Skip to content

Commit f07ee0f

Browse files
committed
unit tests for repeat_match()
1 parent f84fe49 commit f07ee0f

1 file changed

Lines changed: 67 additions & 12 deletions

File tree

test/test-matching.coffee

Lines changed: 67 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,31 @@ genpws = (pattern, prefixes, suffixes) ->
1717
result.push [prefix + pattern + suffix, i, j]
1818
result
1919

20+
check_matches = (t, matches, pattern_names, patterns, ijs, props) ->
21+
if typeof pattern_names is "string"
22+
# shortcut: if checking for a list of the same type of patterns,
23+
# allow passing a string 'pat' instead of array ['pat', 'pat', ...]
24+
pattern_names = (pattern_names for i in [0...patterns.length])
25+
26+
is_equal_len_args = pattern_names.length == patterns.length == ijs.length
27+
for prop, lst of props
28+
# props is structured as: keys that points to list of values
29+
is_equal_len_args = is_equal_len_args and (lst.length == patterns.length)
30+
throw 'unequal argument lists to check_matches' unless is_equal_len_args
31+
32+
t.equal matches.length, patterns.length
33+
for k in [0...patterns.length]
34+
match = matches[k]
35+
pattern_name = pattern_names[k]
36+
pattern = patterns[k]
37+
[i, j] = ijs[k]
38+
t.equal match.pattern, pattern_name
39+
t.equal match.i, i
40+
t.equal match.j, j
41+
t.equal match.token, pattern
42+
for prop_name, prop_list of props
43+
t.equal match[prop_name], prop_list[k]
44+
2045
test 'matching utils', (t) ->
2146
t.ok matching.empty []
2247
t.notOk matching.empty [1]
@@ -48,18 +73,35 @@ test 'matching utils', (t) ->
4873
t.equal matching.translate('', chr_map), ''
4974
t.equal matching.translate('', {}), ''
5075
t.equal matching.translate('abc', {}), 'abc'
51-
t.end()
5276

5377
t.equal matching.mod(0, 1), 0
5478
t.equal matching.mod(5, 5), 0
5579
t.equal matching.mod(-1, 5), 4
5680
t.equal matching.mod(-5, 5), 0
5781
t.equal matching.mod(6, 5), 1
5882

83+
t.deepEqual matching.sorted([]), []
84+
[m1, m2, m3, m4, m5, m6] = [
85+
{i: 5, j: 5}
86+
{i: 6, j: 7}
87+
{i: 2, j: 5}
88+
{i: 0, j: 0}
89+
{i: 2, j: 3}
90+
{i: 0, j: 3}
91+
]
92+
t.deepEqual matching.sorted([m1, m2, m3, m4, m5, m6]), [m4, m6, m5, m3, m1, m2]
93+
t.end()
94+
5995
test 'sequence matching', (t) ->
6096
t.deepEqual matching.sequence_match(''), []
6197
t.deepEqual matching.sequence_match('a'), []
6298
t.deepEqual matching.sequence_match('1'), []
99+
matches = matching.sequence_match('abcbabc')
100+
check_matches t, matches, 'sequence', ['abc', 'cba', 'abc'], [[0, 2], [2, 4], [4, 6]],
101+
ascending: [true, false, true]
102+
t.equal matching.sequence_match('xyzabc').length, 1
103+
t.equal matching.sequence_match('cbazyx').length, 1
104+
t.equal matching.sequence_match('ab').length, 0
63105
prefixes = ['!', '22', 'ttt']
64106
suffixes = ['!', '22', 'ttt']
65107
for [pattern, name, is_ascending] in [
@@ -82,16 +124,29 @@ test 'sequence matching', (t) ->
82124
]
83125
for [password, i, j] in genpws pattern, prefixes, suffixes
84126
matches = matching.sequence_match password
85-
t.equal matches.length, 1
86-
match = matches[0]
87-
t.equal match.pattern, 'sequence'
88-
t.equal match.i, i
89-
t.equal match.j, j
90-
t.equal match.token, pattern
91-
t.equal match.sequence_name, name
92-
t.equal match.ascending, is_ascending
93-
t.equal matching.sequence_match('abcba').length, 2
94-
t.equal matching.sequence_match('xyzabc').length, 1
95-
t.equal matching.sequence_match('ab').length, 0
127+
check_matches t, matches, 'sequence', [pattern], [[i, j]],
128+
sequence_name: [name]
129+
ascending: [is_ascending]
96130
t.end()
97131

132+
test 'repeat matching', (t) ->
133+
t.deepEqual matching.repeat_match(''), []
134+
t.deepEqual matching.repeat_match('#'), []
135+
t.deepEqual matching.repeat_match('##'), []
136+
prefixes = ['@', 'y4@']
137+
suffixes = ['u', 'u%7']
138+
for length in [3, 12]
139+
for chr in ['a', 'Z', '4', '&']
140+
pattern = Array(length + 1).join(chr)
141+
for [password, i, j] in genpws pattern, prefixes, suffixes
142+
matches = matching.repeat_match password
143+
check_matches t, matches, 'repeat', [pattern], [[i, j]],
144+
repeated_char: [chr]
145+
matches = matching.repeat_match('BBB1111aaaaa@@@@@@')
146+
patterns = ['BBB','1111','aaaaa','@@@@@@']
147+
check_matches t, matches, 'repeat', patterns, [[0, 2],[3, 6],[7, 11],[12, 17]],
148+
repeated_char: ['B', '1', 'a', '@']
149+
matches = matching.repeat_match('2818BBBbzsdf1111@*&@!aaaaaEUDA@@@@@@1729')
150+
check_matches t, matches, 'repeat', patterns, [[4, 6],[12, 15],[21, 25],[30, 35]],
151+
repeated_char: ['B', '1', 'a', '@']
152+
t.end()

0 commit comments

Comments
 (0)