| // Copyright (c) 2011, 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. |
| |
| import "package:expect/expect.dart"; |
| |
| // Bind a method to a variable that can be invoked as a function |
| |
| class A { |
| int a; |
| |
| static var func; |
| |
| A(this.a) {} |
| |
| static foo() { |
| return 4; |
| } |
| |
| bar() { |
| return a; |
| } |
| |
| int baz() { |
| return a; |
| } |
| |
| getThis() { |
| return this.bar; |
| } |
| |
| getNoThis() { |
| return bar; |
| } |
| |
| methodArgs(arg) { |
| return arg + a; |
| } |
| |
| selfReference() { |
| return selfReference; |
| } |
| |
| invokeBaz() { |
| return (baz)(); |
| } |
| |
| invokeBar(var obj) { |
| return (obj.bar)(); |
| } |
| |
| invokeThisBar() { |
| return (this.bar)(); |
| } |
| |
| implicitStaticRef() { |
| return foo; |
| } |
| } |
| |
| class B { |
| static foo() { |
| return -1; |
| } |
| } |
| |
| class C { |
| C() {} |
| var f; |
| } |
| |
| topLevel99() { |
| return 99; |
| } |
| |
| var topFunc; |
| |
| class D extends A { |
| D(a) : super(a) {} |
| getSuper() { |
| return super.bar; |
| } |
| } |
| |
| class MethodBindingTest { |
| static test() { |
| // Create closure from global |
| Expect.equals(99, topLevel99()); |
| Function f99 = topLevel99; |
| Expect.equals(99, f99()); |
| |
| // Invoke closure through a global |
| topFunc = f99; |
| Expect.equals(99, topFunc()); |
| |
| // Create closure from static method |
| Function f4 = A.foo; |
| Expect.equals(4, f4()); |
| |
| // Create closure from instance method |
| var o5 = new A(5); |
| Function f5 = o5.bar; |
| Expect.equals(5, f5()); |
| |
| // Assign closure to field and invoke it |
| var c = new C(); |
| c.f = () => "success"; |
| Expect.equals("success", c.f()); |
| |
| // referencing instance method with explicit 'this' qualiier |
| var o6 = new A(6); |
| var f6 = o6.getThis(); |
| Expect.equals(6, f6()); |
| |
| // referencing an instance method with no qualifier |
| var o7 = new A(7); |
| var f7 = o7.getNoThis(); |
| Expect.equals(7, f7()); |
| |
| // bind a method that takes arguments |
| var o8 = new A(8); |
| Function f8 = o8.methodArgs; |
| Expect.equals(9, f8(1)); |
| |
| // Self referential method |
| var o9 = new A(9); |
| Function f9 = o9.selfReference; |
| |
| // invoking a known method as if it were a bound closure... |
| var o10 = new A(10); |
| Expect.equals(10, o10.invokeBaz()); |
| |
| // invoking a known method as if it were a bound closure... |
| var o11 = new A(11); |
| Expect.equals(10, o11.invokeBar(o10)); |
| |
| // invoking a known method as if it were a bound closure... |
| var o12 = new A(12); |
| Expect.equals(12, o12.invokeThisBar()); |
| |
| // bind to a static variable with no explicit class qualifier |
| var o13 = new A(13); |
| Function f13 = o13.implicitStaticRef(); |
| Expect.equals(4, f13()); |
| |
| var o14 = new D(14); |
| Function f14 = o14.getSuper(); |
| Expect.equals(14, f14()); |
| |
| // Assign static field to a function and invoke it. |
| A.func = A.foo; |
| Expect.equals(4, A.func()); |
| |
| // bind a function that is possibly native in Javascript. |
| String o15 = 'hithere'; |
| var f15 = o15.substring; |
| Expect.equals('i', f15(1, 2)); |
| |
| var o16 = 'hithere'; |
| var f16 = o16.substring; |
| Expect.equals('i', f16(1, 2)); |
| |
| var f17 = 'hithere'.substring; |
| Expect.equals('i', f17(1, 2)); |
| } |
| |
| static testMain() { |
| test(); |
| } |
| } |
| |
| main() { |
| MethodBindingTest.testMain(); |
| } |