// 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')
@initializeTracker
library initialize.test.initializer_from_test;

import 'package:initialize/src/initialize_tracker.dart';
import 'package:initialize/initialize.dart';
import 'package:test/test.dart';
import 'package:test_package/bar.dart' as bar;

/// Uses [bar]
main() {
  test('The `from` option', () async {
    final expectedNames = <LibraryIdentifier>[];

    // First just run on the test packages bar.dart file.
    await run(from: Uri.parse('package:test_package/bar.dart'));
    expectedNames.add(
        const LibraryIdentifier(#test_package.bar, 'test_package', 'bar.dart'));
    expect(InitializeTracker.seen, expectedNames);

    // Now we run on the rest (just this file).
    await run();
    expect(InitializeTracker.seen.length, 2);
    // Don't know what the path will be, so have to explicitly check fields
    // and use an [endsWith] matcher for the path.
    expect(
        InitializeTracker.seen[1].name, #initialize.test.initializer_from_test);
    expect(InitializeTracker.seen[1].package, isNull);
    expect(
        InitializeTracker.seen[1].path, endsWith('initializer_from_test.dart'));
  },
      skip: 'Should be skipped only in pub-serve mode, blocked on  '
          'https://github.com/dart-lang/test/issues/388.');
}
