blob: 4bf582313094472ef0d6b5638ea6d820323a9602 [file] [log] [blame]
Ben Rohlfs3bd254b2022-02-01 12:37:57 +01001/**
2 * @license
3 * Copyright 2022 Google LLC
4 * SPDX-License-Identifier: Apache-2.0
5 */
Frank Bordene1ba8212022-08-29 15:20:01 +02006import {assert} from '@open-wc/testing';
Frank Bordenbe9451a2022-09-12 15:44:29 +02007import '../test/common-test-setup';
Ben Rohlfsde5c02e2022-02-01 12:42:12 +01008import './syntax-util';
Ben Rohlfs3bd254b2022-02-01 12:37:57 +01009import {
10 highlightedStringToRanges,
11 removeFirstSpan,
12 SpanType,
Ben Rohlfsde5c02e2022-02-01 12:42:12 +010013} from './syntax-util';
Ben Rohlfs3bd254b2022-02-01 12:37:57 +010014
Ben Rohlfsde5c02e2022-02-01 12:42:12 +010015suite('file syntax-util', () => {
Ben Rohlfs3bd254b2022-02-01 12:37:57 +010016 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 Rohlfsde5c02e2022-02-01 12:42:12 +010048 assert.deepEqual(highlightedStringToRanges(''), [{ranges: []}]);
49 assert.deepEqual(highlightedStringToRanges('\n'), [
50 {ranges: []},
51 {ranges: []},
52 ]);
Ben Rohlfs3bd254b2022-02-01 12:37:57 +010053 assert.deepEqual(highlightedStringToRanges('asdf\nasdf\nasdf'), [
Ben Rohlfsde5c02e2022-02-01 12:42:12 +010054 {ranges: []},
55 {ranges: []},
56 {ranges: []},
Ben Rohlfs3bd254b2022-02-01 12:37:57 +010057 ]);
58 });
59
60 test('one line, one span', async () => {
61 assert.deepEqual(
62 highlightedStringToRanges('asdf<span class="c">qwer</span>asdf'),
Ben Rohlfsde5c02e2022-02-01 12:42:12 +010063 [{ranges: [{start: 4, length: 4, className: 'c'}]}]
Ben Rohlfs3bd254b2022-02-01 12:37:57 +010064 );
65 assert.deepEqual(
66 highlightedStringToRanges('<span class="d">asdfqwer</span>'),
Ben Rohlfsde5c02e2022-02-01 12:42:12 +010067 [{ranges: [{start: 0, length: 8, className: 'd'}]}]
Ben Rohlfs3bd254b2022-02-01 12:37:57 +010068 );
69 });
70
Ben Rohlfs95e628c2022-03-16 14:03:38 +010071 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 Rohlfs6af45452022-04-06 10:31:51 +020084 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 Rohlfs3bd254b2022-02-01 12:37:57 +010093 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 Rohlfsde5c02e2022-02-01 12:42:12 +010099 {
100 ranges: [
101 {start: 4, length: 4, className: 'c'},
102 {start: 12, length: 4, className: 'd'},
103 ],
104 },
Ben Rohlfs3bd254b2022-02-01 12:37:57 +0100105 ]
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 Rohlfsde5c02e2022-02-01 12:42:12 +0100115 {
116 ranges: [
117 {start: 4, length: 12, className: 'c'},
118 {start: 8, length: 4, className: 'd'},
119 ],
120 },
Ben Rohlfs3bd254b2022-02-01 12:37:57 +0100121 ]
122 );
123 });
124
Ben Rohlfsc21ef2e2022-03-17 14:16:06 +0100125 test('<span> quoted in a string', async () => {
126 const s = `
127<span class="keyword">const</span> x = <span class="string">&#x27;&lt;span class=&quot;c&quot;&gt;&#x27;</span>;
128<span class="keyword">const</span> y = <span class="string">&#x27;&lt;/span&gt;&#x27;</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 Rohlfsc5196472022-03-01 10:26:44 +0100147 test('one complex line with escaped HTML', async () => {
148 assert.deepEqual(
149 highlightedStringToRanges(
150 ' <span class="tag">&lt;<span class="name">span</span> <span class="attr">class</span>=<span class="string">&quot;title&quot;</span>&gt;</span>[[name]]<span class="tag">&lt;/<span class="name">span</span>&gt;</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 Rohlfs3bd254b2022-02-01 12:37:57 +0100168 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 Rohlfsde5c02e2022-02-01 12:42:12 +0100175 {ranges: [{start: 4, length: 4, className: 'c'}]},
176 {ranges: [{start: 3, length: 3, className: 'd'}]},
Ben Rohlfs3bd254b2022-02-01 12:37:57 +0100177 ]
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 Rohlfsde5c02e2022-02-01 12:42:12 +0100187 {ranges: [{start: 4, length: 4, className: 'c'}]},
188 {ranges: [{start: 0, length: 4, className: 'c'}]},
Ben Rohlfs3bd254b2022-02-01 12:37:57 +0100189 ]
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 Rohlfsde5c02e2022-02-01 12:42:12 +0100200 {
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 Rohlfs3bd254b2022-02-01 12:37:57 +0100212 ]
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 Rohlfsde5c02e2022-02-01 12:42:12 +0100225 {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 Rohlfs3bd254b2022-02-01 12:37:57 +0100239 ]
240 );
241 });
242 });
243});