Index: packages/csslib/test/compiler_test.dart |
diff --git a/packages/csslib/test/compiler_test.dart b/packages/csslib/test/compiler_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..df5a44aaa163c1f2cb4482055b8694e2d72e2d41 |
--- /dev/null |
+++ b/packages/csslib/test/compiler_test.dart |
@@ -0,0 +1,740 @@ |
+// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+library compiler_test; |
+ |
+import 'dart:convert'; |
+import 'package:test/test.dart'; |
+import 'package:csslib/parser.dart'; |
+import 'package:csslib/visitor.dart'; |
+import 'testing.dart'; |
+ |
+void testClass() { |
+ var errors = []; |
+ var input = ".foobar {}"; |
+ var stylesheet = parseCss(input, errors: errors); |
+ |
+ expect(stylesheet != null, true); |
+ expect(errors.isEmpty, true, reason: errors.toString()); |
+ |
+ walkTree(stylesheet); |
+ |
+ expect(stylesheet.topLevels.length, 1); |
+ |
+ expect(stylesheet.topLevels[0] is RuleSet, true); |
+ |
+ var ruleset = stylesheet.topLevels[0]; |
+ expect(ruleset.selectorGroup.selectors.length, 1); |
+ expect(ruleset.declarationGroup.declarations.length, 0); |
+ |
+ var selectorSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; |
+ expect(selectorSeqs.length, 1); |
+ final simpSelector = selectorSeqs[0].simpleSelector; |
+ expect(simpSelector is ClassSelector, true); |
+ expect(selectorSeqs[0].isCombinatorNone, true); |
+ expect(simpSelector.name, "foobar"); |
+} |
+ |
+void testClass2() { |
+ var errors = []; |
+ var input = ".foobar .bar .no-story {}"; |
+ var stylesheet = parseCss(input, errors: errors); |
+ |
+ expect(stylesheet != null, true); |
+ expect(errors.isEmpty, true, reason: errors.toString()); |
+ |
+ walkTree(stylesheet); |
+ |
+ expect(stylesheet.topLevels.length, 1); |
+ |
+ expect(stylesheet.topLevels[0] is RuleSet, true); |
+ var ruleset = stylesheet.topLevels[0]; |
+ expect(ruleset.selectorGroup.selectors.length, 1); |
+ expect(ruleset.declarationGroup.declarations.length, 0); |
+ |
+ var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; |
+ expect(simpleSeqs.length, 3); |
+ |
+ var simpSelector0 = simpleSeqs[0].simpleSelector; |
+ expect(simpSelector0 is ClassSelector, true); |
+ expect(simpleSeqs[0].isCombinatorNone, true); |
+ expect(simpSelector0.name, "foobar"); |
+ |
+ var simpSelector1 = simpleSeqs[1].simpleSelector; |
+ expect(simpSelector1 is ClassSelector, true); |
+ expect(simpleSeqs[1].isCombinatorDescendant, true); |
+ expect(simpSelector1.name, "bar"); |
+ |
+ var simpSelector2 = simpleSeqs[2].simpleSelector; |
+ expect(simpSelector2 is ClassSelector, true); |
+ expect(simpleSeqs[2].isCombinatorDescendant, true); |
+ expect(simpSelector2.name, "no-story"); |
+} |
+ |
+void testId() { |
+ var errors = []; |
+ var input = "#elemId {}"; |
+ var stylesheet = parseCss(input, errors: errors); |
+ |
+ expect(stylesheet != null, true); |
+ expect(errors.isEmpty, true, reason: errors.toString()); |
+ |
+ walkTree(stylesheet); |
+ |
+ expect(stylesheet.topLevels.length, 1); |
+ |
+ expect(stylesheet.topLevels[0] is RuleSet, true); |
+ var ruleset = stylesheet.topLevels[0]; |
+ expect(ruleset.selectorGroup.selectors.length, 1); |
+ expect(ruleset.declarationGroup.declarations.length, 0); |
+ |
+ var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; |
+ |
+ expect(simpleSeqs.length, 1); |
+ var simpSelector = simpleSeqs[0].simpleSelector; |
+ expect(simpSelector is IdSelector, true); |
+ expect(simpleSeqs[0].isCombinatorNone, true); |
+ expect(simpSelector.name, "elemId"); |
+} |
+ |
+void testElement() { |
+ var errors = []; |
+ var input = "div {}"; |
+ var stylesheet = parseCss(input, errors: errors); |
+ |
+ expect(stylesheet != null, true); |
+ expect(errors.isEmpty, true, reason: errors.toString()); |
+ |
+ walkTree(stylesheet); |
+ |
+ expect(stylesheet.topLevels.length, 1); |
+ |
+ expect(stylesheet.topLevels[0] is RuleSet, true); |
+ var ruleset = stylesheet.topLevels[0]; |
+ expect(ruleset.selectorGroup.selectors.length, 1); |
+ expect(ruleset.declarationGroup.declarations.length, 0); |
+ |
+ var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; |
+ |
+ expect(simpleSeqs.length, 1); |
+ |
+ final simpSelector = simpleSeqs[0].simpleSelector; |
+ expect(simpSelector is ElementSelector, true); |
+ expect(simpleSeqs[0].isCombinatorNone, true); |
+ expect(simpSelector.name, "div"); |
+ |
+ input = "div div span {}"; |
+ stylesheet = parseCss(input, errors: errors..clear()); |
+ |
+ expect(stylesheet != null, true); |
+ expect(errors.isEmpty, true, reason: errors.toString()); |
+ |
+ walkTree(stylesheet); |
+ |
+ expect(stylesheet.topLevels.length, 1); |
+ |
+ expect(stylesheet.topLevels[0] is RuleSet, true); |
+ ruleset = stylesheet.topLevels[0]; |
+ expect(ruleset.selectorGroup.selectors.length, 1); |
+ expect(ruleset.declarationGroup.declarations.length, 0); |
+ |
+ simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; |
+ |
+ expect(simpleSeqs.length, 3); |
+ |
+ var simpSelector0 = simpleSeqs[0].simpleSelector; |
+ expect(simpSelector0 is ElementSelector, true); |
+ expect(simpleSeqs[0].isCombinatorNone, true); |
+ expect(simpSelector0.name, "div"); |
+ |
+ var simpSelector1 = simpleSeqs[1].simpleSelector; |
+ expect(simpSelector1 is ElementSelector, true); |
+ expect(simpleSeqs[1].isCombinatorDescendant, true); |
+ expect(simpSelector1.name, "div"); |
+ |
+ var simpSelector2 = simpleSeqs[2].simpleSelector; |
+ expect(simpSelector2 is ElementSelector, true); |
+ expect(simpleSeqs[2].isCombinatorDescendant, true); |
+ expect(simpSelector2.name, "span"); |
+} |
+ |
+void testNamespace() { |
+ var errors = []; |
+ var input = "ns1|div {}"; |
+ var stylesheet = parseCss(input, errors: errors); |
+ |
+ expect(stylesheet != null, true); |
+ expect(errors.isEmpty, true, reason: errors.toString()); |
+ |
+ walkTree(stylesheet); |
+ |
+ expect(stylesheet.topLevels.length, 1); |
+ |
+ expect(stylesheet.topLevels[0] is RuleSet, true); |
+ var ruleset = stylesheet.topLevels[0]; |
+ expect(ruleset.selectorGroup.selectors.length, 1); |
+ expect(ruleset.declarationGroup.declarations.length, 0); |
+ |
+ var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; |
+ |
+ expect(simpleSeqs.length, 1); |
+ var simpSelector = simpleSeqs[0].simpleSelector; |
+ expect(simpSelector is NamespaceSelector, true); |
+ expect(simpleSeqs[0].isCombinatorNone, true); |
+ expect(simpSelector.isNamespaceWildcard, false); |
+ expect(simpSelector.namespace, "ns1"); |
+ var elementSelector = simpSelector.nameAsSimpleSelector; |
+ expect(elementSelector is ElementSelector, true); |
+ expect(elementSelector.isWildcard, false); |
+ expect(elementSelector.name, "div"); |
+} |
+ |
+void testNamespace2() { |
+ var errors = []; |
+ var input = "ns1|div div ns2|span .foobar {}"; |
+ var stylesheet = parseCss(input, errors: errors); |
+ |
+ expect(stylesheet != null, true); |
+ expect(errors.isEmpty, true, reason: errors.toString()); |
+ |
+ walkTree(stylesheet); |
+ |
+ expect(stylesheet.topLevels.length, 1); |
+ |
+ expect(stylesheet.topLevels[0] is RuleSet, true); |
+ var ruleset = stylesheet.topLevels[0]; |
+ expect(ruleset.selectorGroup.selectors.length, 1); |
+ expect(ruleset.declarationGroup.declarations.length, 0); |
+ |
+ var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; |
+ |
+ expect(simpleSeqs.length, 4); |
+ |
+ var simpSelector0 = simpleSeqs[0].simpleSelector; |
+ expect(simpSelector0 is NamespaceSelector, true); |
+ expect(simpleSeqs[0].isCombinatorNone, true); |
+ expect(simpSelector0.namespace, "ns1"); |
+ var elementSelector0 = simpSelector0.nameAsSimpleSelector; |
+ expect(elementSelector0 is ElementSelector, true); |
+ expect(elementSelector0.isWildcard, false); |
+ expect(elementSelector0.name, "div"); |
+ |
+ var simpSelector1 = simpleSeqs[1].simpleSelector; |
+ expect(simpSelector1 is ElementSelector, true); |
+ expect(simpleSeqs[1].isCombinatorDescendant, true); |
+ expect(simpSelector1.name, "div"); |
+ |
+ var simpSelector2 = simpleSeqs[2].simpleSelector; |
+ expect(simpSelector2 is NamespaceSelector, true); |
+ expect(simpleSeqs[2].isCombinatorDescendant, true); |
+ expect(simpSelector2.namespace, "ns2"); |
+ var elementSelector2 = simpSelector2.nameAsSimpleSelector; |
+ expect(elementSelector2 is ElementSelector, true); |
+ expect(elementSelector2.isWildcard, false); |
+ expect(elementSelector2.name, "span"); |
+ |
+ var simpSelector3 = simpleSeqs[3].simpleSelector; |
+ expect(simpSelector3 is ClassSelector, true); |
+ expect(simpleSeqs[3].isCombinatorDescendant, true); |
+ expect(simpSelector3.name, "foobar"); |
+} |
+ |
+void testSelectorGroups() { |
+ var errors = []; |
+ var input = |
+ "div, .foobar ,#elemId, .xyzzy .test, ns1|div div #elemId .foobar {}"; |
+ var stylesheet = parseCss(input, errors: errors); |
+ |
+ expect(stylesheet != null, true); |
+ expect(errors.isEmpty, true, reason: errors.toString()); |
+ |
+ walkTree(stylesheet); |
+ |
+ expect(stylesheet.topLevels.length, 1); |
+ |
+ expect(stylesheet.topLevels[0] is RuleSet, true); |
+ var ruleset = stylesheet.topLevels[0]; |
+ expect(ruleset.selectorGroup.selectors.length, 5); |
+ expect(ruleset.declarationGroup.declarations.length, 0); |
+ |
+ var groupSelector0 = ruleset.selectorGroup.selectors[0]; |
+ expect(groupSelector0.simpleSelectorSequences.length, 1); |
+ var selector0 = groupSelector0.simpleSelectorSequences[0]; |
+ var simpleSelector0 = selector0.simpleSelector; |
+ expect(simpleSelector0 is ElementSelector, true); |
+ expect(selector0.isCombinatorNone, true); |
+ expect(simpleSelector0.name, "div"); |
+ |
+ var groupSelector1 = ruleset.selectorGroup.selectors[1]; |
+ expect(groupSelector1.simpleSelectorSequences.length, 1); |
+ var selector1 = groupSelector1.simpleSelectorSequences[0]; |
+ var simpleSelector1 = selector1.simpleSelector; |
+ expect(simpleSelector1 is ClassSelector, true); |
+ expect(selector1.isCombinatorNone, true); |
+ expect(simpleSelector1.name, "foobar"); |
+ |
+ var groupSelector2 = ruleset.selectorGroup.selectors[2]; |
+ expect(groupSelector2.simpleSelectorSequences.length, 1); |
+ var selector2 = groupSelector2.simpleSelectorSequences[0]; |
+ var simpleSelector2 = selector2.simpleSelector; |
+ expect(simpleSelector2 is IdSelector, true); |
+ expect(selector2.isCombinatorNone, true); |
+ expect(simpleSelector2.name, "elemId"); |
+ |
+ var groupSelector3 = ruleset.selectorGroup.selectors[3]; |
+ expect(groupSelector3.simpleSelectorSequences.length, 2); |
+ |
+ var selector30 = groupSelector3.simpleSelectorSequences[0]; |
+ var simpleSelector30 = selector30.simpleSelector; |
+ expect(simpleSelector30 is ClassSelector, true); |
+ expect(selector30.isCombinatorNone, true); |
+ expect(simpleSelector30.name, "xyzzy"); |
+ |
+ var selector31 = groupSelector3.simpleSelectorSequences[1]; |
+ var simpleSelector31 = selector31.simpleSelector; |
+ expect(simpleSelector31 is ClassSelector, true); |
+ expect(selector31.isCombinatorDescendant, true); |
+ expect(simpleSelector31.name, "test"); |
+ |
+ var groupSelector4 = ruleset.selectorGroup.selectors[4]; |
+ expect(groupSelector4.simpleSelectorSequences.length, 4); |
+ |
+ var selector40 = groupSelector4.simpleSelectorSequences[0]; |
+ var simpleSelector40 = selector40.simpleSelector; |
+ expect(simpleSelector40 is NamespaceSelector, true); |
+ expect(selector40.isCombinatorNone, true); |
+ expect(simpleSelector40.namespace, "ns1"); |
+ var elementSelector = simpleSelector40.nameAsSimpleSelector; |
+ expect(elementSelector is ElementSelector, true); |
+ expect(elementSelector.isWildcard, false); |
+ expect(elementSelector.name, "div"); |
+ |
+ var selector41 = groupSelector4.simpleSelectorSequences[1]; |
+ var simpleSelector41 = selector41.simpleSelector; |
+ expect(simpleSelector41 is ElementSelector, true); |
+ expect(selector41.isCombinatorDescendant, true); |
+ expect(simpleSelector41.name, "div"); |
+ |
+ var selector42 = groupSelector4.simpleSelectorSequences[2]; |
+ var simpleSelector42 = selector42.simpleSelector; |
+ expect(simpleSelector42 is IdSelector, true); |
+ expect(selector42.isCombinatorDescendant, true); |
+ expect(simpleSelector42.name, "elemId"); |
+ |
+ var selector43 = groupSelector4.simpleSelectorSequences[3]; |
+ var simpleSelector43 = selector43.simpleSelector; |
+ expect(selector43.isCombinatorDescendant, true); |
+ expect(simpleSelector43.name, "foobar"); |
+} |
+ |
+void testCombinator() { |
+ var errors = []; |
+ var input = ".foobar > .bar + .no-story ~ myNs|div #elemId {}"; |
+ var stylesheet = parseCss(input, errors: errors); |
+ |
+ expect(stylesheet != null, true); |
+ expect(errors.isEmpty, true, reason: errors.toString()); |
+ |
+ walkTree(stylesheet); |
+ |
+ expect(stylesheet.topLevels.length, 1); |
+ |
+ expect(stylesheet.topLevels[0] is RuleSet, true); |
+ var ruleset = stylesheet.topLevels[0]; |
+ expect(ruleset.selectorGroup.selectors.length, 1); |
+ expect(ruleset.declarationGroup.declarations.length, 0); |
+ |
+ var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; |
+ |
+ expect(simpleSeqs.length, 5); |
+ |
+ var selector0 = simpleSeqs[0]; |
+ var simpleSelector0 = selector0.simpleSelector; |
+ expect(simpleSelector0 is ClassSelector, true); |
+ expect(selector0.isCombinatorNone, true); |
+ expect(simpleSelector0.name, "foobar"); |
+ |
+ var selector1 = simpleSeqs[1]; |
+ var simpleSelector1 = selector1.simpleSelector; |
+ expect(simpleSelector1 is ClassSelector, true); |
+ expect(selector1.isCombinatorGreater, true); |
+ expect(simpleSelector1.name, "bar"); |
+ |
+ var selector2 = simpleSeqs[2]; |
+ var simpleSelector2 = selector2.simpleSelector; |
+ expect(simpleSelector2 is ClassSelector, true); |
+ expect(selector2.isCombinatorPlus, true); |
+ expect(simpleSelector2.name, "no-story"); |
+ |
+ var selector3 = simpleSeqs[3]; |
+ var simpleSelector3 = selector3.simpleSelector; |
+ expect(simpleSelector3 is NamespaceSelector, true); |
+ expect(selector3.isCombinatorTilde, true); |
+ expect(simpleSelector3.namespace, "myNs"); |
+ var elementSelector = simpleSelector3.nameAsSimpleSelector; |
+ expect(elementSelector is ElementSelector, true); |
+ expect(elementSelector.isWildcard, false); |
+ expect(elementSelector.name, "div"); |
+ |
+ var selector4 = simpleSeqs[4]; |
+ var simpleSelector4 = selector4.simpleSelector; |
+ expect(simpleSelector4 is IdSelector, true); |
+ expect(selector4.isCombinatorDescendant, true); |
+ expect(simpleSelector4.name, "elemId"); |
+} |
+ |
+void testWildcard() { |
+ var errors = []; |
+ var input = "* {}"; |
+ var stylesheet = parseCss(input, errors: errors); |
+ |
+ expect(stylesheet != null, true); |
+ expect(errors.isEmpty, true, reason: errors.toString()); |
+ |
+ walkTree(stylesheet); |
+ |
+ expect(stylesheet.topLevels.length, 1); |
+ |
+ expect(stylesheet.topLevels[0] is RuleSet, true); |
+ var ruleset = stylesheet.topLevels[0]; |
+ expect(ruleset.selectorGroup.selectors.length, 1); |
+ expect(ruleset.declarationGroup.declarations.length, 0); |
+ |
+ var simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; |
+ |
+ expect(simpleSeqs.length, 1); |
+ var simpSelector = simpleSeqs[0].simpleSelector; |
+ expect(simpSelector is ElementSelector, true); |
+ expect(simpleSeqs[0].isCombinatorNone, true); |
+ expect(simpSelector.isWildcard, true); |
+ expect(simpSelector.name, "*"); |
+ |
+ input = "*.foobar {}"; |
+ stylesheet = parseCss(input, errors: errors..clear()); |
+ |
+ expect(stylesheet != null, true); |
+ expect(errors.isEmpty, true, reason: errors.toString()); |
+ |
+ walkTree(stylesheet); |
+ |
+ expect(stylesheet.topLevels.length, 1); |
+ |
+ expect(stylesheet.topLevels[0] is RuleSet, true); |
+ ruleset = stylesheet.topLevels[0]; |
+ expect(ruleset.selectorGroup.selectors.length, 1); |
+ expect(ruleset.declarationGroup.declarations.length, 0); |
+ |
+ simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; |
+ |
+ expect(simpleSeqs.length, 2); |
+ |
+ var selector0 = simpleSeqs[0]; |
+ var simpleSelector0 = selector0.simpleSelector; |
+ expect(simpleSelector0 is ElementSelector, true); |
+ expect(selector0.isCombinatorNone, true); |
+ expect(simpleSelector0.isWildcard, true); |
+ expect(simpleSelector0.name, "*"); |
+ |
+ var selector1 = simpleSeqs[1]; |
+ var simpleSelector1 = selector1.simpleSelector; |
+ expect(simpleSelector1 is ClassSelector, true); |
+ expect(selector1.isCombinatorNone, true); |
+ expect(simpleSelector1.name, "foobar"); |
+ |
+ input = "myNs|*.foobar {}"; |
+ stylesheet = parseCss(input, errors: errors..clear()); |
+ |
+ expect(stylesheet != null, true); |
+ expect(errors.isEmpty, true, reason: errors.toString()); |
+ |
+ walkTree(stylesheet); |
+ |
+ expect(stylesheet.topLevels.length, 1); |
+ |
+ expect(stylesheet.topLevels[0] is RuleSet, true); |
+ ruleset = stylesheet.topLevels[0]; |
+ expect(ruleset.selectorGroup.selectors.length, 1); |
+ expect(ruleset.declarationGroup.declarations.length, 0); |
+ |
+ simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; |
+ |
+ expect(simpleSeqs.length, 2); |
+ |
+ selector0 = simpleSeqs[0]; |
+ simpleSelector0 = selector0.simpleSelector; |
+ expect(simpleSelector0 is NamespaceSelector, true); |
+ expect(selector0.isCombinatorNone, true); |
+ expect(simpleSelector0.isNamespaceWildcard, false); |
+ var elementSelector = simpleSelector0.nameAsSimpleSelector; |
+ expect("myNs", simpleSelector0.namespace); |
+ expect(elementSelector.isWildcard, true); |
+ expect("*", elementSelector.name); |
+ |
+ selector1 = simpleSeqs[1]; |
+ simpleSelector1 = selector1.simpleSelector; |
+ expect(simpleSelector1 is ClassSelector, true); |
+ expect(selector1.isCombinatorNone, true); |
+ expect("foobar", simpleSelector1.name); |
+ |
+ input = "*|*.foobar {}"; |
+ stylesheet = parseCss(input, errors: errors..clear()); |
+ |
+ expect(stylesheet != null, true); |
+ expect(errors.isEmpty, true, reason: errors.toString()); |
+ |
+ walkTree(stylesheet); |
+ |
+ expect(stylesheet.topLevels[0] is RuleSet, true); |
+ ruleset = stylesheet.topLevels[0]; |
+ expect(ruleset.selectorGroup.selectors.length, 1); |
+ expect(ruleset.declarationGroup.declarations.length, 0); |
+ |
+ simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; |
+ |
+ expect(simpleSeqs.length, 2); |
+ |
+ selector0 = simpleSeqs[0]; |
+ simpleSelector0 = selector0.simpleSelector; |
+ expect(simpleSelector0 is NamespaceSelector, true); |
+ expect(selector0.isCombinatorNone, true); |
+ expect(simpleSelector0.isNamespaceWildcard, true); |
+ expect("*", simpleSelector0.namespace); |
+ elementSelector = simpleSelector0.nameAsSimpleSelector; |
+ expect(elementSelector.isWildcard, true); |
+ expect("*", elementSelector.name); |
+ |
+ selector1 = simpleSeqs[1]; |
+ simpleSelector1 = selector1.simpleSelector; |
+ expect(simpleSelector1 is ClassSelector, true); |
+ expect(selector1.isCombinatorNone, true); |
+ expect("foobar", simpleSelector1.name); |
+} |
+ |
+/** Test List<int> as input to parser. */ |
+void testArrayOfChars() { |
+ var errors = []; |
+ var input = '<![CDATA[.foo { ' |
+ 'color: red; left: 20px; top: 20px; width: 100px; height:200px' |
+ '}' |
+ '#div {' |
+ 'color : #00F578; border-color: #878787;' |
+ '}]]>'; |
+ |
+ var stylesheet = parse(UTF8.encode(input), errors: errors); |
+ |
+ expect(stylesheet != null, true); |
+ expect(errors.isEmpty, true, reason: errors.toString()); |
+ |
+ expect(prettyPrint(stylesheet), r''' |
+.foo { |
+ color: #f00; |
+ left: 20px; |
+ top: 20px; |
+ width: 100px; |
+ height: 200px; |
+} |
+#div { |
+ color: #00F578; |
+ border-color: #878787; |
+}'''); |
+} |
+ |
+void testPseudo() { |
+ var errors = []; |
+ |
+ final input = r''' |
+html:lang(fr-ca) { quotes: '" ' ' "' } |
+zoom: { } |
+ |
+a:link { color: red } |
+:link { color: blue } |
+ |
+a:focus { background: yellow } |
+a:focus:hover { background: white } |
+ |
+p.special:first-letter {color: #ffd800} |
+ |
+p:not(#example){ |
+ background-color: yellow; |
+} |
+ |
+input:not([DISABLED]){ |
+ background-color: yellow; |
+} |
+ |
+html|*:not(:link):not(:visited) { |
+ border: 1px solid black; |
+} |
+ |
+*:not(FOO) { |
+ height: 20px; |
+} |
+ |
+*|*:not(*) { |
+ color: orange; |
+} |
+ |
+*|*:not(:hover) { |
+ color: magenta; |
+} |
+ |
+p:nth-child(3n-3) { } |
+ |
+div:nth-child(2n) { color : red; } |
+'''; |
+ |
+ var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); |
+ |
+ expect(stylesheet != null, true); |
+ expect(errors.isEmpty, true, reason: errors.toString()); |
+ expect(prettyPrint(stylesheet), r''' |
+html:lang(fr-ca) { |
+ quotes: '" ' ' "'; |
+} |
+zoom { |
+} |
+a:link { |
+ color: #f00; |
+} |
+:link { |
+ color: #00f; |
+} |
+a:focus { |
+ background: #ff0; |
+} |
+a:focus:hover { |
+ background: #fff; |
+} |
+p.special:first-letter { |
+ color: #ffd800; |
+} |
+p:not(#example) { |
+ background-color: #ff0; |
+} |
+input:not([DISABLED]) { |
+ background-color: #ff0; |
+} |
+html|*:not(:link):not(:visited) { |
+ border: 1px solid #000; |
+} |
+*:not(FOO) { |
+ height: 20px; |
+} |
+*|*:not(*) { |
+ color: #ffa500; |
+} |
+*|*:not(:hover) { |
+ color: #f0f; |
+} |
+p:nth-child(3n-3) { |
+} |
+div:nth-child(2n) { |
+ color: #f00; |
+}'''); |
+} |
+ |
+void testAttribute() { |
+ // TODO(terry): Implement |
+} |
+ |
+void testNegation() { |
+ // TODO(terry): Implement |
+} |
+ |
+void testHost() { |
+ var errors = []; |
+ var input = '@host { ' |
+ ':scope {' |
+ 'white-space: nowrap;' |
+ 'overflow-style: marquee-line;' |
+ 'overflow-x: marquee;' |
+ '}' |
+ '* { color: red; }' |
+ '*:hover { font-weight: bold; }' |
+ ':nth-child(odd) { color: blue; }' |
+ '}'; |
+ var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); |
+ |
+ expect(stylesheet != null, true); |
+ expect(errors.isEmpty, true, reason: errors.toString()); |
+ expect(prettyPrint(stylesheet), r''' |
+@host { |
+:scope { |
+ white-space: nowrap; |
+ overflow-style: marquee-line; |
+ overflow-x: marquee; |
+} |
+* { |
+ color: #f00; |
+} |
+*:hover { |
+ font-weight: bold; |
+} |
+:nth-child(odd) { |
+ color: #00f; |
+} |
+}'''); |
+} |
+ |
+void testStringEscape() { |
+ var errors = []; |
+ var input = r'''a { foo: '{"text" : "a\\\""}' }'''; |
+ var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); |
+ expect(stylesheet != null, true); |
+ expect(errors.isEmpty, true, reason: errors.toString()); |
+ |
+ expect(prettyPrint(stylesheet), r''' |
+a { |
+ foo: '{"text" : "a\\\""}'; |
+}'''); |
+} |
+ |
+// TODO(terry): Move to emitter_test.dart when real emitter exist. |
+void testEmitter() { |
+ var errors = []; |
+ var input = '.foo { ' |
+ 'color: red; left: 20px; top: 20px; width: 100px; height:200px' |
+ '}' |
+ '#div {' |
+ 'color : #00F578; border-color: #878787;' |
+ '}'; |
+ var stylesheet = parseCss(input, errors: errors); |
+ |
+ expect(stylesheet != null, true); |
+ expect(errors.isEmpty, true, reason: errors.toString()); |
+ |
+ walkTree(stylesheet); |
+ |
+ expect(prettyPrint(stylesheet), r''' |
+.foo { |
+ color: #f00; |
+ left: 20px; |
+ top: 20px; |
+ width: 100px; |
+ height: 200px; |
+} |
+#div { |
+ color: #00F578; |
+ border-color: #878787; |
+}'''); |
+} |
+ |
+main() { |
+ test('Classes', testClass); |
+ test('Classes 2', testClass2); |
+ test('Ids', testId); |
+ test('Elements', testElement); |
+ test('Namespace', testNamespace); |
+ test('Namespace 2', testNamespace2); |
+ test('Selector Groups', testSelectorGroups); |
+ test('Combinator', testCombinator); |
+ test('Wildcards', testWildcard); |
+ test('Pseudo', testPseudo); |
+ test('Attributes', testAttribute); |
+ test('Negation', testNegation); |
+ test('@host', testHost); |
+ test('stringEscape', testStringEscape); |
+ test('Parse List<int> as input', testArrayOfChars); |
+ test('Simple Emitter', testEmitter); |
+} |