@@ -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+
2045test ' 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+
5995test ' 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