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