// 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.

// TODO(jakemac): swap this to @TestOn('pub-serve') once
// https://github.com/dart-lang/test/issues/388 is completed.
@TestOn('!js')
library initialize.initializer_custom_filter_test;

import 'dart:async';
import 'package:initialize/initialize.dart';
import 'package:test/test.dart';
import 'package:initialize/src/initialize_tracker.dart';

main() {
  test('filter option limits which types of annotations will be ran', () {
    var originalSize;
    return runPhase(1)
        .then((_) {
          // Even though Baz extends Bar, only Baz should be run.
          expect(InitializeTracker.seen, [Baz]);
        })
        .then((_) => runPhase(2))
        .then((_) {
          expect(InitializeTracker.seen, [Baz, foo]);
        })
        .then((_) => runPhase(3))
        .then((_) {
          expect(InitializeTracker.seen, [Baz, foo, Foo]);
        })
        .then((_) => runPhase(4))
        .then((_) {
          expect(InitializeTracker.seen, [Baz, foo, Foo, Bar]);
        })
        .then((_) {
          originalSize = InitializeTracker.seen.length;
        })
        .then((_) => runPhase(1))
        .then((_) => runPhase(2))
        .then((_) => runPhase(3))
        .then((_) => runPhase(4))
        .then((_) => run())
        .then((_) {
          expect(InitializeTracker.seen.length, originalSize);
        });
  });
}

Future runPhase(int phase) => run(
    customFilter: (Initializer meta) =>
        meta is PhasedInitializer && meta.phase == phase);

@PhasedInitializer(3)
class Foo {}

@PhasedInitializer(2)
foo() {}

@PhasedInitializer(4)
class Bar {}

@PhasedInitializer(1)
class Baz extends Bar {}

// Initializer that has a phase associated with it, this can be used in
// combination with a custom filter to run intialization in phases.
class PhasedInitializer extends InitializeTracker {
  final int phase;

  const PhasedInitializer(this.phase);
}
