OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. |
| 4 |
| 5 library compiler_test; |
| 6 |
| 7 import 'dart:convert'; |
| 8 import 'package:test/test.dart'; |
| 9 import 'package:csslib/parser.dart'; |
| 10 import 'package:csslib/visitor.dart'; |
| 11 import 'testing.dart'; |
| 12 |
| 13 void testClass() { |
| 14 var errors = []; |
| 15 var input = ".foobar {}"; |
| 16 var stylesheet = parseCss(input, errors: errors); |
| 17 |
| 18 expect(stylesheet != null, true); |
| 19 expect(errors.isEmpty, true, reason: errors.toString()); |
| 20 |
| 21 walkTree(stylesheet); |
| 22 |
| 23 expect(stylesheet.topLevels.length, 1); |
| 24 |
| 25 expect(stylesheet.topLevels[0] is RuleSet, true); |
| 26 |
| 27 var ruleset = stylesheet.topLevels[0]; |
| 28 expect(ruleset.selectorGroup.selectors.length, 1); |
| 29 expect(ruleset.declarationGroup.declarations.length, 0); |
| 30 |
| 31 var selectorSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; |
| 32 expect(selectorSeqs.length, 1); |
| 33 final simpSelector = selectorSeqs[0].simpleSelector; |
| 34 expect(simpSelector is ClassSelector, true); |
| 35 expect(selectorSeqs[0].isCombinatorNone, true); |
| 36 expect(simpSelector.name, "foobar"); |
| 37 } |
| 38 |
| 39 void testClass2() { |
| 40 var errors = []; |
| 41 var input = ".foobar .bar .no-story {}"; |
| 42 var stylesheet = parseCss(input, errors: errors); |
| 43 |
| 44 expect(stylesheet != null, true); |
| 45 expect(errors.isEmpty, true, reason: errors.toString()); |
| 46 |
| 47 walkTree(stylesheet); |
| 48 |
| 49 expect(stylesheet.topLevels.length, 1); |
| 50 |
| 51 expect(stylesheet.topLevels[0] is RuleSet, true); |
| 52 var ruleset = stylesheet.topLevels[0]; |
| 53 expect(ruleset.selectorGroup.selectors.length, 1); |
| 54 expect(ruleset.declarationGroup.declarations.length, 0); |
| 55 |
| 56 var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; |
| 57 expect(simpleSeqs.length, 3); |
| 58 |
| 59 var simpSelector0 = simpleSeqs[0].simpleSelector; |
| 60 expect(simpSelector0 is ClassSelector, true); |
| 61 expect(simpleSeqs[0].isCombinatorNone, true); |
| 62 expect(simpSelector0.name, "foobar"); |
| 63 |
| 64 var simpSelector1 = simpleSeqs[1].simpleSelector; |
| 65 expect(simpSelector1 is ClassSelector, true); |
| 66 expect(simpleSeqs[1].isCombinatorDescendant, true); |
| 67 expect(simpSelector1.name, "bar"); |
| 68 |
| 69 var simpSelector2 = simpleSeqs[2].simpleSelector; |
| 70 expect(simpSelector2 is ClassSelector, true); |
| 71 expect(simpleSeqs[2].isCombinatorDescendant, true); |
| 72 expect(simpSelector2.name, "no-story"); |
| 73 } |
| 74 |
| 75 void testId() { |
| 76 var errors = []; |
| 77 var input = "#elemId {}"; |
| 78 var stylesheet = parseCss(input, errors: errors); |
| 79 |
| 80 expect(stylesheet != null, true); |
| 81 expect(errors.isEmpty, true, reason: errors.toString()); |
| 82 |
| 83 walkTree(stylesheet); |
| 84 |
| 85 expect(stylesheet.topLevels.length, 1); |
| 86 |
| 87 expect(stylesheet.topLevels[0] is RuleSet, true); |
| 88 var ruleset = stylesheet.topLevels[0]; |
| 89 expect(ruleset.selectorGroup.selectors.length, 1); |
| 90 expect(ruleset.declarationGroup.declarations.length, 0); |
| 91 |
| 92 var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; |
| 93 |
| 94 expect(simpleSeqs.length, 1); |
| 95 var simpSelector = simpleSeqs[0].simpleSelector; |
| 96 expect(simpSelector is IdSelector, true); |
| 97 expect(simpleSeqs[0].isCombinatorNone, true); |
| 98 expect(simpSelector.name, "elemId"); |
| 99 } |
| 100 |
| 101 void testElement() { |
| 102 var errors = []; |
| 103 var input = "div {}"; |
| 104 var stylesheet = parseCss(input, errors: errors); |
| 105 |
| 106 expect(stylesheet != null, true); |
| 107 expect(errors.isEmpty, true, reason: errors.toString()); |
| 108 |
| 109 walkTree(stylesheet); |
| 110 |
| 111 expect(stylesheet.topLevels.length, 1); |
| 112 |
| 113 expect(stylesheet.topLevels[0] is RuleSet, true); |
| 114 var ruleset = stylesheet.topLevels[0]; |
| 115 expect(ruleset.selectorGroup.selectors.length, 1); |
| 116 expect(ruleset.declarationGroup.declarations.length, 0); |
| 117 |
| 118 var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; |
| 119 |
| 120 expect(simpleSeqs.length, 1); |
| 121 |
| 122 final simpSelector = simpleSeqs[0].simpleSelector; |
| 123 expect(simpSelector is ElementSelector, true); |
| 124 expect(simpleSeqs[0].isCombinatorNone, true); |
| 125 expect(simpSelector.name, "div"); |
| 126 |
| 127 input = "div div span {}"; |
| 128 stylesheet = parseCss(input, errors: errors..clear()); |
| 129 |
| 130 expect(stylesheet != null, true); |
| 131 expect(errors.isEmpty, true, reason: errors.toString()); |
| 132 |
| 133 walkTree(stylesheet); |
| 134 |
| 135 expect(stylesheet.topLevels.length, 1); |
| 136 |
| 137 expect(stylesheet.topLevels[0] is RuleSet, true); |
| 138 ruleset = stylesheet.topLevels[0]; |
| 139 expect(ruleset.selectorGroup.selectors.length, 1); |
| 140 expect(ruleset.declarationGroup.declarations.length, 0); |
| 141 |
| 142 simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; |
| 143 |
| 144 expect(simpleSeqs.length, 3); |
| 145 |
| 146 var simpSelector0 = simpleSeqs[0].simpleSelector; |
| 147 expect(simpSelector0 is ElementSelector, true); |
| 148 expect(simpleSeqs[0].isCombinatorNone, true); |
| 149 expect(simpSelector0.name, "div"); |
| 150 |
| 151 var simpSelector1 = simpleSeqs[1].simpleSelector; |
| 152 expect(simpSelector1 is ElementSelector, true); |
| 153 expect(simpleSeqs[1].isCombinatorDescendant, true); |
| 154 expect(simpSelector1.name, "div"); |
| 155 |
| 156 var simpSelector2 = simpleSeqs[2].simpleSelector; |
| 157 expect(simpSelector2 is ElementSelector, true); |
| 158 expect(simpleSeqs[2].isCombinatorDescendant, true); |
| 159 expect(simpSelector2.name, "span"); |
| 160 } |
| 161 |
| 162 void testNamespace() { |
| 163 var errors = []; |
| 164 var input = "ns1|div {}"; |
| 165 var stylesheet = parseCss(input, errors: errors); |
| 166 |
| 167 expect(stylesheet != null, true); |
| 168 expect(errors.isEmpty, true, reason: errors.toString()); |
| 169 |
| 170 walkTree(stylesheet); |
| 171 |
| 172 expect(stylesheet.topLevels.length, 1); |
| 173 |
| 174 expect(stylesheet.topLevels[0] is RuleSet, true); |
| 175 var ruleset = stylesheet.topLevels[0]; |
| 176 expect(ruleset.selectorGroup.selectors.length, 1); |
| 177 expect(ruleset.declarationGroup.declarations.length, 0); |
| 178 |
| 179 var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; |
| 180 |
| 181 expect(simpleSeqs.length, 1); |
| 182 var simpSelector = simpleSeqs[0].simpleSelector; |
| 183 expect(simpSelector is NamespaceSelector, true); |
| 184 expect(simpleSeqs[0].isCombinatorNone, true); |
| 185 expect(simpSelector.isNamespaceWildcard, false); |
| 186 expect(simpSelector.namespace, "ns1"); |
| 187 var elementSelector = simpSelector.nameAsSimpleSelector; |
| 188 expect(elementSelector is ElementSelector, true); |
| 189 expect(elementSelector.isWildcard, false); |
| 190 expect(elementSelector.name, "div"); |
| 191 } |
| 192 |
| 193 void testNamespace2() { |
| 194 var errors = []; |
| 195 var input = "ns1|div div ns2|span .foobar {}"; |
| 196 var stylesheet = parseCss(input, errors: errors); |
| 197 |
| 198 expect(stylesheet != null, true); |
| 199 expect(errors.isEmpty, true, reason: errors.toString()); |
| 200 |
| 201 walkTree(stylesheet); |
| 202 |
| 203 expect(stylesheet.topLevels.length, 1); |
| 204 |
| 205 expect(stylesheet.topLevels[0] is RuleSet, true); |
| 206 var ruleset = stylesheet.topLevels[0]; |
| 207 expect(ruleset.selectorGroup.selectors.length, 1); |
| 208 expect(ruleset.declarationGroup.declarations.length, 0); |
| 209 |
| 210 var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; |
| 211 |
| 212 expect(simpleSeqs.length, 4); |
| 213 |
| 214 var simpSelector0 = simpleSeqs[0].simpleSelector; |
| 215 expect(simpSelector0 is NamespaceSelector, true); |
| 216 expect(simpleSeqs[0].isCombinatorNone, true); |
| 217 expect(simpSelector0.namespace, "ns1"); |
| 218 var elementSelector0 = simpSelector0.nameAsSimpleSelector; |
| 219 expect(elementSelector0 is ElementSelector, true); |
| 220 expect(elementSelector0.isWildcard, false); |
| 221 expect(elementSelector0.name, "div"); |
| 222 |
| 223 var simpSelector1 = simpleSeqs[1].simpleSelector; |
| 224 expect(simpSelector1 is ElementSelector, true); |
| 225 expect(simpleSeqs[1].isCombinatorDescendant, true); |
| 226 expect(simpSelector1.name, "div"); |
| 227 |
| 228 var simpSelector2 = simpleSeqs[2].simpleSelector; |
| 229 expect(simpSelector2 is NamespaceSelector, true); |
| 230 expect(simpleSeqs[2].isCombinatorDescendant, true); |
| 231 expect(simpSelector2.namespace, "ns2"); |
| 232 var elementSelector2 = simpSelector2.nameAsSimpleSelector; |
| 233 expect(elementSelector2 is ElementSelector, true); |
| 234 expect(elementSelector2.isWildcard, false); |
| 235 expect(elementSelector2.name, "span"); |
| 236 |
| 237 var simpSelector3 = simpleSeqs[3].simpleSelector; |
| 238 expect(simpSelector3 is ClassSelector, true); |
| 239 expect(simpleSeqs[3].isCombinatorDescendant, true); |
| 240 expect(simpSelector3.name, "foobar"); |
| 241 } |
| 242 |
| 243 void testSelectorGroups() { |
| 244 var errors = []; |
| 245 var input = |
| 246 "div, .foobar ,#elemId, .xyzzy .test, ns1|div div #elemId .foobar {}"; |
| 247 var stylesheet = parseCss(input, errors: errors); |
| 248 |
| 249 expect(stylesheet != null, true); |
| 250 expect(errors.isEmpty, true, reason: errors.toString()); |
| 251 |
| 252 walkTree(stylesheet); |
| 253 |
| 254 expect(stylesheet.topLevels.length, 1); |
| 255 |
| 256 expect(stylesheet.topLevels[0] is RuleSet, true); |
| 257 var ruleset = stylesheet.topLevels[0]; |
| 258 expect(ruleset.selectorGroup.selectors.length, 5); |
| 259 expect(ruleset.declarationGroup.declarations.length, 0); |
| 260 |
| 261 var groupSelector0 = ruleset.selectorGroup.selectors[0]; |
| 262 expect(groupSelector0.simpleSelectorSequences.length, 1); |
| 263 var selector0 = groupSelector0.simpleSelectorSequences[0]; |
| 264 var simpleSelector0 = selector0.simpleSelector; |
| 265 expect(simpleSelector0 is ElementSelector, true); |
| 266 expect(selector0.isCombinatorNone, true); |
| 267 expect(simpleSelector0.name, "div"); |
| 268 |
| 269 var groupSelector1 = ruleset.selectorGroup.selectors[1]; |
| 270 expect(groupSelector1.simpleSelectorSequences.length, 1); |
| 271 var selector1 = groupSelector1.simpleSelectorSequences[0]; |
| 272 var simpleSelector1 = selector1.simpleSelector; |
| 273 expect(simpleSelector1 is ClassSelector, true); |
| 274 expect(selector1.isCombinatorNone, true); |
| 275 expect(simpleSelector1.name, "foobar"); |
| 276 |
| 277 var groupSelector2 = ruleset.selectorGroup.selectors[2]; |
| 278 expect(groupSelector2.simpleSelectorSequences.length, 1); |
| 279 var selector2 = groupSelector2.simpleSelectorSequences[0]; |
| 280 var simpleSelector2 = selector2.simpleSelector; |
| 281 expect(simpleSelector2 is IdSelector, true); |
| 282 expect(selector2.isCombinatorNone, true); |
| 283 expect(simpleSelector2.name, "elemId"); |
| 284 |
| 285 var groupSelector3 = ruleset.selectorGroup.selectors[3]; |
| 286 expect(groupSelector3.simpleSelectorSequences.length, 2); |
| 287 |
| 288 var selector30 = groupSelector3.simpleSelectorSequences[0]; |
| 289 var simpleSelector30 = selector30.simpleSelector; |
| 290 expect(simpleSelector30 is ClassSelector, true); |
| 291 expect(selector30.isCombinatorNone, true); |
| 292 expect(simpleSelector30.name, "xyzzy"); |
| 293 |
| 294 var selector31 = groupSelector3.simpleSelectorSequences[1]; |
| 295 var simpleSelector31 = selector31.simpleSelector; |
| 296 expect(simpleSelector31 is ClassSelector, true); |
| 297 expect(selector31.isCombinatorDescendant, true); |
| 298 expect(simpleSelector31.name, "test"); |
| 299 |
| 300 var groupSelector4 = ruleset.selectorGroup.selectors[4]; |
| 301 expect(groupSelector4.simpleSelectorSequences.length, 4); |
| 302 |
| 303 var selector40 = groupSelector4.simpleSelectorSequences[0]; |
| 304 var simpleSelector40 = selector40.simpleSelector; |
| 305 expect(simpleSelector40 is NamespaceSelector, true); |
| 306 expect(selector40.isCombinatorNone, true); |
| 307 expect(simpleSelector40.namespace, "ns1"); |
| 308 var elementSelector = simpleSelector40.nameAsSimpleSelector; |
| 309 expect(elementSelector is ElementSelector, true); |
| 310 expect(elementSelector.isWildcard, false); |
| 311 expect(elementSelector.name, "div"); |
| 312 |
| 313 var selector41 = groupSelector4.simpleSelectorSequences[1]; |
| 314 var simpleSelector41 = selector41.simpleSelector; |
| 315 expect(simpleSelector41 is ElementSelector, true); |
| 316 expect(selector41.isCombinatorDescendant, true); |
| 317 expect(simpleSelector41.name, "div"); |
| 318 |
| 319 var selector42 = groupSelector4.simpleSelectorSequences[2]; |
| 320 var simpleSelector42 = selector42.simpleSelector; |
| 321 expect(simpleSelector42 is IdSelector, true); |
| 322 expect(selector42.isCombinatorDescendant, true); |
| 323 expect(simpleSelector42.name, "elemId"); |
| 324 |
| 325 var selector43 = groupSelector4.simpleSelectorSequences[3]; |
| 326 var simpleSelector43 = selector43.simpleSelector; |
| 327 expect(selector43.isCombinatorDescendant, true); |
| 328 expect(simpleSelector43.name, "foobar"); |
| 329 } |
| 330 |
| 331 void testCombinator() { |
| 332 var errors = []; |
| 333 var input = ".foobar > .bar + .no-story ~ myNs|div #elemId {}"; |
| 334 var stylesheet = parseCss(input, errors: errors); |
| 335 |
| 336 expect(stylesheet != null, true); |
| 337 expect(errors.isEmpty, true, reason: errors.toString()); |
| 338 |
| 339 walkTree(stylesheet); |
| 340 |
| 341 expect(stylesheet.topLevels.length, 1); |
| 342 |
| 343 expect(stylesheet.topLevels[0] is RuleSet, true); |
| 344 var ruleset = stylesheet.topLevels[0]; |
| 345 expect(ruleset.selectorGroup.selectors.length, 1); |
| 346 expect(ruleset.declarationGroup.declarations.length, 0); |
| 347 |
| 348 var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; |
| 349 |
| 350 expect(simpleSeqs.length, 5); |
| 351 |
| 352 var selector0 = simpleSeqs[0]; |
| 353 var simpleSelector0 = selector0.simpleSelector; |
| 354 expect(simpleSelector0 is ClassSelector, true); |
| 355 expect(selector0.isCombinatorNone, true); |
| 356 expect(simpleSelector0.name, "foobar"); |
| 357 |
| 358 var selector1 = simpleSeqs[1]; |
| 359 var simpleSelector1 = selector1.simpleSelector; |
| 360 expect(simpleSelector1 is ClassSelector, true); |
| 361 expect(selector1.isCombinatorGreater, true); |
| 362 expect(simpleSelector1.name, "bar"); |
| 363 |
| 364 var selector2 = simpleSeqs[2]; |
| 365 var simpleSelector2 = selector2.simpleSelector; |
| 366 expect(simpleSelector2 is ClassSelector, true); |
| 367 expect(selector2.isCombinatorPlus, true); |
| 368 expect(simpleSelector2.name, "no-story"); |
| 369 |
| 370 var selector3 = simpleSeqs[3]; |
| 371 var simpleSelector3 = selector3.simpleSelector; |
| 372 expect(simpleSelector3 is NamespaceSelector, true); |
| 373 expect(selector3.isCombinatorTilde, true); |
| 374 expect(simpleSelector3.namespace, "myNs"); |
| 375 var elementSelector = simpleSelector3.nameAsSimpleSelector; |
| 376 expect(elementSelector is ElementSelector, true); |
| 377 expect(elementSelector.isWildcard, false); |
| 378 expect(elementSelector.name, "div"); |
| 379 |
| 380 var selector4 = simpleSeqs[4]; |
| 381 var simpleSelector4 = selector4.simpleSelector; |
| 382 expect(simpleSelector4 is IdSelector, true); |
| 383 expect(selector4.isCombinatorDescendant, true); |
| 384 expect(simpleSelector4.name, "elemId"); |
| 385 } |
| 386 |
| 387 void testWildcard() { |
| 388 var errors = []; |
| 389 var input = "* {}"; |
| 390 var stylesheet = parseCss(input, errors: errors); |
| 391 |
| 392 expect(stylesheet != null, true); |
| 393 expect(errors.isEmpty, true, reason: errors.toString()); |
| 394 |
| 395 walkTree(stylesheet); |
| 396 |
| 397 expect(stylesheet.topLevels.length, 1); |
| 398 |
| 399 expect(stylesheet.topLevels[0] is RuleSet, true); |
| 400 var ruleset = stylesheet.topLevels[0]; |
| 401 expect(ruleset.selectorGroup.selectors.length, 1); |
| 402 expect(ruleset.declarationGroup.declarations.length, 0); |
| 403 |
| 404 var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; |
| 405 |
| 406 expect(simpleSeqs.length, 1); |
| 407 var simpSelector = simpleSeqs[0].simpleSelector; |
| 408 expect(simpSelector is ElementSelector, true); |
| 409 expect(simpleSeqs[0].isCombinatorNone, true); |
| 410 expect(simpSelector.isWildcard, true); |
| 411 expect(simpSelector.name, "*"); |
| 412 |
| 413 input = "*.foobar {}"; |
| 414 stylesheet = parseCss(input, errors: errors..clear()); |
| 415 |
| 416 expect(stylesheet != null, true); |
| 417 expect(errors.isEmpty, true, reason: errors.toString()); |
| 418 |
| 419 walkTree(stylesheet); |
| 420 |
| 421 expect(stylesheet.topLevels.length, 1); |
| 422 |
| 423 expect(stylesheet.topLevels[0] is RuleSet, true); |
| 424 ruleset = stylesheet.topLevels[0]; |
| 425 expect(ruleset.selectorGroup.selectors.length, 1); |
| 426 expect(ruleset.declarationGroup.declarations.length, 0); |
| 427 |
| 428 simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; |
| 429 |
| 430 expect(simpleSeqs.length, 2); |
| 431 |
| 432 var selector0 = simpleSeqs[0]; |
| 433 var simpleSelector0 = selector0.simpleSelector; |
| 434 expect(simpleSelector0 is ElementSelector, true); |
| 435 expect(selector0.isCombinatorNone, true); |
| 436 expect(simpleSelector0.isWildcard, true); |
| 437 expect(simpleSelector0.name, "*"); |
| 438 |
| 439 var selector1 = simpleSeqs[1]; |
| 440 var simpleSelector1 = selector1.simpleSelector; |
| 441 expect(simpleSelector1 is ClassSelector, true); |
| 442 expect(selector1.isCombinatorNone, true); |
| 443 expect(simpleSelector1.name, "foobar"); |
| 444 |
| 445 input = "myNs|*.foobar {}"; |
| 446 stylesheet = parseCss(input, errors: errors..clear()); |
| 447 |
| 448 expect(stylesheet != null, true); |
| 449 expect(errors.isEmpty, true, reason: errors.toString()); |
| 450 |
| 451 walkTree(stylesheet); |
| 452 |
| 453 expect(stylesheet.topLevels.length, 1); |
| 454 |
| 455 expect(stylesheet.topLevels[0] is RuleSet, true); |
| 456 ruleset = stylesheet.topLevels[0]; |
| 457 expect(ruleset.selectorGroup.selectors.length, 1); |
| 458 expect(ruleset.declarationGroup.declarations.length, 0); |
| 459 |
| 460 simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; |
| 461 |
| 462 expect(simpleSeqs.length, 2); |
| 463 |
| 464 selector0 = simpleSeqs[0]; |
| 465 simpleSelector0 = selector0.simpleSelector; |
| 466 expect(simpleSelector0 is NamespaceSelector, true); |
| 467 expect(selector0.isCombinatorNone, true); |
| 468 expect(simpleSelector0.isNamespaceWildcard, false); |
| 469 var elementSelector = simpleSelector0.nameAsSimpleSelector; |
| 470 expect("myNs", simpleSelector0.namespace); |
| 471 expect(elementSelector.isWildcard, true); |
| 472 expect("*", elementSelector.name); |
| 473 |
| 474 selector1 = simpleSeqs[1]; |
| 475 simpleSelector1 = selector1.simpleSelector; |
| 476 expect(simpleSelector1 is ClassSelector, true); |
| 477 expect(selector1.isCombinatorNone, true); |
| 478 expect("foobar", simpleSelector1.name); |
| 479 |
| 480 input = "*|*.foobar {}"; |
| 481 stylesheet = parseCss(input, errors: errors..clear()); |
| 482 |
| 483 expect(stylesheet != null, true); |
| 484 expect(errors.isEmpty, true, reason: errors.toString()); |
| 485 |
| 486 walkTree(stylesheet); |
| 487 |
| 488 expect(stylesheet.topLevels[0] is RuleSet, true); |
| 489 ruleset = stylesheet.topLevels[0]; |
| 490 expect(ruleset.selectorGroup.selectors.length, 1); |
| 491 expect(ruleset.declarationGroup.declarations.length, 0); |
| 492 |
| 493 simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; |
| 494 |
| 495 expect(simpleSeqs.length, 2); |
| 496 |
| 497 selector0 = simpleSeqs[0]; |
| 498 simpleSelector0 = selector0.simpleSelector; |
| 499 expect(simpleSelector0 is NamespaceSelector, true); |
| 500 expect(selector0.isCombinatorNone, true); |
| 501 expect(simpleSelector0.isNamespaceWildcard, true); |
| 502 expect("*", simpleSelector0.namespace); |
| 503 elementSelector = simpleSelector0.nameAsSimpleSelector; |
| 504 expect(elementSelector.isWildcard, true); |
| 505 expect("*", elementSelector.name); |
| 506 |
| 507 selector1 = simpleSeqs[1]; |
| 508 simpleSelector1 = selector1.simpleSelector; |
| 509 expect(simpleSelector1 is ClassSelector, true); |
| 510 expect(selector1.isCombinatorNone, true); |
| 511 expect("foobar", simpleSelector1.name); |
| 512 } |
| 513 |
| 514 /** Test List<int> as input to parser. */ |
| 515 void testArrayOfChars() { |
| 516 var errors = []; |
| 517 var input = '<![CDATA[.foo { ' |
| 518 'color: red; left: 20px; top: 20px; width: 100px; height:200px' |
| 519 '}' |
| 520 '#div {' |
| 521 'color : #00F578; border-color: #878787;' |
| 522 '}]]>'; |
| 523 |
| 524 var stylesheet = parse(UTF8.encode(input), errors: errors); |
| 525 |
| 526 expect(stylesheet != null, true); |
| 527 expect(errors.isEmpty, true, reason: errors.toString()); |
| 528 |
| 529 expect(prettyPrint(stylesheet), r''' |
| 530 .foo { |
| 531 color: #f00; |
| 532 left: 20px; |
| 533 top: 20px; |
| 534 width: 100px; |
| 535 height: 200px; |
| 536 } |
| 537 #div { |
| 538 color: #00F578; |
| 539 border-color: #878787; |
| 540 }'''); |
| 541 } |
| 542 |
| 543 void testPseudo() { |
| 544 var errors = []; |
| 545 |
| 546 final input = r''' |
| 547 html:lang(fr-ca) { quotes: '" ' ' "' } |
| 548 zoom: { } |
| 549 |
| 550 a:link { color: red } |
| 551 :link { color: blue } |
| 552 |
| 553 a:focus { background: yellow } |
| 554 a:focus:hover { background: white } |
| 555 |
| 556 p.special:first-letter {color: #ffd800} |
| 557 |
| 558 p:not(#example){ |
| 559 background-color: yellow; |
| 560 } |
| 561 |
| 562 input:not([DISABLED]){ |
| 563 background-color: yellow; |
| 564 } |
| 565 |
| 566 html|*:not(:link):not(:visited) { |
| 567 border: 1px solid black; |
| 568 } |
| 569 |
| 570 *:not(FOO) { |
| 571 height: 20px; |
| 572 } |
| 573 |
| 574 *|*:not(*) { |
| 575 color: orange; |
| 576 } |
| 577 |
| 578 *|*:not(:hover) { |
| 579 color: magenta; |
| 580 } |
| 581 |
| 582 p:nth-child(3n-3) { } |
| 583 |
| 584 div:nth-child(2n) { color : red; } |
| 585 '''; |
| 586 |
| 587 var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); |
| 588 |
| 589 expect(stylesheet != null, true); |
| 590 expect(errors.isEmpty, true, reason: errors.toString()); |
| 591 expect(prettyPrint(stylesheet), r''' |
| 592 html:lang(fr-ca) { |
| 593 quotes: '" ' ' "'; |
| 594 } |
| 595 zoom { |
| 596 } |
| 597 a:link { |
| 598 color: #f00; |
| 599 } |
| 600 :link { |
| 601 color: #00f; |
| 602 } |
| 603 a:focus { |
| 604 background: #ff0; |
| 605 } |
| 606 a:focus:hover { |
| 607 background: #fff; |
| 608 } |
| 609 p.special:first-letter { |
| 610 color: #ffd800; |
| 611 } |
| 612 p:not(#example) { |
| 613 background-color: #ff0; |
| 614 } |
| 615 input:not([DISABLED]) { |
| 616 background-color: #ff0; |
| 617 } |
| 618 html|*:not(:link):not(:visited) { |
| 619 border: 1px solid #000; |
| 620 } |
| 621 *:not(FOO) { |
| 622 height: 20px; |
| 623 } |
| 624 *|*:not(*) { |
| 625 color: #ffa500; |
| 626 } |
| 627 *|*:not(:hover) { |
| 628 color: #f0f; |
| 629 } |
| 630 p:nth-child(3n-3) { |
| 631 } |
| 632 div:nth-child(2n) { |
| 633 color: #f00; |
| 634 }'''); |
| 635 } |
| 636 |
| 637 void testAttribute() { |
| 638 // TODO(terry): Implement |
| 639 } |
| 640 |
| 641 void testNegation() { |
| 642 // TODO(terry): Implement |
| 643 } |
| 644 |
| 645 void testHost() { |
| 646 var errors = []; |
| 647 var input = '@host { ' |
| 648 ':scope {' |
| 649 'white-space: nowrap;' |
| 650 'overflow-style: marquee-line;' |
| 651 'overflow-x: marquee;' |
| 652 '}' |
| 653 '* { color: red; }' |
| 654 '*:hover { font-weight: bold; }' |
| 655 ':nth-child(odd) { color: blue; }' |
| 656 '}'; |
| 657 var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); |
| 658 |
| 659 expect(stylesheet != null, true); |
| 660 expect(errors.isEmpty, true, reason: errors.toString()); |
| 661 expect(prettyPrint(stylesheet), r''' |
| 662 @host { |
| 663 :scope { |
| 664 white-space: nowrap; |
| 665 overflow-style: marquee-line; |
| 666 overflow-x: marquee; |
| 667 } |
| 668 * { |
| 669 color: #f00; |
| 670 } |
| 671 *:hover { |
| 672 font-weight: bold; |
| 673 } |
| 674 :nth-child(odd) { |
| 675 color: #00f; |
| 676 } |
| 677 }'''); |
| 678 } |
| 679 |
| 680 void testStringEscape() { |
| 681 var errors = []; |
| 682 var input = r'''a { foo: '{"text" : "a\\\""}' }'''; |
| 683 var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); |
| 684 expect(stylesheet != null, true); |
| 685 expect(errors.isEmpty, true, reason: errors.toString()); |
| 686 |
| 687 expect(prettyPrint(stylesheet), r''' |
| 688 a { |
| 689 foo: '{"text" : "a\\\""}'; |
| 690 }'''); |
| 691 } |
| 692 |
| 693 // TODO(terry): Move to emitter_test.dart when real emitter exist. |
| 694 void testEmitter() { |
| 695 var errors = []; |
| 696 var input = '.foo { ' |
| 697 'color: red; left: 20px; top: 20px; width: 100px; height:200px' |
| 698 '}' |
| 699 '#div {' |
| 700 'color : #00F578; border-color: #878787;' |
| 701 '}'; |
| 702 var stylesheet = parseCss(input, errors: errors); |
| 703 |
| 704 expect(stylesheet != null, true); |
| 705 expect(errors.isEmpty, true, reason: errors.toString()); |
| 706 |
| 707 walkTree(stylesheet); |
| 708 |
| 709 expect(prettyPrint(stylesheet), r''' |
| 710 .foo { |
| 711 color: #f00; |
| 712 left: 20px; |
| 713 top: 20px; |
| 714 width: 100px; |
| 715 height: 200px; |
| 716 } |
| 717 #div { |
| 718 color: #00F578; |
| 719 border-color: #878787; |
| 720 }'''); |
| 721 } |
| 722 |
| 723 main() { |
| 724 test('Classes', testClass); |
| 725 test('Classes 2', testClass2); |
| 726 test('Ids', testId); |
| 727 test('Elements', testElement); |
| 728 test('Namespace', testNamespace); |
| 729 test('Namespace 2', testNamespace2); |
| 730 test('Selector Groups', testSelectorGroups); |
| 731 test('Combinator', testCombinator); |
| 732 test('Wildcards', testWildcard); |
| 733 test('Pseudo', testPseudo); |
| 734 test('Attributes', testAttribute); |
| 735 test('Negation', testNegation); |
| 736 test('@host', testHost); |
| 737 test('stringEscape', testStringEscape); |
| 738 test('Parse List<int> as input', testArrayOfChars); |
| 739 test('Simple Emitter', testEmitter); |
| 740 } |
OLD | NEW |