| // 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. | 
 | // | 
 | // Test that a getter is evaluated after the arguments, when a getter is | 
 | // for invoking a method. See chapter 'Method Invocation' in specification. | 
 |  | 
 | import "package:expect/expect.dart"; | 
 |  | 
 | var counter = 0; | 
 |  | 
 | class Test1 { | 
 |   get a { | 
 |     Expect.equals(1, counter); | 
 |     counter++; | 
 |     return (c) {}; | 
 |   } | 
 |  | 
 |   b() { | 
 |     Expect.equals(0, counter); | 
 |     counter++; | 
 |     return 1; | 
 |   } | 
 | } | 
 |  | 
 | class Test2 { | 
 |   static get a { | 
 |     Expect.equals(0, counter); | 
 |     counter++; | 
 |     return (c) {}; | 
 |   } | 
 |  | 
 |   static b() { | 
 |     Expect.equals(1, counter); | 
 |     counter++; | 
 |     return 1; | 
 |   } | 
 | } | 
 |  | 
 | get a { | 
 |   Expect.equals(0, counter); | 
 |   counter++; | 
 |   return (c) {}; | 
 | } | 
 |  | 
 | b() { | 
 |   Expect.equals(1, counter); | 
 |   counter++; | 
 |   return 1; | 
 | } | 
 |  | 
 | main() { | 
 |   var failures = []; | 
 |   try { | 
 |     // Check instance getters. | 
 |     counter = 0; | 
 |     var o = new Test1(); | 
 |     o.a(o.b()); | 
 |     Expect.equals(2, counter); | 
 |   } catch (exc, stack) { | 
 |     failures.add(exc); | 
 |     failures.add(stack); | 
 |   } | 
 |   try { | 
 |     // Check static getters. | 
 |     counter = 0; | 
 |     Test2.a(Test2.b()); | 
 |     Expect.equals(2, counter); | 
 |   } catch (exc, stack) { | 
 |     failures.add(exc); | 
 |     failures.add(stack); | 
 |   } | 
 |   try { | 
 |     // Check top-level getters. | 
 |     counter = 0; | 
 |     a(b()); | 
 |     Expect.equals(2, counter); | 
 |   } catch (exc, stack) { | 
 |     failures.add(exc); | 
 |     failures.add(stack); | 
 |   } | 
 |   // If any of the tests failed print out the details and fail the test. | 
 |   if (failures.length != 0) { | 
 |     for (var msg in failures) { | 
 |       print(msg.toString()); | 
 |     } | 
 |     throw "${failures.length ~/ 2} tests failed."; | 
 |   } | 
 | } |