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

// @dart = 2.9

import "package:expect/expect.dart";

// Test to stress Frog's named parameter scheme.

main() {
  testDollar();
  testPsycho();
}

class TestClass {
  method({a, b, a$b, a$$b}) => [a, b, a$b, a$$b];

  psycho({$, $$, $$$, $$$$}) => [$, $$, $$$, $$$$];
}

globalMethod({a, b, a$b, a$$b}) => [a, b, a$b, a$$b];

format(thing) {
  if (thing == null) return '-';
  if (thing is List) {
    var fragments = ['['];
    var sep;
    for (final item in thing) {
      if (sep != null) fragments.add(sep);
      sep = ', ';
      fragments.add(format(item));
    }
    fragments.add(']');
    return fragments.join();
  }
  return thing.toString();
}

// Hopefully inscrutable to static analysis.
makeTestClass(n) => [new TestClass(), new Decoy(), 'string'][n % 3];

class Decoy {
  method([a$b, b, a]) {
    throw new UnimplementedError();
  }

  psycho([$$$, $$, $]) {
    throw new UnimplementedError();
  }
}

testDollar() {
  Expect.equals('[]', format([]));

  Expect.equals('[-, -, -, -]', format(globalMethod()));
  Expect.equals('[1, 2, -, -]', format(globalMethod(a: 1, b: 2)));
  Expect.equals('[1, 2, -, -]', format(globalMethod(b: 2, a: 1)));
  Expect.equals('[-, -, 3, -]', format(globalMethod(a$b: 3)));
  Expect.equals('[-, -, -, 4]', format(globalMethod(a$$b: 4)));

  TestClass t = new TestClass(); // Statically typed.

  Expect.equals('[-, -, -, -]', format(t.method()));
  Expect.equals('[1, 2, -, -]', format(t.method(a: 1, b: 2)));
  Expect.equals('[1, 2, -, -]', format(t.method(b: 2, a: 1)));
  Expect.equals('[-, -, 3, -]', format(t.method(a$b: 3)));
  Expect.equals('[-, -, -, 4]', format(t.method(a$$b: 4)));

  var obj = makeTestClass(0);

  Expect.equals('[-, -, -, -]', format(obj.method()));
  Expect.equals('[1, 2, -, -]', format(obj.method(a: 1, b: 2)));
  Expect.equals('[1, 2, -, -]', format(obj.method(b: 2, a: 1)));
  Expect.equals('[-, -, 3, -]', format(obj.method(a$b: 3)));
  Expect.equals('[-, -, -, 4]', format(obj.method(a$$b: 4)));
}

testPsycho() {
  TestClass t = new TestClass(); // Statically typed.

  Expect.equals('[1, 2, 3, -]', format(t.psycho($: 1, $$: 2, $$$: 3)));
  Expect.equals('[1, 2, 3, -]', format(t.psycho($$$: 3, $$: 2, $: 1)));
  Expect.equals('[1, 2, -, -]', format(t.psycho($: 1, $$: 2)));
  Expect.equals('[-, -, -, 4]', format(t.psycho($$$$: 4)));

  var obj = makeTestClass(0);

  Expect.equals('[1, 2, -, -]', format(obj.psycho($: 1, $$: 2)));
  Expect.equals('[-, -, -, 4]', format(obj.psycho($$$$: 4)));
  Expect.equals('[1, 2, 3, -]', format(obj.psycho($: 1, $$: 2, $$$: 3)));
  Expect.equals('[1, 2, 3, -]', format(obj.psycho($$$: 3, $$: 2, $: 1)));
}
