// TODO(multitest): This was automatically migrated from a multitest and may // contain strange or dead code. // 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"; // Tests that we can call functions through getters. const TOP_LEVEL_CONST = 1; const TOP_LEVEL_CONST_REF = TOP_LEVEL_CONST; const TOP_LEVEL_NULL = null; var topLevel; class CallThroughGetterTest { static void testMain() { testTopLevel(); testField(); testGetter(); testMethod(); testEvaluationOrder(); } static void testTopLevel() { topLevel = () { return 2; }; Expect.equals(1, TOP_LEVEL_CONST); Expect.equals(1, TOP_LEVEL_CONST_REF); Expect.equals(2, topLevel()); } static void testField() { A a = new A(); a.field = () => 42; Expect.equals(42, a.field()); Expect.equals(42, (a.field)()); a.field = () => 87; Expect.equals(87, a.field()); Expect.equals(87, (a.field)()); a.field = 99; Expect.throwsNoSuchMethodError(() => a.field()); Expect.throwsNoSuchMethodError(() => (a.field)()); } static void testGetter() { A a = new A(); a.field = () => 42; Expect.equals(42, a.getter()); Expect.equals(42, (a.getter)()); a.field = () => 87; Expect.equals(87, a.getter()); Expect.equals(87, (a.getter)()); a.field = 99; Expect.throwsNoSuchMethodError(() => a.getter()); Expect.throwsNoSuchMethodError(() => (a.getter)()); } static void testMethod() { A a = new A(); a.field = () => 42; Expect.equals(true, a.method() is Function); Expect.equals(42, a.method()()); a.field = () => 87; Expect.equals(true, a.method() is Function); Expect.equals(87, a.method()()); a.field = null; Expect.equals(null, a.method()); } static void testEvaluationOrder() { B b = new B(); Expect.equals("gf", b.g0()); b = new B(); Expect.equals("gf", (b.g0)()); b = new B(); Expect.equals("xgf", b.g1(b.x)); b = new B(); Expect.equals("gxf", (b.g1)(b.x)); b = new B(); Expect.equals("xygf", b.g2(b.x, b.y)); b = new B(); Expect.equals("gxyf", (b.g2)(b.x, b.y)); b = new B(); Expect.equals("xyzgf", b.g3(b.x, b.y, b.z)); b = new B(); Expect.equals("gxyzf", (b.g3)(b.x, b.y, b.z)); b = new B(); Expect.equals("yzxgf", b.g3(b.y, b.z, b.x)); b = new B(); Expect.equals("gyzxf", (b.g3)(b.y, b.z, b.x)); } } class A { A() {} var field; get getter { return field; } method() { return field; } } class B { B() : _order = new StringBuffer("") {} get g0 { _mark('g'); return () { return _mark('f'); }; } get g1 { _mark('g'); return (x) { return _mark('f'); }; } get g2 { _mark('g'); return (x, y) { return _mark('f'); }; } get g3 { _mark('g'); return (x, y, z) { return _mark('f'); }; } get x { _mark('x'); return 0; } get y { _mark('y'); return 1; } get z { _mark('z'); return 2; } _mark(m) { _order.write(m); return _order.toString(); } StringBuffer _order; } main() { CallThroughGetterTest.testMain(); }