// 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 list literal <E>[elem_1 ... elem_n] is evaluated as follows:
///
/// 2. For each entry in the map literal:
///    i. If entry is a spread element:
///       a. Evaluate the entry's expression to a value value.
///       b. If entry is null-aware and value is [null], continue to the next
///          entry in the literal.
///       c. Evaluate [value.entries.iterator] to a value iterator.
///       d. Loop:
///          a. If [iterator.moveNext()] returns [false], exit the loop.
///          b. Evaluate [iterator.current] to a value [newEntry].
///          c. Call map[newEntry.key] = newEntry.value.
///    ii. Else, entry has form [e1: e2]:
///       a. Evaluate [e1] to a value key.
///       b. Evaluate [e2] to a value value.
///       c. Call map[key] = value.
/// @description Checks that if element is null-aware and it's [null], nothing
/// added to the result map.
/// @author iarkh@unipro.ru


import "../../Utils/expect.dart";

Map map2 = {};
Map? map3 = null;
Map? map4 = {1: 1, 2: 2, 3: 3, 4: "checkme"};

main() {
  Expect.mapEquals({}, {...?map3});
  Expect.mapEquals({1: 1, 2: 2, 4: 4}, {1: 1, 2: 2, ...?map3, 4: 4});

  Expect.mapEquals({}, <dynamic, dynamic>{...?null});
  Expect.mapEquals({4: 1, 3: 2, 2: 4}, {4: 1, 3: 2, ...?null, 2: 4});

  Expect.mapEquals({100: 14, 1: 1, 2: 2, 3: 3, 4: "checkme", 99: 99},
      {100: 14, ...?map4, ...?map3, 99: 99});

  Expect.mapEquals({}, {...?map3, ...?map3, ...?map3});
  Expect.mapEquals({}, {...map2, ...?map3});
}
