| // Copyright (c) 2021, 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 that the List of positional arguments to [Function.apply] is not | |
| // modified. | |
| import "package:expect/expect.dart"; | |
| class A { | |
| foo([ | |
| a = 10, | |
| b = 20, | |
| c = 30, | |
| d = 40, | |
| e = 50, | |
| f = 60, | |
| g = 70, | |
| h = 80, | |
| i = 90, | |
| ]) => '$a $b $c $d $e $f $g $h $i'; | |
| } | |
| String static1(a, b, {c = 30, d = 40}) => '$a $b $c $d'; | |
| void test( | |
| String expected, | |
| Function function, | |
| List positional, [ | |
| Map<Symbol, dynamic>? named = null, | |
| ]) { | |
| final original = List.of(positional); | |
| Expect.equals(expected, Function.apply(function, positional, named)); | |
| Expect.listEquals(original, positional); | |
| // Test again so there are multiple call sites for `Function.apply`. | |
| Expect.equals(expected, Function.apply(function, positional, named)); | |
| Expect.listEquals(original, positional); | |
| } | |
| main() { | |
| var a = A(); | |
| test('10 20 30 40 50 60 70 80 90', a.foo, []); | |
| test('11 20 30 40 50 60 70 80 90', a.foo, [11]); | |
| test('11 22 30 40 50 60 70 80 90', a.foo, [11, 22]); | |
| test('11 22 33 40 50 60 70 80 90', a.foo, [11, 22, 33]); | |
| test('11 22 33 44 50 60 70 80 90', a.foo, [11, 22, 33, 44]); | |
| test('11 22 33 44 55 60 70 80 90', a.foo, [11, 22, 33, 44, 55]); | |
| test('11 22 33 44 55 66 70 80 90', a.foo, [11, 22, 33, 44, 55, 66]); | |
| test('11 22 33 44 55 66 77 80 90', a.foo, [11, 22, 33, 44, 55, 66, 77]); | |
| test('11 22 33 44 55 66 77 88 90', a.foo, [11, 22, 33, 44, 55, 66, 77, 88]); | |
| test('11 22 33 44 55 66 77 88 99', a.foo, [ | |
| 11, 22, 33, 44, 55, 66, 77, 88, 99, // | |
| ]); | |
| // Some unmodifiable Lists. An attempt to modify the argument would fail. | |
| test('11 22 33 44 55 66 77 80 90', a.foo, const [11, 22, 33, 44, 55, 66, 77]); | |
| test('65 66 67 68 69 70 71 80 90', a.foo, 'ABCDEFG'.codeUnits); | |
| test('11 22 30 40', static1, [11, 22]); | |
| test('11 22 30 40', static1, [11, 22], {}); | |
| test('11 22 33 40', static1, [11, 22], {#c: 33}); | |
| test('11 22 30 44', static1, [11, 22], {#d: 44}); | |
| test('11 22 66 55', static1, [11, 22], {#d: 55, #c: 66}); | |
| test('11 22 88 77', static1, const [11, 22], {#d: 77, #c: 88}); | |
| test('65 66 11 22', static1, 'AB'.codeUnits, {#d: 22, #c: 11}); | |
| } |