Ben Rohlfs | 3bd254b | 2022-02-01 12:37:57 +0100 | [diff] [blame] | 1 | /** |
| 2 | * @license |
| 3 | * Copyright 2022 Google LLC |
| 4 | * SPDX-License-Identifier: Apache-2.0 |
| 5 | */ |
Frank Borden | e1ba821 | 2022-08-29 15:20:01 +0200 | [diff] [blame] | 6 | import {assert} from '@open-wc/testing'; |
Frank Borden | be9451a | 2022-09-12 15:44:29 +0200 | [diff] [blame] | 7 | import '../test/common-test-setup'; |
Ben Rohlfs | de5c02e | 2022-02-01 12:42:12 +0100 | [diff] [blame] | 8 | import './syntax-util'; |
Ben Rohlfs | 3bd254b | 2022-02-01 12:37:57 +0100 | [diff] [blame] | 9 | import { |
| 10 | highlightedStringToRanges, |
| 11 | removeFirstSpan, |
| 12 | SpanType, |
Ben Rohlfs | de5c02e | 2022-02-01 12:42:12 +0100 | [diff] [blame] | 13 | } from './syntax-util'; |
Ben Rohlfs | 3bd254b | 2022-02-01 12:37:57 +0100 | [diff] [blame] | 14 | |
Ben Rohlfs | de5c02e | 2022-02-01 12:42:12 +0100 | [diff] [blame] | 15 | suite('file syntax-util', () => { |
Ben Rohlfs | 3bd254b | 2022-02-01 12:37:57 +0100 | [diff] [blame] | 16 | suite('function removeFirstSpan()', () => { |
| 17 | test('no matches', async () => { |
| 18 | assert.isUndefined(removeFirstSpan('')); |
| 19 | assert.isUndefined(removeFirstSpan('span')); |
| 20 | assert.isUndefined(removeFirstSpan('<span>')); |
| 21 | assert.isUndefined(removeFirstSpan('</span')); |
| 22 | assert.isUndefined(removeFirstSpan('asdf')); |
| 23 | }); |
| 24 | |
| 25 | test('simple opening match', async () => { |
| 26 | const removal = removeFirstSpan('asdf<span class="c">asdf'); |
| 27 | assert.deepEqual(removal, { |
| 28 | type: SpanType.OPENING, |
| 29 | lineAfter: 'asdfasdf', |
| 30 | class: 'c', |
| 31 | offset: 4, |
| 32 | }); |
| 33 | }); |
| 34 | |
| 35 | test('simple closing match', async () => { |
| 36 | const removal = removeFirstSpan('asdf</span>asdf'); |
| 37 | assert.deepEqual(removal, { |
| 38 | type: SpanType.CLOSING, |
| 39 | lineAfter: 'asdfasdf', |
| 40 | class: undefined, |
| 41 | offset: 4, |
| 42 | }); |
| 43 | }); |
| 44 | }); |
| 45 | |
| 46 | suite('function highlightedStringToRanges()', () => { |
| 47 | test('no ranges', async () => { |
Ben Rohlfs | de5c02e | 2022-02-01 12:42:12 +0100 | [diff] [blame] | 48 | assert.deepEqual(highlightedStringToRanges(''), [{ranges: []}]); |
| 49 | assert.deepEqual(highlightedStringToRanges('\n'), [ |
| 50 | {ranges: []}, |
| 51 | {ranges: []}, |
| 52 | ]); |
Ben Rohlfs | 3bd254b | 2022-02-01 12:37:57 +0100 | [diff] [blame] | 53 | assert.deepEqual(highlightedStringToRanges('asdf\nasdf\nasdf'), [ |
Ben Rohlfs | de5c02e | 2022-02-01 12:42:12 +0100 | [diff] [blame] | 54 | {ranges: []}, |
| 55 | {ranges: []}, |
| 56 | {ranges: []}, |
Ben Rohlfs | 3bd254b | 2022-02-01 12:37:57 +0100 | [diff] [blame] | 57 | ]); |
| 58 | }); |
| 59 | |
| 60 | test('one line, one span', async () => { |
| 61 | assert.deepEqual( |
| 62 | highlightedStringToRanges('asdf<span class="c">qwer</span>asdf'), |
Ben Rohlfs | de5c02e | 2022-02-01 12:42:12 +0100 | [diff] [blame] | 63 | [{ranges: [{start: 4, length: 4, className: 'c'}]}] |
Ben Rohlfs | 3bd254b | 2022-02-01 12:37:57 +0100 | [diff] [blame] | 64 | ); |
| 65 | assert.deepEqual( |
| 66 | highlightedStringToRanges('<span class="d">asdfqwer</span>'), |
Ben Rohlfs | de5c02e | 2022-02-01 12:42:12 +0100 | [diff] [blame] | 67 | [{ranges: [{start: 0, length: 8, className: 'd'}]}] |
Ben Rohlfs | 3bd254b | 2022-02-01 12:37:57 +0100 | [diff] [blame] | 68 | ); |
| 69 | }); |
| 70 | |
Ben Rohlfs | 95e628c | 2022-03-16 14:03:38 +0100 | [diff] [blame] | 71 | test('removal of empty spans', async () => { |
| 72 | assert.deepEqual( |
| 73 | highlightedStringToRanges('asdf<span class="c"></span>asdf'), |
| 74 | [{ranges: []}] |
| 75 | ); |
| 76 | assert.deepEqual( |
| 77 | highlightedStringToRanges( |
| 78 | '<span class="d"></span>\n<span class="d"></span>' |
| 79 | ), |
| 80 | [{ranges: []}, {ranges: []}] |
| 81 | ); |
| 82 | }); |
| 83 | |
Ben Rohlfs | 6af4545 | 2022-04-06 10:31:51 +0200 | [diff] [blame] | 84 | test('removal of duplicate spans', async () => { |
| 85 | assert.deepEqual( |
| 86 | highlightedStringToRanges( |
| 87 | '<span class="d"><span class="d">asdfqwer</span></span>' |
| 88 | ), |
| 89 | [{ranges: [{start: 0, length: 8, className: 'd'}]}] |
| 90 | ); |
| 91 | }); |
| 92 | |
Ben Rohlfs | 3bd254b | 2022-02-01 12:37:57 +0100 | [diff] [blame] | 93 | test('one line, two spans one after another', async () => { |
| 94 | assert.deepEqual( |
| 95 | highlightedStringToRanges( |
| 96 | 'asdf<span class="c">qwer</span>zxcv<span class="d">qwer</span>asdf' |
| 97 | ), |
| 98 | [ |
Ben Rohlfs | de5c02e | 2022-02-01 12:42:12 +0100 | [diff] [blame] | 99 | { |
| 100 | ranges: [ |
| 101 | {start: 4, length: 4, className: 'c'}, |
| 102 | {start: 12, length: 4, className: 'd'}, |
| 103 | ], |
| 104 | }, |
Ben Rohlfs | 3bd254b | 2022-02-01 12:37:57 +0100 | [diff] [blame] | 105 | ] |
| 106 | ); |
| 107 | }); |
| 108 | |
| 109 | test('one line, two nested spans', async () => { |
| 110 | assert.deepEqual( |
| 111 | highlightedStringToRanges( |
| 112 | 'asdf<span class="c">qwer<span class="d">zxcv</span>qwer</span>asdf' |
| 113 | ), |
| 114 | [ |
Ben Rohlfs | de5c02e | 2022-02-01 12:42:12 +0100 | [diff] [blame] | 115 | { |
| 116 | ranges: [ |
| 117 | {start: 4, length: 12, className: 'c'}, |
| 118 | {start: 8, length: 4, className: 'd'}, |
| 119 | ], |
| 120 | }, |
Ben Rohlfs | 3bd254b | 2022-02-01 12:37:57 +0100 | [diff] [blame] | 121 | ] |
| 122 | ); |
| 123 | }); |
| 124 | |
Ben Rohlfs | c21ef2e | 2022-03-17 14:16:06 +0100 | [diff] [blame] | 125 | test('<span> quoted in a string', async () => { |
| 126 | const s = ` |
| 127 | <span class="keyword">const</span> x = <span class="string">'<span class="c">'</span>; |
| 128 | <span class="keyword">const</span> y = <span class="string">'</span>'</span>;`; |
| 129 | |
| 130 | assert.deepEqual(highlightedStringToRanges(s), [ |
| 131 | {ranges: []}, |
| 132 | { |
| 133 | ranges: [ |
| 134 | {start: 0, length: 5, className: 'keyword'}, |
| 135 | {start: 10, length: 18, className: 'string'}, |
| 136 | ], |
| 137 | }, |
| 138 | { |
| 139 | ranges: [ |
| 140 | {start: 0, length: 5, className: 'keyword'}, |
| 141 | {start: 10, length: 9, className: 'string'}, |
| 142 | ], |
| 143 | }, |
| 144 | ]); |
| 145 | }); |
| 146 | |
Ben Rohlfs | c519647 | 2022-03-01 10:26:44 +0100 | [diff] [blame] | 147 | test('one complex line with escaped HTML', async () => { |
| 148 | assert.deepEqual( |
| 149 | highlightedStringToRanges( |
| 150 | ' <span class="tag"><<span class="name">span</span> <span class="attr">class</span>=<span class="string">"title"</span>></span>[[name]]<span class="tag"></<span class="name">span</span>></span>' |
| 151 | ), |
| 152 | [ |
| 153 | { |
| 154 | ranges: [ |
| 155 | // ' <span class="title">[[name]]</span>' |
| 156 | {start: 2, length: 20, className: 'tag'}, |
| 157 | {start: 3, length: 4, className: 'name'}, |
| 158 | {start: 8, length: 5, className: 'attr'}, |
| 159 | {start: 14, length: 7, className: 'string'}, |
| 160 | {start: 30, length: 7, className: 'tag'}, |
| 161 | {start: 32, length: 4, className: 'name'}, |
| 162 | ], |
| 163 | }, |
| 164 | ] |
| 165 | ); |
| 166 | }); |
| 167 | |
Ben Rohlfs | 3bd254b | 2022-02-01 12:37:57 +0100 | [diff] [blame] | 168 | test('two lines, one span each', async () => { |
| 169 | assert.deepEqual( |
| 170 | highlightedStringToRanges( |
| 171 | 'asdf<span class="c">qwer</span>asdf\n' + |
| 172 | 'asd<span class="d">qwe</span>asd' |
| 173 | ), |
| 174 | [ |
Ben Rohlfs | de5c02e | 2022-02-01 12:42:12 +0100 | [diff] [blame] | 175 | {ranges: [{start: 4, length: 4, className: 'c'}]}, |
| 176 | {ranges: [{start: 3, length: 3, className: 'd'}]}, |
Ben Rohlfs | 3bd254b | 2022-02-01 12:37:57 +0100 | [diff] [blame] | 177 | ] |
| 178 | ); |
| 179 | }); |
| 180 | |
| 181 | test('one span over two lines', async () => { |
| 182 | assert.deepEqual( |
| 183 | highlightedStringToRanges( |
| 184 | 'asdf<span class="c">qwer\n' + 'asdf</span>qwer' |
| 185 | ), |
| 186 | [ |
Ben Rohlfs | de5c02e | 2022-02-01 12:42:12 +0100 | [diff] [blame] | 187 | {ranges: [{start: 4, length: 4, className: 'c'}]}, |
| 188 | {ranges: [{start: 0, length: 4, className: 'c'}]}, |
Ben Rohlfs | 3bd254b | 2022-02-01 12:37:57 +0100 | [diff] [blame] | 189 | ] |
| 190 | ); |
| 191 | }); |
| 192 | |
| 193 | test('two spans over two lines', async () => { |
| 194 | assert.deepEqual( |
| 195 | highlightedStringToRanges( |
| 196 | 'asdf<span class="c">qwer<span class="d">zxcv\n' + |
| 197 | 'asdf</span>qwer</span>zxcv' |
| 198 | ), |
| 199 | [ |
Ben Rohlfs | de5c02e | 2022-02-01 12:42:12 +0100 | [diff] [blame] | 200 | { |
| 201 | ranges: [ |
| 202 | {start: 4, length: 8, className: 'c'}, |
| 203 | {start: 8, length: 4, className: 'd'}, |
| 204 | ], |
| 205 | }, |
| 206 | { |
| 207 | ranges: [ |
| 208 | {start: 0, length: 8, className: 'c'}, |
| 209 | {start: 0, length: 4, className: 'd'}, |
| 210 | ], |
| 211 | }, |
Ben Rohlfs | 3bd254b | 2022-02-01 12:37:57 +0100 | [diff] [blame] | 212 | ] |
| 213 | ); |
| 214 | }); |
| 215 | |
| 216 | test('two spans over four lines', async () => { |
| 217 | assert.deepEqual( |
| 218 | highlightedStringToRanges( |
| 219 | 'asdf<span class="c">qwer\n' + |
| 220 | 'asdf<span class="d">qwer\n' + |
| 221 | 'asdf</span>qwer\n' + |
| 222 | 'asdf</span>qwer' |
| 223 | ), |
| 224 | [ |
Ben Rohlfs | de5c02e | 2022-02-01 12:42:12 +0100 | [diff] [blame] | 225 | {ranges: [{start: 4, length: 4, className: 'c'}]}, |
| 226 | { |
| 227 | ranges: [ |
| 228 | {start: 0, length: 8, className: 'c'}, |
| 229 | {start: 4, length: 4, className: 'd'}, |
| 230 | ], |
| 231 | }, |
| 232 | { |
| 233 | ranges: [ |
| 234 | {start: 0, length: 8, className: 'c'}, |
| 235 | {start: 0, length: 4, className: 'd'}, |
| 236 | ], |
| 237 | }, |
| 238 | {ranges: [{start: 0, length: 4, className: 'c'}]}, |
Ben Rohlfs | 3bd254b | 2022-02-01 12:37:57 +0100 | [diff] [blame] | 239 | ] |
| 240 | ); |
| 241 | }); |
| 242 | }); |
| 243 | }); |