---
# System prepended metadata

title: 网站书签编辑器 Lab：测试用例

---

# 网站书签编辑器 Lab：测试用例

## 用例1：add show save
请确保当前路径下没有 test1.bmk 文件，或者文件内容为空。

**测试输入**
```
bookmark "test1.bmk"
add-title "标题"
add-title "标题1" at "标题"
add-bookmark "FDU"@"https://www.fudan.edu.cn/" at "标题2"
add-title "标题2" at "标题"
add-bookmark "FDU"@"https://www.fudan.edu.cn/" at "标题2"
add-title "标题3" at "标题"
add-title "标题2.1" at "标题2"
add-title "标题2.1.1" at "标题2.1"
add-title "标题2.1.1" at "标题2.1"
add-bookmark "FDUCS"@"https://cs.fudan.edu.cn/" at "标题2.1.1"
show-tree
save
open "test2.bmk"
open "test1.bmk"
show-tree
```
**期望输出**

第一次的指令 `add-bookmark "FDU"@"https://www.fudan.edu.cn/" at "标题2"` 应当不允许添加书签；
第二次的指令 `add-title "标题2.1.1" at "标题2.1"` 应当再添加一个同名标题；
两次 `show-tree` 的结果应该完全相同（为了与标题区分，打印书签名称时请加上引号""）：
```
└── 标题
    ├── 标题1
    ├── 标题2
    │   ├── "FDU"
    │   └── 标题2.1
    │       ├── 标题2.1.1
    │       │   └── "FDUCS"
    │       └── 标题2.1.1
    └── 标题3
```
并且，用文本编辑器打开文件 test1.bmk，内容应当如下：
```
# 标题
## 标题1
## 标题2
[FDU](https://www.fudan.edu.cn/)
### 标题2.1
#### 标题2.1.1
[FDUCS](https://cs.fudan.edu.cn/)
#### 标题2.1.1
## 标题3
```

## 用例2：add delete save open
请确保当前路径下没有 test2.bmk 文件，或者文件内容为空。

**测试输入**
```
bookmark "test2.bmk"
add-title "标题"
add-title "标题1" at "标题"
add-bookmark "FDU"@"https://www.fudan.edu.cn/" at "标题1"
add-bookmark "FDU"@"https://www.fudan.edu.cn/" at "标题1"
add-title "标题2" at "标题"
add-title "标题3" at "标题"
add-title "标题2.1" at "标题2"
add-title "标题2.1.1" at "标题2.1"
add-title "标题2.1.1" at "标题2.1"
add-bookmark "FDU"@"https://www.fudan.edu.cn/" at "标题2.1.1"
add-bookmark "FDUCS"@"https://cs.fudan.edu.cn/" at "标题2.1.1"
show-tree
delete-bookmark "FDU"
show-tree
delete-title "标题2.1.1"
show-tree
save
delete "标题"
show-tree
open "test1.bmk"
open "test2.bmk"
show-tree
```
**期望输出**

第一次 `show-tree`：
```
└── 标题
    ├── 标题1
    │   ├── "FDU"
    │   └── "FDU"
    ├── 标题2
    │   └── 标题2.1
    │       ├── 标题2.1.1
    │       │   ├── "FDU"
    │       │   └── "FDUCS"
    │       └── 标题2.1.1
    └── 标题3
```
第二次 `show-tree`（所有跟“FDU”匹配的书签都被删除）：
```
└── 标题
    ├── 标题1
    ├── 标题2
    │   └── 标题2.1
    │       ├── 标题2.1.1
    │       │   └── "FDUCS"
    │       └── 标题2.1.1
    └── 标题3
```
第三次 `show-tree`（两个“标题2.1.1”及其中内容都被删除）：
```
└── 标题
    ├── 标题1
    ├── 标题2
    │   └── 标题2.1
    └── 标题3
```
第四次 `show-tree`（打印为空）：
```

```
第五次 `show-tree`（跟第三次打印结果一样，因为 `delete "标题"` 之后没有保存）：
```
└── 标题
    ├── 标题1
    ├── 标题2
    │   └── 标题2.1
    └── 标题3
```
## 用例3：undo/redo
请确保当前已完成用例1，目录中存在文件 test1.bmk，内容应与用例1最后一次 `show-tree` 相同。

