blob: 325e1c98a4ec04b5af6efc67b9a190582b22c192 [file] [log] [blame]
// 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();
}