// 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.

// @dart = 2.9

/// @assertion If a map literal has a downwards inference type of [Map<K, V>] for
/// some [K] and [V], then the downwards inference context type of a spread
/// element in that map is [Map<K, V>].
/// @description Checks that a spread element inference context type is [K, V] in
/// the map literal
/// @author iarkh@unipro.ru


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

class A1 {}
class B1 extends A1 {}
class C1 extends B1 {}

class A2 {}
class B2 extends A2 {}
class C2 extends B2 {}

Map<K, V> getAMap<K, V>(var a, var b) { return <K, V>{a: b}; }

main() {
  dynamic int_map = getAMap<int, int>(1, 2);
  dynamic str_map = getAMap<int, String>(1, "test");

  dynamic a_map = getAMap<A1, A2>(new A1(), new A2());
  dynamic b_map = getAMap<B1, B2>(new B1(), new B2());
  dynamic c_map = getAMap<C1, C2>(new C1(), new C2());

  Map map1 = <int, int>{2: 4, 7: 16, ...int_map, 4: 40};
  Expect.isTrue(map1 is Map<int, int>);

  Map map2 = <A1, A2>{new A1(): new A2(), ...?a_map};
  Expect.isTrue(map2 is Map<A1, A2>);

  Map map3 = <A1, A2>{new A1(): new A2(), ...b_map};
  Expect.isTrue(map3 is Map<A1, A2>);

  Map map4 = <A1, A2>{new A1(): new A2(), ...c_map, new B1(): new C2()};
  Expect.isTrue(map4 is Map<A1, A2>);

  Map map5 = <A1, A2>{new A1(): new B2(), new B1(): new C2(),
      new C1(): new C2(), ...?c_map, new B1(): new A2(), ...a_map, ...b_map,
      new A1(): new C2()};
  Expect.isTrue(map5 is Map<A1, A2>);

  Map map6 = <B1, B2>{new B1(): new B2(), ...?b_map, new C1(): new C2(),
      ...c_map};
  Expect.isTrue(map6 is Map<B1, B2>);

  Map map7 = {123: 14, "123": "1", new A1(): null, new A2(): new C1(), ...a_map,
      ...?b_map, 148: new C1(), ...?c_map, ...int_map, 1499: null, -7: []};
  Expect.isTrue(map7 is Map<Object, Object>);

  Map map8;
  Expect.throws(() => map8 = <int, int>{...str_map});
  Expect.throws(() => map8 = <int, String>{
      1: "1", 2: "2", ...int_map, 14: "14"});
  Expect.throws(() => map8 = <int, C2>{1 : new C2(), ...c_map});

  Expect.throws(() => map8 = <int, A2>{...int_map});
  Expect.throws(() => map8 = <A1, String>{...?str_map});

  Expect.throws(() => map8 = <B1, B2>{...a_map});
  Expect.throws(() => map8 = <B1, B2>{
      new B1(): new C2(), ...?a_map, new C1(): new C2()});

  Expect.throws(() => map8 = <C1, C2>{...b_map});
  Expect.throws(() => map8 = <C1, C2>{...a_map, ...?b_map});

  Expect.throws(() => map8 = <B1, B2>{...a_map});
  Expect.throws(() =>
      map8 = <B1, B2>{new B1(): new C2(), ...?a_map, new C1(): new C2()});

  Expect.throws(() => map8 = <C1, C2>{...b_map});
  Expect.throws(() => map8 = <C1, C2>{...a_map, ...?b_map});
}
