| Index: dart/tests/utils/recursive_import_test.dart
 | 
| diff --git a/dart/tests/utils/recursive_import_test.dart b/dart/tests/utils/recursive_import_test.dart
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..811287001ac76781f8486cc2f038a6a4cefe0f9f
 | 
| --- /dev/null
 | 
| +++ b/dart/tests/utils/recursive_import_test.dart
 | 
| @@ -0,0 +1,88 @@
 | 
| +// 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.
 | 
| +
 | 
| +// Test of "recursive" imports using the dart2js compiler API.
 | 
| +
 | 
| +#import('../../lib/compiler/compiler.dart');
 | 
| +#import('dart:uri');
 | 
| +
 | 
| +const CORE_LIB = """
 | 
| +library core;
 | 
| +class Object{}
 | 
| +class bool {}
 | 
| +class num {}
 | 
| +class int {}
 | 
| +class double{}
 | 
| +class String{}
 | 
| +class Function{}
 | 
| +class List {}
 | 
| +class Closure {}
 | 
| +class Dynamic_ {}
 | 
| +class Null {}
 | 
| +getRuntimeTypeInfo(o) {}
 | 
| +setRuntimeTypeInfo(o, i) {}
 | 
| +eqNull(a) {}
 | 
| +eqNullB(a) {}
 | 
| +""";
 | 
| +
 | 
| +const String RECURSIVE_MAIN = """
 | 
| +library fisk;
 | 
| +import 'recurse/fisk.dart';
 | 
| +main() {}
 | 
| +""";
 | 
| +
 | 
| +
 | 
| +main() {
 | 
| +  int count = 0;
 | 
| +  Future<String> provider(Uri uri) {
 | 
| +    Completer<String> completer = new Completer<String>();
 | 
| +    String source;
 | 
| +    if (uri.path.length > 100) {
 | 
| +      // Simulate an OS error.
 | 
| +      throw 'Path length exceeded';
 | 
| +    } else if (uri.scheme == "main") {
 | 
| +      count++;
 | 
| +      source = RECURSIVE_MAIN;
 | 
| +    } else if (uri.scheme == "lib") {
 | 
| +      if (uri.path.endsWith("/core.dart")) {
 | 
| +        source = CORE_LIB;
 | 
| +      } else if (uri.path.endsWith('_patch.dart')) {
 | 
| +        source = '';
 | 
| +      } else {
 | 
| +        source = "library lib${uri.path.replaceAll('/', '.')};";
 | 
| +      }
 | 
| +    } else {
 | 
| +     throw "unexpected URI $uri";
 | 
| +    }
 | 
| +    completer.complete(source);
 | 
| +    return completer.future;
 | 
| +  }
 | 
| +
 | 
| +  int warningCount = 0;
 | 
| +  int errorCount = 0;
 | 
| +  void handler(Uri uri, int begin, int end, String message, Diagnostic kind) {
 | 
| +    if (uri != null) {
 | 
| +      // print('$uri:$begin:$end: $kind: $message');
 | 
| +      Expect.equals('main', uri.scheme);
 | 
| +      if (kind == Diagnostic.WARNING) {
 | 
| +        warningCount++;
 | 
| +      } else if (kind == Diagnostic.ERROR) {
 | 
| +        errorCount++;
 | 
| +      } else {
 | 
| +        throw kind;
 | 
| +      }
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| +  String code = compile(new Uri.fromComponents(scheme: 'main'),
 | 
| +                        new Uri.fromComponents(scheme: 'lib'),
 | 
| +                        new Uri.fromComponents(scheme: 'package'),
 | 
| +                        provider, handler).value;
 | 
| +  Expect.isNull(code);
 | 
| +  Expect.isTrue(10 < count);
 | 
| +  // Two warnings for each time RECURSIVE_MAIN is read, except the
 | 
| +  // first time.
 | 
| +  Expect.equals(2 * (count - 1), warningCount);
 | 
| +  Expect.equals(1, errorCount);
 | 
| +}
 | 
| 
 |