Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1460)

Unified Diff: tests/language/tearoff_basic_test.dart

Issue 1234883005: Implement tear-off closure operator # (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Address review comments Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tests/language/tearoff_basic_lib.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tests/language/tearoff_basic_test.dart
diff --git a/tests/language/tearoff_basic_test.dart b/tests/language/tearoff_basic_test.dart
new file mode 100644
index 0000000000000000000000000000000000000000..303d38efc34bd8d06a90c88c20d0a631012c42a5
--- /dev/null
+++ b/tests/language/tearoff_basic_test.dart
@@ -0,0 +1,166 @@
+// Copyright (c) 2015, 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.
+
+// Basic test for tear-off closures.
+
+import "package:expect/expect.dart";
+import "tearoff_basic_lib.dart" as P;
+import "tearoff_basic_lib.dart" deferred as D;
+
+class C {
+ var v = 99;
+ final fv = 444;
+
+ operator + (a) { return v + a; }
+ get sugus => "sugus";
+ set frosch(a) { v = "ribbit $a"; }
+ foo() => "kuh";
+
+ static var st;
+ static final stfin = 1000;
+ static stfoo([p1 = 100]) => p1 * 10;
+ static get stg => "stg";
+ static set sts(x) { st = x; }
+}
+
+
+testStatic() {
+ // Closurize static variable.
+ var a = C#st=;
+ a(100);
+ Expect.equals(100, C.st);
+ var b = C#st;
+ Expect.equals(100, b());
+
+ // Closurize static final variable.
+ a = C#stfin;
+ Expect.equals(1000, a());
+ Expect.throws(() => C#stfin= ); // Final variable has no setter.
+
+ // Closurize static method.
+ a = C#stfoo;
+ Expect.equals(1000, a());
+ Expect.equals(90, a(9));
+
+ // Closurize static getter.
+ a = C#stg;
+ Expect.equals("stg", a());
+
+ // Closurize static setter.
+ Expect.throws(() => C#sts); // No setter/method named sts exists.
+ a = C#sts=;
+ a("pflug");
+ Expect.equals("pflug", C.st);
+
+ // Can't closurize instance method via class literal.
+ Expect.throws(() => C#foo);
+
+ // Extracted closures must be equal.
+ Expect.isTrue(C#st == C#st);
+ Expect.isTrue(C#st= == C#st=);
+ Expect.isTrue(C#stfin == C#stfin);
+ Expect.isTrue(C#stfoo == C#stfoo);
+ Expect.isTrue(C#stg == C#stg);
+ Expect.isTrue(C#sts= == C#sts=);
+}
+
+testInstance() {
+ var o = new C();
+ var p = new C();
+ var a, b;
+
+ // Closurize instance variable.
+ a = o#v;
+ Expect.equals(99, a());
+ b = p#v=;
+ b(999);
+ Expect.equals(999, p.v);
+ Expect.equals(99, a());
+
+ // Closurize final instance variable.
+ Expect.throws(() => o#fv=); // Final variable has not setter.
+ a = o#fv;
+ Expect.equals(444, a());
+
+ // Closurize instance method.
+ a = o#foo;
+ Expect.equals("kuh", a());
+
+ // Closurize operator.
+ a = o#+;
+ Expect.equals(100, o + 1);
+ Expect.equals(100, a(1));
+
+ // Closurize instance getter.
+ a = o#sugus;
+ Expect.equals("sugus", a());
+ Expect.throws(() => o#sugus=);
+
+ // Closurize instance setter.
+ a = o#frosch=;
+ a("!");
+ Expect.equals("ribbit !", o.v);
+ Expect.throws(() => o#frosch);
+
+ // Extracted closures must be equal.
+ Expect.isTrue(o#v == o#v);
+ Expect.isTrue(o#v= == o#v=);
+ Expect.isTrue(o#fv == o#fv);
+ Expect.isTrue(o#foo == o#foo);
+ Expect.isTrue(o#+ == o#+);
+ Expect.isTrue(o#sugus == o#sugus);
+ Expect.isTrue(o#frosch= == o#frosch=);
+}
+
+testPrefix() {
+ // Closurize top-level variable.
+ var a = P#cvar;
+ Expect.equals(6, a());
+ var b = P#cvar=;
+ b(7);
+ Expect.equals(7, a());
+
+ // Closurize final top-level variable.
+ a = P#cfinvar;
+ Expect.equals("set in stone", a());
+ Expect.throws(() => P#cfinvar=);
+
+ // Closurize top-level function.
+ a = P#cfunc;
+ Expect.equals("cfunc", a());
+
+ // Closurize top-level getter.
+ a = P#cget;
+ Expect.equals("cget", a());
+
+ // Closurize top-level getter.
+ a = P#cset=;
+ a(99);
+ Expect.equals(99, P.cvar);
+
+ Expect.throws(() => P#ZZ); // Cannot closurize class.
+
+ // Extracted closures must be equal.
+ Expect.isTrue(P#cvar == P#cvar);
+ Expect.isTrue(P#cvar= == P#cvar=);
+ Expect.isTrue(P#cfinvar == P#cfinvar);
+ Expect.isTrue(P#cfunc == P#cfunc);
+ Expect.isTrue(P#cget == P#cget);
+ Expect.isTrue(P#cset= == P#cset=);
+}
+
+testDeferred() {
+ Expect.throws(() => D#cfunc);
+ D.loadLibrary().then((_) {
+ var a = D#cfunc;
+ Expect.equals("cfunc", a());
+ });
+}
+
+main() {
+ testStatic();
+ testInstance();
+ testPrefix();
+ testDeferred();
+}
« no previous file with comments | « tests/language/tearoff_basic_lib.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698