OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 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. |
| 4 library initialize.transformer_test; |
| 5 |
| 6 import 'common.dart'; |
| 7 import 'package:analyzer/src/generated/element.dart'; |
| 8 import 'package:dart_style/dart_style.dart'; |
| 9 import 'package:initialize/transformer.dart'; |
| 10 import 'package:unittest/compact_vm_config.dart'; |
| 11 import 'package:unittest/unittest.dart'; |
| 12 |
| 13 var formatter = new DartFormatter(); |
| 14 |
| 15 main() { |
| 16 useCompactVMConfiguration(); |
| 17 |
| 18 group('Html entry points', htmlEntryPointTests); |
| 19 group('Dart entry points', dartEntryPointTests); |
| 20 group('InitializerPlugins', pluginTests); |
| 21 } |
| 22 |
| 23 void htmlEntryPointTests() { |
| 24 var phases = [[new InitializeTransformer(['web/*.html'])]]; |
| 25 |
| 26 testPhases('basic', phases, { |
| 27 'a|web/index.html': ''' |
| 28 <html><head></head><body> |
| 29 <script type="application/dart" src="index.dart"></script> |
| 30 </body></html> |
| 31 '''.replaceAll(' ', ''), |
| 32 'a|web/index.dart': ''' |
| 33 library web_foo; |
| 34 |
| 35 import 'foo.dart'; |
| 36 ''', |
| 37 'a|web/foo.dart': ''' |
| 38 @constInit |
| 39 library foo; |
| 40 |
| 41 import 'package:initialize/initialize.dart'; |
| 42 import 'package:test_initializers/common.dart'; |
| 43 import 'package:bar/bar.dart'; |
| 44 |
| 45 @constInit |
| 46 class Foo extends Bar {} |
| 47 |
| 48 @initMethod |
| 49 foo() {} |
| 50 ''', |
| 51 'bar|lib/bar.dart': ''' |
| 52 @DynamicInit('bar') |
| 53 @DynamicInit('bar2') |
| 54 library bar; |
| 55 |
| 56 import 'package:initialize/initialize.dart'; |
| 57 import 'package:test_initializers/common.dart'; |
| 58 import 'baz.dart'; |
| 59 |
| 60 @DynamicInit('Bar') |
| 61 @DynamicInit('Bar2') |
| 62 class Bar {} |
| 63 |
| 64 @DynamicInit('bar()') |
| 65 @initMethod |
| 66 bar() {} |
| 67 ''', |
| 68 'bar|lib/baz.dart': ''' |
| 69 @constInit |
| 70 library baz; |
| 71 |
| 72 import 'package:test_initializers/common.dart'; |
| 73 ''', |
| 74 // Mock out the Initialize package plus some initializers. |
| 75 'initialize|lib/initialize.dart': mockInitialize, |
| 76 'test_initializers|lib/common.dart': commonInitializers, |
| 77 }, { |
| 78 'a|web/index.html': ''' |
| 79 <html><head></head><body> |
| 80 <script type="application/dart" src="index.initialize.dart"></script> |
| 81 |
| 82 </body></html>'''.replaceAll(' ', ''), |
| 83 'a|web/index.initialize.dart': formatter.format(''' |
| 84 import 'package:initialize/src/static_loader.dart'; |
| 85 import 'package:initialize/initialize.dart'; |
| 86 import 'index.dart' as i0; |
| 87 import 'package:bar/baz.dart' as i1; |
| 88 import 'package:test_initializers/common.dart' as i2; |
| 89 import 'package:bar/bar.dart' as i3; |
| 90 import 'package:initialize/initialize.dart' as i4; |
| 91 import 'foo.dart' as i5; |
| 92 |
| 93 main() { |
| 94 initializers.addAll([ |
| 95 new InitEntry(i2.constInit, const LibraryIdentifier(#baz, 'bar', 'ba
z.dart')), |
| 96 new InitEntry(const i2.DynamicInit('bar'), const LibraryIdentifier(#
bar, 'bar', 'bar.dart')), |
| 97 new InitEntry(const i2.DynamicInit('bar2'), const LibraryIdentifier(
#bar, 'bar', 'bar.dart')), |
| 98 new InitEntry(const i2.DynamicInit('bar()'), i3.bar), |
| 99 new InitEntry(i4.initMethod, i3.bar), |
| 100 new InitEntry(const i2.DynamicInit('Bar'), i3.Bar), |
| 101 new InitEntry(const i2.DynamicInit('Bar2'), i3.Bar), |
| 102 new InitEntry(i2.constInit, const LibraryIdentifier(#foo, null, 'foo
.dart')), |
| 103 new InitEntry(i4.initMethod, i5.foo), |
| 104 new InitEntry(i2.constInit, i5.Foo), |
| 105 ]); |
| 106 |
| 107 return i0.main(); |
| 108 } |
| 109 ''') |
| 110 }, []); |
| 111 } |
| 112 |
| 113 void dartEntryPointTests() { |
| 114 var phases = [[new InitializeTransformer(['web/index.dart'])]]; |
| 115 |
| 116 testPhases('constructor arguments', phases, { |
| 117 'a|web/index.dart': ''' |
| 118 @DynamicInit(foo) |
| 119 @DynamicInit(_foo) |
| 120 @DynamicInit(Foo.foo) |
| 121 @DynamicInit(bar.Foo.bar) |
| 122 @DynamicInit(bar.Foo.foo) |
| 123 @DynamicInit(const [foo, Foo.foo, 'foo']) |
| 124 @DynamicInit(const {'foo': foo, 'Foo.foo': Foo.foo, 'bar': 'bar'}) |
| 125 @DynamicInit('foo') |
| 126 @DynamicInit(true) |
| 127 @DynamicInit(null) |
| 128 @DynamicInit(1) |
| 129 @DynamicInit(1.1) |
| 130 @DynamicInit('foo-\$x\${y}') |
| 131 @DynamicInit(1 + 2) |
| 132 @DynamicInit(1.0 + 0.2) |
| 133 @DynamicInit(1 == 1) |
| 134 @NamedArgInit(1, name: 'Bill') |
| 135 library web_foo; |
| 136 |
| 137 import 'package:test_initializers/common.dart'; |
| 138 import 'foo.dart'; |
| 139 import 'foo.dart' as bar; |
| 140 |
| 141 const x = 'x'; |
| 142 const y = 'y'; |
| 143 const _foo = '_foo'; |
| 144 |
| 145 class MyConst { |
| 146 const MyConst; |
| 147 } |
| 148 ''', |
| 149 'a|web/foo.dart': ''' |
| 150 library foo; |
| 151 |
| 152 const String foo = 'foo'; |
| 153 |
| 154 class Bar { |
| 155 const Bar(); |
| 156 } |
| 157 |
| 158 class Foo { |
| 159 static foo = 'Foo.foo'; |
| 160 static bar = const Bar(); |
| 161 } |
| 162 ''', |
| 163 // Mock out the Initialize package plus some initializers. |
| 164 'initialize|lib/initialize.dart': mockInitialize, |
| 165 'test_initializers|lib/common.dart': commonInitializers, |
| 166 }, { |
| 167 'a|web/index.initialize.dart': formatter.format(''' |
| 168 import 'package:initialize/src/static_loader.dart'; |
| 169 import 'package:initialize/initialize.dart'; |
| 170 import 'index.dart' as i0; |
| 171 import 'package:test_initializers/common.dart' as i1; |
| 172 import 'foo.dart' as i2; |
| 173 |
| 174 main() { |
| 175 initializers.addAll([ |
| 176 new InitEntry(const i1.DynamicInit(i2.foo), const LibraryIdentifier(
#web_foo, null, 'index.dart')), |
| 177 new InitEntry(const i1.DynamicInit('_foo'), const LibraryIdentifier(
#web_foo, null, 'index.dart')), |
| 178 new InitEntry(const i1.DynamicInit(i2.Foo.foo), const LibraryIdentif
ier(#web_foo, null, 'index.dart')), |
| 179 new InitEntry(const i1.DynamicInit(i2.Foo.bar), const LibraryIdentif
ier(#web_foo, null, 'index.dart')), |
| 180 new InitEntry(const i1.DynamicInit(i2.Foo.foo), const LibraryIdentif
ier(#web_foo, null, 'index.dart')), |
| 181 new InitEntry(const i1.DynamicInit(const [i2.foo, i2.Foo.foo, 'foo']
), const LibraryIdentifier(#web_foo, null, 'index.dart')), |
| 182 new InitEntry(const i1.DynamicInit(const {'foo': i2.foo, 'Foo.foo':
i2.Foo.foo, 'bar': 'bar'}), const LibraryIdentifier(#web_foo, null, 'index.dart'
)), |
| 183 new InitEntry(const i1.DynamicInit('foo'), const LibraryIdentifier(#
web_foo, null, 'index.dart')), |
| 184 new InitEntry(const i1.DynamicInit(true), const LibraryIdentifier(#w
eb_foo, null, 'index.dart')), |
| 185 new InitEntry(const i1.DynamicInit(null), const LibraryIdentifier(#w
eb_foo, null, 'index.dart')), |
| 186 new InitEntry(const i1.DynamicInit(1), const LibraryIdentifier(#web_
foo, null, 'index.dart')), |
| 187 new InitEntry(const i1.DynamicInit(1.1), const LibraryIdentifier(#we
b_foo, null, 'index.dart')), |
| 188 new InitEntry(const i1.DynamicInit('foo-xy'), const LibraryIdentifie
r(#web_foo, null, 'index.dart')), |
| 189 new InitEntry(const i1.DynamicInit(3), const LibraryIdentifier(#web_
foo, null, 'index.dart')), |
| 190 new InitEntry(const i1.DynamicInit(1.2), const LibraryIdentifier(#we
b_foo, null, 'index.dart')), |
| 191 new InitEntry(const i1.DynamicInit(true), const LibraryIdentifier(#w
eb_foo, null, 'index.dart')), |
| 192 new InitEntry(const i1.NamedArgInit(1, name: 'Bill'), const LibraryI
dentifier(#web_foo, null, 'index.dart')), |
| 193 ]); |
| 194 |
| 195 return i0.main(); |
| 196 } |
| 197 ''') |
| 198 }, []); |
| 199 |
| 200 testPhases('exported library annotations', phases, { |
| 201 'a|web/index.dart': ''' |
| 202 library web_foo; |
| 203 |
| 204 export 'foo.dart'; |
| 205 ''', |
| 206 'a|web/foo.dart': ''' |
| 207 @constInit |
| 208 library foo; |
| 209 |
| 210 import 'package:test_initializers/common.dart'; |
| 211 |
| 212 @constInit |
| 213 foo() {}; |
| 214 |
| 215 @constInit |
| 216 class Foo {} |
| 217 ''', |
| 218 // Mock out the Initialize package plus some initializers. |
| 219 'initialize|lib/initialize.dart': mockInitialize, |
| 220 'test_initializers|lib/common.dart': commonInitializers, |
| 221 }, { |
| 222 'a|web/index.initialize.dart': formatter.format(''' |
| 223 import 'package:initialize/src/static_loader.dart'; |
| 224 import 'package:initialize/initialize.dart'; |
| 225 import 'index.dart' as i0; |
| 226 import 'foo.dart' as i1; |
| 227 import 'package:test_initializers/common.dart' as i2; |
| 228 |
| 229 main() { |
| 230 initializers.addAll([ |
| 231 new InitEntry(i2.constInit, const LibraryIdentifier(#foo, null, 'foo
.dart')), |
| 232 new InitEntry(i2.constInit, i1.foo), |
| 233 new InitEntry(i2.constInit, i1.Foo), |
| 234 ]); |
| 235 |
| 236 return i0.main(); |
| 237 } |
| 238 ''') |
| 239 }, []); |
| 240 |
| 241 testPhases('imports from exported libraries', phases, { |
| 242 'a|web/index.dart': ''' |
| 243 library web_foo; |
| 244 |
| 245 export 'foo.dart'; |
| 246 ''', |
| 247 'a|web/foo.dart': ''' |
| 248 library foo; |
| 249 |
| 250 import 'foo/bar.dart'; |
| 251 ''', |
| 252 'a|web/foo/bar.dart': ''' |
| 253 @constInit |
| 254 library bar; |
| 255 |
| 256 import 'package:test_initializers/common.dart'; |
| 257 |
| 258 @constInit |
| 259 bar() {}; |
| 260 |
| 261 @constInit |
| 262 class Bar {} |
| 263 ''', |
| 264 // Mock out the Initialize package plus some initializers. |
| 265 'initialize|lib/initialize.dart': mockInitialize, |
| 266 'test_initializers|lib/common.dart': commonInitializers, |
| 267 }, { |
| 268 'a|web/index.initialize.dart': formatter.format(''' |
| 269 import 'package:initialize/src/static_loader.dart'; |
| 270 import 'package:initialize/initialize.dart'; |
| 271 import 'index.dart' as i0; |
| 272 import 'foo/bar.dart' as i1; |
| 273 import 'package:test_initializers/common.dart' as i2; |
| 274 |
| 275 main() { |
| 276 initializers.addAll([ |
| 277 new InitEntry(i2.constInit, const LibraryIdentifier(#bar, null, 'foo
/bar.dart')), |
| 278 new InitEntry(i2.constInit, i1.bar), |
| 279 new InitEntry(i2.constInit, i1.Bar), |
| 280 ]); |
| 281 |
| 282 return i0.main(); |
| 283 } |
| 284 ''') |
| 285 }, []); |
| 286 |
| 287 testPhases('library parts and exports', phases, { |
| 288 'a|web/index.dart': ''' |
| 289 @constInit |
| 290 library index; |
| 291 |
| 292 import 'package:test_initializers/common.dart'; |
| 293 export 'export.dart'; |
| 294 |
| 295 part 'foo.dart'; |
| 296 part 'bar.dart'; |
| 297 |
| 298 @constInit |
| 299 index() {}; |
| 300 |
| 301 @constInit |
| 302 class Index {}; |
| 303 ''', |
| 304 'a|web/foo.dart': ''' |
| 305 part of index; |
| 306 |
| 307 @constInit |
| 308 foo() {}; |
| 309 |
| 310 @constInit |
| 311 class Foo {}; |
| 312 ''', |
| 313 'a|web/bar.dart': ''' |
| 314 part of index; |
| 315 |
| 316 @constInit |
| 317 bar() {}; |
| 318 |
| 319 @constInit |
| 320 class Bar {}; |
| 321 ''', |
| 322 'a|web/export.dart': ''' |
| 323 @constInit |
| 324 library export; |
| 325 |
| 326 import 'package:test_initializers/common.dart'; |
| 327 |
| 328 @constInit |
| 329 class Export {}; |
| 330 ''', |
| 331 // Mock out the Initialize package plus some initializers. |
| 332 'initialize|lib/initialize.dart': mockInitialize, |
| 333 'test_initializers|lib/common.dart': commonInitializers, |
| 334 }, { |
| 335 'a|web/index.initialize.dart': formatter.format(''' |
| 336 import 'package:initialize/src/static_loader.dart'; |
| 337 import 'package:initialize/initialize.dart'; |
| 338 import 'index.dart' as i0; |
| 339 import 'export.dart' as i1; |
| 340 import 'package:test_initializers/common.dart' as i2; |
| 341 |
| 342 main() { |
| 343 initializers.addAll([ |
| 344 new InitEntry(i2.constInit, const LibraryIdentifier(#export, null, '
export.dart')), |
| 345 new InitEntry(i2.constInit, i1.Export), |
| 346 new InitEntry(i2.constInit, const LibraryIdentifier(#index, null, 'i
ndex.dart')), |
| 347 new InitEntry(i2.constInit, i0.bar), |
| 348 new InitEntry(i2.constInit, i0.foo), |
| 349 new InitEntry(i2.constInit, i0.index), |
| 350 new InitEntry(i2.constInit, i0.Bar), |
| 351 new InitEntry(i2.constInit, i0.Foo), |
| 352 new InitEntry(i2.constInit, i0.Index), |
| 353 ]); |
| 354 |
| 355 return i0.main(); |
| 356 } |
| 357 ''') |
| 358 }, []); |
| 359 } |
| 360 |
| 361 class SkipConstructorsPlugin extends InitializerPlugin { |
| 362 bool shouldApply(InitializerPluginData data) { |
| 363 return data.initializer.annotationElement.element is ConstructorElement; |
| 364 } |
| 365 |
| 366 String apply(_) => null; |
| 367 } |
| 368 |
| 369 void pluginTests() { |
| 370 var phases = [ |
| 371 [ |
| 372 new InitializeTransformer(['web/index.dart'], |
| 373 plugins: [new SkipConstructorsPlugin()]) |
| 374 ] |
| 375 ]; |
| 376 |
| 377 testPhases('can omit statements', phases, { |
| 378 'a|web/index.dart': ''' |
| 379 library index; |
| 380 |
| 381 import 'package:initialize/initialize.dart'; |
| 382 import 'package:test_initializers/common.dart'; |
| 383 import 'foo.dart'; |
| 384 |
| 385 @initMethod |
| 386 @DynamicInit('index') |
| 387 index() {} |
| 388 ''', |
| 389 'a|web/foo.dart': ''' |
| 390 library foo; |
| 391 |
| 392 import 'package:initialize/initialize.dart'; |
| 393 import 'package:test_initializers/common.dart'; |
| 394 |
| 395 @initMethod |
| 396 @DynamicInit('Foo') |
| 397 foo() {} |
| 398 ''', |
| 399 // Mock out the Initialize package plus some initializers. |
| 400 'initialize|lib/initialize.dart': mockInitialize, |
| 401 'test_initializers|lib/common.dart': commonInitializers, |
| 402 }, { |
| 403 'a|web/index.initialize.dart': formatter.format(''' |
| 404 import 'package:initialize/src/static_loader.dart'; |
| 405 import 'package:initialize/initialize.dart'; |
| 406 import 'index.dart' as i0; |
| 407 import 'foo.dart' as i1; |
| 408 import 'package:initialize/initialize.dart' as i2; |
| 409 import 'package:test_initializers/common.dart' as i3; |
| 410 |
| 411 main() { |
| 412 initializers.addAll([ |
| 413 new InitEntry(i2.initMethod, i1.foo), |
| 414 new InitEntry(i2.initMethod, i0.index), |
| 415 ]); |
| 416 |
| 417 return i0.main(); |
| 418 } |
| 419 ''') |
| 420 }, []); |
| 421 } |
OLD | NEW |