**测试输入**
```
open "test1.bmk"
add-title "标题4" at "标题"
add-bookmark "菜鸟"@"https://www.runoob.com/" at "标题2.1.1"
add-bookmark "知乎"@"https://www.zhihu.com/" at "标题4"
show-tree
undo
undo
show-tree
redo
show-tree
delete-title "标题2.1"
redo
show-tree
undo
add-title "标题0"
show-tree
undo
redo
show-tree
save
```

**期望输出**

第一次 `show-tree`：
```
└── 标题
    ├── 标题1
    ├── 标题2
    │   ├── "FDU"
    │   └── 标题2.1
    │       ├── 标题2.1.1
    │       │   ├── "FDUCS"
    │       │   └── "菜鸟"
    │       └── 标题2.1.1
    ├── 标题3
    └── 标题4
        └── "知乎"
```
第二次 `show-tree`：
```
└── 标题
    ├── 标题1
    ├── 标题2
    │   ├── "FDU"
    │   └── 标题2.1
    │       ├── 标题2.1.1
    │       │   └── "FDUCS"
    │       └── 标题2.1.1
    ├── 标题3
    └── 标题4
```
第三次 `show-tree`：
```
└── 标题
    ├── 标题1
    ├── 标题2
    │   ├── "FDU"
    │   └── 标题2.1
    │       ├── 标题2.1.1
    │       │   ├── "FDUCS"
    │       │   └── "菜鸟"
    │       └── 标题2.1.1
    ├── 标题3
    └── 标题4
```
第四次 `show-tree`（`redo` 不产生效果）：
```
└── 标题
    ├── 标题1
    ├── 标题2
    │   └── "FDU"
    ├── 标题3
    └── 标题4
        └── "知乎"
```
第五次&第六次 `show-tree`：
```
├── 标题
│   ├── 标题1
│   ├── 标题2
│   │   ├── "FDU"
│   │   └── 标题2.1
│   │       ├── 标题2.1.1
│   │       │   ├── "FDUCS"
│   │       │   └── "菜鸟"
│   │       └── 标题2.1.1
│   ├── 标题3
│   └── 标题4
└── 标题0
```

## 用例4：ls
请确保当前已完成用例1、2，且当前目录中存在文件 test1.bmk 和 test2.bmk。
同时，请在当前目录下手动新建一个叫 OOAD 的文件夹，在文件夹中手动新建两个文件，schedule.txt 和 week1.txt。

**测试输入**
```
ls-tree
```
**期望输出**

为了与文件夹区分，打印文件名时请加上引号""。
```
├── "test1.bmk"
├── "test2.bmk"
└── OOAD
    ├── "schedule.txt"
    └── "week1.txt"
```

## 用例5：read
请确保当前已完成用例1、2、3，且当前目录中存在文件 test1.bmk 和 test2.bmk，其中 test1.bmk 内容应与用例3最后一次 `show-tree` 相同。

**测试输入**
```
open "test1.bmk"
read-bookmark "FDU"
read-bookmark "FDUCS"
show-tree
open "test2.bmk"
open "test1.bmk"
show-tree
```
**期望输出**

第一次 `show-tree`：
```
├── 标题
│   ├── 标题1
│   ├── 标题2
│   │   ├── "*FDU"
│   │   └── 标题2.1
│   │       ├── 标题2.1.1
│   │       │   ├── "*FDUCS"
│   │       │   └── "菜鸟"
│   │       └── 标题2.1.1
│   ├── 标题3
│   └── 标题4
└── 标题0
```
第二次 `show-tree`（切换文件后丢失访问信息）：
```
├── 标题
│   ├── 标题1
│   ├── 标题2
│   │   ├── "FDU"
│   │   └── 标题2.1
│   │       ├── 标题2.1.1
│   │       │   ├── "FDUCS"
│   │       │   └── "菜鸟"
│   │       └── 标题2.1.1
│   ├── 标题3
│   └── 标题4
└── 标题0
```

## 说明
1. 请注意 `show-tree` 和 `ls-tree` 可视化时，引号""的使用；
2. 测试用例1~5，分数占比分别为20%、20%、30%、20%、10%。