| Index: pkg/polymer/test/css_test.dart
|
| diff --git a/pkg/polymer/test/css_test.dart b/pkg/polymer/test/css_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..5da664a897ff4e915abec399076e6b13f3a8a5b3
|
| --- /dev/null
|
| +++ b/pkg/polymer/test/css_test.dart
|
| @@ -0,0 +1,547 @@
|
| +// 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 css_test;
|
| +
|
| +import 'package:unittest/compact_vm_config.dart';
|
| +import 'package:unittest/unittest.dart';
|
| +import 'package:polymer/src/messages.dart';
|
| +
|
| +import 'testing.dart';
|
| +
|
| +test_simple_var() {
|
| + Map createFiles() {
|
| + return {
|
| + 'index.html':
|
| + '<!DOCTYPE html>'
|
| + '<html lang="en">'
|
| + '<head>'
|
| + '<meta charset="utf-8">'
|
| + '</head>'
|
| + '<body>'
|
| + '<style>'
|
| + '@main_color: var(b);'
|
| + '@b: var(c);'
|
| + '@c: red;'
|
| + '</style>'
|
| + '<style>'
|
| + '.test { color: var(main_color); }'
|
| + '</style>'
|
| + '<script type="application/dart">main() {}</script>'
|
| + '</body>'
|
| + '</html>',
|
| + };
|
| + }
|
| +
|
| + var messages = new Messages.silent();
|
| + var compiler = createCompiler(createFiles(), messages, errors: true,
|
| + scopedCss: true);
|
| +
|
| + compiler.run().then(expectAsync1((e) {
|
| + MockFileSystem fs = compiler.fileSystem;
|
| + expect(fs.readCount, equals({
|
| + 'index.html': 1,
|
| + }), reason: 'Actual:\n ${fs.readCount}');
|
| +
|
| + var htmlInfo = compiler.info['index.html'];
|
| + expect(htmlInfo.styleSheets.length, 2);
|
| + expect(prettyPrintCss(htmlInfo.styleSheets[0]), '');
|
| + expect(prettyPrintCss(htmlInfo.styleSheets[1]), '.test { color: red; }');
|
| +
|
| + var outputs = compiler.output.map((o) => o.path);
|
| + expect(outputs, equals([
|
| + 'out/index.html.dart',
|
| + 'out/index.html.dart.map',
|
| + 'out/index.html_bootstrap.dart',
|
| + 'out/index.html',
|
| + ]));
|
| + }));
|
| +}
|
| +
|
| +test_var() {
|
| + Map createFiles() {
|
| + return {
|
| + 'index.html':
|
| + '<!DOCTYPE html>'
|
| + '<html lang="en">'
|
| + '<head>'
|
| + '<meta charset="utf-8">'
|
| + '</head>'
|
| + '<body>'
|
| + '<style>'
|
| + '@main-color: var(b);'
|
| + '@b: var(c);'
|
| + '@c: red;'
|
| + '@d: var(main-color-1, green);'
|
| + '@border-pen: solid;'
|
| + '@inset: 5px;'
|
| + '@frame-color: solid orange;'
|
| + '@big-border: 2px 2px 2px;'
|
| + '@border-stuff: 3px dashed var(main-color);'
|
| + '@border-2: 3px var(big-border) dashed var(main-color-1, green);'
|
| + '@blue-border: bold var(not-found, 1px 10px blue)'
|
| + '</style>'
|
| + '<style>'
|
| + '.test-1 { color: var(main-color-1, blue); }'
|
| + '.test-2 { color: var(main-color-1, var(main-color)); }'
|
| + '.test-3 { color: var(d, yellow); }'
|
| + '.test-4 { color: var(d-1, yellow); }'
|
| + '.test-5 { color: var(d-1, var(d)); }'
|
| + '.test-6 { border: var(inset) var(border-pen) var(d); }'
|
| + '.test-7 { border: 10px var(border-pen) var(d); }'
|
| + '.test-8 { border: 20px var(border-pen) yellow; }'
|
| + '.test-9 { border: 30px dashed var(d); }'
|
| + '.test-10 { border: 40px var(frame-color);}'
|
| + '.test-11 { border: 40px var(frame-color-1, blue);}'
|
| + '.test-12 { border: 40px var(frame-color-1, solid blue);}'
|
| + '.test-13 {'
|
| + 'border: 40px var(x1, var(x2, var(x3, var(frame-color)));'
|
| + '}'
|
| + '.test-14 { border: 40px var(x1, var(frame-color); }'
|
| + '.test-15 { border: 40px var(x1, solid blue);}'
|
| + '.test-16 { border: 1px 1px 2px 3px var(frame-color);}'
|
| + '.test-17 { border: 1px 1px 2px 3px var(x1, solid blue);}'
|
| + '.test-18 { border: 1px 1px 2px var(border-stuff);}'
|
| + '.test-19 { border: var(big-border) var(border-stuff);}'
|
| + '.test-20 { border: var(border-2);}'
|
| + '.test-21 { border: var(blue-border);}'
|
| + '</style>'
|
| + '<script type="application/dart">main() {}</script>'
|
| + '</body>'
|
| + '</html>',
|
| + };
|
| + }
|
| +
|
| + var messages = new Messages.silent();
|
| + var compiler = createCompiler(createFiles(), messages, errors: true,
|
| + scopedCss: true);
|
| +
|
| + compiler.run().then(expectAsync1((e) {
|
| + MockFileSystem fs = compiler.fileSystem;
|
| + expect(fs.readCount, equals({
|
| + 'index.html': 1,
|
| + }), reason: 'Actual:\n ${fs.readCount}');
|
| +
|
| + var htmlInfo = compiler.info['index.html'];
|
| + expect(htmlInfo.styleSheets.length, 2);
|
| + expect(prettyPrintCss(htmlInfo.styleSheets[0]), '');
|
| + expect(prettyPrintCss(htmlInfo.styleSheets[1]),
|
| + '.test-1 { color: blue; } '
|
| + '.test-2 { color: red; } '
|
| + '.test-3 { color: green; } '
|
| + '.test-4 { color: yellow; } '
|
| + '.test-5 { color: green; } '
|
| + '.test-6 { border: 5px solid green; } '
|
| + '.test-7 { border: 10px solid green; } '
|
| + '.test-8 { border: 20px solid yellow; } '
|
| + '.test-9 { border: 30px dashed green; } '
|
| + '.test-10 { border: 40px solid orange; } '
|
| + '.test-11 { border: 40px blue; } '
|
| + '.test-12 { border: 40px solid blue; } '
|
| + '.test-13 { border: 40px solid orange; } '
|
| + '.test-14 { border: 40px solid orange; } '
|
| + '.test-15 { border: 40px solid blue; } '
|
| + '.test-16 { border: 1px 1px 2px 3px solid orange; } '
|
| + '.test-17 { border: 1px 1px 2px 3px solid blue; } '
|
| + '.test-18 { border: 1px 1px 2px 3px dashed red; } '
|
| + '.test-19 { border: 2px 2px 2px 3px dashed red; } '
|
| + '.test-20 { border: 3px 2px 2px 2px dashed green; } '
|
| + '.test-21 { border: bold 1px 10px blue; }');
|
| + var outputs = compiler.output.map((o) => o.path);
|
| + expect(outputs, equals([
|
| + 'out/index.html.dart',
|
| + 'out/index.html.dart.map',
|
| + 'out/index.html_bootstrap.dart',
|
| + 'out/index.html',
|
| + ]));
|
| + }));
|
| +}
|
| +
|
| +test_simple_import() {
|
| + Map createFiles() {
|
| + return {
|
| + 'foo.css': r'''@main_color: var(b);
|
| + @b: var(c);
|
| + @c: red;''',
|
| + 'index.html':
|
| + '<!DOCTYPE html>'
|
| + '<html lang="en">'
|
| + '<head>'
|
| + '<meta charset="utf-8">'
|
| + '</head>'
|
| + '<body>'
|
| + '<style>'
|
| + '@import "foo.css";'
|
| + '.test { color: var(main_color); }'
|
| + '</style>'
|
| + '<script type="application/dart">main() {}</script>'
|
| + '</body>'
|
| + '</html>',
|
| + };
|
| + }
|
| +
|
| + var messages = new Messages.silent();
|
| + var compiler = createCompiler(createFiles(), messages, errors: true,
|
| + scopedCss: true);
|
| +
|
| + compiler.run().then(expectAsync1((e) {
|
| + MockFileSystem fs = compiler.fileSystem;
|
| + expect(fs.readCount, equals({
|
| + 'foo.css': 1,
|
| + 'index.html': 1,
|
| + }), reason: 'Actual:\n ${fs.readCount}');
|
| +
|
| + var cssInfo = compiler.info['foo.css'];
|
| + expect(cssInfo.styleSheets.length, 1);
|
| + expect(prettyPrintCss(cssInfo.styleSheets[0]), '');
|
| +
|
| + var htmlInfo = compiler.info['index.html'];
|
| + expect(htmlInfo.styleSheets.length, 1);
|
| + expect(prettyPrintCss(htmlInfo.styleSheets[0]),
|
| + '@import url(foo.css); .test { color: red; }');
|
| +
|
| + var outputs = compiler.output.map((o) => o.path);
|
| + expect(outputs, equals([
|
| + 'out/index.html.dart',
|
| + 'out/index.html.dart.map',
|
| + 'out/index.html_bootstrap.dart',
|
| + 'out/foo.css',
|
| + 'out/index.html',
|
| + ]));
|
| + }));
|
| +}
|
| +
|
| +test_imports() {
|
| + Map createFiles() {
|
| + return {
|
| + 'first.css':
|
| + '@import "third.css";'
|
| + '@main-width: var(main-width-b);'
|
| + '@main-width-b: var(main-width-c);'
|
| + '@main-width-c: var(wide-width);',
|
| + 'second.css':
|
| + '@import "fourth.css";'
|
| + '@main-color: var(main-color-b);'
|
| + '@main-color-b: var(main-color-c);'
|
| + '@main-color-c: var(color-value);',
|
| + 'third.css':
|
| + '@wide-width: var(wide-width-b);'
|
| + '@wide-width-b: var(wide-width-c);'
|
| + '@wide-width-c: 100px;',
|
| + 'fourth.css':
|
| + '@color-value: var(color-value-b);'
|
| + '@color-value-b: var(color-value-c);'
|
| + '@color-value-c: red;',
|
| + 'index.html':
|
| + '<!DOCTYPE html>'
|
| + '<html lang="en">'
|
| + '<head>'
|
| + '<meta charset="utf-8">'
|
| + '<link rel="stylesheet" href="first.css">'
|
| + '</head>'
|
| + '<body>'
|
| + '<style>'
|
| + '@import "first.css";'
|
| + '@import "second.css";'
|
| + '.test-1 { color: var(main-color); }'
|
| + '.test-2 { width: var(main-width); }'
|
| + '</style>'
|
| + '<script type="application/dart">main() {}</script>'
|
| + '</body>'
|
| + '</html>',
|
| + };
|
| + }
|
| +
|
| + var messages = new Messages.silent();
|
| + var compiler = createCompiler(createFiles(), messages, errors: true,
|
| + scopedCss: true);
|
| +
|
| + compiler.run().then(expectAsync1((e) {
|
| + MockFileSystem fs = compiler.fileSystem;
|
| + expect(fs.readCount, equals({
|
| + 'first.css': 1,
|
| + 'second.css': 1,
|
| + 'third.css': 1,
|
| + 'fourth.css': 1,
|
| + 'index.html': 1,
|
| + }), reason: 'Actual:\n ${fs.readCount}');
|
| +
|
| + var firstInfo = compiler.info['first.css'];
|
| + expect(firstInfo.styleSheets.length, 1);
|
| + expect(prettyPrintCss(firstInfo.styleSheets[0]), '@import url(third.css);');
|
| +
|
| + var secondInfo = compiler.info['second.css'];
|
| + expect(secondInfo.styleSheets.length, 1);
|
| + expect(prettyPrintCss(secondInfo.styleSheets[0]),
|
| + '@import url(fourth.css);');
|
| +
|
| + var thirdInfo = compiler.info['third.css'];
|
| + expect(thirdInfo.styleSheets.length, 1);
|
| + expect(prettyPrintCss(thirdInfo.styleSheets[0]), '');
|
| +
|
| + var fourthInfo = compiler.info['fourth.css'];
|
| + expect(fourthInfo.styleSheets.length, 1);
|
| + expect(prettyPrintCss(fourthInfo.styleSheets[0]), '');
|
| +
|
| + var htmlInfo = compiler.info['index.html'];
|
| + expect(htmlInfo.styleSheets.length, 1);
|
| + expect(prettyPrintCss(htmlInfo.styleSheets[0]),
|
| + '@import url(first.css); '
|
| + '@import url(second.css); '
|
| + '.test-1 { color: red; } '
|
| + '.test-2 { width: 100px; }');
|
| +
|
| + var outputs = compiler.output.map((o) => o.path);
|
| + expect(outputs, equals([
|
| + 'out/index.html.dart',
|
| + 'out/index.html.dart.map',
|
| + 'out/index.html_bootstrap.dart',
|
| + 'out/first.css',
|
| + 'out/second.css',
|
| + 'out/third.css',
|
| + 'out/fourth.css',
|
| + 'out/index.html',
|
| + ]));
|
| + }));
|
| +}
|
| +
|
| +test_component_var() {
|
| + Map createFiles() {
|
| + return {
|
| + 'index.html': '<!DOCTYPE html>'
|
| + '<html lang="en">'
|
| + '<head>'
|
| + '<meta charset="utf-8">'
|
| + '<link rel="import" href="foo.html">'
|
| + '</head>'
|
| + '<body>'
|
| + '<x-foo></x-foo>'
|
| + '<script type="application/dart">main() {}</script>'
|
| + '</body>'
|
| + '</html>',
|
| + 'foo.html': '<!DOCTYPE html>'
|
| + '<html lang="en">'
|
| + '<head>'
|
| + '<meta charset="utf-8">'
|
| + '</head>'
|
| + '<body>'
|
| + '<polymer-element name="x-foo" constructor="Foo">'
|
| + '<template>'
|
| + '<style scoped>'
|
| + '@import "foo.css";'
|
| + '.main { color: var(main_color); }'
|
| + '.test-background { '
|
| + 'background: url(http://www.foo.com/bar.png);'
|
| + '}'
|
| + '</style>'
|
| + '</template>'
|
| + '</polymer-element>'
|
| + '</body>'
|
| + '</html>',
|
| + 'foo.css': r'''@main_color: var(b);
|
| + @b: var(c);
|
| + @c: red;
|
| +
|
| + @one: var(two);
|
| + @two: var(one);
|
| +
|
| + @four: var(five);
|
| + @five: var(six);
|
| + @six: var(four);
|
| +
|
| + @def-1: var(def-2);
|
| + @def-2: var(def-3);
|
| + @def-3: var(def-2);''',
|
| + };
|
| + }
|
| +
|
| + test('var- and Less @define', () {
|
| + var messages = new Messages.silent();
|
| + var compiler = createCompiler(createFiles(), messages, errors: true,
|
| + scopedCss: true);
|
| +
|
| + compiler.run().then(expectAsync1((e) {
|
| + MockFileSystem fs = compiler.fileSystem;
|
| + expect(fs.readCount, equals({
|
| + 'index.html': 1,
|
| + 'foo.html': 1,
|
| + 'foo.css': 1
|
| + }), reason: 'Actual:\n ${fs.readCount}');
|
| +
|
| + var cssInfo = compiler.info['foo.css'];
|
| + expect(cssInfo.styleSheets.length, 1);
|
| + var htmlInfo = compiler.info['foo.html'];
|
| + expect(htmlInfo.styleSheets.length, 0);
|
| + expect(htmlInfo.declaredComponents.length, 1);
|
| + expect(htmlInfo.declaredComponents[0].styleSheets.length, 1);
|
| +
|
| + var outputs = compiler.output.map((o) => o.path);
|
| + expect(outputs, equals([
|
| + 'out/foo.html.dart',
|
| + 'out/foo.html.dart.map',
|
| + 'out/index.html.dart',
|
| + 'out/index.html.dart.map',
|
| + 'out/index.html_bootstrap.dart',
|
| + 'out/foo.css',
|
| + 'out/index.html.css',
|
| + 'out/index.html',
|
| + ]));
|
| +
|
| + for (var file in compiler.output) {
|
| + if (file.path == 'out/index.html.css') {
|
| + expect(file.contents,
|
| + '/* Auto-generated from components style tags. */\n'
|
| + '/* DO NOT EDIT. */\n\n'
|
| + '/* ==================================================== \n'
|
| + ' Component x-foo stylesheet \n'
|
| + ' ==================================================== */\n'
|
| + '@import "foo.css";\n'
|
| + '[is="x-foo"] .main {\n'
|
| + ' color: #f00;\n'
|
| + '}\n'
|
| + '[is="x-foo"] .test-background {\n'
|
| + ' background: url("http://www.foo.com/bar.png");\n'
|
| + '}\n\n');
|
| + } else if (file.path == 'out/foo.css') {
|
| + expect(file.contents,
|
| + '/* Auto-generated from style sheet href = foo.css */\n'
|
| + '/* DO NOT EDIT. */\n\n\n\n');
|
| + }
|
| + }
|
| +
|
| + // Check for warning messages about var- cycles.
|
| + expect(messages.messages.length, 8);
|
| +
|
| + var errorMessage = messages.messages[0];
|
| + expect(errorMessage.message, contains('var cycle detected var-def-1'));
|
| + expect(errorMessage.span, isNotNull);
|
| + expect(errorMessage.span.start.line, 11);
|
| + expect(errorMessage.span.start.column, 22);
|
| + expect(errorMessage.span.text, '@def-1: var(def-2)');
|
| +
|
| + errorMessage = messages.messages[1];
|
| + expect(errorMessage.message, contains('var cycle detected var-five'));
|
| + expect(errorMessage.span, isNotNull);
|
| + expect(errorMessage.span.start.line, 8);
|
| + expect(errorMessage.span.start.column, 22);
|
| + expect(errorMessage.span.text, '@five: var(six)');
|
| +
|
| + errorMessage = messages.messages[2];
|
| + expect(errorMessage.message, contains('var cycle detected var-six'));
|
| + expect(errorMessage.span, isNotNull);
|
| + expect(errorMessage.span.start.line, 9);
|
| + expect(errorMessage.span.start.column, 22);
|
| + expect(errorMessage.span.text, '@six: var(four)');
|
| +
|
| + errorMessage = messages.messages[3];
|
| + expect(errorMessage.message, contains('var cycle detected var-def-3'));
|
| + expect(errorMessage.span, isNotNull);
|
| + expect(errorMessage.span.start.line, 13);
|
| + expect(errorMessage.span.start.column, 22);
|
| + expect(errorMessage.span.text, '@def-3: var(def-2)');
|
| +
|
| + errorMessage = messages.messages[4];
|
| + expect(errorMessage.message, contains('var cycle detected var-two'));
|
| + expect(errorMessage.span, isNotNull);
|
| + expect(errorMessage.span.start.line, 5);
|
| + expect(errorMessage.span.start.column, 22);
|
| + expect(errorMessage.span.text, '@two: var(one)');
|
| +
|
| + errorMessage = messages.messages[5];
|
| + expect(errorMessage.message, contains('var cycle detected var-def-2'));
|
| + expect(errorMessage.span, isNotNull);
|
| + expect(errorMessage.span.start.line, 12);
|
| + expect(errorMessage.span.start.column, 22);
|
| + expect(errorMessage.span.text, '@def-2: var(def-3)');
|
| +
|
| + errorMessage = messages.messages[6];
|
| + expect(errorMessage.message, contains('var cycle detected var-one'));
|
| + expect(errorMessage.span, isNotNull);
|
| + expect(errorMessage.span.start.line, 4);
|
| + expect(errorMessage.span.start.column, 22);
|
| + expect(errorMessage.span.text, '@one: var(two)');
|
| +
|
| + errorMessage = messages.messages[7];
|
| + expect(errorMessage.message, contains('var cycle detected var-four'));
|
| + expect(errorMessage.span, isNotNull);
|
| + expect(errorMessage.span.start.line, 7);
|
| + expect(errorMessage.span.start.column, 22);
|
| + expect(errorMessage.span.text, '@four: var(five)');
|
| + }));
|
| + });
|
| +}
|
| +
|
| +test_pseudo_element() {
|
| + var messages = new Messages.silent();
|
| + var compiler = createCompiler({
|
| + 'index.html': '<head>'
|
| + '<link rel="import" href="foo.html">'
|
| + '<style>'
|
| + '.test::x-foo { background-color: red; }'
|
| + '.test::x-foo1 { color: blue; }'
|
| + '.test::x-foo2 { color: green; }'
|
| + '</style>'
|
| + '<body>'
|
| + '<x-foo class=test></x-foo>'
|
| + '<x-foo></x-foo>'
|
| + '<script type="application/dart">main() {}</script>',
|
| + 'foo.html': '<head>'
|
| + '<body><polymer-element name="x-foo" constructor="Foo">'
|
| + '<template>'
|
| + '<div pseudo="x-foo">'
|
| + '<div>Test</div>'
|
| + '</div>'
|
| + '<div pseudo="x-foo1 x-foo2">'
|
| + '<div>Test</div>'
|
| + '</div>'
|
| + '</template>',
|
| + }, messages, scopedCss: true);
|
| +
|
| + compiler.run().then(expectAsync1((e) {
|
| + MockFileSystem fs = compiler.fileSystem;
|
| + expect(fs.readCount, equals({
|
| + 'index.html': 1,
|
| + 'foo.html': 1,
|
| + }), reason: 'Actual:\n ${fs.readCount}');
|
| +
|
| + var outputs = compiler.output.map((o) => o.path);
|
| + expect(outputs, equals([
|
| + 'out/foo.html.dart',
|
| + 'out/foo.html.dart.map',
|
| + 'out/index.html.dart',
|
| + 'out/index.html.dart.map',
|
| + 'out/index.html_bootstrap.dart',
|
| + 'out/index.html',
|
| + ]));
|
| + expect(compiler.output.last.contents, contains(
|
| + '<div pseudo="x-foo_0">'
|
| + '<div>Test</div>'
|
| + '</div>'
|
| + '<div pseudo="x-foo1_1 x-foo2_2">'
|
| + '<div>Test</div>'
|
| + '</div>'));
|
| + expect(compiler.output.last.contents, contains(
|
| + '<style>.test > *[pseudo="x-foo_0"] {\n'
|
| + ' background-color: #f00;\n'
|
| + '}\n'
|
| + '.test > *[pseudo="x-foo1_1"] {\n'
|
| + ' color: #00f;\n'
|
| + '}\n'
|
| + '.test > *[pseudo="x-foo2_2"] {\n'
|
| + ' color: #008000;\n'
|
| + '}'
|
| + '</style>'));
|
| + }));
|
| +}
|
| +
|
| +main() {
|
| + useCompactVMConfiguration();
|
| +
|
| + test('test_simple_var', test_simple_var);
|
| + test('test_var', test_var);
|
| + test('test_simple_import', test_simple_import);
|
| + test('test_imports', test_imports);
|
| + test('test_component_var', test_component_var);
|
| + test('test_pseudo_element', test_pseudo_element);
|
| +}
|
|
|