From 3aa84a8c4113ff066137a62a9cbcd5066ff24309 Mon Sep 17 00:00:00 2001 From: Suquster <289166199+Suquster@users.noreply.github.com> Date: Sun, 12 Jul 2026 14:05:54 +0000 Subject: [PATCH] =?UTF-8?q?test:=20=E7=AC=AC=E4=B9=9D=E5=8D=81=E6=89=B9?= =?UTF-8?q?=E4=BD=99=E6=94=AF=E6=94=B6=E5=8F=A3=EF=BC=88semver=20=E9=A2=84?= =?UTF-8?q?=E5=8F=91=E5=B8=83=E5=89=8D=E7=BC=80=E6=AF=94=E8=BE=83=E3=80=81?= =?UTF-8?q?VBool=20=E7=95=B8=E5=BD=A2=E5=80=BC=E3=80=81suggest=20=E7=AD=89?= =?UTF-8?q?=E8=B7=9D=E5=86=B3=E8=83=9C=E3=80=81INI=20=E7=A9=BA=E9=94=AE?= =?UTF-8?q?=E6=8B=92=E7=BB=9D=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- docs/CHAMPIONSHIP_BACKLOG.md | 6 ++++++ src/infra_cli/gaps90_test.mbt | 20 ++++++++++++++++++++ src/infra_config/gaps90_test.mbt | 7 +++++++ src/infra_diff/gaps90_test.mbt | 13 +++++++++++++ uncovered.log | 28 ++++++++++++++-------------- 5 files changed, 60 insertions(+), 14 deletions(-) create mode 100644 src/infra_cli/gaps90_test.mbt create mode 100644 src/infra_config/gaps90_test.mbt create mode 100644 src/infra_diff/gaps90_test.mbt diff --git a/docs/CHAMPIONSHIP_BACKLOG.md b/docs/CHAMPIONSHIP_BACKLOG.md index 914ec7f..27f594f 100644 --- a/docs/CHAMPIONSHIP_BACKLOG.md +++ b/docs/CHAMPIONSHIP_BACKLOG.md @@ -918,6 +918,12 @@ (wt=proto_wire_type(t) 保证标量解释恒成功)与 Ok(_) 线型 不符臂为不可达防御,保留不造假态。src/ 未覆盖 267→265 行, 3321→3324 三后端全绿。2026-07-12。 + - [x] G-B4+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + INFRA 第九十批 余支覆盖收口(infra_diff/infra_cli/infra_config): + semver 预发布字母段前缀比较(短者优先级低);validate_rules + VBool 畸形值上报;suggest_option 等距候选字典序决胜; + ini_parse 空键行拒绝。src/ 未覆盖 265→264 行,3324→3328 + 三后端全绿。2026-07-12。 - [x] G-C 广度闭包:端到端系统切片(2026-07-08 收官) - [x] G-C1 路网服务样例(边表解析→CH 路由→CLI→HdrHistogram 延迟指标→ 熔断器护航全链组装;随机链式路网 PBT)。commit 204cb9a, diff --git a/src/infra_cli/gaps90_test.mbt b/src/infra_cli/gaps90_test.mbt new file mode 100644 index 0000000..0da3930 --- /dev/null +++ b/src/infra_cli/gaps90_test.mbt @@ -0,0 +1,20 @@ +// gaps90_test.mbt —— 类型化校验/建议余臂(第九十批)。 + +///| +/// validate_rules:VBool 规则畸形值上报。 +test "validate_rules:VBool 规则畸形值上报" { + let p : ParsedArgs = { + command_path: [], + flags: [], + values: [("verbose", "maybe")], + positionals: [], + } + let errs = validate_rules(p, [rule("verbose", vtype=VBool, required=true)]) + assert_eq(errs.length(), 1) +} + +///| +/// suggest_option:等距候选取字典序较小者。 +test "suggest_option:等距候选字典序决胜" { + assert_eq(suggest_option("ab", ["ay", "ax"]), Some("ax")) +} diff --git a/src/infra_config/gaps90_test.mbt b/src/infra_config/gaps90_test.mbt new file mode 100644 index 0000000..96e0d41 --- /dev/null +++ b/src/infra_config/gaps90_test.mbt @@ -0,0 +1,7 @@ +// gaps90_test.mbt —— INI 空键拒绝余臂(第九十批)。 + +///| +/// ini_parse:键为空("=value" 行)→ 整体解析拒绝。 +test "ini_parse:空键行拒绝" { + assert_true(ini_parse("[s]\n=value\n") is None) +} diff --git a/src/infra_diff/gaps90_test.mbt b/src/infra_diff/gaps90_test.mbt new file mode 100644 index 0000000..5c2e296 --- /dev/null +++ b/src/infra_diff/gaps90_test.mbt @@ -0,0 +1,13 @@ +// gaps90_test.mbt —— SemVer 预发布比较余臂(第九十批)。 + +///| +/// 字母段互为前缀时短者优先级低(SemVer §11:较短集合优先级低)。 +test "semver_compare:预发布字母段前缀关系" { + match (semver_parse("1.0.0-alpha"), semver_parse("1.0.0-alphab")) { + (Some(a), Some(b)) => { + assert_eq(semver_compare(a, b), -1) + assert_eq(semver_compare(b, a), 1) + } + _ => fail("合法版本不应解析失败") + } +} diff --git a/uncovered.log b/uncovered.log index 675569c..b389250 100644 --- a/uncovered.log +++ b/uncovered.log @@ -1,15 +1,15 @@ -{"schema":"moonbit-pathfinding.actor-bench.v1","machine_id":"b81dace926e09bd26ac488c2f775cc82b419067b1d7e335441fe134b85713027","backend_target":"wasm-gc","generator":"benches/actor_bench/actor_bench.mbt","timing_unit":"microseconds","samples":3,"workloads":[{"workload":"high_frequency_send","load_scale":"messages=5000","timing_us":{"name":"actor_send","sum":1067.4826399293286,"min":350.98679540636044,"max":358.44375971731444,"mean":355.82754664310954,"median":358.05208480565375,"variance":17.61300671117205,"std_dev":4.1967852829483725,"std_dev_pct":1.1794436160272026,"median_abs_dev":0.5806972240281338,"median_abs_dev_pct":0.16218233287018258,"quartiles":[354.5194401060071,358.05208480565375,358.24792226148406],"iqr":3.728482155476968,"batch_size":283,"runs":3}},{"workload":"massive_actor_scheduling","load_scale":"actors=200,msgs_per_actor=50,total=10000","timing_us":{"name":"actor_scheduling","sum":1943.8881448051948,"min":621.4344220779221,"max":674.5856577922078,"mean":647.9627149350649,"median":647.8680649350649,"variance":706.2701834557647,"std_dev":26.575744269084257,"std_dev_pct":4.101431094186882,"median_abs_dev":39.190518899999894,"median_abs_dev_pct":6.04915121166343,"quartiles":[634.6512435064935,647.8680649350649,661.2268613636363],"iqr":26.575617857142788,"batch_size":154,"runs":3}},{"workload":"ask_round_trip","load_scale":"round_trips=500,step_budget=8","timing_us":{"name":"actor_ask_roundtrip","sum":298.16875421686746,"min":98.2306732931727,"max":101.48840220883534,"mean":99.38958473895582,"median":98.44967871485944,"variance":3.3157669225856217,"std_dev":1.8209247438006937,"std_dev_pct":1.8321082119251284,"median_abs_dev":0.3246974381927684,"median_abs_dev_pct":0.32981056152879085,"quartiles":[98.34017600401607,98.44967871485944,99.96904046184738],"iqr":1.6288644578313125,"batch_size":996,"runs":3}},{"workload":"router_dispatch","load_scale":"strategy=round_robin,workers=8,msgs=2000","timing_us":{"name":"actor_router_round_robin","sum":454.3077574766355,"min":151.1863406542056,"max":151.69956635514018,"mean":151.4359191588785,"median":151.42185046728972,"variance":0.06599860108721381,"std_dev":0.2569019289285579,"std_dev_pct":0.1696439856247249,"median_abs_dev":0.3491668488785183,"median_abs_dev_pct":0.23059211586768028,"quartiles":[151.30409556074767,151.42185046728972,151.56070841121493],"iqr":0.25661285046726334,"batch_size":642,"runs":3}},{"workload":"supervision_restart","load_scale":"workers=8,tasks=400,fault_at=17","timing_us":{"name":"actor_supervision_restart","sum":411.55951506456245,"min":136.54965150645626,"max":138.359893687231,"mean":137.18650502152082,"median":136.64996987087517,"variance":1.0351466641727716,"std_dev":1.01742157642384,"std_dev_pct":0.7416338627944741,"median_abs_dev":0.14873200708747705,"median_abs_dev_pct":0.10884159522905025,"quartiles":[136.5998106886657,136.64996987087517,137.5049317790531],"iqr":0.9051210903873823,"batch_size":697,"runs":3}}]} +{"schema":"moonbit-pathfinding.actor-bench.v1","machine_id":"b81dace926e09bd26ac488c2f775cc82b419067b1d7e335441fe134b85713027","backend_target":"wasm-gc","generator":"benches/actor_bench/actor_bench.mbt","timing_unit":"microseconds","samples":3,"workloads":[{"workload":"high_frequency_send","load_scale":"messages=5000","timing_us":{"name":"actor_send","sum":935.0312943925235,"min":309.6233252336449,"max":315.0300626168225,"mean":311.67709813084116,"median":310.3779065420561,"variance":8.574126370939867,"std_dev":2.928160919577315,"std_dev_pct":0.9394854280721265,"median_abs_dev":1.1187422478504723,"median_abs_dev_pct":0.36044519415523635,"quartiles":[310.0006158878505,310.3779065420561,312.7039845794393],"iqr":2.703368691588821,"batch_size":321,"runs":3}},{"workload":"massive_actor_scheduling","load_scale":"actors=200,msgs_per_actor=50,total=10000","timing_us":{"name":"actor_scheduling","sum":1774.8791080924857,"min":585.521260115607,"max":603.641449132948,"mean":591.6263693641619,"median":585.7163988439306,"variance":108.28112616854288,"std_dev":10.405821744030737,"std_dev_pct":1.7588502275877556,"median_abs_dev":0.2893126786126097,"median_abs_dev_pct":0.049394669362791674,"quartiles":[585.6188294797688,585.7163988439306,594.6789239884392],"iqr":9.060094508670431,"batch_size":173,"runs":3}},{"workload":"ask_round_trip","load_scale":"round_trips=500,step_budget=8","timing_us":{"name":"actor_ask_roundtrip","sum":298.54737676470586,"min":97.86624578431373,"max":101.66371725490197,"mean":99.51579225490195,"median":99.0174137254902,"variance":3.791483261416869,"std_dev":1.9471731462345276,"std_dev_pct":1.9566473844141192,"median_abs_dev":1.7067215895882306,"median_abs_dev_pct":1.7236580166796123,"quartiles":[98.44182975490196,99.0174137254902,100.34056549019608],"iqr":1.8987357352941245,"batch_size":1020,"runs":3}},{"workload":"router_dispatch","load_scale":"strategy=round_robin,workers=8,msgs=2000","timing_us":{"name":"actor_router_round_robin","sum":480.82357147192715,"min":155.61456145675265,"max":162.9630874051593,"mean":160.27452382397573,"median":162.24592261001516,"variance":16.41501828379986,"std_dev":4.051545172375579,"std_dev_pct":2.527878464842771,"median_abs_dev":1.0632685252807272,"median_abs_dev_pct":0.6553437572890313,"quartiles":[158.9302420333839,162.24592261001516,162.60450500758725],"iqr":3.6742629742033444,"batch_size":659,"runs":3}},{"workload":"supervision_restart","load_scale":"workers=8,tasks=400,fault_at=17","timing_us":{"name":"actor_supervision_restart","sum":419.7248838080959,"min":136.36054542728635,"max":142.6540700149925,"mean":139.90829460269865,"median":140.7102683658171,"variance":10.384484371563214,"std_dev":3.222496605361007,"std_dev_pct":2.3032920346231207,"median_abs_dev":2.8818803250674665,"median_abs_dev_pct":2.0480952517091247,"quartiles":[138.5354068965517,140.7102683658171,141.6821691904048],"iqr":3.146762293853101,"batch_size":667,"runs":3}}]} ACTOR-BENCH REGRESSION GUARD (timing unit: microseconds) schema=moonbit-pathfinding.actor-bench.v1 machine_id=b81dace926e09bd26ac488c2f775cc82b419067b1d7e335441fe134b85713027 backend=wasm-gc columns: workload | baseline_us | measured_us | tolerance_pct | allowed_us | delta_pct | verdict -high_frequency_send | 1500 | 318 | 50% | 2250 | -79% | OK -massive_actor_scheduling | 4000 | 594 | 50% | 6000 | -85% | OK -ask_round_trip | 900 | 98 | 50% | 1350 | -89% | OK -router_dispatch | 1800 | 153 | 50% | 2700 | -91% | OK -supervision_restart | 1200 | 139 | 50% | 1800 | -88% | OK +high_frequency_send | 1500 | 309 | 50% | 2250 | -79% | OK +massive_actor_scheduling | 4000 | 587 | 50% | 6000 | -85% | OK +ask_round_trip | 900 | 97 | 50% | 1350 | -89% | OK +router_dispatch | 1800 | 149 | 50% | 2700 | -92% | OK +supervision_restart | 1200 | 136 | 50% | 1800 | -89% | OK status: PASS ts=1 level=ERROR -Total: 715 uncovered line(s) in 170 file(s) +Total: 714 uncovered line(s) in 170 file(s) 98 uncovered line(s) in bench_rust/moon_side/main.mbt: @@ -8220,9 +8220,9 @@ Total: 715 uncovered line(s) in 170 file(s) 266 Ok(_) => () 267 } 268 VBool => -269 match parsed.bool_of(r.name) { <-- UNCOVERED +269 match parsed.bool_of(r.name) { 270 Err(e) => errs.push(e) -271 Ok(_) => () +271 Ok(_) => () <-- UNCOVERED 272 } 273 } 274 if r.choices.length() > 0 { @@ -8257,9 +8257,9 @@ Total: 715 uncovered line(s) in 170 file(s) 450 best_d = d 451 best = Some(c) 452 } else if d == best_d { -453 match best { <-- UNCOVERED +453 match best { 454 Some(cur) => if c < cur { best = Some(c) } -455 None => best = Some(c) +455 None => best = Some(c) <-- UNCOVERED 456 } 457 } 458 } @@ -10249,7 +10249,7 @@ Total: 715 uncovered line(s) in 170 file(s) 751 } … -2 uncovered line(s) in src/infra_diff/diff.mbt: +1 uncovered line(s) in src/infra_diff/diff.mbt: 326 pub fn semver_compare(a : SemVer, b : SemVer) -> Int { 327 if a.major != b.major { @@ -10305,7 +10305,7 @@ Total: 715 uncovered line(s) in 170 file(s) 377 return if xs[j] < ys[j] { -1 } else { 1 } 378 } 379 } -380 return if xs.length() < ys.length() { -1 } else { 1 } <-- UNCOVERED +380 return if xs.length() < ys.length() { -1 } else { 1 } 381 } 382 // 前缀相同,段多者优先级高。 383 if a.prerelease.length() == b.prerelease.length() { @@ -15386,4 +15386,4 @@ Total: 715 uncovered line(s) in 170 file(s) 268 } … -Total: 715 uncovered line(s) in 170 file(s) +Total: 714 uncovered line(s) in 170 file(s)