0
|
1 // CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|
2 // Distributed under an MIT license: https://codemirror.net/5/LICENSE
|
|
3
|
|
4 (function() {
|
|
5 var mode = CodeMirror.getMode({indentUnit: 2}, "soy");
|
|
6 function MT(name) {test.mode(name, mode, Array.prototype.slice.call(arguments, 1));}
|
|
7
|
|
8 // Test of small keywords and words containing them.
|
|
9 MT('keywords-test',
|
|
10 '[keyword {] [keyword as] worrying [keyword and] notorious [keyword as]',
|
|
11 ' the Fandor[operator -]alias assassin, [keyword or]',
|
|
12 ' Corcand cannot fit [keyword in] [keyword }]');
|
|
13
|
|
14 MT('let-test',
|
|
15 '[keyword {template] [def .name][keyword }]',
|
|
16 ' [keyword {let] [def $name]: [string "world"][keyword /}]',
|
|
17 ' [tag&bracket <][tag h1][tag&bracket >]',
|
|
18 ' Hello, [keyword {][variable-2 $name][keyword }]',
|
|
19 ' [tag&bracket </][tag h1][tag&bracket >]',
|
|
20 '[keyword {/template}]',
|
|
21 '');
|
|
22
|
|
23 MT('function-test',
|
|
24 '[keyword {] [callee&variable css]([string "MyClass"])[keyword }]',
|
|
25 '[tag&bracket <][tag input] [attribute value]=[string "]' +
|
|
26 '[keyword {] [callee&variable index]([variable-2&error $list])[keyword }]' +
|
|
27 '[string "][tag&bracket />]');
|
|
28
|
|
29 MT('soy-element-composition-test',
|
|
30 '[keyword <{][callee&variable foo]()[keyword }]',
|
|
31 '[keyword ></>]');
|
|
32
|
|
33 MT('soy-element-composition-attribute-test',
|
|
34 '[keyword <{][callee&variable foo]()[keyword }]',
|
|
35 '[attribute class]=[string "Foo"]',
|
|
36 '[keyword ></>]');
|
|
37
|
|
38 MT('namespace-test',
|
|
39 '[keyword {namespace] [variable namespace][keyword }]')
|
|
40
|
|
41 MT('namespace-with-attribute-test',
|
|
42 '[keyword {namespace] [variable my.namespace.templates] ' +
|
|
43 '[attribute requirecss]=[string "my.namespace"][keyword }]');
|
|
44
|
|
45 MT('operators-test',
|
|
46 '[keyword {] [atom 1] [operator ==] [atom 1] [keyword }]',
|
|
47 '[keyword {] [atom 1] [operator !=] [atom 2] [keyword }]',
|
|
48 '[keyword {] [atom 2] [operator +] [atom 2] [keyword }]',
|
|
49 '[keyword {] [atom 2] [operator -] [atom 2] [keyword }]',
|
|
50 '[keyword {] [atom 2] [operator *] [atom 2] [keyword }]',
|
|
51 '[keyword {] [atom 2] [operator /] [atom 2] [keyword }]',
|
|
52 '[keyword {] [atom 2] [operator %] [atom 2] [keyword }]',
|
|
53 '[keyword {] [atom 2] [operator <=] [atom 2] [keyword }]',
|
|
54 '[keyword {] [atom 2] [operator >=] [atom 2] [keyword }]',
|
|
55 '[keyword {] [atom 3] [operator >] [atom 2] [keyword }]',
|
|
56 '[keyword {] [atom 2] [operator >] [atom 3] [keyword }]',
|
|
57 '[keyword {] [atom null] [operator ?:] [string ""] [keyword }]',
|
|
58 '[keyword {] [variable-2&error $variable] [operator |] safeHtml [keyword }]')
|
|
59
|
|
60 MT('primitive-test',
|
|
61 '[keyword {] [atom true] [keyword }]',
|
|
62 '[keyword {] [atom false] [keyword }]',
|
|
63 '[keyword {] truethy [keyword }]',
|
|
64 '[keyword {] falsey [keyword }]',
|
|
65 '[keyword {] [atom 42] [keyword }]',
|
|
66 '[keyword {] [atom .42] [keyword }]',
|
|
67 '[keyword {] [atom 0.42] [keyword }]',
|
|
68 '[keyword {] [atom -0.42] [keyword }]',
|
|
69 '[keyword {] [atom -.2] [keyword }]',
|
|
70 '[keyword {] [atom 6.03e23] [keyword }]',
|
|
71 '[keyword {] [atom -0.03e0] [keyword }]',
|
|
72 '[keyword {] [atom 0x1F] [keyword }]',
|
|
73 '[keyword {] [atom 0x1F00BBEA] [keyword }]');
|
|
74
|
|
75 MT('param-type-record',
|
|
76 '[keyword {@param] [def record]: [[[property foo]: [type bool], [property bar]: [type int] ]][keyword }]'
|
|
77 );
|
|
78
|
|
79 MT('param-type-map',
|
|
80 '[keyword {@param] [def unknown]: [type map]<[type string], [type bool]>[keyword }]'
|
|
81 );
|
|
82
|
|
83 MT('param-type-list',
|
|
84 '[keyword {@param] [def list]: [type list]<[type ?]>[keyword }]'
|
|
85 );
|
|
86
|
|
87 MT('param-type-any',
|
|
88 '[keyword {@param] [def unknown]: [type ?][keyword }]'
|
|
89 );
|
|
90
|
|
91 MT('param-type-nested',
|
|
92 '[keyword {@param] [def a]: ' +
|
|
93 '[type list]<[[[property a]: [type int], ' +
|
|
94 '[property b]: [type map]<[type string], ' +
|
|
95 '[type bool]>]]>][keyword }]');
|
|
96
|
|
97 MT('undefined-var',
|
|
98 '[keyword {][variable-2&error $var]');
|
|
99
|
|
100 MT('param-scope-test',
|
|
101 '[keyword {template] [def .a][keyword }]',
|
|
102 ' [keyword {@param] [def x]: [type string][keyword }]',
|
|
103 ' [keyword {][variable-2 $x][keyword }]',
|
|
104 '[keyword {/template}]',
|
|
105 '',
|
|
106 '[keyword {template] [def .b][keyword }]',
|
|
107 ' [keyword {][variable-2&error $x][keyword }]',
|
|
108 '[keyword {/template}]',
|
|
109 '');
|
|
110
|
|
111 MT('if-variable-test',
|
|
112 '[keyword {if] [variable-2&error $showThing][keyword }]',
|
|
113 ' Yo!',
|
|
114 '[keyword {/if}]',
|
|
115 '');
|
|
116
|
|
117 MT('defined-if-variable-test',
|
|
118 '[keyword {template] [def .foo][keyword }]',
|
|
119 ' [keyword {@param?] [def showThing]: [type bool][keyword }]',
|
|
120 ' [keyword {if] [variable-2 $showThing][keyword }]',
|
|
121 ' Yo!',
|
|
122 ' [keyword {/if}]',
|
|
123 '[keyword {/template}]',
|
|
124 '');
|
|
125
|
|
126 MT('template-calls-test',
|
|
127 '[keyword {call] [variable-2 .foo][keyword /}]',
|
|
128 '[keyword {call] [variable foo][keyword /}]',
|
|
129 '[keyword {call] [variable foo][keyword }] [keyword {/call}]',
|
|
130 '[keyword {call] [variable first1.second.third_3][keyword /}]',
|
|
131 '[keyword {call] [variable first1.second.third_3] [keyword }] [keyword {/call}]',
|
|
132 '');
|
|
133
|
|
134 MT('foreach-scope-test',
|
|
135 '[keyword {@param] [def bar]: [type string][keyword }]',
|
|
136 '[keyword {foreach] [def $foo] [keyword in] [variable-2&error $foos][keyword }]',
|
|
137 ' [keyword {][variable-2 $foo][keyword }]',
|
|
138 '[keyword {/foreach}]',
|
|
139 '[keyword {][variable-2&error $foo][keyword }]',
|
|
140 '[keyword {][variable-2 $bar][keyword }]');
|
|
141
|
|
142 MT('foreach-ifempty-indent-test',
|
|
143 '[keyword {foreach] [def $foo] [keyword in] [variable-2&error $foos][keyword }]',
|
|
144 ' something',
|
|
145 '[keyword {ifempty}]',
|
|
146 ' nothing',
|
|
147 '[keyword {/foreach}]',
|
|
148 '');
|
|
149
|
|
150 MT('foreach-index',
|
|
151 '[keyword {foreach] [def $foo],[def $index] [keyword in] [[]] [keyword }]',
|
|
152 ' [keyword {][variable-2 $foo][keyword }] [keyword {][variable-2 $index][keyword }]',
|
|
153 '[keyword {/foreach}]');
|
|
154
|
|
155 MT('nested-kind-test',
|
|
156 '[keyword {template] [def .foo] [attribute kind]=[string "html"][keyword }]',
|
|
157 ' [tag&bracket <][tag div][tag&bracket >]',
|
|
158 ' [keyword {call] [variable-2 .bar][keyword }]',
|
|
159 ' [keyword {param] [property propertyName] [attribute kind]=[string "js"][keyword }]',
|
|
160 ' [keyword var] [def bar] [operator =] [number 5];',
|
|
161 ' [keyword {/param}]',
|
|
162 ' [keyword {/call}]',
|
|
163 ' [tag&bracket </][tag div][tag&bracket >]',
|
|
164 '[keyword {/template}]',
|
|
165 '');
|
|
166
|
|
167 MT('tag-starting-with-function-call-is-not-a-keyword',
|
|
168 '[keyword {][callee&variable index]([variable-2&error $foo])[keyword }]',
|
|
169 '[keyword {css] [string "some-class"][keyword }]',
|
|
170 '[keyword {][callee&variable css]([string "some-class"])[keyword }]',
|
|
171 '');
|
|
172
|
|
173 MT('allow-missing-colon-in-@param',
|
|
174 '[keyword {template] [def .foo][keyword }]',
|
|
175 ' [keyword {@param] [def showThing] [type bool][keyword }]',
|
|
176 ' [keyword {if] [variable-2 $showThing][keyword }]',
|
|
177 ' Yo!',
|
|
178 ' [keyword {/if}]',
|
|
179 '[keyword {/template}]',
|
|
180 '');
|
|
181
|
|
182 MT('param-type-and-default-value',
|
|
183 '[keyword {template] [def .foo][keyword }]',
|
|
184 ' [keyword {@param] [def bar]: [type bool] = [atom true][keyword }]',
|
|
185 '[keyword {/template}]',
|
|
186 '');
|
|
187
|
|
188 MT('attribute-type',
|
|
189 '[keyword {template] [def .foo][keyword }]',
|
|
190 ' [keyword {@attribute] [def bar]: [type string][keyword }]',
|
|
191 '[keyword {/template}]',
|
|
192 '');
|
|
193
|
|
194 MT('attribute-type-optional',
|
|
195 '[keyword {template] [def .foo][keyword }]',
|
|
196 ' [keyword {@attribute] [def bar]: [type string][keyword }]',
|
|
197 '[keyword {/template}]',
|
|
198 '');
|
|
199
|
|
200 MT('attribute-type-all',
|
|
201 '[keyword {template] [def .foo][keyword }]',
|
|
202 ' [keyword {@attribute] [type *][keyword }]',
|
|
203 '[keyword {/template}]',
|
|
204 '');
|
|
205
|
|
206 MT('state-variable-reference',
|
|
207 '[keyword {template] [def .foo][keyword }]',
|
|
208 ' [keyword {@param] [def bar]:= [atom true][keyword }]',
|
|
209 ' [keyword {@state] [def foobar]:= [variable-2 $bar][keyword }]',
|
|
210 '[keyword {/template}]',
|
|
211 '');
|
|
212
|
|
213 MT('param-type-template',
|
|
214 '[keyword {template] [def .foo][keyword }]',
|
|
215 ' [keyword {@param] [def renderer]: ([def s]:[type string])=>[type html][keyword }]',
|
|
216 ' [keyword {call] [variable-2 $renderer] [keyword /}]',
|
|
217 '[keyword {/template}]',
|
|
218 '');
|
|
219
|
|
220 MT('single-quote-strings',
|
|
221 '[keyword {][string "foo"] [string \'bar\'][keyword }]',
|
|
222 '');
|
|
223
|
|
224 MT('literal-comments',
|
|
225 '[keyword {literal}]/* comment */ // comment[keyword {/literal}]');
|
|
226
|
|
227 MT('highlight-command-at-eol',
|
|
228 '[keyword {msg]',
|
|
229 ' [keyword }]');
|
|
230
|
|
231 MT('switch-indent-test',
|
|
232 '[keyword {let] [def $marbles]: [atom 5] [keyword /}]',
|
|
233 '[keyword {switch] [variable-2 $marbles][keyword }]',
|
|
234 ' [keyword {case] [atom 0][keyword }]',
|
|
235 ' No marbles',
|
|
236 ' [keyword {default}]',
|
|
237 ' At least 1 marble',
|
|
238 '[keyword {/switch}]',
|
|
239 '');
|
|
240
|
|
241 MT('if-elseif-else-indent',
|
|
242 '[keyword {if] [atom true][keyword }]',
|
|
243 ' [keyword {let] [def $a]: [atom 5] [keyword /}]',
|
|
244 '[keyword {elseif] [atom false][keyword }]',
|
|
245 ' [keyword {let] [def $bar]: [atom 5] [keyword /}]',
|
|
246 '[keyword {else}]',
|
|
247 ' [keyword {let] [def $bar]: [atom 5] [keyword /}]',
|
|
248 '[keyword {/if}]');
|
|
249
|
|
250 MT('msg-fallbackmsg-indent',
|
|
251 '[keyword {msg] [attribute desc]=[string "A message"][keyword }]',
|
|
252 ' A message',
|
|
253 '[keyword {fallbackmsg] [attribute desc]=[string "A message"][keyword }]',
|
|
254 ' Old message',
|
|
255 '[keyword {/msg}]');
|
|
256
|
|
257 MT('literal-indent',
|
|
258 '[keyword {template] [def .name][keyword }]',
|
|
259 ' [keyword {literal}]',
|
|
260 ' Lerum',
|
|
261 ' [keyword {/literal}]',
|
|
262 ' Ipsum',
|
|
263 '[keyword {/template}]');
|
|
264
|
|
265 MT('special-chars',
|
|
266 '[keyword {sp}]',
|
|
267 '[keyword {nil}]',
|
|
268 '[keyword {\\r}]',
|
|
269 '[keyword {\\n}]',
|
|
270 '[keyword {\\t}]',
|
|
271 '[keyword {lb}]',
|
|
272 '[keyword {rb}]');
|
|
273
|
|
274 MT('let-list-literal',
|
|
275 '[keyword {let] [def $test]: [[[[[string \'a\'] ], [[[string \'b\'] ] ] [keyword /}]');
|
|
276
|
|
277 MT('let-record-literal',
|
|
278 '[keyword {let] [def $test]: [keyword record]([property test]: [callee&variable bidiGlobalDir](), ' +
|
|
279 '[property foo]: [atom 5]) [keyword /}]');
|
|
280
|
|
281 MT('let-map-literal',
|
|
282 '[keyword {let] [def $test]: [keyword map]([string \'outer\']: [keyword map]([atom 5]: [atom false]), ' +
|
|
283 '[string \'foo\']: [string \'bar\']) [keyword /}]');
|
|
284
|
|
285 MT('wrong-closing-tag',
|
|
286 '[keyword {if] [atom true][keyword }]',
|
|
287 ' Optional',
|
|
288 '[keyword&error {/badend][keyword }]');
|
|
289
|
|
290 MT('list-comprehension',
|
|
291 '[keyword {let] [def $myList]: [[[[[string \'a\'] ] ] [keyword /}] ' +
|
|
292 '[keyword {let] [def $test]: [[[variable $a] [operator +] [atom 1] [keyword for] ' +
|
|
293 '[def $a] [keyword in] [variable-2 $myList] [keyword if] [variable-2 $a] [operator >=] [atom 3] ] [keyword /}]');
|
|
294
|
|
295 MT('list-comprehension-index',
|
|
296 '[keyword {let] [def $test]: [[[variable $a] [operator +] [variable $index] [keyword for] ' +
|
|
297 '[def $a],[def $index] [keyword in] [[]] [keyword if] [variable-2 $a] [operator >=] [variable-2 $index] ] [keyword /}]');
|
|
298
|
|
299
|
|
300 MT('list-comprehension-variable-scope',
|
|
301 '[keyword {let] [def $name]: [string "world"][keyword /}]',
|
|
302 '[keyword {let] [def $test]: [[[variable $a] [operator +] [variable $index] [keyword for] ' +
|
|
303 '[def $a],[def $index] [keyword in] [[]] [keyword if] [variable-2 $a] [operator >=] [variable-2 $index] ] [keyword /}]',
|
|
304 '[keyword {][variable-2&error $a][keyword }]',
|
|
305 '[keyword {][variable-2&error $index][keyword }]',
|
|
306 '[keyword {][variable-2 $test][keyword }]',
|
|
307 '[keyword {][variable-2 $name][keyword }]');
|
|
308
|
|
309 MT('import',
|
|
310 '[keyword import] {[def Name], [variable Person] [keyword as] [def P]} [keyword from] [string \'examples/proto/example.proto\'];');
|
|
311
|
|
312 MT('velog',
|
|
313 '[keyword {velog] [variable-2&error $data][keyword }] Logged [keyword {/velog}]');
|
|
314
|
|
315 MT('extern', '[keyword {extern] [def renderer]: ([def s]:[type string])=>[type string][keyword }] [keyword {/extern}]');
|
|
316
|
|
317 MT('export extern', '[keyword {export] [keyword extern] [def renderer]: ([def s]:[type string])=>[type string][keyword }] [keyword {/extern}]');
|
|
318
|
|
319 MT('const',
|
|
320 '[keyword {const] [def FOO] = [atom 5] [keyword /}]',
|
|
321 '[keyword {export] [keyword const] [def FOO] = [atom 5] [keyword /}]');
|
|
322 })();
|