picomatch-rs 0.1.0

Rust glob matching core for the picomatch-rs workspace.
Documentation
# bash.rs 测试覆盖状态

## 测试文件

- 源文件: `test/bash.js`
- 目标文件: `crates/picomatch-rs/tests/bash.rs`

## 测试覆盖

### 顶层测试函数 (12/12)

`crates/picomatch-rs/tests/bash.rs` 已保留并对齐 `test/bash.js` 的 12 个顶层 `it(...)` 用例。

### 断言覆盖状态

- JS 原始断言数:`645`
- JS 去重后的唯一断言语义:`623`
- Rust 已覆盖的唯一断言语义:`623`
- Rust 额外显式断言:`1`
  - `assert_is_match("a*", "[a-y]*[^c]", opts.clone(), true);`
  - 说明:这条不是 `test/bash.js` 的原始断言,但它记录了当前 JS/Rust 在默认选项下的一致行为,避免后续状态再次漂移

### 已补齐的缺失迁移

1. `should_match_escaped_quotes`
   - 补齐 `foo/\"**\"/bar``foo/\"*\"/bar``foo/"*"/bar` 的完整负例矩阵
2. `should_support_character_classes`
   - 补齐 `[a-y]*[^c]` 的默认 / `bash: true` / `regex: true` 断言
   - 补齐 `a[b]c``a["b"]c``a[\\\\b]c``a[\\b]c``a[b-d]c``a?c` 的完整样例矩阵
   - 补齐 `[^a-c]*` 的遗漏负例 `a/*`
3. `should_match_escaped_characters`
   - 补齐非 Windows 条件分支:`\\*``[A-Z]+/\\\\`

### 仍保留的结构差异

Rust 侧为了可读性没有强制复制 JS 里的重复断言行,因此“原始行数”仍不与 `test/bash.js` 完全相同;但唯一断言语义现已完全覆盖。

### 覆盖的测试类别

1. **Regular Globbing**
   - `a*` 匹配 `a`, `ab`, `abc`
   - `\a*` 转义模式
2. **Directory Matching**
   - `b*/` 尾随斜杠匹配目录
3. **Escaped Characters as Literals**
   - `\^` 匹配 `^`
   - `\*` 匹配 `*`
   - `a\*` 匹配 `a*`
4. **Quoted Characters**
   - 双引号 `"***"` 匹配 `***`
   - 单引号 `'***'` 匹配 `'***'`
   - `"*"*` 内部通配符
5. **Escaped Quotes**
   - `\"**\"` 匹配 `**`
   - `foo/\"*\"/bar` 匹配 `foo/"*"/bar`
6. **Character Classes**
   - 范围: `[a-c]`, `[a-y]`, `[a-z]`
   - 否定: `[^c]`, `[^a-c]`
   - 特殊字符: `[X-]`
7. **Basic Wildmatch Brackets**
   - `a[]-]b` 匹配 `a-b`, `a]b`
   - `[ten]` 字符集
   - `[\\]a\\-]` 转义
8. **Extended Slash-Matching**
   - `foo[/]` 斜杠在括号内
9. **Escaped Characters**
   - `\[ab]` 字面量括号
10. **Star Consolidation**
    - 多余星号合并: `**`, `***`, `*****?`

## 测试结果

```bash
cargo test -p picomatch-rs --test bash
```

- 结果:`12 passed`, `0 failed`

```bash
node - <<'NODE'
const tests = [];
global.describe = (_name, fn) => fn();
global.it = (name, fn) => tests.push({ name, fn });
require('./test/bash.js');
let passed = 0;
for (const t of tests) {
  t.fn();
  passed++;
}
console.log(`js_harness_passed ${passed}/${tests.length}`);
NODE
```

- 结果:`js_harness_passed 12/12`

## 迁移状态

✅ 已完成(按唯一断言语义完全迁移)- `test/bash.js` → `bash.rs`

## 备注

1. 2026-03-15 重新复核后,确认原状态文件“已完成”结论过于乐观:当时 `bash.rs` 尚缺 `escaped quotes``character classes`、非 Windows `escaped characters` 的一批断言。现已补齐并通过复测。
2. 2026-03-15 额外保留了 `a*``[a-y]*[^c]` 的默认选项显式断言:
   - 当前 JS 行为: `true`
   - 当前 Rust 行为: `true`
   - 该断言用于固定当前实现行为,即使它不是原始 `test/bash.js` 里的独立断言