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