| Index: pkg/csslib/test/declaration_test.dart
|
| diff --git a/pkg/csslib/test/declaration_test.dart b/pkg/csslib/test/declaration_test.dart
|
| deleted file mode 100644
|
| index 857df4873298cbbacec41b0b4f2ebc39c041a974..0000000000000000000000000000000000000000
|
| --- a/pkg/csslib/test/declaration_test.dart
|
| +++ /dev/null
|
| @@ -1,1034 +0,0 @@
|
| -// 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 declaration_test;
|
| -
|
| -import 'package:unittest/unittest.dart';
|
| -import 'testing.dart';
|
| -
|
| -
|
| -/** CSS compiler options no checks in in memory style sheet. */
|
| -List options = ['--no-colors', 'memory'];
|
| -
|
| -void testSimpleTerms() {
|
| - var errors = [];
|
| - final String input = r'''
|
| -@ import url("test.css");
|
| -.foo {
|
| - background-color: #191919;
|
| - width: 10PX;
|
| - height: 22mM !important;
|
| - border-width: 20cm;
|
| - margin-width: 33%;
|
| - border-height: 30EM;
|
| - width: .6in;
|
| - length: 1.2in;
|
| - -web-stuff: -10Px;
|
| -}''';
|
| - final String generated = r'''
|
| -@import "test.css";
|
| -.foo {
|
| - background-color: #191919;
|
| - width: 10px;
|
| - height: 22mm !important;
|
| - border-width: 20cm;
|
| - margin-width: 33%;
|
| - border-height: 30em;
|
| - width: .6in;
|
| - length: 1.2in;
|
| - -web-stuff: -10px;
|
| -}''';
|
| -
|
| - var stylesheet = parseCss(input, errors: errors);
|
| -
|
| - expect(stylesheet != null, true);
|
| - expect(errors.isEmpty, true, reason: errors.toString());
|
| - expect(prettyPrint(stylesheet), generated);
|
| -
|
| - final String input2 = r'''
|
| -* {
|
| - border-color: green;
|
| -}''';
|
| - final String generated2 = r'''
|
| -* {
|
| - border-color: #008000;
|
| -}''';
|
| -
|
| - stylesheet = parseCss(input2, errors: errors..clear());
|
| -
|
| - expect(stylesheet != null, true);
|
| - expect(errors.isEmpty, true, reason: errors.toString());
|
| - expect(prettyPrint(stylesheet), generated2);
|
| -}
|
| -
|
| -/**
|
| - * Declarations with comments, references with single-quotes, double-quotes,
|
| - * no quotes. Hex values with # and letters, and functions (rgba, url, etc.)
|
| - */
|
| -void testDeclarations() {
|
| - var errors = [];
|
| - final String input = r'''
|
| -.more {
|
| - color: white;
|
| - color: black;
|
| - color: cyan;
|
| - color: red;
|
| - color: #aabbcc; /* test -- 3 */
|
| - color: blue;
|
| - background-image: url(http://test.jpeg);
|
| - background-image: url("http://double_quote.html");
|
| - background-image: url('http://single_quote.html');
|
| - color: rgba(10,20,255); <!-- test CDO/CDC -->
|
| - color: #123aef; /* hex # part integer and part identifier */
|
| -}''';
|
| - final String generated = r'''
|
| -.more {
|
| - color: #fff;
|
| - color: #000;
|
| - color: #0ff;
|
| - color: #f00;
|
| - color: #abc;
|
| - color: #00f;
|
| - background-image: url("http://test.jpeg");
|
| - background-image: url("http://double_quote.html");
|
| - background-image: url("http://single_quote.html");
|
| - color: rgba(10, 20, 255);
|
| - color: #123aef;
|
| -}''';
|
| -
|
| - var stylesheet = parseCss(input, errors: errors);
|
| -
|
| - expect(stylesheet != null, true);
|
| - expect(errors.isEmpty, true, reason: errors.toString());
|
| - expect(prettyPrint(stylesheet), generated);
|
| -}
|
| -
|
| -void testIdentifiers() {
|
| - var errors = [];
|
| - final String input = r'''
|
| -#da {
|
| - height: 100px;
|
| -}
|
| -#foo {
|
| - width: 10px;
|
| - color: #ff00cc;
|
| -}
|
| -''';
|
| - final String generated = r'''
|
| -#da {
|
| - height: 100px;
|
| -}
|
| -#foo {
|
| - width: 10px;
|
| - color: #f0c;
|
| -}''';
|
| -
|
| - var stylesheet = parseCss(input, errors: errors);
|
| -
|
| - expect(errors.isEmpty, true, reason: errors.toString());
|
| - expect(stylesheet != null, true);
|
| - expect(prettyPrint(stylesheet), generated);
|
| -}
|
| -
|
| -void testComposites() {
|
| - var errors = [];
|
| - final String input = r'''
|
| -.xyzzy {
|
| - border: 10px 80px 90px 100px;
|
| - width: 99%;
|
| -}
|
| -@-webkit-keyframes pulsate {
|
| - 0% {
|
| - -webkit-transform: translate3d(0, 0, 0) scale(1.0);
|
| - }
|
| -}''';
|
| - final String generated = r'''
|
| -.xyzzy {
|
| - border: 10px 80px 90px 100px;
|
| - width: 99%;
|
| -}
|
| -@-webkit-keyframes pulsate {
|
| - 0% {
|
| - -webkit-transform: translate3d(0, 0, 0) scale(1.0);
|
| - }
|
| -}''';
|
| -
|
| - var stylesheet = parseCss(input, errors: errors);
|
| - expect(stylesheet != null, true);
|
| - expect(errors.isEmpty, true, reason: errors.toString());
|
| - expect(prettyPrint(stylesheet), generated);
|
| -}
|
| -
|
| -void testUnits() {
|
| - var errors = [];
|
| - final String input = r'''
|
| -#id-1 {
|
| - transition: color 0.4s;
|
| - animation-duration: 500ms;
|
| - top: 1em;
|
| - left: 200ex;
|
| - right: 300px;
|
| - bottom: 400cm;
|
| - border-width: 2.5mm;
|
| - margin-top: .5in;
|
| - margin-left: 5pc;
|
| - margin-right: 5ex;
|
| - margin-bottom: 5ch;
|
| - font-size: 10pt;
|
| - padding-top: 22rem;
|
| - padding-left: 33vw;
|
| - padding-right: 34vh;
|
| - padding-bottom: 3vmin;
|
| - transform: rotate(20deg);
|
| - voice-pitch: 10hz;
|
| -}
|
| -#id-2 {
|
| - left: 2fr;
|
| - font-size: 10vmax;
|
| - transform: rotatex(20rad);
|
| - voice-pitch: 10khz;
|
| - -web-kit-resolution: 2dpi; /* Bogus property name testing dpi unit. */
|
| -}
|
| -#id-3 {
|
| - -web-kit-resolution: 3dpcm; /* Bogus property name testing dpi unit. */
|
| - transform: rotatey(20grad);
|
| -}
|
| -#id-4 {
|
| - -web-kit-resolution: 4dppx; /* Bogus property name testing dpi unit. */
|
| - transform: rotatez(20turn);
|
| -}
|
| -''';
|
| -
|
| - final String generated = r'''
|
| -#id-1 {
|
| - transition: color 0.4s;
|
| - animation-duration: 500ms;
|
| - top: 1em;
|
| - left: 200ex;
|
| - right: 300px;
|
| - bottom: 400cm;
|
| - border-width: 2.5mm;
|
| - margin-top: .5in;
|
| - margin-left: 5pc;
|
| - margin-right: 5ex;
|
| - margin-bottom: 5ch;
|
| - font-size: 10pt;
|
| - padding-top: 22rem;
|
| - padding-left: 33vw;
|
| - padding-right: 34vh;
|
| - padding-bottom: 3vmin;
|
| - transform: rotate(20deg);
|
| - voice-pitch: 10hz;
|
| -}
|
| -#id-2 {
|
| - left: 2fr;
|
| - font-size: 10vmax;
|
| - transform: rotatex(20rad);
|
| - voice-pitch: 10khz;
|
| - -web-kit-resolution: 2dpi;
|
| -}
|
| -#id-3 {
|
| - -web-kit-resolution: 3dpcm;
|
| - transform: rotatey(20grad);
|
| -}
|
| -#id-4 {
|
| - -web-kit-resolution: 4dppx;
|
| - transform: rotatez(20turn);
|
| -}''';
|
| -
|
| - var stylesheet = parseCss(input, errors: errors, opts: options);
|
| -
|
| - expect(stylesheet != null, true);
|
| - expect(errors.isEmpty, true, reason: errors.toString());
|
| - expect(prettyPrint(stylesheet), generated);
|
| -}
|
| -
|
| -void testUnicode() {
|
| - var errors = [];
|
| - final String input = r'''
|
| -.toggle:after {
|
| - content: '✔';
|
| - line-height: 43px;
|
| - font-size: 20px;
|
| - color: #d9d9d9;
|
| - text-shadow: 0 -1px 0 #bfbfbf;
|
| -}
|
| -''';
|
| -
|
| - final String generated = r'''
|
| -.toggle:after {
|
| - content: '✔';
|
| - line-height: 43px;
|
| - font-size: 20px;
|
| - color: #d9d9d9;
|
| - text-shadow: 0 -1px 0 #bfbfbf;
|
| -}''';
|
| -
|
| - var stylesheet = parseCss(input, errors: errors);
|
| -
|
| - expect(stylesheet != null, true);
|
| - expect(errors.isEmpty, true, reason: errors.toString());
|
| - expect(prettyPrint(stylesheet), generated);
|
| -}
|
| -
|
| -void testNewerCss() {
|
| - var errors = [];
|
| - final String input = r'''
|
| -@media screen,print {
|
| - .foobar_screen {
|
| - width: 10px;
|
| - }
|
| -}
|
| -@page {
|
| - height: 22px;
|
| - size: 3in 3in;
|
| -}
|
| -@page : left {
|
| - width: 10px;
|
| -}
|
| -@page bar : left { @top-left { margin: 8px; } }
|
| -@charset "ISO-8859-1";
|
| -@charset 'ASCII';''';
|
| -
|
| - final String generated = r'''
|
| -@media screen, print {
|
| -.foobar_screen {
|
| - width: 10px;
|
| -}
|
| -}
|
| -@page {
|
| - height: 22px;
|
| - size: 3in 3in;
|
| -}
|
| -@page:left {
|
| - width: 10px;
|
| -}
|
| -@page bar:left {
|
| -@top-left {
|
| - margin: 8px;
|
| -}
|
| -}
|
| -@charset "ISO-8859-1";
|
| -@charset "ASCII";''';
|
| -
|
| - var stylesheet = parseCss(input, errors: errors);
|
| -
|
| - expect(stylesheet != null, true);
|
| - expect(errors.isEmpty, true, reason: errors.toString());
|
| - expect(prettyPrint(stylesheet), generated);
|
| -}
|
| -
|
| -void testMediaQueries() {
|
| - var errors = [];
|
| - String input = '''
|
| -@media screen and (-webkit-min-device-pixel-ratio:0) {
|
| - .todo-item .toggle {
|
| - background: none;
|
| - }
|
| - #todo-item .toggle {
|
| - height: 40px;
|
| - }
|
| -}''';
|
| - String generated = '''
|
| -@media screen AND (-webkit-min-device-pixel-ratio:0) {
|
| -.todo-item .toggle {
|
| - background: none;
|
| -}
|
| -#todo-item .toggle {
|
| - height: 40px;
|
| -}
|
| -}''';
|
| -
|
| - var stylesheet = parseCss(input, errors: errors, opts: options);
|
| - expect(stylesheet != null, true);
|
| - expect(errors.isEmpty, true, reason: errors.toString());
|
| - expect(prettyPrint(stylesheet), generated);
|
| -
|
| - input = '''
|
| - @media handheld and (min-width: 20em),
|
| - screen and (min-width: 20em) {
|
| - #id { color: red; }
|
| - .myclass { height: 20px; }
|
| - }
|
| - @media print and (min-resolution: 300dpi) {
|
| - #anotherId {
|
| - color: #fff;
|
| - }
|
| - }
|
| - @media print and (min-resolution: 280dpcm) {
|
| - #finalId {
|
| - color: #aaa;
|
| - }
|
| - .class2 {
|
| - border: 20px;
|
| - }
|
| - }''';
|
| - generated =
|
| - '''@media handheld AND (min-width:20em), screen AND (min-width:20em) {
|
| -#id {
|
| - color: #f00;
|
| -}
|
| -.myclass {
|
| - height: 20px;
|
| -}
|
| -} @media print AND (min-resolution:300dpi) {
|
| -#anotherId {
|
| - color: #fff;
|
| -}
|
| -} @media print AND (min-resolution:280dpcm) {
|
| -#finalId {
|
| - color: #aaa;
|
| -}
|
| -.class2 {
|
| - border: 20px;
|
| -}
|
| -}''';
|
| -
|
| - stylesheet = parseCss(input, errors: errors..clear(), opts: options);
|
| -
|
| - expect(stylesheet != null, true);
|
| - expect(errors.isEmpty, true, reason: errors.toString());
|
| - expect(prettyPrint(stylesheet), generated);
|
| -
|
| - input = '''
|
| -@media only screen and (min-device-width: 4000px) and
|
| - (min-device-height: 2000px), screen (another: 100px) {
|
| - html {
|
| - font-size: 10em;
|
| - }
|
| - }''';
|
| - generated = '@media ONLY screen AND (min-device-width:4000px) '
|
| - 'AND (min-device-height:2000px), screen (another:100px) {\n'
|
| - 'html {\n font-size: 10em;\n}\n}';
|
| -
|
| - stylesheet = parseCss(input, errors: errors..clear(), opts: options);
|
| -
|
| - expect(stylesheet != null, true);
|
| - expect(errors.isEmpty, true, reason: errors.toString());
|
| - expect(prettyPrint(stylesheet), generated);
|
| -
|
| - input = '''
|
| -@media screen,print (min-device-width: 4000px) and
|
| - (min-device-height: 2000px), screen (another: 100px) {
|
| - html {
|
| - font-size: 10em;
|
| - }
|
| - }''';
|
| - generated = '@media screen, print (min-device-width:4000px) AND '
|
| - '(min-device-height:2000px), screen (another:100px) {\n'
|
| - 'html {\n font-size: 10em;\n}\n}';
|
| -
|
| - stylesheet = parseCss(input, errors: errors..clear(), opts: options);
|
| -
|
| - expect(stylesheet != null, true);
|
| - expect(errors.isEmpty, true, reason: errors.toString());
|
| - expect(prettyPrint(stylesheet), generated);
|
| -
|
| - input = '''
|
| -@import "test.css" ONLY screen, NOT print (min-device-width: 4000px);''';
|
| - generated =
|
| - '@import "test.css" ONLY screen, NOT print (min-device-width:4000px);';
|
| -
|
| - stylesheet = parseCss(input, errors: errors..clear(), opts: options);
|
| -
|
| - expect(stylesheet != null, true);
|
| - expect(errors.isEmpty, true, reason: errors.toString());
|
| - expect(prettyPrint(stylesheet), generated);
|
| -}
|
| -
|
| -void testFontFace() {
|
| - var errors = [];
|
| -
|
| - final String input = '''
|
| -@font-face {
|
| - font-family: BBCBengali;
|
| - src: url(fonts/BBCBengali.ttf) format("opentype");
|
| - unicode-range: U+0A-FF, U+980-9FF, U+????, U+3???;
|
| -}''';
|
| - final String generated = '''@font-face {
|
| - font-family: BBCBengali;
|
| - src: url("fonts/BBCBengali.ttf") format("opentype");
|
| - unicode-range: U+0A-FF, U+980-9FF, U+????, U+3???;
|
| -}''';
|
| - var stylesheet = parseCss(input, errors: errors, opts: options);
|
| -
|
| - expect(stylesheet != null, true);
|
| - expect(errors.isEmpty, true, reason: errors.toString());
|
| - expect(prettyPrint(stylesheet), generated);
|
| -
|
| - final String input1 = '''
|
| -@font-face {
|
| - font-family: Gentium;
|
| - src: url(http://example.com/fonts/Gentium.ttf);
|
| - src: url(http://example.com/fonts/Gentium.ttf);
|
| -}''';
|
| - final String generated1 = '''@font-face {
|
| - font-family: Gentium;
|
| - src: url("http://example.com/fonts/Gentium.ttf");
|
| - src: url("http://example.com/fonts/Gentium.ttf");
|
| -}''';
|
| -
|
| - stylesheet = parseCss(input1, errors: errors..clear(), opts: options);
|
| -
|
| - expect(stylesheet != null, true);
|
| - expect(errors.isEmpty, true, reason: errors.toString());
|
| - expect(prettyPrint(stylesheet), generated1);
|
| -
|
| - final String input2 = '''
|
| -@font-face {
|
| -src: url(ideal-sans-serif.woff) format("woff"),
|
| - url(basic-sans-serif.ttf) format("opentype"),
|
| - local(Gentium Bold);
|
| -}''';
|
| - final String generated2 =
|
| - '@font-face {\n'
|
| - ' src: url("ideal-sans-serif.woff") '
|
| - 'format("woff"), url("basic-sans-serif.ttf") '
|
| - 'format("opentype"), local(Gentium Bold);\n}';
|
| -
|
| - stylesheet = parseCss(input2, errors: errors..clear(), opts: options);
|
| -
|
| - expect(stylesheet != null, true);
|
| - expect(errors.isEmpty, true, reason: errors.toString());
|
| - expect(prettyPrint(stylesheet), generated2);
|
| -
|
| - final String input3 = '''@font-face {
|
| - font-family: MyGentium Text Ornaments;
|
| - src: local(Gentium Bold), /* full font name */
|
| - local(Gentium-Bold), /* Postscript name */
|
| - url(GentiumBold.ttf); /* otherwise, download it */
|
| - font-weight: bold;
|
| -}''';
|
| - final String generated3 = '''@font-face {
|
| - font-family: MyGentium Text Ornaments;
|
| - src: local(Gentium Bold), local(Gentium-Bold), url("GentiumBold.ttf");
|
| - font-weight: bold;
|
| -}''';
|
| -
|
| - stylesheet = parseCss(input3, errors: errors..clear(), opts: options);
|
| -
|
| - expect(stylesheet != null, true);
|
| - expect(errors.isEmpty, true, reason: errors.toString());
|
| - expect(prettyPrint(stylesheet), generated3);
|
| -
|
| - final String input4 = '''
|
| -@font-face {
|
| - font-family: STIXGeneral;
|
| - src: local(STIXGeneral), url(/stixfonts/STIXGeneral.otf);
|
| - unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF;
|
| -}''';
|
| - final String generated4 = '''@font-face {
|
| - font-family: STIXGeneral;
|
| - src: local(STIXGeneral), url("/stixfonts/STIXGeneral.otf");
|
| - unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF;
|
| -}''';
|
| - stylesheet = parseCss(input4, errors: errors..clear(), opts: options);
|
| -
|
| - expect(stylesheet != null, true);
|
| - expect(errors.isEmpty, true, reason: errors.toString());
|
| - expect(prettyPrint(stylesheet), generated4);
|
| -}
|
| -
|
| -void testCssFile() {
|
| - var errors = [];
|
| - final String input = r'''
|
| -@import 'simple.css'
|
| -@import "test.css" print
|
| -@import url(test.css) screen, print
|
| -@import url(http://google.com/maps/maps.css);
|
| -
|
| -div[href^='test'] {
|
| - height: 10px;
|
| -}
|
| -
|
| -@-webkit-keyframes pulsate {
|
| - from {
|
| - -webkit-transform: translate3d(0, 0, 0) scale(1.0);
|
| - }
|
| - 10% {
|
| - -webkit-transform: translate3d(0, 0, 0) scale(1.0);
|
| - }
|
| - 30% {
|
| - -webkit-transform: translate3d(0, 2, 0) scale(1.0);
|
| - }
|
| -}
|
| -
|
| -.foobar {
|
| - grid-columns: 10px ("content" 1fr 10px)[4];
|
| -}
|
| -
|
| -.test-background {
|
| - background: url(http://www.foo.com/bar.png);
|
| -}
|
| -''';
|
| -
|
| - final String generated =
|
| - '@import "simple.css"; '
|
| - '@import "test.css" print; '
|
| - '@import "test.css" screen, print; '
|
| - '@import "http://google.com/maps/maps.css";\n'
|
| - 'div[href^="test"] {\n'
|
| - ' height: 10px;\n'
|
| - '}\n'
|
| - '@-webkit-keyframes pulsate {\n'
|
| - ' from {\n'
|
| - ' -webkit-transform: translate3d(0, 0, 0) scale(1.0);\n'
|
| - ' }\n'
|
| - ' 10% {\n'
|
| - ' -webkit-transform: translate3d(0, 0, 0) scale(1.0);\n'
|
| - ' }\n'
|
| - ' 30% {\n'
|
| - ' -webkit-transform: translate3d(0, 2, 0) scale(1.0);\n'
|
| - ' }\n'
|
| - '}\n'
|
| - '.foobar {\n'
|
| - ' grid-columns: 10px ("content" 1fr 10px) [4];\n'
|
| - '}\n'
|
| - '.test-background {\n'
|
| - ' background: url("http://www.foo.com/bar.png");\n'
|
| - '}';
|
| - var stylesheet = parseCss(input, errors: errors);
|
| -
|
| - expect(stylesheet != null, true);
|
| - expect(errors.isEmpty, true, reason: errors.toString());
|
| - expect(prettyPrint(stylesheet), generated);
|
| -}
|
| -
|
| -void testCompactEmitter() {
|
| - var errors = [];
|
| -
|
| - // Check !import compactly emitted.
|
| - final String input = r'''
|
| -div {
|
| - color: green !important;
|
| -}
|
| -''';
|
| - final String generated = "div { color: green!important; }";
|
| -
|
| - var stylesheet = parseCss(input, errors: errors);
|
| -
|
| - expect(stylesheet != null, true);
|
| - expect(errors.isEmpty, true, reason: errors.toString());
|
| - expect(compactOuptut(stylesheet), generated);
|
| -
|
| - // Check namespace directive compactly emitted.
|
| - final String input2 = "@namespace a url(http://www.example.org/a);";
|
| - final String generated2 = "@namespace a url(http://www.example.org/a);";
|
| -
|
| - var stylesheet2 = parseCss(input2, errors: errors..clear());
|
| -
|
| - expect(stylesheet2 != null, true);
|
| - expect(errors.isEmpty, true, reason: errors.toString());
|
| - expect(compactOuptut(stylesheet2), generated2);
|
| -}
|
| -
|
| -void testNotSelectors() {
|
| - var errors = [];
|
| -
|
| - final String input = r'''
|
| -.details:not(.open-details) x-element,
|
| -.details:not(.open-details) .summary {
|
| - overflow: hidden;
|
| -}
|
| -
|
| -.details:not(.open-details) x-icon {
|
| - margin-left: 99px;
|
| -}
|
| -
|
| -.kind-class .details:not(.open-details) x-icon {
|
| - margin-left: 0px;
|
| -}
|
| -
|
| -.name {
|
| - margin-left: 0px;
|
| -}
|
| -
|
| -.details:not(.open-details) .the-class {
|
| - width: 80px;
|
| -}
|
| -
|
| -*:focus
|
| -{
|
| - outline: none;
|
| -}
|
| -
|
| -body > h2:not(:first-of-type):not(:last-of-type) {
|
| - color: red;
|
| -}
|
| -
|
| -.details-1:not([DISABLED]) {
|
| - outline: none;
|
| -}
|
| -
|
| -html|*:not(:link):not(:visited) {
|
| - width: 92%;
|
| -}
|
| -
|
| -*|*:not(*) {
|
| - font-weight: bold;
|
| -}
|
| -
|
| -*:not(:not([disabled])) { color: blue; }
|
| -''';
|
| - final String generated = r'''
|
| -.details:not(.open-details) x-element, .details:not(.open-details) .summary {
|
| - overflow: hidden;
|
| -}
|
| -.details:not(.open-details) x-icon {
|
| - margin-left: 99px;
|
| -}
|
| -.kind-class .details:not(.open-details) x-icon {
|
| - margin-left: 0px;
|
| -}
|
| -.name {
|
| - margin-left: 0px;
|
| -}
|
| -.details:not(.open-details) .the-class {
|
| - width: 80px;
|
| -}
|
| -*:focus {
|
| - outline: none;
|
| -}
|
| -body > h2:not(:first-of-type):not(:last-of-type) {
|
| - color: #f00;
|
| -}
|
| -.details-1:not([DISABLED]) {
|
| - outline: none;
|
| -}
|
| -html|*:not(:link):not(:visited) {
|
| - width: 92%;
|
| -}
|
| -*|*:not(*) {
|
| - font-weight: bold;
|
| -}
|
| -*:not(:not([disabled])) {
|
| - color: #00f;
|
| -}''';
|
| -
|
| - var stylesheet = parseCss(input, errors: errors, opts: options);
|
| -
|
| - expect(stylesheet != null, true);
|
| - expect(errors.isEmpty, true, reason: errors.toString());
|
| - expect(prettyPrint(stylesheet), generated);
|
| -}
|
| -
|
| -void testIE() {
|
| - var errors = [];
|
| - final String input =
|
| -".test {\n"
|
| -" filter: progid:DXImageTransform.Microsoft.gradient"
|
| -"(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');\n"
|
| -"}";
|
| - final String generated =
|
| -".test {\n"
|
| -" filter: progid:DXImageTransform.Microsoft.gradient"
|
| -"(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');\n"
|
| -"}";
|
| -
|
| - var stylesheet = parseCss(input, errors: errors, opts: options);
|
| -
|
| - expect(stylesheet != null, true);
|
| - expect(errors.isEmpty, true, reason: errors.toString());
|
| - expect(prettyPrint(stylesheet), generated);
|
| -
|
| - final String input2 =
|
| -".test {\n"
|
| -" filter: progid:DXImageTransform.Microsoft.gradient"
|
| -"(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670')\n"
|
| -" progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n"
|
| -"}";
|
| -
|
| - final String generated2 =
|
| -".test {\n"
|
| -" filter: progid:DXImageTransform.Microsoft.gradient"
|
| -"(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670')\n"
|
| -" progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n"
|
| -"}";
|
| -
|
| - stylesheet = parseCss(input2, errors: errors..clear(), opts: options);
|
| -
|
| - expect(stylesheet != null, true);
|
| - expect(errors.isEmpty, true, reason: errors.toString());
|
| - expect(prettyPrint(stylesheet), generated2);
|
| -
|
| - final String input3 = '''
|
| -div {
|
| - filter: alpha(opacity=80); /* IE7 and under */
|
| - -ms-filter: "Alpha(Opacity=40)"; /* IE8 and newer */
|
| -
|
| - Filter: Blur(Add = 0, Direction = 225, Strength = 10);
|
| - Filter: FlipV;
|
| - Filter: Gray;
|
| - FILTER: Chroma(Color = #000000) Mask(Color=#00FF00);
|
| - Filter: Alpha(Opacity=100, FinishOpacity=0, Style=2, StartX=20, StartY=40,
|
| - FinishX=0, FinishY=0) Wave(Add=0, Freq=5, LightStrength=20,
|
| - Phase=220, Strength=10);
|
| -}
|
| -''';
|
| - final String generated3 = 'div {\n filter: alpha(opacity=80);\n'
|
| - ' -ms-filter: "Alpha(Opacity=40)";\n'
|
| - ' Filter: Blur(Add = 0, Direction = 225, Strength = 10);\n'
|
| - ' Filter: FlipV;\n Filter: Gray;\n'
|
| - ' FILTER: Chroma(Color = #000000) Mask(Color=#00FF00);\n'
|
| - ' Filter: Alpha(Opacity=100, FinishOpacity=0, Style=2, '
|
| - 'StartX=20, StartY=40, \n'
|
| - ' FinishX=0, FinishY=0) Wave(Add=0, Freq=5, LightStrength=20, \n'
|
| - ' Phase=220, Strength=10);\n}';
|
| -
|
| - stylesheet = parseCss(input3, errors: errors..clear(), opts: options);
|
| -
|
| - expect(stylesheet != null, true);
|
| - expect(errors.isEmpty, true, reason: errors.toString());
|
| - expect(prettyPrint(stylesheet), generated3);
|
| -}
|
| -
|
| -/**
|
| - * Test IE specific declaration syntax:
|
| - * IE6 property name prefixed with _ (normal CSS property name can start
|
| - * with an underscore).
|
| - *
|
| - * IE7 or below property add asterisk before the CSS property.
|
| - *
|
| - * IE8 or below add \9 at end of declaration expression e.g.,
|
| - * background: red\9;
|
| - */
|
| -void testIEDeclaration() {
|
| - var errors = [];
|
| -
|
| - final input = '''
|
| -.testIE-6 {
|
| - _zoom : 5;
|
| -}
|
| -.clearfix {
|
| - *zoom: 1;
|
| -}
|
| -audio, video {
|
| - display: inline-block;
|
| - *display: inline;
|
| - *zoom: 1;
|
| -}
|
| -input {
|
| - *overflow: visible;
|
| - line-height: normal;
|
| -}
|
| -.uneditable-input:focus {
|
| - border-color: rgba(82, 168, 236, 0.8);
|
| - outline: 0;
|
| - outline: thin dotted \\9; /* IE6-9 */
|
| -}
|
| -
|
| -input[type="radio"], input[type="checkbox"] {
|
| - margin-top: 1px \\9;
|
| - *margin-top: 0;
|
| -}
|
| -
|
| -input.search-query {
|
| - padding-right: 14px;
|
| - padding-right: 4px \\9;
|
| - padding-left: 14px;
|
| - padding-left: 4px \\9; /* IE7-8 no border-radius, don't indent padding. */
|
| -}
|
| -
|
| -.btn.active {
|
| - background-color: #cccccc \\9;
|
| -}
|
| -
|
| -@-webkit-keyframes progress-bar-stripes {
|
| -from {
|
| -background-position: 40px 0;
|
| -}
|
| -to {
|
| -background-position: 0 0;
|
| -}
|
| -}
|
| -
|
| -@-moz-keyframes progress-bar-stripes {
|
| - from {
|
| - background-position: 40px 0;
|
| - }
|
| - to {
|
| - background-position: 0 0;
|
| - }
|
| -}
|
| -
|
| -@-ms-keyframes progress-bar-stripes {
|
| - from {
|
| - background-position: 40px 0;
|
| - }
|
| - to {
|
| - background-position: 0 0;
|
| - }
|
| -}
|
| -
|
| -@-o-keyframes progress-bar-stripes {
|
| - from {
|
| - background-position: 40px 0;
|
| - }
|
| - to {
|
| - background-position: 0 0;
|
| - }
|
| -}
|
| -
|
| -@keyframes progress-bar-stripes {
|
| - from {
|
| - background-position: 40px 0;
|
| - }
|
| - to {
|
| - background-position: 0 0;
|
| - }
|
| -}''';
|
| -
|
| - final generated = '''.testIE-6 {
|
| - _zoom: 5;
|
| -}
|
| -.clearfix {
|
| - *zoom: 1;
|
| -}
|
| -audio, video {
|
| - display: inline-block;
|
| - *display: inline;
|
| - *zoom: 1;
|
| -}
|
| -input {
|
| - *overflow: visible;
|
| - line-height: normal;
|
| -}
|
| -.uneditable-input:focus {
|
| - border-color: rgba(82, 168, 236, 0.8);
|
| - outline: 0;
|
| - outline: thin dotted \\9;
|
| -}
|
| -input[type="radio"], input[type="checkbox"] {
|
| - margin-top: 1px \\9;
|
| - *margin-top: 0;
|
| -}
|
| -input.search-query {
|
| - padding-right: 14px;
|
| - padding-right: 4px \\9;
|
| - padding-left: 14px;
|
| - padding-left: 4px \\9;
|
| -}
|
| -.btn.active {
|
| - background-color: #ccc \\9;
|
| -}
|
| -@-webkit-keyframes progress-bar-stripes {
|
| - from {
|
| - background-position: 40px 0;
|
| - }
|
| - to {
|
| - background-position: 0 0;
|
| - }
|
| -}
|
| -@-moz-keyframes progress-bar-stripes {
|
| - from {
|
| - background-position: 40px 0;
|
| - }
|
| - to {
|
| - background-position: 0 0;
|
| - }
|
| -}
|
| -@keyframes progress-bar-stripes {
|
| - from {
|
| - background-position: 40px 0;
|
| - }
|
| - to {
|
| - background-position: 0 0;
|
| - }
|
| -}
|
| -@-o-keyframes progress-bar-stripes {
|
| - from {
|
| - background-position: 40px 0;
|
| - }
|
| - to {
|
| - background-position: 0 0;
|
| - }
|
| -}
|
| -@keyframes progress-bar-stripes {
|
| - from {
|
| - background-position: 40px 0;
|
| - }
|
| - to {
|
| - background-position: 0 0;
|
| - }
|
| -}''';
|
| -
|
| - var stylesheet = parseCss(input, errors: errors, opts: options);
|
| - expect(stylesheet != null, true);
|
| - expect(errors.isEmpty, true, reason: errors.toString());
|
| - expect(prettyPrint(stylesheet), generated);
|
| -}
|
| -
|
| -void testHangs() {
|
| - final optionErrors = ['--no-colors', '--warnings_as_errors', 'memory'];
|
| - var errors = [];
|
| -
|
| - // Bad hexvalue had caused a hang in processTerm.
|
| - final input = r'''#a { color: #ebebeburl(0/IE8+9+); }''';
|
| - var stylesheet = parseCss(input, errors: errors, opts: optionErrors);
|
| -
|
| - expect(stylesheet != null, true);
|
| - expect(errors.length, 3, reason: errors.toString());
|
| -
|
| - var errorMessage = errors[0];
|
| - expect(errorMessage.message, contains('Bad hex number'));
|
| - expect(errorMessage.span, isNotNull);
|
| - expect(errorMessage.span.start.line, 0);
|
| - expect(errorMessage.span.start.column, 12);
|
| - expect(errorMessage.span.text, '#ebebeburl');
|
| -
|
| - errorMessage = errors[1];
|
| - expect(errorMessage.message, contains('expected }, but found +'));
|
| - expect(errorMessage.span, isNotNull);
|
| - expect(errorMessage.span.start.line, 0);
|
| - expect(errorMessage.span.start.column, 30);
|
| - expect(errorMessage.span.text, '+');
|
| -
|
| - errorMessage = errors[2];
|
| - expect(errorMessage.message, contains('premature end of file unknown CSS'));
|
| - expect(errorMessage.span, isNotNull);
|
| - expect(errorMessage.span.start.line, 0);
|
| - expect(errorMessage.span.start.column, 31);
|
| - expect(errorMessage.span.text, ')');
|
| -
|
| - // Missing closing parenthesis for keyframes.
|
| - final input2 = r'''@-ms-keyframes progress-bar-stripes {
|
| - from {
|
| - background-position: 40px 0;
|
| - }
|
| - to {
|
| - background-position: 0 0;
|
| - }
|
| -''';
|
| -
|
| - stylesheet = parseCss(input2, errors: errors..clear(), opts: optionErrors);
|
| -
|
| - expect(stylesheet != null, true);
|
| -
|
| - expect(errors.length, 1, reason: errors.toString());
|
| -
|
| - errorMessage = errors[0];
|
| - expect(errorMessage.message, contains('unexpected end of file'));
|
| - expect(errorMessage.span, isNotNull);
|
| - expect(errorMessage.span.start.line, 7);
|
| - expect(errorMessage.span.start.column, 0);
|
| - expect(errorMessage.span.text.trim(), '');
|
| -}
|
| -
|
| -main() {
|
| - test('Simple Terms', testSimpleTerms);
|
| - test('Declarations', testDeclarations);
|
| - test('Identifiers', testIdentifiers);
|
| - test('Composites', testComposites);
|
| - test('Units', testUnits);
|
| - test('Unicode', testUnicode);
|
| - test('Newer CSS', testNewerCss);
|
| - test('Media Queries', testMediaQueries);
|
| - test('Font-Face', testFontFace);
|
| - test('CSS file', testCssFile);
|
| - test('Compact Emitter', testCompactEmitter);
|
| - test('Selector Negation', testNotSelectors);
|
| - test('IE stuff', testIE);
|
| - test('IE declaration syntax', testIEDeclaration);
|
| - test('Hanging bugs', testHangs);
|
| -}
|
|
|