// Copyright (c) 2014, 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.

// Helper class for writing compiler tests.
library trydart.compiler_test_case;

import 'dart:async' show
    Future;

export 'dart:async' show
    Future;

import 'package:async_helper/async_helper.dart' show
    asyncTest;

import '../../compiler/dart2js/mock_compiler.dart' show
    MockCompiler,
    compilerFor;

export 'package:expect/expect.dart' show
    Expect;

import 'package:compiler/src/elements/elements.dart' show
    LibraryElement;

export 'package:compiler/src/elements/elements.dart' show
    LibraryElement;

const String CONSTANT_CLASS = 'class Constant { const Constant(); }';

const String SCHEME = 'org.trydart.compiler-test-case';

Uri customUri(String path) => Uri.parse('$SCHEME:/$path');

Future runTests(List<CompilerTestCase> tests) {
  asyncTest(() => Future.forEach(tests, runTest));
}

Future runTest(CompilerTestCase test) {
  print('\n{{{\n$test\n\n=== Test Output:\n');
  return test.run().then((_) {
  print('}}}');
  });
}

abstract class CompilerTestCase {
  final String source;

  final Uri scriptUri;

  final MockCompiler compiler;

  CompilerTestCase.init(this.source, this.scriptUri, this.compiler);

  CompilerTestCase.intermediate(String source, Uri scriptUri)
      : this.init(source, scriptUri, compilerFor(source, scriptUri));

  CompilerTestCase(String source, [String path])
      : this.intermediate(source, customUri(path == null ? 'main.dart' : path));

  Future<LibraryElement> loadMainApp() {
    return compiler.libraryLoader.loadLibrary(scriptUri)
        .then((LibraryElement library) {
          if (compiler.mainApp == null) {
            compiler.mainApp = library;
          } else if (compiler.mainApp != library) {
            throw
                "Inconsistent use of compiler"
                " (${compiler.mainApp} != $library).";
          }
          return library;
        });
  }

  Future run();

  /// Returns a future for the mainApp after running the compiler.
  Future<LibraryElement> compile() {
    return loadMainApp().then((LibraryElement library) {
      return compiler.runCompiler(scriptUri).then((_) => library);
    });
  }

  String toString() => source;
}
