1 assert = require('./assert')
2 utils = require('../lib/utils')
4 exports['test selectAllSubstringMatches'] = ($vimfx, teardown) ->
5 window = utils.getCurrentWindow()
7 selection = window.getSelection()
9 # Element creation helper.
10 e = (tagName, childNodes = []) ->
11 element = document.createElement(tagName)
12 element.appendChild(childNode) for childNode in childNodes
15 # Text node creation helper.
16 t = (text) -> document.createTextNode(text)
18 test = (name, element, string, options, expected) ->
19 msg = (message) -> "#{name}: #{message}"
21 document.documentElement.appendChild(element)
26 selection.removeAllRanges()
27 utils.selectAllSubstringMatches(element, string, options)
29 assert.equal(selection.rangeCount, expected.length, msg('rangeCount'))
31 for index in [0...selection.rangeCount] by 1
32 range = selection.getRangeAt(index)
34 startContainer, startOffset
35 endContainer, endOffset
36 expectedString = string
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()'))
46 do (name = 'simple case') ->
50 test(name, element, 'es', null, [
54 do (name = 'several matches per text node') ->
56 (t1 = t('es test best es'))
58 test(name, element, 'es', null, [
65 do (name = 'split across two text nodes') ->
70 test(name, element, 'es', null, [
74 do (name = 'split across three text nodes') ->
80 test(name, element, 'test', null, [
84 do (name = 'empty text nodes skipped') ->
95 test(name, element, 'test', null, [
99 do (name = 'across several elements') ->
111 test(name, element, 'test', null, [
115 do (name = 'overlapping matches') ->
117 (t1 = t('ababaabacaba'))
119 test(name, element, 'aba', null, [
120 [t1, 0, t1, 8, 'ababaaba']
124 do (name = 'case sensitivity') ->
128 test(name, element, 'TesT', null, [])
130 do (name = 'case insensitivity') ->
134 test(name, element, 'TesT', {caseSensitive: false}, [
135 [t1, 0, t1, 4, 'tESt']
138 exports['test bisect'] = ->
139 fn = (num) -> num > 7
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])
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])
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])
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])
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])
181 exports['test removeDuplicates'] = ->
182 assert.arrayEqual(utils.removeDuplicates(
186 assert.arrayEqual(utils.removeDuplicates(
187 ['a', 'b', 'c', 'b', 'd', 'a']),