// Copyright (c) 2015, 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 initialize.transformer_test;

import 'common.dart';
import 'package:initialize/transformer.dart';
import 'package:unittest/compact_vm_config.dart';

main() {
  useCompactVMConfiguration();

  var transformer =
      new InitializeTransformer('web/index.dart', 'web/index.bootstrap.dart');

  testPhases('transformer', [[transformer]], {
    'a|web/index.dart': '''
          library web_foo;

          import 'foo.dart';
          ''',
    'a|web/foo.dart': '''
          @constInit
          library foo;

          import 'package:initialize/initialize.dart';
          import 'package:bar/bar.dart';

          @constInit
          class Foo extends Bar {}

          @initMethod
          foo() {}
          ''',
    'bar|lib/bar.dart': '''
          @DynamicInit('bar')
          @DynamicInit('bar2')
          library bar;

          import 'package:initialize/initialize.dart';

          @DynamicInit('Bar')
          @DynamicInit('Bar2')
          class Bar {}

          @DynamicInit('bar()')
          @initMethod
          bar() {}
          ''',
    // Mock out the Initialize package plus some initializers.
    'initialize|lib/initialize.dart': '''
          library initialize;

          abstract class Initializer<T> {}

          class _ConstInit extends Initializer<dynamic> {
            const ConstInit();
          }
          const _ConstInit constInit = const _ConstInit();

          class DynamicInit extends Initializer<dynamic> {
            final String _name;
            const DynamicInit(this._name);
          }

          class _InitMethod implements Initializer<Function> {
            const _InitMethod();
          }
          const _InitMethod initMethod = const _InitMethod();
          '''
  }, {
    'a|web/index.bootstrap.dart': '''
          import 'package:initialize/src/static_loader.dart';
          import 'index.dart' as i0;
          import 'package:bar/bar.dart' as i1;
          import 'package:initialize/initialize.dart' as i2;
          import 'foo.dart' as i3;

          main() {
            initializers.addAll([
              new InitEntry(const i2.DynamicInit('bar'), #bar),
              new InitEntry(const i2.DynamicInit('bar2'), #bar),
              new InitEntry(const i2.DynamicInit('bar()'), i1.bar),
              new InitEntry(i2.initMethod, i1.bar),
              new InitEntry(const i2.DynamicInit('Bar'), i1.Bar),
              new InitEntry(const i2.DynamicInit('Bar2'), i1.Bar),
              new InitEntry(i2.constInit, #foo),
              new InitEntry(i2.initMethod, i3.foo),
              new InitEntry(i2.constInit, i3.Foo),
            ]);

            i0.main();
          }
          '''.replaceAll('          ', '')
  });
}
