// Copyright (c) 2018, 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";
import 'dart:collection';
import 'dart:convert' show json;

var baseMap = const {"x": 0, "y": 1};

void main() {
  var entry = new MapEntry<int, int>(1, 2);
  Expect.isTrue(entry is MapEntry<int, int>);
  Expect.isTrue(entry is! MapEntry<String, String>);
  Expect.isTrue(entry is! MapEntry<Null, Null>);
  Expect.equals(1, entry.key);
  Expect.equals(2, entry.value);
  Expect.equals("MapEntry(1: 2)", "$entry");
  dynamic dynEntry = entry;
  Expect.throwsNoSuchMethodError(() {
    dynEntry.key = 0;
  }, "key not settable");
  Expect.throwsNoSuchMethodError(() {
    dynEntry.value = 0;
  }, "value not settable");

  checkEntries(baseMap, baseMap);
  checkEntries(baseMap, new Map<String, Object>.unmodifiable(baseMap));
  checkMap({"x": 0, "y": 1});
  checkMap(new Map<String, dynamic>.from(baseMap));
  checkMap(new HashMap<String, dynamic>.from(baseMap));
  checkMap(new LinkedHashMap<String, dynamic>.from(baseMap));
  checkMap(new SplayTreeMap<String, dynamic>.from(baseMap));
  checkMap(json.decode('{"x":0,"y":1}'));
}

void checkMap(Map<String, dynamic> map) {
  checkEntries(baseMap, map);
  map.addEntries([new MapEntry<String, dynamic>("z", 2)]);
  checkEntries({"x": 0, "y": 1, "z": 2}, map);
  map.addEntries(<MapEntry<String, dynamic>>[
    new MapEntry("y", 11),
    new MapEntry("v", 3),
    new MapEntry("w", 4)
  ]);
  checkEntries({"v": 3, "w": 4, "x": 0, "y": 11, "z": 2}, map);

  var valueMap =
      map.map<int, String>((key, value) => new MapEntry(value as int, key));
  checkEntries({0: "x", 2: "z", 3: "v", 4: "w", 11: "y"}, valueMap);
}

void checkEntries(Map expected, Map map) {
  int byKey(MapEntry e1, MapEntry e2) => e1.key.compareTo(e2.key);
  Expect.equals(expected.length, map.entries.length);
  var sorted = map.entries.toList()..sort(byKey);
  Expect.equals(expected.length, sorted.length);
  var expectedEntries = expected.entries.toList();
  for (int i = 0; i < sorted.length; i++) {
    Expect.equals(expectedEntries[i].key, sorted[i].key);
    Expect.equals(expectedEntries[i].value, sorted[i].value);
  }
}
