| Index: pkg/csslib/test/var_test.dart
|
| diff --git a/pkg/csslib/test/var_test.dart b/pkg/csslib/test/var_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..fb870c7274f11e9cf5dd750033f28ff89b9de4dd
|
| --- /dev/null
|
| +++ b/pkg/csslib/test/var_test.dart
|
| @@ -0,0 +1,629 @@
|
| +// 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 var_test;
|
| +
|
| +import 'dart:utf';
|
| +import 'package:unittest/unittest.dart';
|
| +import 'package:csslib/parser.dart';
|
| +import 'package:csslib/visitor.dart';
|
| +import 'testing.dart';
|
| +
|
| +void simpleVar() {
|
| + final errors = [];
|
| + final input = ''':root {
|
| + var-color-background: red;
|
| + var-color-foreground: blue;
|
| +
|
| + var-a: var(b);
|
| + var-b: var(c);
|
| + var-c: #00ff00;
|
| +}
|
| +.testIt {
|
| + color: var(color-foreground);
|
| + background: var(color-background);
|
| +}
|
| +''';
|
| +
|
| + final generated = ''':root {
|
| + var-color-background: #f00;
|
| + var-color-foreground: #00f;
|
| + var-a: var(b);
|
| + var-b: var(c);
|
| + var-c: #0f0;
|
| +}
|
| +.testIt {
|
| + color: var(color-foreground);
|
| + background: var(color-background);
|
| +}''';
|
| +
|
| + var stylesheet = compileCss(input, errors: errors,
|
| + opts: ['--no-colors', 'memory']);
|
| +
|
| + expect(stylesheet != null, true);
|
| + expect(errors.isEmpty, true, reason: errors.toString());
|
| + expect(prettyPrint(stylesheet), generated);
|
| +}
|
| +
|
| +void expressionsVar() {
|
| + final errors = [];
|
| + final input = ''':root {
|
| + var-color-background: red;
|
| + var-color-foreground: blue;
|
| +
|
| + var-a: var(b);
|
| + var-b: var(c);
|
| + var-c: #00ff00;
|
| +
|
| + var-image: url(test.png);
|
| +
|
| + var-b-width: 20cm;
|
| + var-m-width: 33%;
|
| + var-b-height: 30EM;
|
| + var-width: .6in;
|
| + var-length: 1.2in;
|
| + var-web-stuff: -10Px;
|
| + var-rgba: rgba(10,20,255);
|
| + var-transition: color 0.4s;
|
| + var-transform: rotate(20deg);
|
| + var-content: "✔";
|
| + var-text-shadow: 0 -1px 0 #bfbfbf;
|
| + var-font-family: Gentium;
|
| + var-src: url("http://example.com/fonts/Gentium.ttf");
|
| + var-src-1: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf");
|
| + var-unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF;
|
| + var-unicode-range-1: U+0A-FF, U+980-9FF, U+????, U+3???;
|
| + var-grid-columns: 10px ("content" 1fr 10px) [4];
|
| +}
|
| +
|
| +.testIt {
|
| + color: var(color-foreground);
|
| + background: var(c);
|
| + background-image: var(image);
|
| +
|
| + border-width: var(b-width);
|
| + margin-width: var(m-width);
|
| + border-height: var(b-height);
|
| + width: var(width);
|
| + length: var(length);
|
| + -web-stuff: var(web-stuff);
|
| + background-color: var(rgba);
|
| +
|
| + transition: var(transition);
|
| + transform: var(transform);
|
| + content: var(content);
|
| + text-shadow: var(text-shadow);
|
| +}
|
| +
|
| +@font-face {
|
| + font-family: var(font-family);
|
| + src: var(src);
|
| + unicode-range: var(unicode-range);
|
| +}
|
| +
|
| +@font-face {
|
| + font-family: var(font-family);
|
| + src: var(src-1);
|
| + unicode-range: var(unicode-range-1);
|
| +}
|
| +
|
| +.foobar {
|
| + grid-columns: var(grid-columns);
|
| +}
|
| +''';
|
| +
|
| + final generated = ''':root {
|
| + var-color-background: #f00;
|
| + var-color-foreground: #00f;
|
| + var-a: var(b);
|
| + var-b: var(c);
|
| + var-c: #0f0;
|
| + var-image: url("test.png");
|
| + var-b-width: 20cm;
|
| + var-m-width: 33%;
|
| + var-b-height: 30em;
|
| + var-width: .6in;
|
| + var-length: 1.2in;
|
| + var-web-stuff: -10px;
|
| + var-rgba: rgba(10, 20, 255);
|
| + var-transition: color 0.4s;
|
| + var-transform: rotate(20deg);
|
| + var-content: "✔";
|
| + var-text-shadow: 0 -1px 0 #bfbfbf;
|
| + var-font-family: Gentium;
|
| + var-src: url("http://example.com/fonts/Gentium.ttf");
|
| + var-src-1: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf");
|
| + var-unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF;
|
| + var-unicode-range-1: U+0A-FF, U+980-9FF, U+????, U+3???;
|
| + var-grid-columns: 10px ("content" 1fr 10px) [4];
|
| +}
|
| +.testIt {
|
| + color: var(color-foreground);
|
| + background: var(c);
|
| + background-image: var(image);
|
| + border-width: var(b-width);
|
| + margin-width: var(m-width);
|
| + border-height: var(b-height);
|
| + width: var(width);
|
| + length: var(length);
|
| + -web-stuff: var(web-stuff);
|
| + background-color: var(rgba);
|
| + transition: var(transition);
|
| + transform: var(transform);
|
| + content: var(content);
|
| + text-shadow: var(text-shadow);
|
| +}
|
| +@font-face {
|
| + font-family: var(font-family);
|
| + src: var(src);
|
| + unicode-range: var(unicode-range);
|
| +}
|
| +@font-face {
|
| + font-family: var(font-family);
|
| + src: var(src-1);
|
| + unicode-range: var(unicode-range-1);
|
| +}
|
| +.foobar {
|
| + grid-columns: var(grid-columns);
|
| +}''';
|
| +
|
| + var stylesheet = compileCss(input, errors: errors,
|
| + opts: ['--no-colors', 'memory']);
|
| +
|
| + expect(stylesheet != null, true);
|
| + expect(errors.isEmpty, true, reason: errors.toString());
|
| + expect(prettyPrint(stylesheet), generated);
|
| +}
|
| +
|
| +void defaultVar() {
|
| + final errors = [];
|
| + final input = '''
|
| +:root {
|
| + var-color-background: red;
|
| + var-color-foreground: blue;
|
| +
|
| + var-a: var(b);
|
| + var-b: var(c);
|
| + var-c: #00ff00;
|
| +
|
| + var-image: url(test.png);
|
| +
|
| + var-b-width: 20cm;
|
| + var-m-width: 33%;
|
| + var-b-height: 30EM;
|
| +}
|
| +
|
| +.test {
|
| + background-color: var(test, orange);
|
| +}
|
| +
|
| +body {
|
| + background: var(a) var(image) no-repeat right top;
|
| +}
|
| +
|
| +div {
|
| + background: var(color-background) url('img_tree.png') no-repeat right top;
|
| +}
|
| +
|
| +.test-2 {
|
| + background: var(color-background) var(image-2, url('img_1.png'))
|
| + no-repeat right top;
|
| +}
|
| +
|
| +.test-3 {
|
| + background: var(color-background) var(image-2) no-repeat right top;
|
| +}
|
| +
|
| +.test-4 {
|
| + background: #ffff00 var(image) no-repeat right top;
|
| +}
|
| +
|
| +.test-5 {
|
| + background: var(test-color, var(a)) var(image) no-repeat right top;
|
| +}
|
| +
|
| +.test-6 {
|
| + border: red var(a-1, solid 20px);
|
| +}
|
| +''';
|
| +
|
| + final generated = ''':root {
|
| + var-color-background: #f00;
|
| + var-color-foreground: #00f;
|
| + var-a: var(b);
|
| + var-b: var(c);
|
| + var-c: #0f0;
|
| + var-image: url("test.png");
|
| + var-b-width: 20cm;
|
| + var-m-width: 33%;
|
| + var-b-height: 30em;
|
| +}
|
| +.test {
|
| + background-color: var(test, #ffa500);
|
| +}
|
| +body {
|
| + background: var(a) var(image) no-repeat right top;
|
| +}
|
| +div {
|
| + background: var(color-background) url("img_tree.png") no-repeat right top;
|
| +}
|
| +.test-2 {
|
| + background: var(color-background) var(image-2, url("img_1.png")) no-repeat right top;
|
| +}
|
| +.test-3 {
|
| + background: var(color-background) var(image-2) no-repeat right top;
|
| +}
|
| +.test-4 {
|
| + background: #ff0 var(image) no-repeat right top;
|
| +}
|
| +.test-5 {
|
| + background: var(test-color, var(a)) var(image) no-repeat right top;
|
| +}
|
| +.test-6 {
|
| + border: #f00 var(a-1, solid 20px);
|
| +}''';
|
| +
|
| + var stylesheet = compileCss(input, errors: errors,
|
| + opts: ['--no-colors', 'memory']);
|
| +
|
| + expect(stylesheet != null, true);
|
| + expect(errors.isEmpty, true, reason: errors.toString());
|
| + expect(prettyPrint(stylesheet), generated);
|
| +}
|
| +
|
| +void cyclesVar() {
|
| + final errors = [];
|
| + final input = ''':root {
|
| + var-color-background: red;
|
| + var-color-foreground: blue;
|
| +
|
| + var-a: var(b);
|
| + var-b: var(c);
|
| + var-c: #00ff00;
|
| +
|
| + var-one: var(two);
|
| + var-two: var(one);
|
| +
|
| + var-four: var(five);
|
| + var-five: var(six);
|
| + var-six: var(four);
|
| +
|
| + var-def-1: var(def-2);
|
| + var-def-2: var(def-3);
|
| + var-def-3: var(def-2);
|
| +}
|
| +.testIt {
|
| + color: var(color-foreground);
|
| + background: var(color-background);
|
| +}
|
| +.test-2 {
|
| + color: var(one);
|
| +}
|
| +''';
|
| +
|
| + final generated = ''':root {
|
| + var-color-background: #f00;
|
| + var-color-foreground: #00f;
|
| + var-a: var(b);
|
| + var-b: var(c);
|
| + var-c: #0f0;
|
| +}
|
| +.testIt {
|
| + color: var(color-foreground);
|
| + background: var(color-background);
|
| +}
|
| +.test-2 {
|
| + color: var(one);
|
| +}''';
|
| +
|
| + var stylesheet = compileCss(input, errors: errors,
|
| + opts: ['--no-colors', '--warnings_as_errors', 'memory']);
|
| +
|
| + expect(stylesheet != null, true);
|
| + expect(errors.length, 8, reason: errors.toString());
|
| + expect(errors[0].toString(),
|
| + 'error :14:3: var cycle detected var-six\n'
|
| + ' var-six: var(four);\n'
|
| + ' ^^^^^^^^^^^^^^^^^^');
|
| + expect(errors[1].toString(),
|
| + 'error :18:3: var cycle detected var-def-3\n'
|
| + ' var-def-3: var(def-2);\n'
|
| + ' ^^^^^^^^^^^^^^^^^^^^^');
|
| + expect(errors[2].toString(),
|
| + 'error :10:3: var cycle detected var-two\n'
|
| + ' var-two: var(one);\n'
|
| + ' ^^^^^^^^^^^^^^^^^');
|
| + expect(errors[3].toString(),
|
| + 'error :17:3: var cycle detected var-def-2\n'
|
| + ' var-def-2: var(def-3);\n'
|
| + ' ^^^^^^^^^^^^^^^^^^^^^');
|
| + expect(errors[4].toString(),
|
| + 'error :16:3: var cycle detected var-def-1\n'
|
| + ' var-def-1: var(def-2);\n'
|
| + ' ^^^^^^^^^^^^^^^^^^^^^');
|
| + expect(errors[5].toString(),
|
| + 'error :13:3: var cycle detected var-five\n'
|
| + ' var-five: var(six);\n'
|
| + ' ^^^^^^^^^^^^^^^^^^');
|
| + expect(errors[6].toString(),
|
| + 'error :9:3: var cycle detected var-one\n'
|
| + ' var-one: var(two);\n'
|
| + ' ^^^^^^^^^^^^^^^^^');
|
| + expect(errors[7].toString(),
|
| + 'error :12:3: var cycle detected var-four\n'
|
| + ' var-four: var(five);\n'
|
| + ' ^^^^^^^^^^^^^^^^^^^');
|
| + expect(prettyPrint(stylesheet), generated);
|
| +}
|
| +
|
| +parserVar() {
|
| + final errors = [];
|
| + final input = ''':root {
|
| + var-color-background: red;
|
| + var-color-foreground: blue;
|
| +
|
| + var-a: var(b);
|
| + var-b: var(c);
|
| + var-c: #00ff00;
|
| +
|
| + var-image: url(test.png);
|
| +
|
| + var-b-width: 20cm;
|
| + var-m-width: 33%;
|
| + var-b-height: 30EM;
|
| + var-width: .6in;
|
| + var-length: 1.2in;
|
| + var-web-stuff: -10Px;
|
| + var-rgba: rgba(10,20,255);
|
| + var-transition: color 0.4s;
|
| + var-transform: rotate(20deg);
|
| + var-content: "✔";
|
| + var-text-shadow: 0 -1px 0 #bfbfbf;
|
| + var-font-family: Gentium;
|
| + var-src: url("http://example.com/fonts/Gentium.ttf");
|
| + var-src-1: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf");
|
| + var-unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF;
|
| + var-unicode-range-1: U+0A-FF, U+980-9FF, U+????, U+3???;
|
| + var-grid-columns: 10px ("content" 1fr 10px) [4];
|
| +}
|
| +
|
| +.testIt {
|
| + color: var(color-foreground);
|
| + background: var(c);
|
| + background-image: var(image);
|
| +
|
| + border-width: var(b-width);
|
| + margin-width: var(m-width);
|
| + border-height: var(b-height);
|
| + width: var(width);
|
| + length: var(length);
|
| + -web-stuff: var(web-stuff);
|
| + background-color: var(rgba);
|
| +
|
| + transition: var(transition);
|
| + transform: var(transform);
|
| + content: var(content);
|
| + text-shadow: var(text-shadow);
|
| +}
|
| +
|
| +@font-face {
|
| + font-family: var(font-family);
|
| + src: var(src);
|
| + unicode-range: var(unicode-range);
|
| +}
|
| +
|
| +@font-face {
|
| + font-family: var(font-family);
|
| + src: var(src-1);
|
| + unicode-range: var(unicode-range-1);
|
| +}
|
| +
|
| +.foobar {
|
| + grid-columns: var(grid-columns);
|
| +}
|
| +''';
|
| +
|
| + final generated = ''':root {
|
| + var-color-background: #f00;
|
| + var-color-foreground: #00f;
|
| + var-a: var(b);
|
| + var-b: var(c);
|
| + var-c: #0f0;
|
| + var-image: url("test.png");
|
| + var-b-width: 20cm;
|
| + var-m-width: 33%;
|
| + var-b-height: 30em;
|
| + var-width: .6in;
|
| + var-length: 1.2in;
|
| + var-web-stuff: -10px;
|
| + var-rgba: rgba(10, 20, 255);
|
| + var-transition: color 0.4s;
|
| + var-transform: rotate(20deg);
|
| + var-content: "✔";
|
| + var-text-shadow: 0 -1px 0 #bfbfbf;
|
| + var-font-family: Gentium;
|
| + var-src: url("http://example.com/fonts/Gentium.ttf");
|
| + var-src-1: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf");
|
| + var-unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF;
|
| + var-unicode-range-1: U+0A-FF, U+980-9FF, U+????, U+3???;
|
| + var-grid-columns: 10px ("content" 1fr 10px) [4];
|
| +}
|
| +.testIt {
|
| + color: var(color-foreground);
|
| + background: var(c);
|
| + background-image: var(image);
|
| + border-width: var(b-width);
|
| + margin-width: var(m-width);
|
| + border-height: var(b-height);
|
| + width: var(width);
|
| + length: var(length);
|
| + -web-stuff: var(web-stuff);
|
| + background-color: var(rgba);
|
| + transition: var(transition);
|
| + transform: var(transform);
|
| + content: var(content);
|
| + text-shadow: var(text-shadow);
|
| +}
|
| +@font-face {
|
| + font-family: var(font-family);
|
| + src: var(src);
|
| + unicode-range: var(unicode-range);
|
| +}
|
| +@font-face {
|
| + font-family: var(font-family);
|
| + src: var(src-1);
|
| + unicode-range: var(unicode-range-1);
|
| +}
|
| +.foobar {
|
| + grid-columns: var(grid-columns);
|
| +}''';
|
| +
|
| + var stylesheet = parseCss(input, errors: errors,
|
| + opts: ['--no-colors', 'memory']);
|
| +
|
| + expect(stylesheet != null, true);
|
| + expect(errors.isEmpty, true, reason: errors.toString());
|
| + expect(prettyPrint(stylesheet), generated);
|
| +}
|
| +
|
| +testVar() {
|
| + final errors = [];
|
| + final input = '''
|
| +@color-background: red;
|
| +@color-foreground: blue;
|
| +
|
| +.test {
|
| + background-color: var(color-background);
|
| + color: var(color-foreground);
|
| +}
|
| +''';
|
| + final generated = '''
|
| +var-color-background: #f00;
|
| +var-color-foreground: #00f;
|
| +
|
| +.test {
|
| + background-color: var(color-background);
|
| + color: var(color-foreground);
|
| +}''';
|
| +
|
| + var stylesheet = parseCss(input, errors: errors,
|
| + opts: ['--no-colors', 'memory']);
|
| +
|
| + expect(stylesheet != null, true);
|
| + expect(errors.isEmpty, true, reason: errors.toString());
|
| + expect(prettyPrint(stylesheet), generated);
|
| +
|
| + stylesheet = compileCss(input, errors: errors..clear(),
|
| + opts: ['--no-colors', 'memory']);
|
| +
|
| + expect(stylesheet != null, true);
|
| + expect(errors.isEmpty, true, reason: errors.toString());
|
| + expect(prettyPrint(stylesheet), generated);
|
| +
|
| + final input2 = '''
|
| +@color-background: red;
|
| +@color-foreground: blue;
|
| +
|
| +.test {
|
| + background-color: @color-background;
|
| + color: @color-foreground;
|
| +}
|
| +''';
|
| + final generated2 = '''var-color-background: #f00;
|
| +var-color-foreground: #00f;
|
| +
|
| +.test {
|
| + background-color: var(color-background);
|
| + color: var(color-foreground);
|
| +}''';
|
| +
|
| + stylesheet = parseCss(input, errors: errors..clear(),
|
| + opts: ['--no-colors', 'memory']);
|
| +
|
| + expect(stylesheet != null, true);
|
| + expect(errors.isEmpty, true, reason: errors.toString());
|
| + expect(prettyPrint(stylesheet), generated2);
|
| +
|
| + stylesheet = compileCss(input2, errors: errors..clear(),
|
| + opts: ['--no-colors', 'memory', '--no-less']);
|
| +
|
| + expect(stylesheet != null, true);
|
| + expect(errors.isEmpty, true, reason: errors.toString());
|
| + expect(prettyPrint(stylesheet), generated2);
|
| +}
|
| +
|
| +testLess() {
|
| + final errors = [];
|
| + final input = '''
|
| +@color-background: red;
|
| +@color-foreground: blue;
|
| +
|
| +.test {
|
| + background-color: var(color-background);
|
| + color: var(color-foreground);
|
| +}
|
| +''';
|
| + final generated = '''var-color-background: #f00;
|
| +var-color-foreground: #00f;
|
| +
|
| +.test {
|
| + background-color: var(color-background);
|
| + color: var(color-foreground);
|
| +}''';
|
| +
|
| + var stylesheet = parseCss(input, errors: errors,
|
| + opts: ['--no-colors', 'memory']);
|
| +
|
| + expect(stylesheet != null, true);
|
| + expect(errors.isEmpty, true, reason: errors.toString());
|
| + expect(prettyPrint(stylesheet), generated);
|
| +
|
| + stylesheet = compileCss(input, errors: errors..clear(),
|
| + opts: ['--no-colors', 'memory']);
|
| +
|
| + expect(stylesheet != null, true);
|
| + expect(errors.isEmpty, true, reason: errors.toString());
|
| + expect(prettyPrint(stylesheet), generated);
|
| +
|
| + final input2 = '''
|
| +@color-background: red;
|
| +@color-foreground: blue;
|
| +
|
| +.test {
|
| + background-color: @color-background;
|
| + color: @color-foreground;
|
| +}
|
| +''';
|
| + final generated2 = '''var-color-background: #f00;
|
| +var-color-foreground: #00f;
|
| +
|
| +.test {
|
| + background-color: var(color-background);
|
| + color: var(color-foreground);
|
| +}''';
|
| +
|
| + stylesheet = parseCss(input, errors: errors..clear(),
|
| + opts: ['--no-colors', 'memory']);
|
| +
|
| + expect(stylesheet != null, true);
|
| + expect(errors.isEmpty, true, reason: errors.toString());
|
| + expect(prettyPrint(stylesheet), generated2);
|
| +
|
| + stylesheet = compileCss(input2, errors: errors..clear(),
|
| + opts: ['--no-colors', 'memory', '--no-less']);
|
| +
|
| + expect(stylesheet != null, true);
|
| + expect(errors.isEmpty, true, reason: errors.toString());
|
| + expect(prettyPrint(stylesheet), generated2);
|
| +}
|
| +
|
| +main() {
|
| + test('Simple var', simpleVar);
|
| + test('Expressions var', expressionsVar);
|
| + test('Default value in var()', defaultVar);
|
| + test('CSS Parser only var', parserVar);
|
| + test('Var syntax', testVar);
|
| + test('Cycles var', cyclesVar);
|
| + test('Less syntax', testLess);
|
| +}
|
|
|