Index: pkg/csslib/test/mixin_test.dart |
diff --git a/pkg/csslib/test/mixin_test.dart b/pkg/csslib/test/mixin_test.dart |
deleted file mode 100644 |
index 6d3b71e0a1cc664f2f6cf6f3479dfd30a0ccfcb5..0000000000000000000000000000000000000000 |
--- a/pkg/csslib/test/mixin_test.dart |
+++ /dev/null |
@@ -1,665 +0,0 @@ |
-// 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 mixin_test; |
- |
-import 'package:unittest/unittest.dart'; |
-import 'testing.dart'; |
- |
-final options = ['--warnings_as_errors', '--no-colors', 'memory']; |
- |
-compileAndValidate(String input, String generated) { |
- var errors = []; |
- var stylesheet = compileCss(input, errors: errors, opts: options); |
- expect(stylesheet != null, true); |
- expect(errors.isEmpty, true, reason: errors.toString()); |
- expect(prettyPrint(stylesheet), generated); |
-} |
- |
-compilePolyfillAndValidate(String input, String generated) { |
- var errors = []; |
- var stylesheet = polyFillCompileCss(input, errors: errors, opts: options); |
- expect(stylesheet != null, true); |
- expect(errors.isEmpty, true, reason: errors.toString()); |
- expect(prettyPrint(stylesheet), generated); |
-} |
- |
-void topLevelMixin() { |
- compileAndValidate(r''' |
-@mixin silly-links { |
- a { |
- color: blue; |
- background-color: red; |
- } |
-} |
- |
-@include silly-links; |
-''', r'''a { |
- color: #00f; |
- background-color: #f00; |
-}'''); |
-} |
- |
-void topLevelMixinTwoIncludes() { |
- compileAndValidate(r''' |
-@mixin a { |
- a { |
- color: blue; |
- background-color: red; |
- } |
-} |
-@mixin b { |
- span { |
- color: black; |
- background-color: orange; |
- } |
-} |
-@include a; |
-@include b; |
-''', r'''a { |
- color: #00f; |
- background-color: #f00; |
-} |
-span { |
- color: #000; |
- background-color: #ffa500; |
-}'''); |
-} |
- |
-/** Tests top-level mixins that includes another mixin. */ |
-void topLevelMixinMultiRulesets() { |
- compileAndValidate(r''' |
-@mixin a { |
- a { |
- color: blue; |
- background-color: red; |
- } |
-} |
-@mixin b { |
- #foo-id { |
- border-top: 1px solid red; |
- border-bottom: 2px solid green; |
- } |
-} |
-@mixin c { |
- span { |
- color: black; |
- background-color: orange; |
- } |
- @include b; |
-} |
-@include a; |
-@include c; |
-''', r'''a { |
- color: #00f; |
- background-color: #f00; |
-} |
-span { |
- color: #000; |
- background-color: #ffa500; |
-} |
-#foo-id { |
- border-top: 1px solid #f00; |
- border-bottom: 2px solid #008000; |
-}'''); |
-} |
- |
-void topLevelMixinDeeplyNestedRulesets() { |
- compileAndValidate(r''' |
-@mixin a { |
- a { |
- color: blue; |
- background-color: red; |
- } |
-} |
-@mixin b { |
- #foo-id { |
- border-top: 1px solid red; |
- border-bottom: 2px solid green; |
- } |
-} |
-@mixin f { |
- #split-bar div { |
- border: 1px solid lightgray; |
- } |
-} |
-@mixin e { |
- #split-bar:visited { |
- color: gray; |
- } |
- @include f; |
-} |
-@mixin d { |
- a:hover { |
- cursor: arrow; |
- } |
- @include e |
-} |
-@mixin c { |
- @include a; |
- span { |
- color: black; |
- background-color: orange; |
- } |
- @include b; |
- @include d; |
-} |
-@include c; |
-''', r'''a { |
- color: #00f; |
- background-color: #f00; |
-} |
-span { |
- color: #000; |
- background-color: #ffa500; |
-} |
-#foo-id { |
- border-top: 1px solid #f00; |
- border-bottom: 2px solid #008000; |
-} |
-a:hover { |
- cursor: arrow; |
-} |
-#split-bar:visited { |
- color: #808080; |
-} |
-#split-bar div { |
- border: 1px solid #d3d3d3; |
-}'''); |
-} |
- |
-/** Tests selector groups and other combinators. */ |
-void topLevelMixinSelectors() { |
- compileAndValidate(r''' |
-@mixin a { |
- a, b { |
- color: blue; |
- background-color: red; |
- } |
- div > span { |
- color: black; |
- background-color: orange; |
- } |
-} |
- |
-@include a; |
-''', r'''a, b { |
- color: #00f; |
- background-color: #f00; |
-} |
-div > span { |
- color: #000; |
- background-color: #ffa500; |
-}'''); |
-} |
- |
-void declSimpleMixin() { |
- compileAndValidate(r''' |
-@mixin div-border { |
- border: 2px dashed red; |
-} |
-div { |
- @include div-border; |
-} |
-''', r'''div { |
- border: 2px dashed #f00; |
-}'''); |
-} |
- |
-void declMixinTwoIncludes() { |
- compileAndValidate(r''' |
-@mixin div-border { |
- border: 2px dashed red; |
-} |
-@mixin div-color { |
- color: blue; |
-} |
-div { |
- @include div-border; |
- @include div-color; |
-} |
-''', r'''div { |
- border: 2px dashed #f00; |
- color: #00f; |
-}'''); |
-} |
- |
-void declMixinNestedIncludes() { |
- compileAndValidate(r''' |
-@mixin div-border { |
- border: 2px dashed red; |
-} |
-@mixin div-padding { |
- padding: .5em; |
-} |
-@mixin div-margin { |
- margin: 5px; |
-} |
-@mixin div-color { |
- @include div-padding; |
- color: blue; |
- @include div-margin; |
-} |
-div { |
- @include div-border; |
- @include div-color; |
-} |
-''', r'''div { |
- border: 2px dashed #f00; |
- padding: .5em; |
- color: #00f; |
- margin: 5px; |
-}'''); |
-} |
- |
-void declMixinDeeperNestedIncludes() { |
- compileAndValidate(r''' |
-@mixin div-border { |
- border: 2px dashed red; |
-} |
-@mixin div-padding { |
- padding: .5em; |
-} |
-@mixin div-margin { |
- margin: 5px; |
-} |
-@mixin div-color { |
- @include div-padding; |
- @include div-margin; |
-} |
-div { |
- @include div-border; |
- @include div-color; |
-} |
-''', r'''div { |
- border: 2px dashed #f00; |
- padding: .5em; |
- margin: 5px; |
-}'''); |
-} |
- |
-void mixinArg() { |
- compileAndValidate(r''' |
-@mixin div-border-1 { |
- border: 2px dashed red; |
-} |
-@mixin div-border-2() { |
- border: 22px solid blue; |
-} |
-@mixin div-left(@dist) { |
- margin-left: @dist; |
-} |
-@mixin div-right(var-margin) { |
- margin-right: var(margin); |
-} |
-div-1 { |
- @include div-left(10px); |
- @include div-right(100px); |
- @include div-border-1; |
-} |
-div-2 { |
- @include div-left(20em); |
- @include div-right(5in); |
- @include div-border-2(); |
-} |
-div-3 { |
- @include div-border-1(); |
-} |
-div-4 { |
- @include div-border-2; |
-} |
-''', r'''div-1 { |
- margin-left: 10px; |
- margin-right: 100px; |
- border: 2px dashed #f00; |
-} |
-div-2 { |
- margin-left: 20em; |
- margin-right: 5in; |
- border: 22px solid #00f; |
-} |
-div-3 { |
- border: 2px dashed #f00; |
-} |
-div-4 { |
- border: 22px solid #00f; |
-}'''); |
-} |
- |
-void mixinArgs() { |
- compileAndValidate(r''' |
-@mixin box-shadow(@shadows...) { |
- -moz-box-shadow: @shadows; |
- -webkit-box-shadow: @shadows; |
- box-shadow: var(shadows); |
-} |
- |
-.shadows { |
- @include box-shadow(0px 4px 5px #666, 2px 6px 10px #999); |
-}''', r''' |
-.shadowed { |
- -moz-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999; |
- -webkit-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999; |
- box-shadow: 0px 4px 5px #666, 2px 6px 10px #999; |
-} |
-'''); |
-} |
- |
-void mixinManyArgs() { |
- compileAndValidate(r''' |
-@mixin border(@border-values) { |
- border: @border-values |
-} |
- |
-.primary { |
- @include border(3px solid green); |
-} |
-''', r''' |
-.primary { |
- border: 3px solid #008000; |
-}'''); |
- |
- compileAndValidate(r''' |
-@mixin setup(@border-color, @border-style, @border-size, @color) { |
- border: @border-size @border-style @border-color; |
- color: @color; |
-} |
- |
-.primary { |
- @include setup(red, solid, 5px, blue); |
-} |
-''', r''' |
-.primary { |
- border: 5px solid #f00; |
- color: #00f; |
-}'''); |
- |
- // Test passing a declaration that is multiple parameters. |
- compileAndValidate(r''' |
-@mixin colors(@text, @background, @border) { |
- color: @text; |
- background-color: @background; |
- border-color: @border; |
-} |
- |
-@values: #ff0000, #00ff00, #0000ff; |
-.primary { |
- @include colors(@values); |
-} |
-''', r'''var-values: #f00, #0f0, #00f; |
- |
-.primary { |
- color: #f00; |
- background-color: #0f0; |
- border-color: #00f; |
-}'''); |
- |
- compilePolyfillAndValidate(r''' |
-@mixin colors(@text, @background, @border) { |
- color: @text; |
- background-color: @background; |
- border-color: @border; |
-} |
- |
-@values: #ff0000, #00ff00, #0000ff; |
-.primary { |
- @include colors(@values); |
-} |
-''', r'''.primary { |
- color: #f00; |
- background-color: #0f0; |
- border-color: #00f; |
-}'''); |
-} |
- |
-void badDeclarationInclude() { |
- final errors = []; |
- final input = r''' |
-@mixin a { |
- #foo-id { |
- color: red; |
- } |
-} |
-@mixin b { |
- span { |
- border: 2px dashed red; |
- @include a; |
- } |
-} |
-@include b; |
-'''; |
- |
- var stylesheet = compileCss(input, errors: errors, opts: options); |
- |
- expect(stylesheet != null, true); |
- expect(errors.isNotEmpty, true); |
- expect(errors.length, 1, reason: errors.toString()); |
- var error = errors[0]; |
- expect(error.message, 'Using top-level mixin a as a declaration'); |
- expect(error.span.start.line, 8); |
- expect(error.span.end.offset, 105); |
-} |
- |
-void badTopInclude() { |
- final errors = []; |
- final input = r''' |
-@mixin b { |
- color: red; |
-} |
- |
-@mixin a { |
- span { |
- border: 2px dashed red; |
- } |
- @include b; |
-} |
- |
-@include a; |
- '''; |
- |
- var generated = r'''span { |
- border: 2px dashed #f00; |
-}'''; |
- |
- var stylesheet = compileCss(input, errors: errors, opts: options); |
- expect(stylesheet != null, true); |
- expect(errors.length, 1, reason: errors.toString()); |
- var error = errors[0]; |
- expect(error.message, 'Using declaration mixin b as top-level mixin'); |
- expect(error.span.start.line, 8); |
- expect(error.span.end.offset, 90); |
-} |
- |
-void emptyMixin() { |
- final errors = []; |
- final input = r''' |
-@mixin a { |
-} |
-@mixin b { |
- border: 2px dashed red; |
- @include a; |
-} |
-div { |
- @include b; |
-} |
- '''; |
- |
- var generated = r'''div { |
- border: 2px dashed #f00; |
-}'''; |
- |
- var stylesheet = compileCss(input, errors: errors, opts: options); |
- |
- expect(stylesheet != null, true); |
- expect(errors.isEmpty, true, reason: errors.toString()); |
- expect(prettyPrint(stylesheet), generated); |
-} |
- |
- |
-void undefinedTopLevel() { |
- final errors = []; |
- final input = r''' |
-@mixin a { |
- @include b; |
-} |
-@mixin b { |
- span { |
- border: 2px dashed red; |
- } |
- @include a; |
-} |
- |
-@include b; |
- |
- '''; |
- |
- var stylesheet = compileCss(input, errors: errors, opts: options); |
- |
- expect(stylesheet != null, true); |
- expect(errors.isNotEmpty, true); |
- expect(errors.length, 1, reason: errors.toString()); |
- var error = errors[0]; |
- expect(error.message, 'Undefined mixin b'); |
- expect(error.span.start.line, 1); |
- expect(error.span.start.offset, 14); |
-} |
- |
-void undefinedDeclaration() { |
- final errors = []; |
- final input = r''' |
-@mixin a { |
- @include b; |
-} |
-@mixin b { |
- border: 2px dashed red; |
- @include a; |
-} |
-div { |
- @include b; |
-} |
- '''; |
- |
- var stylesheet = compileCss(input, errors: errors, opts: options); |
- |
- expect(stylesheet != null, true); |
- expect(errors.isNotEmpty, true); |
- expect(errors.length, 1, reason: errors.toString()); |
- var error = errors[0]; |
- expect(error.message, 'Undefined mixin b'); |
- expect(error.span.start.line, 1); |
- expect(error.span.start.offset, 14); |
-} |
- |
-void includeGrammar() { |
- compileAndValidate(r''' |
-@mixin a { |
- foo { color: red } |
-} |
- |
-@mixin b { |
- @include a; |
- @include a; |
-} |
- |
-@include b; |
-''', r'''foo { |
- color: #f00; |
-} |
-foo { |
- color: #f00; |
-}'''); |
- |
- compileAndValidate(r''' |
-@mixin a { |
- color: red |
-} |
- |
-foo { |
- @include a; |
- @include a |
-} |
-''', r'''foo { |
- color: #f00; |
- color: #f00; |
-}'''); |
- |
- var errors = []; |
- var input = r''' |
-@mixin a { |
- foo { color: red } |
-} |
- |
-@mixin b { |
- @include a |
- @include a |
-} |
- |
-@include b |
-'''; |
- |
- var stylesheet = compileCss(input, errors: errors, opts: options); |
- |
- expect(stylesheet != null, true); |
- |
- expect(errors.isNotEmpty, true); |
- expect(errors.length, 6, reason: errors.toString()); |
- var error = errors[0]; |
- expect(error.message, 'parsing error expected ;'); |
- expect(error.span.start.line, 6); |
- expect(error.span.end.offset, 69); |
- error = errors[1]; |
- expect(error.message, 'expected :, but found }'); |
- expect(error.span.start.line, 7); |
- expect(error.span.end.offset, 73); |
- error = errors[2]; |
- expect(error.message, 'parsing error expected }'); |
- expect(error.span.start.line, 9); |
- expect(error.span.end.offset, 83); |
- error = errors[3]; |
- expect(error.message, 'expected {, but found end of file()'); |
- expect(error.span.start.line, 9); |
- expect(error.span.end.offset, 86); |
- error = errors[4]; |
- expect(error.message, 'expected }, but found end of file()'); |
- expect(error.span.start.line, 10); |
- expect(error.span.end.offset, 86); |
- error = errors[5]; |
- expect(error.message, 'Using top-level mixin a as a declaration'); |
- expect(error.span.start.line, 5); |
- expect(error.span.end.offset, 56); |
-} |
- |
-main() { |
- group('Basic mixin', () { |
- test('include grammar', includeGrammar); |
- test('empty mixin content', emptyMixin); |
- }); |
- |
- group('Top-level mixin', () { |
- test('simple mixin', topLevelMixin); |
- test('mixin with two @includes', topLevelMixinTwoIncludes); |
- test('multi rulesets', topLevelMixinMultiRulesets); |
- test('multi rulesets and nesting', topLevelMixinDeeplyNestedRulesets); |
- test('selector groups', topLevelMixinSelectors); |
- }); |
- |
- group('Declaration mixin', () { |
- test('simple', declSimpleMixin); |
- test('with two @includes', declMixinTwoIncludes); |
- test('with includes', declMixinNestedIncludes); |
- test('with deeper nesting', declMixinDeeperNestedIncludes); |
- }); |
- |
- group('Mixin arguments', () { |
- test('simple arg', mixinArg); |
- test('multiple args and var decls as args', mixinManyArgs); |
- }); |
- |
- group('Mixin warnings', () { |
- test('undefined top-level', undefinedTopLevel); |
- test('undefined declaration', undefinedDeclaration); |
- test('detect bad top-level as declaration', badDeclarationInclude); |
- test('detect bad declaration as top-level', badTopInclude); |
- }); |
-} |