OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library declaration_test; | 5 library declaration_test; |
6 | 6 |
| 7 import 'package:csslib/src/messages.dart'; |
| 8 import 'package:csslib/visitor.dart'; |
7 import 'package:test/test.dart'; | 9 import 'package:test/test.dart'; |
8 | 10 |
9 import 'testing.dart'; | 11 import 'testing.dart'; |
10 | 12 |
11 void testSimpleTerms() { | 13 void testSimpleTerms() { |
12 var errors = []; | 14 var errors = <Message>[]; |
13 final String input = r''' | 15 final String input = r''' |
14 @ import url("test.css"); | 16 @ import url("test.css"); |
15 .foo { | 17 .foo { |
16 background-color: #191919; | 18 background-color: #191919; |
17 width: 10PX; | 19 width: 10PX; |
18 height: 22mM !important; | 20 height: 22mM !important; |
19 border-width: 20cm; | 21 border-width: 20cm; |
20 margin-width: 33%; | 22 margin-width: 33%; |
21 border-height: 30EM; | 23 border-height: 30EM; |
22 width: .6in; | 24 width: .6in; |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 expect(stylesheet != null, true); | 59 expect(stylesheet != null, true); |
58 expect(errors.isEmpty, true, reason: errors.toString()); | 60 expect(errors.isEmpty, true, reason: errors.toString()); |
59 expect(prettyPrint(stylesheet), generated2); | 61 expect(prettyPrint(stylesheet), generated2); |
60 } | 62 } |
61 | 63 |
62 /** | 64 /** |
63 * Declarations with comments, references with single-quotes, double-quotes, | 65 * Declarations with comments, references with single-quotes, double-quotes, |
64 * no quotes. Hex values with # and letters, and functions (rgba, url, etc.) | 66 * no quotes. Hex values with # and letters, and functions (rgba, url, etc.) |
65 */ | 67 */ |
66 void testDeclarations() { | 68 void testDeclarations() { |
67 var errors = []; | 69 var errors = <Message>[]; |
68 final String input = r''' | 70 final String input = r''' |
69 .more { | 71 .more { |
70 color: white; | 72 color: white; |
71 color: black; | 73 color: black; |
72 color: cyan; | 74 color: cyan; |
73 color: red; | 75 color: red; |
74 color: #aabbcc; /* test -- 3 */ | 76 color: #aabbcc; /* test -- 3 */ |
75 color: blue; | 77 color: blue; |
76 background-image: url(http://test.jpeg); | 78 background-image: url(http://test.jpeg); |
77 background-image: url("http://double_quote.html"); | 79 background-image: url("http://double_quote.html"); |
(...skipping 17 matching lines...) Expand all Loading... |
95 }'''; | 97 }'''; |
96 | 98 |
97 var stylesheet = parseCss(input, errors: errors); | 99 var stylesheet = parseCss(input, errors: errors); |
98 | 100 |
99 expect(stylesheet != null, true); | 101 expect(stylesheet != null, true); |
100 expect(errors.isEmpty, true, reason: errors.toString()); | 102 expect(errors.isEmpty, true, reason: errors.toString()); |
101 expect(prettyPrint(stylesheet), generated); | 103 expect(prettyPrint(stylesheet), generated); |
102 } | 104 } |
103 | 105 |
104 void testIdentifiers() { | 106 void testIdentifiers() { |
105 var errors = []; | 107 var errors = <Message>[]; |
106 final String input = r''' | 108 final String input = r''' |
107 #da { | 109 #da { |
108 height: 100px; | 110 height: 100px; |
109 } | 111 } |
110 #foo { | 112 #foo { |
111 width: 10px; | 113 width: 10px; |
112 color: #ff00cc; | 114 color: #ff00cc; |
113 } | 115 } |
114 '''; | 116 '''; |
115 final String generated = r''' | 117 final String generated = r''' |
116 #da { | 118 #da { |
117 height: 100px; | 119 height: 100px; |
118 } | 120 } |
119 #foo { | 121 #foo { |
120 width: 10px; | 122 width: 10px; |
121 color: #f0c; | 123 color: #f0c; |
122 }'''; | 124 }'''; |
123 | 125 |
124 var stylesheet = parseCss(input, errors: errors); | 126 var stylesheet = parseCss(input, errors: errors); |
125 | 127 |
126 expect(errors.isEmpty, true, reason: errors.toString()); | 128 expect(errors.isEmpty, true, reason: errors.toString()); |
127 expect(stylesheet != null, true); | 129 expect(stylesheet != null, true); |
128 expect(prettyPrint(stylesheet), generated); | 130 expect(prettyPrint(stylesheet), generated); |
129 } | 131 } |
130 | 132 |
131 void testComposites() { | 133 void testComposites() { |
132 var errors = []; | 134 var errors = <Message>[]; |
133 final String input = r''' | 135 final String input = r''' |
134 .xyzzy { | 136 .xyzzy { |
135 border: 10px 80px 90px 100px; | 137 border: 10px 80px 90px 100px; |
136 width: 99%; | 138 width: 99%; |
137 } | 139 } |
138 @-webkit-keyframes pulsate { | 140 @-webkit-keyframes pulsate { |
139 0% { | 141 0% { |
140 -webkit-transform: translate3d(0, 0, 0) scale(1.0); | 142 -webkit-transform: translate3d(0, 0, 0) scale(1.0); |
141 } | 143 } |
142 }'''; | 144 }'''; |
143 final String generated = r''' | 145 final String generated = r''' |
144 .xyzzy { | 146 .xyzzy { |
145 border: 10px 80px 90px 100px; | 147 border: 10px 80px 90px 100px; |
146 width: 99%; | 148 width: 99%; |
147 } | 149 } |
148 @-webkit-keyframes pulsate { | 150 @-webkit-keyframes pulsate { |
149 0% { | 151 0% { |
150 -webkit-transform: translate3d(0, 0, 0) scale(1.0); | 152 -webkit-transform: translate3d(0, 0, 0) scale(1.0); |
151 } | 153 } |
152 }'''; | 154 }'''; |
153 | 155 |
154 var stylesheet = parseCss(input, errors: errors); | 156 var stylesheet = parseCss(input, errors: errors); |
155 expect(stylesheet != null, true); | 157 expect(stylesheet != null, true); |
156 expect(errors.isEmpty, true, reason: errors.toString()); | 158 expect(errors.isEmpty, true, reason: errors.toString()); |
157 expect(prettyPrint(stylesheet), generated); | 159 expect(prettyPrint(stylesheet), generated); |
158 } | 160 } |
159 | 161 |
160 void testUnits() { | 162 void testUnits() { |
161 var errors = []; | 163 var errors = <Message>[]; |
162 final String input = r''' | 164 final String input = r''' |
163 #id-1 { | 165 #id-1 { |
164 transition: color 0.4s; | 166 transition: color 0.4s; |
165 animation-duration: 500ms; | 167 animation-duration: 500ms; |
166 top: 1em; | 168 top: 1em; |
167 left: 200ex; | 169 left: 200ex; |
168 right: 300px; | 170 right: 300px; |
169 bottom: 400cm; | 171 bottom: 400cm; |
170 border-width: 2.5mm; | 172 border-width: 2.5mm; |
171 margin-top: .5in; | 173 margin-top: .5in; |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
235 }'''; | 237 }'''; |
236 | 238 |
237 var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); | 239 var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); |
238 | 240 |
239 expect(stylesheet != null, true); | 241 expect(stylesheet != null, true); |
240 expect(errors.isEmpty, true, reason: errors.toString()); | 242 expect(errors.isEmpty, true, reason: errors.toString()); |
241 expect(prettyPrint(stylesheet), generated); | 243 expect(prettyPrint(stylesheet), generated); |
242 } | 244 } |
243 | 245 |
244 void testUnicode() { | 246 void testUnicode() { |
245 var errors = []; | 247 var errors = <Message>[]; |
246 final String input = r''' | 248 final String input = r''' |
247 .toggle:after { | 249 .toggle:after { |
248 content: '✔'; | 250 content: '✔'; |
249 line-height: 43px; | 251 line-height: 43px; |
250 font-size: 20px; | 252 font-size: 20px; |
251 color: #d9d9d9; | 253 color: #d9d9d9; |
252 text-shadow: 0 -1px 0 #bfbfbf; | 254 text-shadow: 0 -1px 0 #bfbfbf; |
253 } | 255 } |
254 '''; | 256 '''; |
255 | 257 |
256 final String generated = r''' | 258 final String generated = r''' |
257 .toggle:after { | 259 .toggle:after { |
258 content: '✔'; | 260 content: '✔'; |
259 line-height: 43px; | 261 line-height: 43px; |
260 font-size: 20px; | 262 font-size: 20px; |
261 color: #d9d9d9; | 263 color: #d9d9d9; |
262 text-shadow: 0 -1px 0 #bfbfbf; | 264 text-shadow: 0 -1px 0 #bfbfbf; |
263 }'''; | 265 }'''; |
264 | 266 |
265 var stylesheet = parseCss(input, errors: errors); | 267 var stylesheet = parseCss(input, errors: errors); |
266 | 268 |
267 expect(stylesheet != null, true); | 269 expect(stylesheet != null, true); |
268 expect(errors.isEmpty, true, reason: errors.toString()); | 270 expect(errors.isEmpty, true, reason: errors.toString()); |
269 expect(prettyPrint(stylesheet), generated); | 271 expect(prettyPrint(stylesheet), generated); |
270 } | 272 } |
271 | 273 |
272 void testNewerCss() { | 274 void testNewerCss() { |
273 var errors = []; | 275 var errors = <Message>[]; |
274 final String input = r''' | 276 final String input = r''' |
275 @media screen,print { | 277 @media screen,print { |
276 .foobar_screen { | 278 .foobar_screen { |
277 width: 10px; | 279 width: 10px; |
278 } | 280 } |
279 } | 281 } |
280 @page { | 282 @page { |
281 height: 22px; | 283 height: 22px; |
282 size: 3in 3in; | 284 size: 3in 3in; |
283 } | 285 } |
(...skipping 26 matching lines...) Expand all Loading... |
310 @charset "ASCII";'''; | 312 @charset "ASCII";'''; |
311 | 313 |
312 var stylesheet = parseCss(input, errors: errors); | 314 var stylesheet = parseCss(input, errors: errors); |
313 | 315 |
314 expect(stylesheet != null, true); | 316 expect(stylesheet != null, true); |
315 expect(errors.isEmpty, true, reason: errors.toString()); | 317 expect(errors.isEmpty, true, reason: errors.toString()); |
316 expect(prettyPrint(stylesheet), generated); | 318 expect(prettyPrint(stylesheet), generated); |
317 } | 319 } |
318 | 320 |
319 void testMediaQueries() { | 321 void testMediaQueries() { |
320 var errors = []; | 322 var errors = <Message>[]; |
321 String input = ''' | 323 String input = ''' |
322 @media screen and (-webkit-min-device-pixel-ratio:0) { | 324 @media screen and (-webkit-min-device-pixel-ratio:0) { |
323 .todo-item .toggle { | 325 .todo-item .toggle { |
324 background: none; | 326 background: none; |
325 } | 327 } |
326 #todo-item .toggle { | 328 #todo-item .toggle { |
327 height: 40px; | 329 height: 40px; |
328 } | 330 } |
329 }'''; | 331 }'''; |
330 String generated = ''' | 332 String generated = ''' |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
428 '@import "test.css" ONLY screen, NOT print (min-device-width:4000px);'; | 430 '@import "test.css" ONLY screen, NOT print (min-device-width:4000px);'; |
429 | 431 |
430 stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions); | 432 stylesheet = parseCss(input, errors: errors..clear(), opts: simpleOptions); |
431 | 433 |
432 expect(stylesheet != null, true); | 434 expect(stylesheet != null, true); |
433 expect(errors.isEmpty, true, reason: errors.toString()); | 435 expect(errors.isEmpty, true, reason: errors.toString()); |
434 expect(prettyPrint(stylesheet), generated); | 436 expect(prettyPrint(stylesheet), generated); |
435 } | 437 } |
436 | 438 |
437 void testFontFace() { | 439 void testFontFace() { |
438 var errors = []; | 440 var errors = <Message>[]; |
439 | 441 |
440 final String input = ''' | 442 final String input = ''' |
441 @font-face { | 443 @font-face { |
442 font-family: BBCBengali; | 444 font-family: BBCBengali; |
443 src: url(fonts/BBCBengali.ttf) format("opentype"); | 445 src: url(fonts/BBCBengali.ttf) format("opentype"); |
444 unicode-range: U+0A-FF, U+980-9FF, U+????, U+3???; | 446 unicode-range: U+0A-FF, U+980-9FF, U+????, U+3???; |
445 }'''; | 447 }'''; |
446 final String generated = '''@font-face { | 448 final String generated = '''@font-face { |
447 font-family: BBCBengali; | 449 font-family: BBCBengali; |
448 src: url("fonts/BBCBengali.ttf") format("opentype"); | 450 src: url("fonts/BBCBengali.ttf") format("opentype"); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
520 unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF; | 522 unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF; |
521 }'''; | 523 }'''; |
522 stylesheet = parseCss(input4, errors: errors..clear(), opts: simpleOptions); | 524 stylesheet = parseCss(input4, errors: errors..clear(), opts: simpleOptions); |
523 | 525 |
524 expect(stylesheet != null, true); | 526 expect(stylesheet != null, true); |
525 expect(errors.isEmpty, true, reason: errors.toString()); | 527 expect(errors.isEmpty, true, reason: errors.toString()); |
526 expect(prettyPrint(stylesheet), generated4); | 528 expect(prettyPrint(stylesheet), generated4); |
527 } | 529 } |
528 | 530 |
529 void testCssFile() { | 531 void testCssFile() { |
530 var errors = []; | 532 var errors = <Message>[]; |
531 final String input = r''' | 533 final String input = r''' |
532 @import 'simple.css' | 534 @import 'simple.css' |
533 @import "test.css" print | 535 @import "test.css" print |
534 @import url(test.css) screen, print | 536 @import url(test.css) screen, print |
535 @import url(http://google.com/maps/maps.css); | 537 @import url(http://google.com/maps/maps.css); |
536 | 538 |
537 div[href^='test'] { | 539 div[href^='test'] { |
538 height: 10px; | 540 height: 10px; |
539 } | 541 } |
540 | 542 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
584 ' background: url("http://www.foo.com/bar.png");\n' | 586 ' background: url("http://www.foo.com/bar.png");\n' |
585 '}'; | 587 '}'; |
586 var stylesheet = parseCss(input, errors: errors); | 588 var stylesheet = parseCss(input, errors: errors); |
587 | 589 |
588 expect(stylesheet != null, true); | 590 expect(stylesheet != null, true); |
589 expect(errors.isEmpty, true, reason: errors.toString()); | 591 expect(errors.isEmpty, true, reason: errors.toString()); |
590 expect(prettyPrint(stylesheet), generated); | 592 expect(prettyPrint(stylesheet), generated); |
591 } | 593 } |
592 | 594 |
593 void testCompactEmitter() { | 595 void testCompactEmitter() { |
594 var errors = []; | 596 var errors = <Message>[]; |
595 | 597 |
596 // Check !import compactly emitted. | 598 // Check !import compactly emitted. |
597 final String input = r''' | 599 final String input = r''' |
598 div { | 600 div { |
599 color: green !important; | 601 color: green !important; |
600 } | 602 } |
601 '''; | 603 '''; |
602 final String generated = "div { color: green!important; }"; | 604 final String generated = "div { color: green!important; }"; |
603 | 605 |
604 var stylesheet = parseCss(input, errors: errors); | 606 var stylesheet = parseCss(input, errors: errors); |
605 | 607 |
606 expect(stylesheet != null, true); | 608 expect(stylesheet != null, true); |
607 expect(errors.isEmpty, true, reason: errors.toString()); | 609 expect(errors.isEmpty, true, reason: errors.toString()); |
608 expect(compactOuptut(stylesheet), generated); | 610 expect(compactOuptut(stylesheet), generated); |
609 | 611 |
610 // Check namespace directive compactly emitted. | 612 // Check namespace directive compactly emitted. |
611 final String input2 = "@namespace a url(http://www.example.org/a);"; | 613 final String input2 = "@namespace a url(http://www.example.org/a);"; |
612 final String generated2 = "@namespace a url(http://www.example.org/a);"; | 614 final String generated2 = "@namespace a url(http://www.example.org/a);"; |
613 | 615 |
614 var stylesheet2 = parseCss(input2, errors: errors..clear()); | 616 var stylesheet2 = parseCss(input2, errors: errors..clear()); |
615 | 617 |
616 expect(stylesheet2 != null, true); | 618 expect(stylesheet2 != null, true); |
617 expect(errors.isEmpty, true, reason: errors.toString()); | 619 expect(errors.isEmpty, true, reason: errors.toString()); |
618 expect(compactOuptut(stylesheet2), generated2); | 620 expect(compactOuptut(stylesheet2), generated2); |
619 } | 621 } |
620 | 622 |
621 void testNotSelectors() { | 623 void testNotSelectors() { |
622 var errors = []; | 624 var errors = <Message>[]; |
623 | 625 |
624 final String input = r''' | 626 final String input = r''' |
625 .details:not(.open-details) x-element, | 627 .details:not(.open-details) x-element, |
626 .details:not(.open-details) .summary { | 628 .details:not(.open-details) .summary { |
627 overflow: hidden; | 629 overflow: hidden; |
628 } | 630 } |
629 | 631 |
630 .details:not(.open-details) x-icon { | 632 .details:not(.open-details) x-icon { |
631 margin-left: 99px; | 633 margin-left: 99px; |
632 } | 634 } |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
702 }'''; | 704 }'''; |
703 | 705 |
704 var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); | 706 var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); |
705 | 707 |
706 expect(stylesheet != null, true); | 708 expect(stylesheet != null, true); |
707 expect(errors.isEmpty, true, reason: errors.toString()); | 709 expect(errors.isEmpty, true, reason: errors.toString()); |
708 expect(prettyPrint(stylesheet), generated); | 710 expect(prettyPrint(stylesheet), generated); |
709 } | 711 } |
710 | 712 |
711 void testIE() { | 713 void testIE() { |
712 var errors = []; | 714 var errors = <Message>[]; |
713 final String input = ".test {\n" | 715 final String input = ".test {\n" |
714 " filter: progid:DXImageTransform.Microsoft.gradient" | 716 " filter: progid:DXImageTransform.Microsoft.gradient" |
715 "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');\n" | 717 "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');\n" |
716 "}"; | 718 "}"; |
717 final String generated = ".test {\n" | 719 final String generated = ".test {\n" |
718 " filter: progid:DXImageTransform.Microsoft.gradient" | 720 " filter: progid:DXImageTransform.Microsoft.gradient" |
719 "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');\n" | 721 "(GradientType=0,StartColorStr='#9d8b83', EndColorStr='#847670');\n" |
720 "}"; | 722 "}"; |
721 | 723 |
722 var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); | 724 var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
778 * Test IE specific declaration syntax: | 780 * Test IE specific declaration syntax: |
779 * IE6 property name prefixed with _ (normal CSS property name can start | 781 * IE6 property name prefixed with _ (normal CSS property name can start |
780 * with an underscore). | 782 * with an underscore). |
781 * | 783 * |
782 * IE7 or below property add asterisk before the CSS property. | 784 * IE7 or below property add asterisk before the CSS property. |
783 * | 785 * |
784 * IE8 or below add \9 at end of declaration expression e.g., | 786 * IE8 or below add \9 at end of declaration expression e.g., |
785 * background: red\9; | 787 * background: red\9; |
786 */ | 788 */ |
787 void testIEDeclaration() { | 789 void testIEDeclaration() { |
788 var errors = []; | 790 var errors = <Message>[]; |
789 | 791 |
790 final input = ''' | 792 final input = ''' |
791 .testIE-6 { | 793 .testIE-6 { |
792 _zoom : 5; | 794 _zoom : 5; |
793 } | 795 } |
794 .clearfix { | 796 .clearfix { |
795 *zoom: 1; | 797 *zoom: 1; |
796 } | 798 } |
797 audio, video { | 799 audio, video { |
798 display: inline-block; | 800 display: inline-block; |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
944 } | 946 } |
945 }'''; | 947 }'''; |
946 | 948 |
947 var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); | 949 var stylesheet = parseCss(input, errors: errors, opts: simpleOptions); |
948 expect(stylesheet != null, true); | 950 expect(stylesheet != null, true); |
949 expect(errors.isEmpty, true, reason: errors.toString()); | 951 expect(errors.isEmpty, true, reason: errors.toString()); |
950 expect(prettyPrint(stylesheet), generated); | 952 expect(prettyPrint(stylesheet), generated); |
951 } | 953 } |
952 | 954 |
953 void testHangs() { | 955 void testHangs() { |
954 var errors = []; | 956 var errors = <Message>[]; |
955 | 957 |
956 // Bad hexvalue had caused a hang in processTerm. | 958 // Bad hexvalue had caused a hang in processTerm. |
957 final input = r'''#a { color: #ebebeburl(0/IE8+9+); }'''; | 959 final input = r'''#a { color: #ebebeburl(0/IE8+9+); }'''; |
958 var stylesheet = parseCss(input, errors: errors, opts: options); | 960 var stylesheet = parseCss(input, errors: errors, opts: options); |
959 | 961 |
960 expect(stylesheet != null, true); | 962 expect(stylesheet != null, true); |
961 expect(errors.length, 3, reason: errors.toString()); | 963 expect(errors.length, 3, reason: errors.toString()); |
962 | 964 |
963 var errorMessage = errors[0]; | 965 var errorMessage = errors[0]; |
964 expect(errorMessage.message, contains('Bad hex number')); | 966 expect(errorMessage.message, contains('Bad hex number')); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1001 expect(errorMessage.message, contains('unexpected end of file')); | 1003 expect(errorMessage.message, contains('unexpected end of file')); |
1002 expect(errorMessage.span, isNotNull); | 1004 expect(errorMessage.span, isNotNull); |
1003 expect(errorMessage.span.start.line, 7); | 1005 expect(errorMessage.span.start.line, 7); |
1004 expect(errorMessage.span.start.column, 0); | 1006 expect(errorMessage.span.start.column, 0); |
1005 expect(errorMessage.span.text.trim(), ''); | 1007 expect(errorMessage.span.text.trim(), ''); |
1006 } | 1008 } |
1007 | 1009 |
1008 void testExpressionSpans() { | 1010 void testExpressionSpans() { |
1009 final input = r'''.foo { width: 50px; }'''; | 1011 final input = r'''.foo { width: 50px; }'''; |
1010 var stylesheet = parseCss(input); | 1012 var stylesheet = parseCss(input); |
1011 var decl = stylesheet.topLevels.single.declarationGroup.declarations.single; | 1013 var decl = (stylesheet.topLevels.single as RuleSet) |
| 1014 .declarationGroup |
| 1015 .declarations |
| 1016 .single; |
1012 // This passes | 1017 // This passes |
1013 expect(decl.span.text, 'width: 50px'); | 1018 expect(decl.span.text, 'width: 50px'); |
1014 // This currently fails | 1019 // This currently fails |
1015 expect(decl.expression.span.text, '50px'); | 1020 expect((decl as Declaration).expression.span.text, '50px'); |
1016 } | 1021 } |
1017 | 1022 |
1018 void simpleCalc() { | 1023 void simpleCalc() { |
1019 final input = r'''.foo { height: calc(100% - 55px); }'''; | 1024 final input = r'''.foo { height: calc(100% - 55px); }'''; |
1020 var stylesheet = parseCss(input); | 1025 var stylesheet = parseCss(input); |
1021 var decl = stylesheet.topLevels.single.declarationGroup.declarations.single; | 1026 var decl = (stylesheet.topLevels.single as RuleSet) |
| 1027 .declarationGroup |
| 1028 .declarations |
| 1029 .single; |
1022 expect(decl.span.text, 'height: calc(100% - 55px)'); | 1030 expect(decl.span.text, 'height: calc(100% - 55px)'); |
1023 } | 1031 } |
1024 | 1032 |
1025 void complexCalc() { | 1033 void complexCalc() { |
1026 final input = r'''.foo { left: calc((100%/3 - 2) * 1em - 2 * 1px); }'''; | 1034 final input = r'''.foo { left: calc((100%/3 - 2) * 1em - 2 * 1px); }'''; |
1027 var stylesheet = parseCss(input); | 1035 var stylesheet = parseCss(input); |
1028 var decl = stylesheet.topLevels.single.declarationGroup.declarations.single; | 1036 var decl = (stylesheet.topLevels.single as RuleSet) |
| 1037 .declarationGroup |
| 1038 .declarations |
| 1039 .single; |
1029 expect(decl.span.text, 'left: calc((100%/3 - 2) * 1em - 2 * 1px)'); | 1040 expect(decl.span.text, 'left: calc((100%/3 - 2) * 1em - 2 * 1px)'); |
1030 } | 1041 } |
1031 | 1042 |
1032 void twoCalcs() { | 1043 void twoCalcs() { |
1033 final input = r'''.foo { margin: calc(1rem - 2px) calc(1rem - 1px); }'''; | 1044 final input = r'''.foo { margin: calc(1rem - 2px) calc(1rem - 1px); }'''; |
1034 var stylesheet = parseCss(input); | 1045 var stylesheet = parseCss(input); |
1035 var decl = stylesheet.topLevels.single.declarationGroup.declarations.single; | 1046 var decl = (stylesheet.topLevels.single as RuleSet) |
| 1047 .declarationGroup |
| 1048 .declarations |
| 1049 .single; |
1036 expect(decl.span.text, 'margin: calc(1rem - 2px) calc(1rem - 1px)'); | 1050 expect(decl.span.text, 'margin: calc(1rem - 2px) calc(1rem - 1px)'); |
1037 } | 1051 } |
1038 | 1052 |
1039 void selectorWithCalcs() { | 1053 void selectorWithCalcs() { |
1040 var errors = []; | 1054 var errors = <Message>[]; |
1041 final String input = r''' | 1055 final String input = r''' |
1042 .foo { | 1056 .foo { |
1043 width: calc(1em + 5 * 2em); | 1057 width: calc(1em + 5 * 2em); |
1044 height: calc(1px + 2%) !important; | 1058 height: calc(1px + 2%) !important; |
1045 border: 5px calc(1pt + 2cm) 6px calc(1em + 1in + 2px) red; | 1059 border: 5px calc(1pt + 2cm) 6px calc(1em + 1in + 2px) red; |
1046 border: calc(5px + 1em) 0px 1px calc(10 + 20 + 1px); | 1060 border: calc(5px + 1em) 0px 1px calc(10 + 20 + 1px); |
1047 margin: 25px calc(50px + (100% / (3 - 1em) - 20%)) calc(10px + 10 * 20) calc(1
00% - 10px); | 1061 margin: 25px calc(50px + (100% / (3 - 1em) - 20%)) calc(10px + 10 * 20) calc(1
00% - 10px); |
1048 }'''; | 1062 }'''; |
1049 final String generated = r''' | 1063 final String generated = r''' |
1050 .foo { | 1064 .foo { |
(...skipping 21 matching lines...) Expand all Loading... |
1072 test('Media Queries', testMediaQueries); | 1086 test('Media Queries', testMediaQueries); |
1073 test('Font-Face', testFontFace); | 1087 test('Font-Face', testFontFace); |
1074 test('CSS file', testCssFile); | 1088 test('CSS file', testCssFile); |
1075 test('Compact Emitter', testCompactEmitter); | 1089 test('Compact Emitter', testCompactEmitter); |
1076 test('Selector Negation', testNotSelectors); | 1090 test('Selector Negation', testNotSelectors); |
1077 test('IE stuff', testIE); | 1091 test('IE stuff', testIE); |
1078 test('IE declaration syntax', testIEDeclaration); | 1092 test('IE declaration syntax', testIEDeclaration); |
1079 test('Hanging bugs', testHangs); | 1093 test('Hanging bugs', testHangs); |
1080 test('Expression spans', testExpressionSpans, | 1094 test('Expression spans', testExpressionSpans, |
1081 skip: 'expression spans are broken' | 1095 skip: 'expression spans are broken' |
1082 ' (https://github.com/dart-lang/csslib/issues/15)'); | 1096 ' (https://github.com/dart-lang/csslib/issues/15)'); |
1083 group('calc function', () { | 1097 group('calc function', () { |
1084 test('simple calc', simpleCalc); | 1098 test('simple calc', simpleCalc); |
1085 test('single complex', complexCalc); | 1099 test('single complex', complexCalc); |
1086 test('two calc terms for same declaration', twoCalcs); | 1100 test('two calc terms for same declaration', twoCalcs); |
1087 test('selector with many calc declarations', selectorWithCalcs); | 1101 test('selector with many calc declarations', selectorWithCalcs); |
1088 }); | 1102 }); |
1089 } | 1103 } |
1090 | |
OLD | NEW |