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

// 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 Strings.concatAll(fragments);
  }
  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 const NotImplementedException(); }
  psycho([$$$, $$, $])  { throw const NotImplementedException(); }
}

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