|  | // Copyright (c) 2024, 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. | 
|  |  | 
|  | /// WARNING | 
|  | /// | 
|  | /// Not all of the expectations in this test match the language specification. | 
|  | /// | 
|  | /// This is part of a set of tests covering "callable objects". Please consider | 
|  | /// them all together when making changes: | 
|  | /// | 
|  | /// ``` | 
|  | /// tests/web/call_field_test.dart | 
|  | /// tests/web/call_getter_test.dart | 
|  | /// tests/web/call_method_test.dart | 
|  | /// ``` | 
|  | /// | 
|  | /// This test was created with expectations that match the current behavior to | 
|  | /// make it more clear when something changes and when the results in the web | 
|  | /// compilers differ. | 
|  | /// | 
|  | /// If your change causes an expectation to fail you should decide if the | 
|  | /// new result is desirable and update the expectation accordingly. | 
|  |  | 
|  | import 'package:expect/expect.dart'; | 
|  |  | 
|  | const dart2js = const bool.fromEnvironment('dart.library._dart2js_only'); | 
|  | const ddc = const bool.fromEnvironment('dart.library._ddc_only'); | 
|  |  | 
|  | @pragma('dart2js:noInline') | 
|  | @pragma('dart2js:assumeDynamic') | 
|  | dynamic confuse(dynamic x) => x; | 
|  |  | 
|  | class C { | 
|  | int Function(String s) call = (s) => s.length; | 
|  | } | 
|  |  | 
|  | class C2 { | 
|  | Function call = (s) => s.length; | 
|  | } | 
|  |  | 
|  | final expectJSCompilersOnlyMessage = | 
|  | 'Test only expects to run on dart2js and ddc configurations.'; | 
|  |  | 
|  | void main() { | 
|  | var c = C(); | 
|  | Expect.equals(5, c.call('Cello')); | 
|  | Expect.equals(5, (c.call)('Cello')); | 
|  |  | 
|  | var d = confuse(C()); | 
|  | if (dart2js) { | 
|  | Expect.equals(5, d.call('Fosse')); | 
|  | } else if (ddc) { | 
|  | Expect.throwsNoSuchMethodError(() => d.call('Fosse')); | 
|  | } else { | 
|  | Expect.fail(expectJSCompilersOnlyMessage); | 
|  | } | 
|  | Expect.equals(5, (d.call)('Fosse')); | 
|  | if (dart2js) { | 
|  | Expect.equals(5, d('Fosse')); | 
|  | } else if (ddc) { | 
|  | Expect.throwsNoSuchMethodError(() => d('Fosse')); | 
|  | } else { | 
|  | Expect.fail(expectJSCompilersOnlyMessage); | 
|  | } | 
|  |  | 
|  | var c2 = C2(); | 
|  | if (dart2js) { | 
|  | Expect.equals(5, c2.call('Cello')); | 
|  | } else { | 
|  | Expect.throwsNoSuchMethodError(() => c2.call('Cello')); | 
|  | } | 
|  | Expect.equals(5, (c2.call)('Cello')); | 
|  |  | 
|  | d = confuse(C2()); | 
|  | if (dart2js) { | 
|  | Expect.equals(5, d.call('Fosse')); | 
|  | } else if (ddc) { | 
|  | Expect.throwsNoSuchMethodError(() => d.call('Fosse')); | 
|  | } else { | 
|  | Expect.fail(expectJSCompilersOnlyMessage); | 
|  | } | 
|  | Expect.equals(5, (d.call)('Fosse')); | 
|  | if (dart2js) { | 
|  | Expect.equals(5, d('Fosse')); | 
|  | } else if (ddc) { | 
|  | Expect.throwsNoSuchMethodError(() => d('Fosse')); | 
|  | } else { | 
|  | Expect.fail(expectJSCompilersOnlyMessage); | 
|  | } | 
|  | } |