// Copyright (c) 2012, 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.

import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import 'dart:async';
import 'memory_compiler.dart';
import 'package:compiler/implementation/mirrors/source_mirrors.dart';

const SOURCE_FILES = const {
'main.dart': '''
import 'a.dart' show A1, A2;
import 'b.dart' as b hide B1;
export 'a.dart' show A2 hide A3, A1;
export 'b.dart' hide B1, B2 show B3;
import 'dart:core' as core;

main() {}
''',
'a.dart': '''
class A1 {}
class A2 {}
class A3 {}
''',
'b.dart': '''
class B1 {}
class B2 {}
class B3 {}
'''
};

void main() {
  asyncTest(() => mirrorSystemFor(SOURCE_FILES).then((MirrorSystem mirrors) {
    LibrarySourceMirror mainLibrary =
        mirrors.libraries[Uri.parse('memory:main.dart')];
    Expect.isNotNull(mainLibrary);

    LibrarySourceMirror aLibrary =
        mirrors.libraries[Uri.parse('memory:a.dart')];
    Expect.isNotNull(aLibrary);

    LibrarySourceMirror bLibrary =
        mirrors.libraries[Uri.parse('memory:b.dart')];
    Expect.isNotNull(bLibrary);

    LibrarySourceMirror coreLibrary =
        mirrors.libraries[Uri.parse('dart:core')];
    Expect.isNotNull(coreLibrary);

    var dependencies = mainLibrary.libraryDependencies;
    Expect.isNotNull(dependencies);
    Expect.equals(5, dependencies.length);

    // import 'a.dart' show A1, A2;
    var dependency = dependencies[0];
    Expect.isNotNull(dependency);
    Expect.isTrue(dependency.isImport);
    Expect.isFalse(dependency.isExport);
    Expect.equals(mainLibrary, dependency.sourceLibrary);
    Expect.equals(aLibrary, dependency.targetLibrary);
    Expect.isNull(dependency.prefix);

    var combinators = dependency.combinators;
    Expect.isNotNull(combinators);
    Expect.equals(1, combinators.length);

    var combinator = combinators[0];
    Expect.isNotNull(combinator);
    Expect.isTrue(combinator.isShow);
    Expect.isFalse(combinator.isHide);
    Expect.listEquals(['A1', 'A2'], combinator.identifiers);

    // import 'b.dart' as b hide B1;
    dependency = dependencies[1];
    Expect.isNotNull(dependency);
    Expect.isTrue(dependency.isImport);
    Expect.isFalse(dependency.isExport);
    Expect.equals(mainLibrary, dependency.sourceLibrary);
    Expect.equals(bLibrary, dependency.targetLibrary);
    Expect.equals('b', dependency.prefix);

    combinators = dependency.combinators;
    Expect.isNotNull(combinators);
    Expect.equals(1, combinators.length);

    combinator = combinators[0];
    Expect.isNotNull(combinator);
    Expect.isFalse(combinator.isShow);
    Expect.isTrue(combinator.isHide);
    Expect.listEquals(['B1'], combinator.identifiers);

    // export 'a.dart' show A2 hide A3, A1;
    dependency = dependencies[2];
    Expect.isNotNull(dependency);
    Expect.isFalse(dependency.isImport);
    Expect.isTrue(dependency.isExport);
    Expect.equals(mainLibrary, dependency.sourceLibrary);
    Expect.equals(aLibrary, dependency.targetLibrary);
    Expect.isNull(dependency.prefix);

    combinators = dependency.combinators;
    Expect.isNotNull(combinators);
    Expect.equals(2, combinators.length);

    combinator = combinators[0];
    Expect.isNotNull(combinator);
    Expect.isTrue(combinator.isShow);
    Expect.isFalse(combinator.isHide);
    Expect.listEquals(['A2'], combinator.identifiers);

    combinator = combinators[1];
    Expect.isNotNull(combinator);
    Expect.isFalse(combinator.isShow);
    Expect.isTrue(combinator.isHide);
    Expect.listEquals(['A3', 'A1'], combinator.identifiers);

    // export 'b.dart' hide B1, B2 show B3;
    dependency = dependencies[3];
    Expect.isNotNull(dependency);
    Expect.isFalse(dependency.isImport);
    Expect.isTrue(dependency.isExport);
    Expect.equals(mainLibrary, dependency.sourceLibrary);
    Expect.equals(bLibrary, dependency.targetLibrary);
    Expect.isNull(dependency.prefix);

    combinators = dependency.combinators;
    Expect.isNotNull(combinators);
    Expect.equals(2, combinators.length);

    combinator = combinators[0];
    Expect.isNotNull(combinator);
    Expect.isFalse(combinator.isShow);
    Expect.isTrue(combinator.isHide);
    Expect.listEquals(['B1', 'B2'], combinator.identifiers);

    combinator = combinators[1];
    Expect.isNotNull(combinator);
    Expect.isTrue(combinator.isShow);
    Expect.isFalse(combinator.isHide);
    Expect.listEquals(['B3'], combinator.identifiers);

    // import 'dart:core' as core;
    dependency = dependencies[4];
    Expect.isNotNull(dependency);
    Expect.isTrue(dependency.isImport);
    Expect.isFalse(dependency.isExport);
    Expect.equals(mainLibrary, dependency.sourceLibrary);
    Expect.equals(coreLibrary, dependency.targetLibrary);
    Expect.equals('core', dependency.prefix);

    combinators = dependency.combinators;
    Expect.isNotNull(combinators);
    Expect.equals(0, combinators.length);
  }));
}