| // Copyright (c) 2019, 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'; |
| |
| // Typed as dynamic to also test spreading a value of type dynamic. |
| const dynamic list = [1, 2, 3, 4]; |
| const dynamic map = {1: 1, 2: 2, 3: 3, 4: 4}; |
| const dynamic set = {1, 2, 3, 4}; |
| |
| void main() { |
| testList(); |
| testMap(); |
| testSet(); |
| testKeyOrder(); |
| } |
| |
| void testList() { |
| // Only spread. |
| Expect.identical(list, const <int>[...list]); |
| Expect.identical(list, const <int>[...set]); |
| |
| // Spread at beginning. |
| Expect.identical(list, const <int>[...<int>[1, 2], 3, 4]); |
| |
| // Spread in middle. |
| Expect.identical(list, const <int>[1, ...<int>[2, 3], 4]); |
| |
| // Spread at end. |
| Expect.identical(list, const <int>[1, 2, ...<int>[3, 4]]); |
| |
| // Empty spreads. |
| Expect.identical(list, |
| const <int>[...<int>[], 1, 2, ...<int>[], 3, 4, ...<int>[]]); |
| |
| // Multiple spreads. |
| Expect.identical(list, |
| const <int>[...<int>[1], 2, ...<int>[3, 4]]); |
| |
| // Nested spreads. |
| Expect.identical(list, |
| const <int>[...<int>[...<int>[1, 2], ...<int>[3, 4]]]); |
| |
| // Null-aware. |
| const list23 = <int>[2, 3] as List<int>?; |
| const list4 = <int>[4] as List<int>?; |
| Expect.identical(list, |
| const <int>[1, ...?list23, ...?(null), ...?list4]); |
| |
| // Does not deep flatten. |
| Expect.identical( |
| const <Object>[1, 2, <int>[3], 4], |
| const <Object>[1, ...<Object>[2, <int>[3], 4]]); |
| |
| // Establishes const context. |
| Expect.identical(const <Symbol>[Symbol("sym")], |
| const <Symbol>[...<Symbol>[Symbol("sym")]]); |
| } |
| |
| void testMap() { |
| // Only spread. |
| Expect.identical(map, const <int, int>{...map}); |
| |
| // Spread at beginning. |
| Expect.identical(map, |
| const <int, int>{...<int, int>{1: 1, 2: 2}, 3: 3, 4: 4}); |
| |
| // Spread in middle. |
| Expect.identical(map, |
| const <int, int>{1: 1, ...<int, int>{2: 2, 3: 3}, 4: 4}); |
| |
| // Spread at end. |
| Expect.identical(map, |
| const <int, int>{1: 1, 2: 2, ...<int, int>{3: 3, 4: 4}}); |
| |
| // Empty spreads. |
| Expect.identical(map, const <int, int>{ |
| ...<int, int>{}, |
| 1: 1, |
| 2: 2, |
| ...<int, int>{}, |
| 3: 3, |
| 4: 4, |
| ...<int, int>{} |
| }); |
| |
| // Multiple spreads. |
| Expect.identical(map, |
| const <int, int>{...<int, int>{1: 1}, 2: 2, ...<int, int>{3: 3, 4: 4}}); |
| |
| // Nested spreads. |
| Expect.identical(map, const <int, int>{ |
| ...<int, int>{ |
| ...<int, int>{1: 1, 2: 2}, |
| ...<int, int>{3: 3, 4: 4} |
| } |
| }); |
| |
| // Null-aware. |
| const map23 = <int, int>{2: 2, 3: 3} as Map<int, int>?; |
| const map4 = <int, int>{4: 4} as Map<int, int>?; |
| Expect.identical(map, const <int, int>{ |
| 1: 1, |
| ...?map23, |
| ...?(null), |
| ...?map4 |
| }); |
| |
| // Does not deep flatten. |
| Expect.identical(const <int, Object>{ |
| 1: 1, |
| 2: 2, |
| 3: <int, int>{3: 3}, |
| 4: 4 |
| }, const <int, Object>{ |
| 1: 1, |
| ...<int, Object>{ |
| 2: 2, |
| 3: <int, int>{3: 3}, |
| 4: 4 |
| } |
| }); |
| |
| // Establishes const context. |
| Expect.identical(const <Symbol, Symbol>{ |
| Symbol("sym"): Symbol("bol") |
| }, const <Symbol, Symbol>{ |
| ...<Symbol, Symbol>{Symbol("sym"): Symbol("bol")} |
| }); |
| } |
| |
| void testSet() { |
| // Only spread. |
| Expect.identical(set, const <int>{...set}); |
| Expect.identical(set, const <int>{...list}); |
| |
| // Spread at beginning. |
| Expect.identical(set, const <int>{...<int>[1, 2], 3, 4}); |
| |
| // Spread in middle. |
| Expect.identical(set, const <int>{1, ...<int>[2, 3], 4}); |
| |
| // Spread at end. |
| Expect.identical(set, const <int>{1, 2, ...<int>[3, 4]}); |
| |
| // Empty spreads. |
| Expect.identical(set, |
| const <int>{...<int>[], 1, 2, ...<int>[], 3, 4, ...<int>[]}); |
| |
| // Multiple spreads. |
| Expect.identical(set, const <int>{...<int>[1], 2, ...<int>[3, 4]}); |
| |
| // Nested spreads. |
| Expect.identical(set, const <int>{...<int>{...<int>[1, 2], ...<int>[3, 4]}}); |
| |
| // Null-aware. |
| const list23 = <int>[2, 3] as List<int>?; |
| const list4 = <int>[4] as List<int>?; |
| Expect.identical(set, |
| const <int>{1, ...?list23, ...?(null), ...?list4}); |
| |
| // Does not deep flatten. |
| Expect.identical(const <Object>{1, 2, <int>{3}, 4}, |
| const <Object>{1, ...<Object>{2, <int>{3}, 4}}); |
| |
| // Establishes const context. |
| Expect.identical(const <Symbol>{Symbol("sym")}, |
| const <Symbol>{...<Symbol>{Symbol("sym")}}); |
| } |
| |
| void testKeyOrder() { |
| // Canonicalization isn't affected by which elements are spread. |
| Expect.identical(map, |
| const <int, int>{1: 1, ...<int, int>{2: 2, 3: 3}, 4: 4}); |
| Expect.identical(map, |
| const <int, int>{1: 1, ...<int, int>{2: 2}, 3: 3, ...<int, int>{4: 4}}); |
| |
| Expect.identical(set, const <int>{1, ...<int>{2, 3}, 4}); |
| Expect.identical(set, const <int>{1, ...<int>{2}, 3, ...<int>{4}}); |
| |
| // Ordering does affect canonicalization. |
| Expect.notIdentical(const <int, int>{1: 1, 2: 2, 3: 3}, |
| const <int, int>{1: 1, ...<int, int>{3: 3, 2: 2}}); |
| Expect.notIdentical(const <int>{1, 2, 3}, const <int>{1, ...<int>{3, 2}}); |
| } |