// 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. // @dart=2.9 // 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 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}); }