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