| // 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. |
| |
| /// @assertion A [set] literal [<E>{elem_1 ... elem_n}] is evaluated as follows: |
| /// 2. For each element in the [set] literal: |
| /// i. Evaluate the element's expression to a value value. |
| /// ii. If element is a spread element: |
| /// a. If element is null-aware and value is [null], continue to the |
| /// next element in the literal. |
| /// b. Evaluate [value.iterator] to a [value] iterator. |
| /// c. Loop: |
| /// a. If [iterator.moveNext()] returns [false], exit the loop. |
| /// b. Evaluate set.add(iterator.current). |
| /// iii. Else: |
| /// a. Evaluate [set.add(value)]. |
| /// @description Checks that elements in the spread element are added to the |
| /// result set in correct order. |
| /// @author iarkh@unipro.ru |
| |
| |
| import "dart:collection"; |
| import "../../Utils/expect.dart"; |
| |
| class MyIterable extends IterableBase { |
| late MyIterator iterator; |
| |
| MyIterable(Set set) { iterator = new MyIterator(set); } |
| |
| Iterator getIterator() { return iterator; } |
| } |
| |
| class MyIterator extends Iterator { |
| int i = -1; |
| late List list; |
| |
| MyIterator(Set set) { list = set.toList(); } |
| |
| @override |
| bool moveNext() { return ++i < list.length; } |
| |
| @override |
| dynamic get current { return list[i]; } |
| } |
| |
| List mySets = [{1, 2, 3, 4, 5}, |
| {"a", "14", 1, 2, null, 143, [11]}, |
| {1, 2, {}, [123,4], 14}, |
| {[], [11], 12345}, |
| {1, 2, 3, 4, 5, 6, 7, 8, 9}, |
| ]; |
| |
| main() { |
| mySets.forEach((var set) { |
| MyIterable it = new MyIterable(set); |
| Expect.setEquals(set, {...it}); |
| Expect.isFalse(it.getIterator().moveNext()); |
| }); |
| } |