-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathldiff_wbtest.mbt
More file actions
86 lines (82 loc) · 2.74 KB
/
Copy pathldiff_wbtest.mbt
File metadata and controls
86 lines (82 loc) · 2.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// Copyright 2026 International Digital Economy Academy
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
///|
test "alignment objective is positive margin, not raw similarity" {
// One strong pair (margin ~510) must beat two above-threshold moderate
// diagonal pairs (raw-sim total ~1280, margins ~240 each).
let a = "alpha beta gamma delta epsilon zeta eta theta"
let y = "alpha beta gamma delta epsilon zeta eta CHANGED"
let x = "alpha beta gamma delta ONE TWO THREE FOUR"
let b = "FIVE SIX SEVEN EIGHT epsilon zeta eta CHANGED"
let olds = [a, b].map(tokenize_line)
let news = [x, y].map(tokenize_line)
@debug.debug_inspect(
align(olds, news),
content="[(None, Some(0)), (Some(0), Some(1)), (Some(1), None)]",
)
}
///|
test "unrelated block orders delete before insert" {
let a = ["aaa bbb ccc"].map(tokenize_line)
let b = ["xxx yyy zzz"].map(tokenize_line)
@debug.debug_inspect(
align(a, b),
content="[(Some(0), None), (None, Some(0))]",
)
}
///|
test "pair_ops reconstruction property" {
for
pair in [
("let total = a", "let sum = a"),
("f(x, 1) // old note", "g(x, 2) // new note"),
("let 名 = \"é😀\"", "let 名 = \"z\""),
("", "only new"),
] {
let (oa, ob) = pair
let left = StringBuilder::new()
let right = StringBuilder::new()
for op in pair_ops(tokenize_line(oa), tokenize_line(ob)) {
match op {
OEq(t) => {
left <+ "\{t.text}"
right <+ "\{t.text}"
}
OSub(a, b) => {
left <+ "\{a.text}"
right <+ "\{b.text}"
}
ODel(a) => left <+ "\{a.text}"
OIns(b) => right <+ "\{b.text}"
}
}
assert_eq(left.to_string(), oa)
assert_eq(right.to_string(), ob)
}
}
///|
test "strong crossing pair beats weak monotone pairs" {
// The strong pair sits on the anti-diagonal; taking it forbids the weak
// diagonal pairs. Margin scoring must still prefer it.
let olds = ["unrelated_one thing here", "let total = price * count"].map(
tokenize_line,
)
let news = ["let total = price * count + tax", "other_stuff entirely now"].map(
tokenize_line,
)
@debug.debug_inspect(
align(olds, news),
content="[(Some(0), None), (Some(1), Some(0)), (None, Some(1))]",
)
}