| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 error_test; | 5 library error_test; |
| 6 | 6 |
| 7 import 'package:csslib/src/messages.dart'; | 7 import 'package:csslib/src/messages.dart'; |
| 8 import 'package:test/test.dart'; | 8 import 'package:test/test.dart'; |
| 9 | 9 |
| 10 import 'testing.dart'; | 10 import 'testing.dart'; |
| 11 | 11 |
| 12 /** | 12 /** |
| 13 * Test for unsupported font-weights values of bolder, lighter and inherit. | 13 * Test for unsupported font-weights values of bolder, lighter and inherit. |
| 14 */ | 14 */ |
| 15 void testUnsupportedFontWeights() { | 15 void testUnsupportedFontWeights() { |
| 16 var errors = []; | 16 var errors = <Message>[]; |
| 17 | 17 |
| 18 // TODO(terry): Need to support bolder. | 18 // TODO(terry): Need to support bolder. |
| 19 // font-weight value bolder. | 19 // font-weight value bolder. |
| 20 var input = ".foobar { font-weight: bolder; }"; | 20 var input = ".foobar { font-weight: bolder; }"; |
| 21 var stylesheet = parseCss(input, errors: errors); | 21 var stylesheet = parseCss(input, errors: errors); |
| 22 | 22 |
| 23 expect(errors.isEmpty, false); | 23 expect(errors.isEmpty, false); |
| 24 expect(errors[0].toString(), r''' | 24 expect( |
| 25 errors[0].toString(), |
| 26 r''' |
| 25 error on line 1, column 24: Unknown property value bolder | 27 error on line 1, column 24: Unknown property value bolder |
| 26 .foobar { font-weight: bolder; } | 28 .foobar { font-weight: bolder; } |
| 27 ^^^^^^'''); | 29 ^^^^^^'''); |
| 28 expect(stylesheet != null, true); | 30 expect(stylesheet != null, true); |
| 29 | 31 |
| 30 expect(prettyPrint(stylesheet), r''' | 32 expect( |
| 33 prettyPrint(stylesheet), |
| 34 r''' |
| 31 .foobar { | 35 .foobar { |
| 32 font-weight: bolder; | 36 font-weight: bolder; |
| 33 }'''); | 37 }'''); |
| 34 | 38 |
| 35 // TODO(terry): Need to support lighter. | 39 // TODO(terry): Need to support lighter. |
| 36 // font-weight value lighter. | 40 // font-weight value lighter. |
| 37 input = ".foobar { font-weight: lighter; }"; | 41 input = ".foobar { font-weight: lighter; }"; |
| 38 stylesheet = parseCss(input, errors: errors..clear()); | 42 stylesheet = parseCss(input, errors: errors..clear()); |
| 39 | 43 |
| 40 expect(errors.isEmpty, false); | 44 expect(errors.isEmpty, false); |
| 41 expect(errors[0].toString(), r''' | 45 expect( |
| 46 errors[0].toString(), |
| 47 r''' |
| 42 error on line 1, column 24: Unknown property value lighter | 48 error on line 1, column 24: Unknown property value lighter |
| 43 .foobar { font-weight: lighter; } | 49 .foobar { font-weight: lighter; } |
| 44 ^^^^^^^'''); | 50 ^^^^^^^'''); |
| 45 expect(stylesheet != null, true); | 51 expect(stylesheet != null, true); |
| 46 expect(prettyPrint(stylesheet), r''' | 52 expect( |
| 53 prettyPrint(stylesheet), |
| 54 r''' |
| 47 .foobar { | 55 .foobar { |
| 48 font-weight: lighter; | 56 font-weight: lighter; |
| 49 }'''); | 57 }'''); |
| 50 | 58 |
| 51 // TODO(terry): Need to support inherit. | 59 // TODO(terry): Need to support inherit. |
| 52 // font-weight value inherit. | 60 // font-weight value inherit. |
| 53 input = ".foobar { font-weight: inherit; }"; | 61 input = ".foobar { font-weight: inherit; }"; |
| 54 stylesheet = parseCss(input, errors: errors..clear()); | 62 stylesheet = parseCss(input, errors: errors..clear()); |
| 55 | 63 |
| 56 expect(errors.isEmpty, false); | 64 expect(errors.isEmpty, false); |
| 57 expect(errors[0].toString(), r''' | 65 expect( |
| 66 errors[0].toString(), |
| 67 r''' |
| 58 error on line 1, column 24: Unknown property value inherit | 68 error on line 1, column 24: Unknown property value inherit |
| 59 .foobar { font-weight: inherit; } | 69 .foobar { font-weight: inherit; } |
| 60 ^^^^^^^'''); | 70 ^^^^^^^'''); |
| 61 expect(stylesheet != null, true); | 71 expect(stylesheet != null, true); |
| 62 expect(prettyPrint(stylesheet), r''' | 72 expect( |
| 73 prettyPrint(stylesheet), |
| 74 r''' |
| 63 .foobar { | 75 .foobar { |
| 64 font-weight: inherit; | 76 font-weight: inherit; |
| 65 }'''); | 77 }'''); |
| 66 } | 78 } |
| 67 | 79 |
| 68 /** | 80 /** |
| 69 * Test for unsupported line-height values of units other than px, pt and | 81 * Test for unsupported line-height values of units other than px, pt and |
| 70 * inherit. | 82 * inherit. |
| 71 */ | 83 */ |
| 72 void testUnsupportedLineHeights() { | 84 void testUnsupportedLineHeights() { |
| 73 var errors = []; | 85 var errors = <Message>[]; |
| 74 | 86 |
| 75 // line-height value in percentge unit. | 87 // line-height value in percentge unit. |
| 76 var input = ".foobar { line-height: 120%; }"; | 88 var input = ".foobar { line-height: 120%; }"; |
| 77 var stylesheet = parseCss(input, errors: errors); | 89 var stylesheet = parseCss(input, errors: errors); |
| 78 | 90 |
| 79 expect(errors.isEmpty, false); | 91 expect(errors.isEmpty, false); |
| 80 expect(errors[0].toString(), r''' | 92 expect( |
| 93 errors[0].toString(), |
| 94 r''' |
| 81 error on line 1, column 24: Unexpected value for line-height | 95 error on line 1, column 24: Unexpected value for line-height |
| 82 .foobar { line-height: 120%; } | 96 .foobar { line-height: 120%; } |
| 83 ^^^'''); | 97 ^^^'''); |
| 84 expect(stylesheet != null, true); | 98 expect(stylesheet != null, true); |
| 85 expect(prettyPrint(stylesheet), r''' | 99 expect( |
| 100 prettyPrint(stylesheet), |
| 101 r''' |
| 86 .foobar { | 102 .foobar { |
| 87 line-height: 120%; | 103 line-height: 120%; |
| 88 }'''); | 104 }'''); |
| 89 | 105 |
| 90 // TODO(terry): Need to support all units. | 106 // TODO(terry): Need to support all units. |
| 91 // line-height value in cm unit. | 107 // line-height value in cm unit. |
| 92 input = ".foobar { line-height: 20cm; }"; | 108 input = ".foobar { line-height: 20cm; }"; |
| 93 stylesheet = parseCss(input, errors: errors..clear()); | 109 stylesheet = parseCss(input, errors: errors..clear()); |
| 94 | 110 |
| 95 expect(errors.isEmpty, false); | 111 expect(errors.isEmpty, false); |
| 96 expect(errors[0].toString(), r''' | 112 expect( |
| 113 errors[0].toString(), |
| 114 r''' |
| 97 error on line 1, column 24: Unexpected unit for line-height | 115 error on line 1, column 24: Unexpected unit for line-height |
| 98 .foobar { line-height: 20cm; } | 116 .foobar { line-height: 20cm; } |
| 99 ^^'''); | 117 ^^'''); |
| 100 expect(stylesheet != null, true); | 118 expect(stylesheet != null, true); |
| 101 expect(prettyPrint(stylesheet), r''' | 119 expect( |
| 120 prettyPrint(stylesheet), |
| 121 r''' |
| 102 .foobar { | 122 .foobar { |
| 103 line-height: 20cm; | 123 line-height: 20cm; |
| 104 }'''); | 124 }'''); |
| 105 | 125 |
| 106 // TODO(terry): Need to support inherit. | 126 // TODO(terry): Need to support inherit. |
| 107 // line-height value inherit. | 127 // line-height value inherit. |
| 108 input = ".foobar { line-height: inherit; }"; | 128 input = ".foobar { line-height: inherit; }"; |
| 109 stylesheet = parseCss(input, errors: errors..clear()); | 129 stylesheet = parseCss(input, errors: errors..clear()); |
| 110 | 130 |
| 111 expect(errors.isEmpty, false); | 131 expect(errors.isEmpty, false); |
| 112 expect(errors[0].toString(), r''' | 132 expect( |
| 133 errors[0].toString(), |
| 134 r''' |
| 113 error on line 1, column 24: Unknown property value inherit | 135 error on line 1, column 24: Unknown property value inherit |
| 114 .foobar { line-height: inherit; } | 136 .foobar { line-height: inherit; } |
| 115 ^^^^^^^'''); | 137 ^^^^^^^'''); |
| 116 expect(stylesheet != null, true); | 138 expect(stylesheet != null, true); |
| 117 expect(prettyPrint(stylesheet), r''' | 139 expect( |
| 140 prettyPrint(stylesheet), |
| 141 r''' |
| 118 .foobar { | 142 .foobar { |
| 119 line-height: inherit; | 143 line-height: inherit; |
| 120 }'''); | 144 }'''); |
| 121 } | 145 } |
| 122 | 146 |
| 123 /** Test for bad selectors. */ | 147 /** Test for bad selectors. */ |
| 124 void testBadSelectors() { | 148 void testBadSelectors() { |
| 125 var errors = []; | 149 var errors = <Message>[]; |
| 126 | 150 |
| 127 // Invalid id selector. | 151 // Invalid id selector. |
| 128 var input = "# foo { color: #ff00ff; }"; | 152 var input = "# foo { color: #ff00ff; }"; |
| 129 var stylesheet = parseCss(input, errors: errors); | 153 var stylesheet = parseCss(input, errors: errors); |
| 130 | 154 |
| 131 expect(errors.isEmpty, false); | 155 expect(errors.isEmpty, false); |
| 132 expect(errors[0].toString(), r''' | 156 expect( |
| 157 errors[0].toString(), |
| 158 r''' |
| 133 error on line 1, column 1: Not a valid ID selector expected #id | 159 error on line 1, column 1: Not a valid ID selector expected #id |
| 134 # foo { color: #ff00ff; } | 160 # foo { color: #ff00ff; } |
| 135 ^'''); | 161 ^'''); |
| 136 expect(stylesheet != null, true); | 162 expect(stylesheet != null, true); |
| 137 expect(prettyPrint(stylesheet), r''' | 163 expect( |
| 164 prettyPrint(stylesheet), |
| 165 r''' |
| 138 # foo { | 166 # foo { |
| 139 color: #f0f; | 167 color: #f0f; |
| 140 }'''); | 168 }'''); |
| 141 | 169 |
| 142 // Invalid class selector. | 170 // Invalid class selector. |
| 143 input = ". foo { color: #ff00ff; }"; | 171 input = ". foo { color: #ff00ff; }"; |
| 144 stylesheet = parseCss(input, errors: errors..clear()); | 172 stylesheet = parseCss(input, errors: errors..clear()); |
| 145 | 173 |
| 146 expect(errors.isEmpty, false); | 174 expect(errors.isEmpty, false); |
| 147 expect(errors[0].toString(), r''' | 175 expect( |
| 176 errors[0].toString(), |
| 177 r''' |
| 148 error on line 1, column 1: Not a valid class selector expected .className | 178 error on line 1, column 1: Not a valid class selector expected .className |
| 149 . foo { color: #ff00ff; } | 179 . foo { color: #ff00ff; } |
| 150 ^'''); | 180 ^'''); |
| 151 expect(stylesheet != null, true); | 181 expect(stylesheet != null, true); |
| 152 expect(prettyPrint(stylesheet), r''' | 182 expect( |
| 183 prettyPrint(stylesheet), |
| 184 r''' |
| 153 . foo { | 185 . foo { |
| 154 color: #f0f; | 186 color: #f0f; |
| 155 }'''); | 187 }'''); |
| 156 } | 188 } |
| 157 | 189 |
| 158 /** Test for bad hex values. */ | 190 /** Test for bad hex values. */ |
| 159 void testBadHexValues() { | 191 void testBadHexValues() { |
| 160 var errors = []; | 192 var errors = <Message>[]; |
| 161 | 193 |
| 162 // Invalid hex value. | 194 // Invalid hex value. |
| 163 var input = ".foobar { color: #AH787; }"; | 195 var input = ".foobar { color: #AH787; }"; |
| 164 var stylesheet = parseCss(input, errors: errors); | 196 var stylesheet = parseCss(input, errors: errors); |
| 165 | 197 |
| 166 expect(errors.isEmpty, false); | 198 expect(errors.isEmpty, false); |
| 167 expect(errors[0].toString(), r''' | 199 expect( |
| 200 errors[0].toString(), |
| 201 r''' |
| 168 error on line 1, column 18: Bad hex number | 202 error on line 1, column 18: Bad hex number |
| 169 .foobar { color: #AH787; } | 203 .foobar { color: #AH787; } |
| 170 ^^^^^^'''); | 204 ^^^^^^'''); |
| 171 expect(stylesheet != null, true); | 205 expect(stylesheet != null, true); |
| 172 expect(prettyPrint(stylesheet), r''' | 206 expect( |
| 207 prettyPrint(stylesheet), |
| 208 r''' |
| 173 .foobar { | 209 .foobar { |
| 174 color: #AH787; | 210 color: #AH787; |
| 175 }'''); | 211 }'''); |
| 176 | 212 |
| 177 // Bad color constant. | 213 // Bad color constant. |
| 178 input = ".foobar { color: redder; }"; | 214 input = ".foobar { color: redder; }"; |
| 179 stylesheet = parseCss(input, errors: errors..clear()); | 215 stylesheet = parseCss(input, errors: errors..clear()); |
| 180 | 216 |
| 181 expect(errors.isEmpty, false); | 217 expect(errors.isEmpty, false); |
| 182 expect(errors[0].toString(), r''' | 218 expect( |
| 219 errors[0].toString(), |
| 220 r''' |
| 183 error on line 1, column 18: Unknown property value redder | 221 error on line 1, column 18: Unknown property value redder |
| 184 .foobar { color: redder; } | 222 .foobar { color: redder; } |
| 185 ^^^^^^'''); | 223 ^^^^^^'''); |
| 186 | 224 |
| 187 expect(stylesheet != null, true); | 225 expect(stylesheet != null, true); |
| 188 expect(prettyPrint(stylesheet), r''' | 226 expect( |
| 227 prettyPrint(stylesheet), |
| 228 r''' |
| 189 .foobar { | 229 .foobar { |
| 190 color: redder; | 230 color: redder; |
| 191 }'''); | 231 }'''); |
| 192 | 232 |
| 193 // Bad hex color #<space>ffffff. | 233 // Bad hex color #<space>ffffff. |
| 194 input = ".foobar { color: # ffffff; }"; | 234 input = ".foobar { color: # ffffff; }"; |
| 195 stylesheet = parseCss(input, errors: errors..clear()); | 235 stylesheet = parseCss(input, errors: errors..clear()); |
| 196 | 236 |
| 197 expect(errors.isEmpty, false); | 237 expect(errors.isEmpty, false); |
| 198 expect(errors[0].toString(), r''' | 238 expect( |
| 239 errors[0].toString(), |
| 240 r''' |
| 199 error on line 1, column 18: Expected hex number | 241 error on line 1, column 18: Expected hex number |
| 200 .foobar { color: # ffffff; } | 242 .foobar { color: # ffffff; } |
| 201 ^'''); | 243 ^'''); |
| 202 | 244 |
| 203 expect(stylesheet != null, true); | 245 expect(stylesheet != null, true); |
| 204 expect(prettyPrint(stylesheet), r''' | 246 expect( |
| 247 prettyPrint(stylesheet), |
| 248 r''' |
| 205 .foobar { | 249 .foobar { |
| 206 color: # ffffff; | 250 color: # ffffff; |
| 207 }'''); | 251 }'''); |
| 208 | 252 |
| 209 // Bad hex color #<space>123fff. | 253 // Bad hex color #<space>123fff. |
| 210 input = ".foobar { color: # 123fff; }"; | 254 input = ".foobar { color: # 123fff; }"; |
| 211 stylesheet = parseCss(input, errors: errors..clear()); | 255 stylesheet = parseCss(input, errors: errors..clear()); |
| 212 | 256 |
| 213 expect(errors.isEmpty, false); | 257 expect(errors.isEmpty, false); |
| 214 expect(errors[0].toString(), r''' | 258 expect( |
| 259 errors[0].toString(), |
| 260 r''' |
| 215 error on line 1, column 18: Expected hex number | 261 error on line 1, column 18: Expected hex number |
| 216 .foobar { color: # 123fff; } | 262 .foobar { color: # 123fff; } |
| 217 ^'''); | 263 ^'''); |
| 218 | 264 |
| 219 expect(stylesheet != null, true); | 265 expect(stylesheet != null, true); |
| 220 | 266 |
| 221 // Formating is off with an extra space. However, the entire value is bad | 267 // Formating is off with an extra space. However, the entire value is bad |
| 222 // and isn't processed anyway. | 268 // and isn't processed anyway. |
| 223 expect(prettyPrint(stylesheet), r''' | 269 expect( |
| 270 prettyPrint(stylesheet), |
| 271 r''' |
| 224 .foobar { | 272 .foobar { |
| 225 color: # 123 fff; | 273 color: # 123 fff; |
| 226 }'''); | 274 }'''); |
| 227 } | 275 } |
| 228 | 276 |
| 229 void testBadUnicode() { | 277 void testBadUnicode() { |
| 230 var errors = []; | 278 var errors = <Message>[]; |
| 231 final String input = ''' | 279 final String input = ''' |
| 232 @font-face { | 280 @font-face { |
| 233 src: url(fonts/BBCBengali.ttf) format("opentype"); | 281 src: url(fonts/BBCBengali.ttf) format("opentype"); |
| 234 unicode-range: U+400-200; | 282 unicode-range: U+400-200; |
| 235 }'''; | 283 }'''; |
| 236 | 284 |
| 237 parseCss(input, errors: errors); | 285 parseCss(input, errors: errors); |
| 238 | 286 |
| 239 expect(errors.isEmpty, false); | 287 expect(errors.isEmpty, false); |
| 240 expect(errors[0].toString(), | 288 expect( |
| 289 errors[0].toString(), |
| 241 'error on line 3, column 20: unicode first range can not be greater than ' | 290 'error on line 3, column 20: unicode first range can not be greater than ' |
| 242 'last\n' | 291 'last\n' |
| 243 ' unicode-range: U+400-200;\n' | 292 ' unicode-range: U+400-200;\n' |
| 244 ' ^^^^^^^'); | 293 ' ^^^^^^^'); |
| 245 | 294 |
| 246 final String input2 = ''' | 295 final String input2 = ''' |
| 247 @font-face { | 296 @font-face { |
| 248 src: url(fonts/BBCBengali.ttf) format("opentype"); | 297 src: url(fonts/BBCBengali.ttf) format("opentype"); |
| 249 unicode-range: U+12FFFF; | 298 unicode-range: U+12FFFF; |
| 250 }'''; | 299 }'''; |
| 251 | 300 |
| 252 parseCss(input2, errors: errors..clear()); | 301 parseCss(input2, errors: errors..clear()); |
| 253 | 302 |
| 254 expect(errors.isEmpty, false); | 303 expect(errors.isEmpty, false); |
| 255 expect(errors[0].toString(), | 304 expect( |
| 305 errors[0].toString(), |
| 256 'error on line 3, column 20: unicode range must be less than 10FFFF\n' | 306 'error on line 3, column 20: unicode range must be less than 10FFFF\n' |
| 257 ' unicode-range: U+12FFFF;\n' | 307 ' unicode-range: U+12FFFF;\n' |
| 258 ' ^^^^^^'); | 308 ' ^^^^^^'); |
| 259 } | 309 } |
| 260 | 310 |
| 261 void testBadNesting() { | 311 void testBadNesting() { |
| 262 var errors = []; | 312 var errors = <Message>[]; |
| 263 | 313 |
| 264 // Test for bad declaration in a nested rule. | 314 // Test for bad declaration in a nested rule. |
| 265 final String input = ''' | 315 final String input = ''' |
| 266 div { | 316 div { |
| 267 width: 20px; | 317 width: 20px; |
| 268 span + ul { color: blue; } | 318 span + ul { color: blue; } |
| 269 span + ul > #aaaa { | 319 span + ul > #aaaa { |
| 270 color: #ffghghgh; | 320 color: #ffghghgh; |
| 271 } | 321 } |
| 272 background-color: red; | 322 background-color: red; |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 345 } | 395 } |
| 346 | 396 |
| 347 main() { | 397 main() { |
| 348 test('font-weight value errors', testUnsupportedFontWeights); | 398 test('font-weight value errors', testUnsupportedFontWeights); |
| 349 test('line-height value errors', testUnsupportedLineHeights); | 399 test('line-height value errors', testUnsupportedLineHeights); |
| 350 test('bad selectors', testBadSelectors); | 400 test('bad selectors', testBadSelectors); |
| 351 test('bad Hex values', testBadHexValues); | 401 test('bad Hex values', testBadHexValues); |
| 352 test('bad unicode ranges', testBadUnicode); | 402 test('bad unicode ranges', testBadUnicode); |
| 353 test('nested rules', testBadNesting); | 403 test('nested rules', testBadNesting); |
| 354 } | 404 } |
| OLD | NEW |