// 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:test/test.dart';

import 'package:path/path.dart';

void main() {
  group("considers equal", () {
    test("two identical paths", () {
      var map = PathMap<int>();
      map[join("foo", "bar")] = 1;
      map[join("foo", "bar")] = 2;
      expect(map, hasLength(1));
      expect(map, containsPair(join("foo", "bar"), 2));
    });

    test("two logically equivalent paths", () {
      var map = PathMap<int>();
      map["foo"] = 1;
      map[absolute("foo")] = 2;
      expect(map, hasLength(1));
      expect(map, containsPair("foo", 2));
      expect(map, containsPair(absolute("foo"), 2));
    });

    test("two nulls", () {
      var map = PathMap<int>();
      map[null] = 1;
      map[null] = 2;
      expect(map, hasLength(1));
      expect(map, containsPair(null, 2));
    });
  });

  group("considers unequal", () {
    test("two distinct paths", () {
      var map = PathMap<int>();
      map["foo"] = 1;
      map["bar"] = 2;
      expect(map, hasLength(2));
      expect(map, containsPair("foo", 1));
      expect(map, containsPair("bar", 2));
    });

    test("a path and null", () {
      var map = PathMap<int>();
      map["foo"] = 1;
      map[null] = 2;
      expect(map, hasLength(2));
      expect(map, containsPair("foo", 1));
      expect(map, containsPair(null, 2));
    });
  });

  test("uses the custom context", () {
    var map = PathMap<int>(context: windows);
    map["FOO"] = 1;
    map["foo"] = 2;
    expect(map, hasLength(1));
    expect(map, containsPair("fOo", 2));
  });

  group(".of()", () {
    test("copies the existing map's keys", () {
      var map = PathMap.of({"foo": 1, "bar": 2});
      expect(map, hasLength(2));
      expect(map, containsPair("foo", 1));
      expect(map, containsPair("bar", 2));
    });

    test("uses the second value in the case of duplicates", () {
      var map = PathMap.of({"foo": 1, absolute("foo"): 2});
      expect(map, hasLength(1));
      expect(map, containsPair("foo", 2));
      expect(map, containsPair(absolute("foo"), 2));
    });
  });
}
