| 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();
|
| +}
|
|
|