// Copyright (c) 2011, 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 expression_tests; import '../../css/css.dart'; main() { initCssWorld(); testClass(); testId(); testElement(); testNamespace(); testSelectorGroups(); testCombinator(); testWildcard(); testPseudo(); testAttribute(); testNegation(); } void testClass() { Parser parser = new Parser(new SourceFile( SourceFile.IN_MEMORY_FILE, ".foobar {}")); Stylesheet stylesheet = parser.parse(); Expect.isNotNull(stylesheet); Expect.equals(stylesheet.topLevels.length, 1); Expect.isTrue(stylesheet.topLevels[0] is RuleSet); RuleSet ruleset = stylesheet.topLevels[0]; Expect.equals(ruleset.selectorGroup.selectors.length, 1); Expect.equals(ruleset.declarationGroup.declarations.length, 0); List simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; Expect.equals(simpleSeqs.length, 1); for (final selector in simpleSeqs) { final simpSelector = selector.simpleSelector; Expect.isTrue(simpSelector is ClassSelector); Expect.isTrue(selector.isCombinatorNone()); Expect.equals(simpSelector.name, "foobar"); } parser = new Parser(new SourceFile(SourceFile.IN_MEMORY_FILE, ".foobar .bar .no-story {}")); stylesheet = parser.parse(); Expect.isNotNull(stylesheet); Expect.equals(stylesheet.topLevels.length, 1); Expect.isTrue(stylesheet.topLevels[0] is RuleSet); ruleset = stylesheet.topLevels[0]; Expect.equals(ruleset.selectorGroup.selectors.length, 1); Expect.equals(ruleset.declarationGroup.declarations.length, 0); simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; var idx = 0; for (final selector in simpleSeqs) { final simpSelector = selector.simpleSelector; if (idx == 0) { Expect.isTrue(simpSelector is ClassSelector); Expect.isTrue(selector.isCombinatorNone()); Expect.equals(simpSelector.name, "foobar"); } else if (idx == 1) { Expect.isTrue(simpSelector is ClassSelector); Expect.isTrue(selector.isCombinatorDescendant()); Expect.equals(simpSelector.name, "bar"); } else if (idx == 2) { Expect.isTrue(simpSelector is ClassSelector); Expect.isTrue(selector.isCombinatorDescendant()); Expect.equals(simpSelector.name, "no-story"); } else { Expect.fail("unexpected expression"); } idx++; } Expect.equals(simpleSeqs.length, idx); } void testId() { Parser parser = new Parser(new SourceFile( SourceFile.IN_MEMORY_FILE, "#elemId {}")); Stylesheet stylesheet = parser.parse(); Expect.isNotNull(stylesheet); Expect.equals(stylesheet.topLevels.length, 1); Expect.isTrue(stylesheet.topLevels[0] is RuleSet); RuleSet ruleset = stylesheet.topLevels[0]; Expect.equals(ruleset.selectorGroup.selectors.length, 1); Expect.equals(ruleset.declarationGroup.declarations.length, 0); List simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; for (final selector in simpleSeqs) { final simpSelector = selector.simpleSelector; Expect.isTrue(simpSelector is IdSelector); Expect.isTrue(selector.isCombinatorNone()); Expect.equals(simpSelector.name, "elemId"); } } void testElement() { Parser parser = new Parser(new SourceFile( SourceFile.IN_MEMORY_FILE, "div {}")); Stylesheet stylesheet = parser.parse(); Expect.isNotNull(stylesheet); Expect.equals(stylesheet.topLevels.length, 1); Expect.isTrue(stylesheet.topLevels[0] is RuleSet); RuleSet ruleset = stylesheet.topLevels[0]; Expect.equals(ruleset.selectorGroup.selectors.length, 1); Expect.equals(ruleset.declarationGroup.declarations.length, 0); List simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; for (final selector in simpleSeqs) { final simpSelector = selector.simpleSelector; Expect.isTrue(simpSelector is ElementSelector); Expect.isTrue(selector.isCombinatorNone()); Expect.equals(simpSelector.name, "div"); } parser = new Parser(new SourceFile(SourceFile.IN_MEMORY_FILE, "div div span {}")); stylesheet = parser.parse(); Expect.isNotNull(stylesheet); Expect.equals(stylesheet.topLevels.length, 1); Expect.isTrue(stylesheet.topLevels[0] is RuleSet); ruleset = stylesheet.topLevels[0]; Expect.equals(ruleset.selectorGroup.selectors.length, 1); Expect.equals(ruleset.declarationGroup.declarations.length, 0); simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; var idx = 0; for (final selector in simpleSeqs) { final simpSelector = selector.simpleSelector; if (idx == 0) { Expect.isTrue(simpSelector is ElementSelector); Expect.isTrue(selector.isCombinatorNone()); Expect.equals(simpSelector.name, "div"); } else if (idx == 1) { Expect.isTrue(simpSelector is ElementSelector); Expect.isTrue(selector.isCombinatorDescendant()); Expect.equals(simpSelector.name, "div"); } else if (idx == 2) { Expect.isTrue(simpSelector is ElementSelector); Expect.isTrue(selector.isCombinatorDescendant()); Expect.equals(simpSelector.name, "span"); } else { Expect.fail("unexpected expression"); } idx++; } Expect.equals(simpleSeqs.length, idx); } void testNamespace() { Parser parser = new Parser(new SourceFile( SourceFile.IN_MEMORY_FILE, "ns1|div {}")); Stylesheet stylesheet = parser.parse(); Expect.isNotNull(stylesheet); Expect.equals(stylesheet.topLevels.length, 1); Expect.isTrue(stylesheet.topLevels[0] is RuleSet); RuleSet ruleset = stylesheet.topLevels[0]; Expect.equals(ruleset.selectorGroup.selectors.length, 1); Expect.equals(ruleset.declarationGroup.declarations.length, 0); List simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; for (final selector in simpleSeqs) { final simpSelector = selector.simpleSelector; Expect.isTrue(simpSelector is NamespaceSelector); Expect.isTrue(selector.isCombinatorNone()); Expect.isFalse(simpSelector.isNamespaceWildcard()); Expect.equals(simpSelector.namespace, "ns1"); ElementSelector elementSelector = simpSelector.nameAsSimpleSelector; Expect.isTrue(elementSelector is ElementSelector); Expect.isFalse(elementSelector.isWildcard()); Expect.equals(elementSelector.name, "div"); } parser = new Parser(new SourceFile(SourceFile.IN_MEMORY_FILE, "ns1|div div ns2|span .foobar {}")); stylesheet = parser.parse(); Expect.isNotNull(stylesheet); Expect.equals(stylesheet.topLevels.length, 1); Expect.isTrue(stylesheet.topLevels[0] is RuleSet); ruleset = stylesheet.topLevels[0]; Expect.equals(ruleset.selectorGroup.selectors.length, 1); Expect.equals(ruleset.declarationGroup.declarations.length, 0); simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; var idx = 0; for (final selector in simpleSeqs) { final simpSelector = selector.simpleSelector; if (idx == 0) { Expect.isTrue(simpSelector is NamespaceSelector); Expect.isTrue(selector.isCombinatorNone()); Expect.equals(simpSelector.namespace, "ns1"); ElementSelector elementSelector = simpSelector.nameAsSimpleSelector; Expect.isTrue(elementSelector is ElementSelector); Expect.isFalse(elementSelector.isWildcard()); Expect.equals(elementSelector.name, "div"); } else if (idx == 1) { Expect.isTrue(simpSelector is ElementSelector); Expect.isTrue(selector.isCombinatorDescendant()); Expect.equals(simpSelector.name, "div"); } else if (idx == 2) { Expect.isTrue(simpSelector is NamespaceSelector); Expect.isTrue(selector.isCombinatorDescendant()); Expect.equals(simpSelector.namespace, "ns2"); ElementSelector elementSelector = simpSelector.nameAsSimpleSelector; Expect.isTrue(elementSelector is ElementSelector); Expect.isFalse(elementSelector.isWildcard()); Expect.equals(elementSelector.name, "span"); } else if (idx == 3) { Expect.isTrue(simpSelector is ClassSelector); Expect.isTrue(selector.isCombinatorDescendant()); Expect.equals(simpSelector.name, "foobar"); } else { Expect.fail("unexpected expression"); } idx++; } Expect.equals(simpleSeqs.length, idx); } void testSelectorGroups() { Parser parser = new Parser(new SourceFile( SourceFile.IN_MEMORY_FILE, "div, .foobar ,#elemId, .xyzzy .test, ns1|div div #elemId .foobar {}")); Stylesheet stylesheet = parser.parse(); Expect.isNotNull(stylesheet); Expect.equals(stylesheet.topLevels.length, 1); Expect.isTrue(stylesheet.topLevels[0] is RuleSet); RuleSet ruleset = stylesheet.topLevels[0]; Expect.equals(ruleset.selectorGroup.selectors.length, 5); Expect.equals(ruleset.declarationGroup.declarations.length, 0); var groupIdx = 0; for (final selectorGroup in ruleset.selectorGroup.selectors) { var idx = 0; for (final selector in selectorGroup.simpleSelectorSequences) { final simpSelector = selector.simpleSelector; switch (groupIdx) { case 0: // First selector group. Expect.isTrue(simpSelector is ElementSelector); Expect.isTrue(selector.isCombinatorNone()); Expect.equals(simpSelector.name, "div"); break; case 1: // Second selector group. Expect.isTrue(simpSelector is ClassSelector); Expect.isTrue(selector.isCombinatorNone()); Expect.equals(simpSelector.name, "foobar"); break; case 2: // Third selector group. Expect.isTrue(simpSelector is IdSelector); Expect.isTrue(selector.isCombinatorNone()); Expect.equals(simpSelector.name, "elemId"); break; case 3: // Fourth selector group. Expect.equals(selectorGroup.simpleSelectorSequences.length, 2); if (idx == 0) { Expect.isTrue(simpSelector is ClassSelector); Expect.isTrue(selector.isCombinatorNone()); Expect.equals(simpSelector.name, "xyzzy"); } else if (idx == 1) { Expect.isTrue(simpSelector is ClassSelector); Expect.isTrue(selector.isCombinatorDescendant()); Expect.equals(simpSelector.name, "test"); } else { Expect.fail("unexpected expression"); } break; case 4: // Fifth selector group. Expect.equals(selectorGroup.simpleSelectorSequences.length, 4); if (idx == 0) { Expect.isTrue(simpSelector is NamespaceSelector); Expect.isTrue(selector.isCombinatorNone()); Expect.equals(simpSelector.namespace, "ns1"); ElementSelector elementSelector = simpSelector.nameAsSimpleSelector; Expect.isTrue(elementSelector is ElementSelector); Expect.isFalse(elementSelector.isWildcard()); Expect.equals(elementSelector.name, "div"); } else if (idx == 1) { Expect.isTrue(simpSelector is ElementSelector); Expect.isTrue(selector.isCombinatorDescendant()); Expect.equals(simpSelector.name, "div"); } else if (idx == 2) { Expect.isTrue(simpSelector is IdSelector); Expect.isTrue(selector.isCombinatorDescendant()); Expect.equals(simpSelector.name, "elemId"); } else if (idx == 3) { Expect.isTrue(simpSelector is ClassSelector); Expect.isTrue(selector.isCombinatorDescendant()); Expect.equals(simpSelector.name, "foobar"); } else { Expect.fail("unexpected expression"); } break; } idx++; } groupIdx++; } } void testCombinator() { Parser parser = new Parser(new SourceFile( SourceFile.IN_MEMORY_FILE, ".foobar > .bar + .no-story ~ myNs|div #elemId {}")); Stylesheet stylesheet = parser.parse(); Expect.isNotNull(stylesheet); Expect.equals(stylesheet.topLevels.length, 1); Expect.isTrue(stylesheet.topLevels[0] is RuleSet); RuleSet ruleset = stylesheet.topLevels[0]; Expect.equals(ruleset.selectorGroup.selectors.length, 1); Expect.equals(ruleset.declarationGroup.declarations.length, 0); List simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; Expect.equals(simpleSeqs.length, 5); var idx = 0; for (final selector in simpleSeqs) { final simpSelector = selector.simpleSelector; if (idx == 0) { Expect.isTrue(simpSelector is ClassSelector); Expect.isTrue(selector.isCombinatorNone()); Expect.equals(simpSelector.name, "foobar"); } else if (idx == 1) { Expect.isTrue(simpSelector is ClassSelector); Expect.isTrue(selector.isCombinatorGreater()); Expect.equals(simpSelector.name, "bar"); } else if (idx == 2) { Expect.isTrue(simpSelector is ClassSelector); Expect.isTrue(selector.isCombinatorPlus()); Expect.equals(simpSelector.name, "no-story"); } else if (idx == 3) { Expect.isTrue(simpSelector is NamespaceSelector); Expect.isTrue(selector.isCombinatorTilde()); Expect.equals(simpSelector.namespace, "myNs"); ElementSelector elementSelector = simpSelector.nameAsSimpleSelector; Expect.isTrue(elementSelector is ElementSelector); Expect.isFalse(elementSelector.isWildcard()); Expect.equals(elementSelector.name, "div"); } else if (idx == 4) { Expect.isTrue(simpSelector is IdSelector); Expect.isTrue(selector.isCombinatorDescendant()); Expect.equals(simpSelector.name, "elemId"); } else { Expect.fail("unexpected expression"); } idx++; } } void testWildcard() { Parser parser = new Parser(new SourceFile( SourceFile.IN_MEMORY_FILE, "* {}")); Stylesheet stylesheet = parser.parse(); Expect.isNotNull(stylesheet); Expect.equals(stylesheet.topLevels.length, 1); Expect.isTrue(stylesheet.topLevels[0] is RuleSet); RuleSet ruleset = stylesheet.topLevels[0]; Expect.equals(ruleset.selectorGroup.selectors.length, 1); Expect.equals(ruleset.declarationGroup.declarations.length, 0); List simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; for (final selector in simpleSeqs) { final simpSelector = selector.simpleSelector; Expect.isTrue(simpSelector is ElementSelector); Expect.isTrue(selector.isCombinatorNone()); Expect.isTrue(simpSelector.isWildcard()); Expect.equals(simpSelector.name, "*"); } parser = new Parser(new SourceFile(SourceFile.IN_MEMORY_FILE, "*.foobar {}")); stylesheet = parser.parse(); Expect.isNotNull(stylesheet); Expect.equals(stylesheet.topLevels.length, 1); Expect.isTrue(stylesheet.topLevels[0] is RuleSet); ruleset = stylesheet.topLevels[0]; Expect.equals(ruleset.selectorGroup.selectors.length, 1); Expect.equals(ruleset.declarationGroup.declarations.length, 0); simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; Expect.equals(simpleSeqs.length, 2); var idx = 0; for (final selector in simpleSeqs) { final simpSelector = selector.simpleSelector; if (idx == 0) { Expect.isTrue(simpSelector is ElementSelector); Expect.isTrue(selector.isCombinatorNone()); Expect.isTrue(simpSelector.isWildcard()); Expect.equals(simpSelector.name, "*"); } else if (idx == 1) { Expect.isTrue(simpSelector is ClassSelector); Expect.isTrue(selector.isCombinatorNone()); Expect.equals(simpSelector.name, "foobar"); } else { Expect.fail("unexpected expression"); } idx++; } parser = new Parser(new SourceFile(SourceFile.IN_MEMORY_FILE, "myNs|*.foobar {}")); stylesheet = parser.parse(); Expect.isNotNull(stylesheet); Expect.equals(stylesheet.topLevels.length, 1); Expect.isTrue(stylesheet.topLevels[0] is RuleSet); ruleset = stylesheet.topLevels[0]; Expect.equals(ruleset.selectorGroup.selectors.length, 1); Expect.equals(ruleset.declarationGroup.declarations.length, 0); simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; Expect.equals(simpleSeqs.length, 2); idx = 0; for (final selector in simpleSeqs) { final simpSelector = selector.simpleSelector; if (idx == 0) { Expect.isTrue(simpSelector is NamespaceSelector); Expect.isTrue(selector.isCombinatorNone()); Expect.isFalse(simpSelector.isNamespaceWildcard()); ElementSelector elementSelector = simpSelector.nameAsSimpleSelector; Expect.equals("myNs", simpSelector.namespace); Expect.isTrue(elementSelector.isWildcard()); Expect.equals("*", elementSelector.name); } else if (idx == 1) { Expect.isTrue(simpSelector is ClassSelector); Expect.isTrue(selector.isCombinatorNone()); Expect.equals("foobar", simpSelector.name); } else { Expect.fail("unexpected expression"); } idx++; } parser = new Parser(new SourceFile(SourceFile.IN_MEMORY_FILE, "*|*.foobar {}")); stylesheet = parser.parse(); Expect.isNotNull(stylesheet); Expect.isTrue(stylesheet.topLevels[0] is RuleSet); ruleset = stylesheet.topLevels[0]; Expect.equals(ruleset.selectorGroup.selectors.length, 1); Expect.equals(ruleset.declarationGroup.declarations.length, 0); simpleSeqs = ruleset.selectorGroup.selectors[0].simpleSelectorSequences; Expect.equals(simpleSeqs.length, 2); idx = 0; for (final selector in simpleSeqs) { final simpSelector = selector.simpleSelector; if (idx == 0) { Expect.isTrue(simpSelector is NamespaceSelector); Expect.isTrue(selector.isCombinatorNone()); Expect.isTrue(simpSelector.isNamespaceWildcard()); Expect.equals("*", simpSelector.namespace); ElementSelector elementSelector = simpSelector.nameAsSimpleSelector; Expect.isTrue(elementSelector.isWildcard()); Expect.equals("*", elementSelector.name); } else if (idx == 1) { Expect.isTrue(simpSelector is ClassSelector); Expect.isTrue(selector.isCombinatorNone()); Expect.equals("foobar", simpSelector.name); } else { Expect.fail("unexpected expression"); } idx++; } } void testPseudo() { // TODO(terry): Implement } void testAttribute() { // TODO(terry): Implement } void testNegation() { // TODO(terry): Implement }