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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
//! MATCH TEST FUNCTIONS
use std::collections::HashMap;
#[cfg(test)]
use diffmatchpatch::*;
#[test]
fn match_alphabet() {
// Initialise the bitmasks for Bitap.
// self.assertEqual({"a":4, "b":2, "c":1}, self.dmp.match_alphabet("abc"))
let mut dmp = DiffMatchPatch::new();
let mut s = HashMap::new();
s.insert('a', 4);
s.insert('b', 2);
s.insert('c', 1);
assert_eq!(s, dmp.match_alphabet(&"abc".to_chars()));
// self.assertEqual({"a":37, "b":18, "c":8}, self.dmp.match_alphabet("abcaba"))
let mut s = HashMap::new();
s.insert('a', 37);
s.insert('b', 18);
s.insert('c', 8);
assert_eq!(s, dmp.match_alphabet(&"abcaba".to_chars()));
}
#[test]
fn match_bitap() {
let mut dmp = DiffMatchPatch::new();
dmp.match_distance = 100;
dmp.match_threshold = 0.5;
// Exact matches.
assert_eq!(Some(5), dmp.match_bitap(&"abcdefghijk".to_chars(), &"fgh".to_chars(), 5));
assert_eq!(Some(5), dmp.match_bitap(&"abcdefghijk".to_chars(), &"fgh".to_chars(), 0));
// Fuzzy matches.
//self.assertEqual(4, self.dmp.match_bitap("abcdefghijk", "efxhi", 0))
assert_eq!(Some(4), dmp.match_bitap(&"abcdefghijk".to_chars(), &"efxhi".to_chars(), 0));
//self.assertEqual(2, self.dmp.match_bitap("abcdefghijk", "cdefxyhijk", 5))
assert_eq!(Some(2), dmp.match_bitap(&"abcdefghijk".to_chars(), &"cdefxyhijk".to_chars(), 5));
//self.assertEqual(-1, self.dmp.match_bitap("abcdefghijk", "bxy", 1))
assert_eq!(None, dmp.match_bitap(&"abcdefghijk".to_chars(), &"bxy".to_chars(), 1));
// Overflow.
//self.assertEqual(2, self.dmp.match_bitap("123456789xx0", "3456789x0", 2))
assert_eq!(Some(2), dmp.match_bitap(&"123456789xx0".to_chars(), &"3456789x0".to_chars(), 2));
//self.assertEqual(0, self.dmp.match_bitap("abcdef", "xxabc", 4))
assert_eq!(Some(0), dmp.match_bitap(&"abcdef".to_chars(), &"xxabc".to_chars(), 4));
//self.assertEqual(3, self.dmp.match_bitap("abcdef", "defyy", 4))
assert_eq!(Some(3), dmp.match_bitap(&"abcdef".to_chars(), &"defyy".to_chars(), 4));
//self.assertEqual(0, self.dmp.match_bitap("abcdef", "xabcdefy", 0))
assert_eq!(Some(0), dmp.match_bitap(&"abcdef".to_chars(), &"xabcdefy".to_chars(), 0));
// Threshold test.
//dmp.Match_Threshold = 0.4
//self.assertEqual(4, self.dmp.match_bitap("abcdefghijk", "efxyhi", 1))
dmp.match_threshold = 0.4;
assert_eq!(Some(4), dmp.match_bitap(&"abcdefghijk".to_chars(), &"efxyhi".to_chars(), 1));
//self.dmp.Match_Threshold = 0.3
//self.assertEqual(-1, self.dmp.match_bitap("abcdefghijk", "efxyhi", 1))
dmp.match_threshold = 0.3;
assert_eq!(None, dmp.match_bitap(&"abcdefghijk".to_chars(), &"efxyhi".to_chars(), 1));
//self.dmp.Match_Threshold = 0.0
// self.assertEqual(1, self.dmp.match_bitap("abcdefghijk", "bcdef", 1))
dmp.match_threshold = 0.0;
assert_eq!(Some(1), dmp.match_bitap(&"abcdefghijk".to_chars(), &"bcdef".to_chars(), 1));
dmp.match_threshold = 0.5;
// Multiple select.
//self.assertEqual(0, self.dmp.match_bitap("abcdexyzabcde", "abccde", 3))
assert_eq!(Some(0), dmp.match_bitap(&"abcdexyzabcde".to_chars(), &"abccde".to_chars(), 3));
// self.assertEqual(8, self.dmp.match_bitap("abcdexyzabcde", "abccde", 5))
assert_eq!(Some(8), dmp.match_bitap(&"abcdexyzabcde".to_chars(), &"abccde".to_chars(), 5));
// Distance test.
//self.dmp.Match_Distance = 10 # Strict location.
//self.assertEqual(-1, self.dmp.match_bitap("abcdefghijklmnopqrstuvwxyz", "abcdefg", 24))
dmp.match_distance = 10;
assert_eq!(
None,
dmp.match_bitap(&"abcdefghijklmnopqrstuvwxyz".to_chars(), &"abcdefg".to_chars(), 24)
);
//self.assertEqual(0, self.dmp.match_bitap("abcdefghijklmnopqrstuvwxyz", "abcdxxefg", 1))
assert_eq!(
Some(0),
dmp.match_bitap(&"abcdefghijklmnopqrstuvwxyz".to_chars(), &"abcdxxefg".to_chars(), 1)
);
//self.dmp.Match_Distance = 1000 # Loose location.
//self.assertEqual(0, self.dmp.match_bitap("abcdefghijklmnopqrstuvwxyz", "abcdefg", 24))
dmp.match_distance = 1000;
assert_eq!(
Some(0),
dmp.match_bitap(&"abcdefghijklmnopqrstuvwxyz".to_chars(), &"abcdefg".to_chars(), 24)
);
}
#[test]
fn match_main() {
let mut dmp = DiffMatchPatch::new();
// Shortcut matches.
//self.assertEqual(0, self.dmp.match_main("abcdef", "abcdef", 1000))
assert_eq!(Some(0), dmp.match_main(&"abcdef".to_chars(), &"abcdef".to_chars(), 1000));
//self.assertEqual(-1, self.dmp.match_main("", "abcdef", 1))
assert_eq!(None, dmp.match_main(&"".to_chars(), &"abcdef".to_chars(), 1));
//self.assertEqual(3, self.dmp.match_main("abcdef", "", 3))
assert_eq!(Some(3), dmp.match_main(&"abcdef".to_chars(), &"".to_chars(), 3));
//self.assertEqual(3, self.dmp.match_main("abcdef", "de", 3))
assert_eq!(Some(3), dmp.match_main(&"abcdef".to_chars(), &"de".to_chars(), 3));
//self.assertEqual(3, self.dmp.match_main("abcdef", "defy", 4))
assert_eq!(Some(3), dmp.match_main(&"abcdef".to_chars(), &"defy".to_chars(), 4));
//self.assertEqual(0, self.dmp.match_main("abcdef", "abcdefy", 0))
assert_eq!(Some(0), dmp.match_main(&"abcdef".to_chars(), &"abcdefy".to_chars(), 0));
// Complex match.
dmp.match_threshold = 0.7;
// self.assertEqual(4, self.dmp.match_main("I am the very model of a modern major general.", " that berry ", 5))
assert_eq!(
Some(4),
dmp.match_main(
&"I am the very model of a modern major general.".to_chars(),
&" that berry ".to_chars(),
5
)
);
}