Index: packages/csslib/test/visitor_test.dart |
diff --git a/packages/csslib/test/visitor_test.dart b/packages/csslib/test/visitor_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..803b10614738b509fbed3c24453db98da81c7ad9 |
--- /dev/null |
+++ b/packages/csslib/test/visitor_test.dart |
@@ -0,0 +1,113 @@ |
+// Copyright (c) 2013, 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 visitor_test; |
+ |
+import 'package:csslib/visitor.dart'; |
+import 'package:test/test.dart'; |
+ |
+import 'testing.dart'; |
+ |
+class ClassVisitor extends Visitor { |
+ final List expectedClasses; |
+ final Set<String> foundClasses = new Set(); |
+ |
+ ClassVisitor(this.expectedClasses); |
+ |
+ void visitClassSelector(ClassSelector node) { |
+ foundClasses.add(node.name); |
+ } |
+ |
+ bool get matches { |
+ bool match = true; |
+ foundClasses.forEach((value) { |
+ match = match && expectedClasses.contains(value); |
+ }); |
+ expectedClasses.forEach((value) { |
+ match = match && foundClasses.contains(value); |
+ }); |
+ |
+ return match; |
+ } |
+} |
+ |
+void testClassVisitors() { |
+ var errors = []; |
+ var in1 = '.foobar { }'; |
+ |
+ var s = parseCss(in1, errors: errors); |
+ |
+ expect(s != null, true); |
+ expect(errors.isEmpty, true, reason: errors.toString()); |
+ |
+ var clsVisits = new ClassVisitor(['foobar'])..visitTree(s); |
+ expect(clsVisits.matches, true); |
+ |
+ in1 = ''' |
+ .foobar1 { } |
+ .xyzzy .foo #my-div { color: red; } |
+ div.hello { font: arial; } |
+ '''; |
+ |
+ s = parseCss(in1, errors: errors..clear(), opts: simpleOptions); |
+ |
+ expect(s != null, true); |
+ expect(errors.isEmpty, true, reason: errors.toString()); |
+ |
+ clsVisits = new ClassVisitor(['foobar1', 'xyzzy', 'foo', 'hello']) |
+ ..visitTree(s); |
+ expect(clsVisits.matches, true); |
+ |
+ expect(prettyPrint(s), r''' |
+.foobar1 { |
+} |
+.xyzzy .foo #my-div { |
+ color: #f00; |
+} |
+div.hello { |
+ font: arial; |
+}'''); |
+} |
+ |
+class PolyfillEmitter extends CssPrinter { |
+ final String _prefix; |
+ |
+ PolyfillEmitter(this._prefix); |
+ |
+ void visitClassSelector(ClassSelector node) { |
+ emit('.${_prefix}_${node.name}'); |
+ } |
+} |
+ |
+String polyfillPrint(String prefix, StyleSheet ss) => |
+ (new PolyfillEmitter(prefix)..visitTree(ss, pretty: true)).toString(); |
+ |
+void testPolyFill() { |
+ var errors = []; |
+ final input = r''' |
+.foobar { } |
+div.xyzzy { } |
+#foo .foo .bar .foobar { } |
+'''; |
+ |
+ final generated = r''' |
+.myComponent_foobar { |
+} |
+div.myComponent_xyzzy { |
+} |
+#foo .myComponent_foo .myComponent_bar .myComponent_foobar { |
+}'''; |
+ |
+ var s = parseCss(input, errors: errors); |
+ expect(s != null, true); |
+ expect(errors.isEmpty, true, reason: errors.toString()); |
+ |
+ final emitted = polyfillPrint('myComponent', s); |
+ expect(emitted, generated); |
+} |
+ |
+main() { |
+ test('Class Visitors', testClassVisitors); |
+ test('Polyfill', testPolyFill); |
+} |