// 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) get call => (s) => s.length;
}

class C2 {
  Function get call => (s) => s.length;
}

extension on A {
  int Function(String s) get call => (s) => s.length;
}

class A {}

extension on A2 {
  Function get call => (s) => s.length;
}

class A2 {}

extension type ExtType(B _) {
  int Function(String s) get call => (s) => s.length;
}

extension type ExtType2(B _) {
  Function get call => (s) => s.length;
}

class B {}

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

  var a = A();
  Expect.equals(5, a.call('Cello'));
  Expect.equals(5, (a.call)('Cello'));

  d = confuse(A());
  Expect.throwsNoSuchMethodError(() => d.call('Fosse'));
  Expect.throwsNoSuchMethodError(() => (d.call)('Fosse'));
  Expect.throwsNoSuchMethodError(() => d('Fosse'));

  var a2 = A2();
  Expect.equals(5, a2.call('Cello'));
  Expect.equals(5, (a2.call)('Cello'));

  d = confuse(A2());
  Expect.throwsNoSuchMethodError(() => d.call('Fosse'));
  Expect.throwsNoSuchMethodError(() => (d.call)('Fosse'));
  Expect.throwsNoSuchMethodError(() => d('Fosse'));

  var e = ExtType(B());
  Expect.equals(5, e.call('Cello'));
  Expect.equals(5, (e.call)('Cello'));

  d = confuse(ExtType(B()));
  Expect.throwsNoSuchMethodError(() => d.call('Fosse'));
  Expect.throwsNoSuchMethodError(() => (d.call)('Fosse'));
  Expect.throwsNoSuchMethodError(() => d('Fosse'));

  var e2 = ExtType2(B());
  Expect.equals(5, e2.call('Cello'));
  Expect.equals(5, (e2.call)('Cello'));

  d = confuse(ExtType2(B()));
  Expect.throwsNoSuchMethodError(() => d.call('Fosse'));
  Expect.throwsNoSuchMethodError(() => (d.call)('Fosse'));
  Expect.throwsNoSuchMethodError(() => d('Fosse'));
}
