Index: tests/language/vm/regress_27201_test.dart |
diff --git a/tests/language/vm/regress_27201_test.dart b/tests/language/vm/regress_27201_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b36310f82ccafd2cdfc65b5164e2b5e28bc7dcb5 |
--- /dev/null |
+++ b/tests/language/vm/regress_27201_test.dart |
@@ -0,0 +1,113 @@ |
+/* |
+ * Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
zra
2016/11/29 21:24:35
2016
bkonyi
2016/11/29 21:43:17
Done.
|
+ * 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. |
+ */ |
+/** |
zra
2016/11/29 21:24:35
We probably don't need to copy this comment from t
bkonyi
2016/11/29 21:43:17
Done.
|
+ * @assertion The current library is the library currently being compiled. The |
+ * import modifies the import namespace of the current library in a manner that |
+ * is determined by the imported library and by the optional elements of the |
+ * import. |
+ * . . . |
+ * Let I be an import directive that refers to a URI via the string s1. |
+ * Evaluation of I proceeds as follows: |
+ * |
+ * If I is a deferred import, no evaluation takes place. Instead, a mapping of |
+ * the name of the prefix, p to a deferred prefix object is added to the scope |
+ * of the current library L. The deferred prefix object has the following |
+ * methods: |
+ * • loadLibrary. This method returns a future f. When called, the method |
+ * causes an immediate import I to be executed at some future time, where |
+ * I is is derived from I by eliding the word deferred and adding a hide |
+ * loadLibrary combinator clause. When I executes without error, f completes |
+ * successfully. If I executes without error, we say that the call to |
+ * loadLibrary has succeeded, otherwise we say the call has failed. |
+ * • For every top level function f named id in the imported library B, a |
+ * corresponding method named id with the same signature as f. Calling |
+ * the method results in a runtime error. |
+ * • For every top level getter g named id in B, a corresponding getter named |
+ * id with the same signature as g. Calling the method results in a runtime |
+ * error. |
+ * • For every top level setter s named id in B, a corresponding setter named |
+ * id with the same signature as s. Calling the method results in a runtime |
+ * error. |
+ * • For every type T named id in B, a corresponding getter named id with |
+ * return type Type. Calling the method results in a runtime error. |
+ * . . . |
+ * After a call succeeds, the name p is mapped to a non-deferred prefix object |
+ * as described below. In addition, the prefix object also supports the |
+ * loadLibrary method, and so it is possible to call loadLibrary again. If |
+ * a call fails, nothing happens, and one again has the option to call |
+ * loadLibrary again. Whether a repeated call to loadLibrary succeeds will |
+ * vary as described below. |
+ * The effect of a repeated call to p.loadLibrary is as follows: |
+ * • If another call to p.loadLibrary has already succeeded, the repeated call |
+ * also succeeds. Otherwise, |
+ * • If another call to to p.loadLibrary has failed: |
+ * – If the failure is due to a compilation error, the repeated call fails |
+ * for the same reason. |
+ * – If the failure is due to other causes, the repeated call behaves as if |
+ * no previous call had been made. |
+ * In other words, one can retry a deferred load after a network failure or |
+ * because a file is absent, but once one finds some content and loads it, one |
+ * can no longer reload. |
+ * |
+ * @description Checks that if a library is load successfully, prefix is |
+ * mapped to a non-deferred prefix object, and top-level declarations from |
+ * the imported library became accessed in the current library with specified |
+ * prefix. If a call loadLibrary fails nothing happens, and one again has the |
+ * option to call loadLibrary again. Also checks to see that an attempt to |
+ * load a library from a bad path throws a sane exception. |
+ * @author ngl@unipro.ru |
+ */ |
+import "dart:async"; |
+import "../../co19/src/Utils/expect.dart"; |
zra
2016/11/29 21:24:35
Let's not have a dependence on co19 here. Use:
im
bkonyi
2016/11/29 21:43:17
Done.
|
+import "regress_27201_lib.dart" deferred as p; |
+import "regress_27201_bad_lib_path.dart" deferred as q; |
+ |
+test_loaded() { |
+ try { |
+ p.someFunc(); |
+ } catch (e) { |
+ Expect.fail("Should not be here"); |
+ } |
+ try { |
+ p.someGetter; |
+ } catch (e) { |
+ Expect.fail("Should not be here"); |
+ } |
+ try { |
+ p.someSetter = 1; |
+ } catch (e) { |
+ Expect.fail("Should not be here"); |
+ } |
+ try { |
+ p.Func; |
+ } catch (e) { |
+ Expect.fail("Should not be here"); |
+ } |
+ try { |
+ Expect.isTrue(p.loadLibrary() is Future); |
+ } catch (e) { |
+ Expect.fail("Should not be here"); |
+ } |
+} |
+ |
+ |
+main() async { |
zra
2016/11/29 21:24:35
There is no await, so async is not needed.
bkonyi
2016/11/29 21:43:17
Done.
|
+ p.loadLibrary().then((v) { |
+ test_loaded(); |
+ }, |
+ onError: (e) { |
+ Expect.fail("Should have loaded library!"); |
+ }); |
+ |
+ // Ensure bad library import is handled correctly |
zra
2016/11/29 21:24:35
Please end comments with a '.'
bkonyi
2016/11/29 21:43:17
Done.
|
+ q.loadLibrary().then((v) { |
+ Expect.fail("Should have failed"); |
+ }, |
+ onError: (e) { |
+ Expect.throws(() => q.x); |
+ }); |
+} |
+ |