// 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.

import "package:expect/expect.dart";

void checkStatic(
  String expected, {
  String arguments = 'a',
  String constructor = 'c',
  String hasOwnProperty = 'h',
  String isPrototypeOf = 'i',
  String propertyIsEnumerable = 'p',
  String toLocaleString = 'L',
  String toString = 'S',
  String valueOf = 'v',
}) {
  Expect.equals(
    expected,
    '$arguments,'
    '$constructor,'
    '$hasOwnProperty,'
    '$isPrototypeOf,'
    '$propertyIsEnumerable,'
    '$toLocaleString,'
    '$toString,'
    '$valueOf',
  );
}

class CheckMethod {
  void method(
    String expected, {
    String arguments = 'a',
    String constructor = 'c',
    String hasOwnProperty = 'h',
    String isPrototypeOf = 'i',
    String propertyIsEnumerable = 'p',
    String toLocaleString = 'L',
    String toString = 'S',
    String valueOf = 'v',
  }) {
    Expect.equals(
      expected,
      '$arguments,'
      '$constructor,'
      '$hasOwnProperty,'
      '$isPrototypeOf,'
      '$propertyIsEnumerable,'
      '$toLocaleString,'
      '$toString,'
      '$valueOf',
    );
  }

  static void check(CheckMethod object) {
    object.method('a,c,h,i,p,L,S,v');
    object.method('X,c,h,i,p,L,S,v', arguments: 'X');
    object.method('a,X,h,i,p,L,S,v', constructor: 'X');
    object.method('a,c,X,i,p,L,S,v', hasOwnProperty: 'X');
    object.method('a,c,h,X,p,L,S,v', isPrototypeOf: 'X');
    object.method('a,c,h,i,X,L,S,v', propertyIsEnumerable: 'X');
    object.method('a,c,h,i,p,X,S,v', toLocaleString: 'X');
    object.method('a,c,h,i,p,L,X,v', toString: 'X');
    object.method('a,c,h,i,p,L,S,X', valueOf: 'X');

    object.method('a,c,h,i,p,L,Y,X', valueOf: 'X', toString: 'Y');
  }
}

class CheckMethod2 extends CheckMethod {
  void method(
    String expected, {
    String? arguments,
    String? constructor,
    String? hasOwnProperty,
    String? isPrototypeOf,
    String? propertyIsEnumerable,
    String? toLocaleString,
    String? toString,
    String? valueOf,
  }) {
    arguments ??= 'a';
    constructor ??= 'c';
    hasOwnProperty ??= 'h';
    isPrototypeOf ??= 'i';
    propertyIsEnumerable ??= 'p';
    toLocaleString ??= 'L';
    toString ??= 'S';
    valueOf ??= 'v';
    Expect.equals(
      expected,
      '$arguments,'
      '$constructor,'
      '$hasOwnProperty,'
      '$isPrototypeOf,'
      '$propertyIsEnumerable,'
      '$toLocaleString,'
      '$toString,'
      '$valueOf',
    );
  }
}

main() {
  checkStatic('a,c,h,i,p,L,S,v');
  checkStatic('X,c,h,i,p,L,S,v', arguments: 'X');
  checkStatic('a,X,h,i,p,L,S,v', constructor: 'X');
  checkStatic('a,c,X,i,p,L,S,v', hasOwnProperty: 'X');
  checkStatic('a,c,h,X,p,L,S,v', isPrototypeOf: 'X');
  checkStatic('a,c,h,i,X,L,S,v', propertyIsEnumerable: 'X');
  checkStatic('a,c,h,i,p,X,S,v', toLocaleString: 'X');
  checkStatic('a,c,h,i,p,L,X,v', toString: 'X');
  checkStatic('a,c,h,i,p,L,S,X', valueOf: 'X');

  checkStatic('a,c,h,i,p,L,Y,X', valueOf: 'X', toString: 'Y');

  CheckMethod.check(CheckMethod());
  CheckMethod.check(CheckMethod2());
  // TODO(https://dartbug.com/56314): Remove following line when fixed.
  // Explanation at:
  // https://dart-review.googlesource.com/c/sdk/+/377360/2/tests/language/argument/strangely_named_arguments_test.dart#117
  CheckMethod2().method('a,c,h,i,p,L,S,v');
}
