]> git.gir.st - VimFx.git/blob - extension/test/test-utils.coffee
Fix TypeError when hitting ESC
[VimFx.git] / extension / test / test-utils.coffee
1 assert = require('./assert')
2 utils = require('../lib/utils')
3
4 exports['test selectAllSubstringMatches'] = ($vimfx, teardown) ->
5 window = utils.getCurrentWindow()
6 {document} = window
7 selection = window.getSelection()
8
9 # Element creation helper.
10 e = (tagName, childNodes = []) ->
11 element = document.createElement(tagName)
12 element.appendChild(childNode) for childNode in childNodes
13 return element
14
15 # Text node creation helper.
16 t = (text) -> document.createTextNode(text)
17
18 test = (name, element, string, options, expected) ->
19 msg = (message) -> "#{name}: #{message}"
20
21 document.documentElement.appendChild(element)
22 teardown(->
23 element.remove()
24 )
25
26 selection.removeAllRanges()
27 utils.selectAllSubstringMatches(element, string, options)
28
29 assert.equal(selection.rangeCount, expected.length, msg('rangeCount'))
30
31 for index in [0...selection.rangeCount] by 1
32 range = selection.getRangeAt(index)
33 [
34 startContainer, startOffset
35 endContainer, endOffset
36 expectedString = string
37 ] = expected[index]
38 assert.equal(range.startContainer, startContainer, msg('startContainer'))
39 assert.equal(range.startOffset, startOffset, msg('startOffset'))
40 assert.equal(range.endContainer, endContainer, msg('endContainer'))
41 assert.equal(range.endOffset, endOffset, msg('endOffset'))
42 assert.equal(range.toString(), expectedString, msg('toString()'))
43
44 return
45
46 do (name = 'simple case') ->
47 element = e('p', [
48 (t1 = t('test'))
49 ])
50 test(name, element, 'es', null, [
51 [t1, 1, t1, 3]
52 ])
53
54 do (name = 'several matches per text node') ->
55 element = e('p', [
56 (t1 = t('es test best es'))
57 ])
58 test(name, element, 'es', null, [
59 [t1, 0, t1, 2]
60 [t1, 4, t1, 6]
61 [t1, 9, t1, 11]
62 [t1, 13, t1, 15]
63 ])
64
65 do (name = 'split across two text nodes') ->
66 element = e('p', [
67 (t1 = t('te'))
68 (t2 = t('st'))
69 ])
70 test(name, element, 'es', null, [
71 [t1, 1, t2, 1]
72 ])
73
74 do (name = 'split across three text nodes') ->
75 element = e('p', [
76 (t1 = t('te'))
77 t('s')
78 (t2 = t('t'))
79 ])
80 test(name, element, 'test', null, [
81 [t1, 0, t2, 1]
82 ])
83
84 do (name = 'empty text nodes skipped') ->
85 element = e('p', [
86 t('')
87 (t1 = t('a te'))
88 t('')
89 t('')
90 t('s')
91 t('')
92 (t2 = t('t!'))
93 t('')
94 ])
95 test(name, element, 'test', null, [
96 [t1, 2, t2, 1]
97 ])
98
99 do (name = 'across several elements') ->
100 element = e('p', [
101 t('\n ')
102 e('span', [
103 (t1 = t('\tte'))
104 e('i', [
105 t('s')
106 ])
107 ])
108 e('span')
109 (t2 = t('t'))
110 ])
111 test(name, element, 'test', null, [
112 [t1, 1, t2, 1]
113 ])
114
115 do (name = 'overlapping matches') ->
116 element = e('p', [
117 (t1 = t('ababaabacaba'))
118 ])
119 test(name, element, 'aba', null, [
120 [t1, 0, t1, 8, 'ababaaba']
121 [t1, 9, t1, 12]
122 ])
123
124 do (name = 'case sensitivity') ->
125 element = e('p', [
126 (t1 = t('tESt'))
127 ])
128 test(name, element, 'TesT', null, [])
129
130 do (name = 'case insensitivity') ->
131 element = e('p', [
132 (t1 = t('tESt'))
133 ])
134 test(name, element, 'TesT', {caseSensitive: false}, [
135 [t1, 0, t1, 4, 'tESt']
136 ])
137
138 exports['test bisect'] = ->
139 fn = (num) -> num > 7
140
141 # Non-sensical input.
142 assert.arrayEqual(utils.bisect(5, 2, fn), [null, null])
143 assert.arrayEqual(utils.bisect(7.5, 8, fn), [null, null])
144 assert.arrayEqual(utils.bisect(7, 8.5, fn), [null, null])
145 assert.arrayEqual(utils.bisect(7.5, 8.5, fn), [null, null])
146
147 # Unfindable bounds.
148 assert.arrayEqual(utils.bisect(8, 8, fn), [null, 8])
149 assert.arrayEqual(utils.bisect(7, 7, fn), [7, null])
150 assert.arrayEqual(utils.bisect(6, 7, fn), [7, null])
151 assert.arrayEqual(utils.bisect(7, 8, fn), [7, 8])
152 assert.arrayEqual(utils.bisect(1, 2, (n) -> n == 1), [null, null])
153 assert.arrayEqual(utils.bisect(0, 0, fn), [0, null])
154
155 # Less than.
156 assert.arrayEqual(utils.bisect(0, 7, fn), [7, null])
157 assert.arrayEqual(utils.bisect(0, 8, fn), [7, 8])
158 assert.arrayEqual(utils.bisect(1, 8, fn), [7, 8])
159 assert.arrayEqual(utils.bisect(2, 8, fn), [7, 8])
160 assert.arrayEqual(utils.bisect(3, 8, fn), [7, 8])
161 assert.arrayEqual(utils.bisect(4, 8, fn), [7, 8])
162 assert.arrayEqual(utils.bisect(5, 8, fn), [7, 8])
163 assert.arrayEqual(utils.bisect(6, 8, fn), [7, 8])
164
165 # Greater than.
166 assert.arrayEqual(utils.bisect(7, 9, fn), [7, 8])
167 assert.arrayEqual(utils.bisect(7, 10, fn), [7, 8])
168 assert.arrayEqual(utils.bisect(7, 11, fn), [7, 8])
169 assert.arrayEqual(utils.bisect(7, 12, fn), [7, 8])
170 assert.arrayEqual(utils.bisect(7, 13, fn), [7, 8])
171 assert.arrayEqual(utils.bisect(7, 14, fn), [7, 8])
172 assert.arrayEqual(utils.bisect(7, 15, fn), [7, 8])
173 assert.arrayEqual(utils.bisect(7, 16, fn), [7, 8])
174
175 # Various cases.
176 assert.arrayEqual(utils.bisect(0, 9, fn), [7, 8])
177 assert.arrayEqual(utils.bisect(5, 9, fn), [7, 8])
178 assert.arrayEqual(utils.bisect(6, 10, fn), [7, 8])
179 assert.arrayEqual(utils.bisect(0, 12345, fn), [7, 8])
180
181 exports['test removeDuplicates'] = ->
182 assert.arrayEqual(utils.removeDuplicates(
183 [1, 1, 2, 1, 3, 2]),
184 [1, 2, 3]
185 )
186 assert.arrayEqual(utils.removeDuplicates(
187 ['a', 'b', 'c', 'b', 'd', 'a']),
188 ['a', 'b', 'c', 'd']
189 )
Imprint / Impressum