| Index: dart/tests/try/web/web_compiler_test_case.dart
|
| diff --git a/dart/tests/try/web/web_compiler_test_case.dart b/dart/tests/try/web/web_compiler_test_case.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..60dd8b9889f76e4930e3504b1541118f8887f9b1
|
| --- /dev/null
|
| +++ b/dart/tests/try/web/web_compiler_test_case.dart
|
| @@ -0,0 +1,135 @@
|
| +// 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.
|
| +
|
| +// Helpers for writing compiler tests running in browser.
|
| +library trydart.web_compiler_test_case;
|
| +
|
| +import 'dart:async' show
|
| + EventSink,
|
| + Future;
|
| +
|
| +import 'dart:html' show
|
| + HttpRequest;
|
| +
|
| +import '../poi/compiler_test_case.dart' show
|
| + customUri,
|
| + CompilerTestCase;
|
| +
|
| +import 'package:dart2js_incremental/dart2js_incremental.dart' show
|
| + IncrementalCompiler;
|
| +
|
| +import 'package:compiler/compiler.dart' show
|
| + Diagnostic;
|
| +
|
| +const String WEB_SCHEME = 'org.trydart.web';
|
| +
|
| +/// A CompilerTestCase which runs in a browser.
|
| +class WebCompilerTestCase extends CompilerTestCase {
|
| + final IncrementalCompiler incrementalCompiler;
|
| +
|
| + WebCompilerTestCase.init(String source, Uri uri)
|
| + : this.incrementalCompiler = makeCompiler(source, uri),
|
| + super.init(source, uri, null);
|
| +
|
| + WebCompilerTestCase(String source, [String path])
|
| + : this.init(source, customUri(path == null ? 'main.dart' : path));
|
| +
|
| + Future run() {
|
| + return incrementalCompiler.compile(scriptUri).then((success) {
|
| + if (!success) throw 'Compilation failed';
|
| + OutputProvider outputProvider = incrementalCompiler.outputProvider;
|
| + return outputProvider['.js'];
|
| + });
|
| + }
|
| +
|
| + static IncrementalCompiler makeCompiler(String source, Uri mainUri) {
|
| + Uri libraryRoot = new Uri(scheme: WEB_SCHEME, path: '/sdk/');
|
| + Uri packageRoot = new Uri(scheme: WEB_SCHEME, path: '/packages/');
|
| + WebInputProvider inputProvider =
|
| + new WebInputProvider(source, mainUri, libraryRoot, packageRoot);
|
| +
|
| + void diagnosticHandler(
|
| + Uri uri, int begin, int end, String message, Diagnostic kind) {
|
| + if (uri == null) {
|
| + print('[$kind] $message');
|
| + } else {
|
| + print('$uri@$begin+${end - begin}: [$kind] $message');
|
| + }
|
| + }
|
| +
|
| + return new IncrementalCompiler(
|
| + libraryRoot: libraryRoot,
|
| + packageRoot: packageRoot,
|
| + inputProvider: inputProvider,
|
| + diagnosticHandler: diagnosticHandler,
|
| + outputProvider: new OutputProvider());
|
| + }
|
| +}
|
| +
|
| +/// An input provider which provides input via [HttpRequest].
|
| +/// Includes one in-memory compilation unit [source] which is returned when
|
| +/// [mainUri] is requested.
|
| +class WebInputProvider {
|
| + final String source;
|
| +
|
| + final Uri mainUri;
|
| +
|
| + final Uri libraryRoot;
|
| +
|
| + final Uri packageRoot;
|
| +
|
| + final Map<Uri, Future> cachedSources = new Map<Uri, Future>();
|
| +
|
| + WebInputProvider(
|
| + this.source, this.mainUri, this.libraryRoot, this.packageRoot);
|
| +
|
| + Future call(Uri uri) {
|
| + return cachedSources.putIfAbsent(uri, () {
|
| + if (uri == mainUri) return new Future.value(source);
|
| + if (uri.scheme == WEB_SCHEME) {
|
| + return HttpRequest.getString('/root_dart${uri.path}');
|
| + } else {
|
| + return HttpRequest.getString('$uri');
|
| + }
|
| + });
|
| + }
|
| +}
|
| +
|
| +/// Output provider which collect output in [output].
|
| +class OutputProvider {
|
| + final Map<String, String> output = new Map<String, String>();
|
| +
|
| + EventSink<String> call(String name, String extension) {
|
| + return new StringEventSink((String data) {
|
| + output['$name.$extension'] = data;
|
| + });
|
| + }
|
| +
|
| + String operator[] (String key) => output[key];
|
| +}
|
| +
|
| +/// Helper class to collect sources.
|
| +class StringEventSink implements EventSink<String> {
|
| + List<String> data = <String>[];
|
| +
|
| + final Function onClose;
|
| +
|
| + StringEventSink(this.onClose);
|
| +
|
| + void add(String event) {
|
| + if (data == null) throw 'StringEventSink is closed.';
|
| + data.add(event);
|
| + }
|
| +
|
| + void addError(errorEvent, [StackTrace stackTrace]) {
|
| + throw 'addError($errorEvent, $stackTrace)';
|
| + }
|
| +
|
| + void close() {
|
| + if (data != null) {
|
| + onClose(data.join());
|
| + data = null;
|
| + }
|
| + }
|
| +}
|
|
|