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