blob: 3546ae8f337291de415b535397de838fe5d1b68e [file] [log] [blame]
// Copyright (c) 2016, 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:collection/collection.dart";
import "package:test/test.dart";
import '../utils.dart';
void main() {
group("with valid types, forwards", () {
var wrapper;
var emptyWrapper;
setUp(() {
wrapper = DelegatingMap.typed/*<String, int>*/(
<Object, Object>{"foo": 1, "bar": 2, "baz": 3, "bang": 4});
emptyWrapper = DelegatingMap.typed/*<String, int>*/(<Object, Object>{});
});
test("[]", () {
expect(wrapper["foo"], equals(1));
expect(wrapper["bar"], equals(2));
expect(wrapper["qux"], isNull);
expect(wrapper[1], isNull);
});
test("[]=", () {
wrapper["foo"] = 5;
expect(wrapper, equals({"foo": 5, "bar": 2, "baz": 3, "bang": 4}));
wrapper["qux"] = 6;
expect(wrapper,
equals({"foo": 5, "bar": 2, "baz": 3, "bang": 4, "qux": 6}));
});
test("addAll()", () {
wrapper.addAll({"bar": 5, "qux": 6});
expect(wrapper,
equals({"foo": 1, "bar": 5, "baz": 3, "bang": 4, "qux": 6}));
});
test("clear()", () {
wrapper.clear();
expect(wrapper, isEmpty);
});
test("containsKey()", () {
expect(wrapper.containsKey("foo"), isTrue);
expect(wrapper.containsKey("qux"), isFalse);
expect(wrapper.containsKey(1), isFalse);
});
test("containsValue()", () {
expect(wrapper.containsValue(1), isTrue);
expect(wrapper.containsValue(7), isFalse);
expect(wrapper.containsValue("foo"), isFalse);
});
test("forEach()", () {
var results = [];
wrapper.forEach((key, value) => results.add([key, value]));
expect(results,
unorderedEquals([["foo", 1], ["bar", 2], ["baz", 3], ["bang", 4]]));
emptyWrapper.forEach(expectAsync((_, __) {}, count: 0));
});
test("isEmpty", () {
expect(wrapper.isEmpty, isFalse);
expect(emptyWrapper.isEmpty, isTrue);
});
test("isNotEmpty", () {
expect(wrapper.isNotEmpty, isTrue);
expect(emptyWrapper.isNotEmpty, isFalse);
});
test("keys", () {
expect(wrapper.keys, unorderedEquals(["foo", "bar", "baz", "bang"]));
expect(emptyWrapper.keys, isEmpty);
});
test("length", () {
expect(wrapper.length, equals(4));
expect(emptyWrapper.length, equals(0));
});
test("putIfAbsent()", () {
expect(wrapper.putIfAbsent("foo", expectAsync(() => null, count: 0)),
equals(1));
expect(wrapper.putIfAbsent("qux", () => 6), equals(6));
expect(wrapper,
equals({"foo": 1, "bar": 2, "baz": 3, "bang": 4, "qux": 6}));
});
test("remove()", () {
expect(wrapper.remove("foo"), equals(1));
expect(wrapper, equals({"bar": 2, "baz": 3, "bang": 4}));
expect(wrapper.remove("foo"), isNull);
expect(wrapper.remove(3), isNull);
});
test("values", () {
expect(wrapper.values, unorderedEquals([1, 2, 3, 4]));
expect(emptyWrapper.values, isEmpty);
});
test("toString()", () {
expect(wrapper.toString(), allOf([
startsWith("{"),
contains("foo: 1"),
contains("bar: 2"),
contains("baz: 3"),
contains("bang: 4"),
endsWith("}")
]));
});
});
group("with invalid key types", () {
var inner;
var wrapper;
setUp(() {
inner = <Object, Object>{1: 1, 2: 2, 3: 3, 4: 4};
wrapper = DelegatingMap.typed/*<String, int>*/(inner);
});
group("throws a CastError for", () {
test("forEach()", () {
expect(() => wrapper.forEach(expectAsync((_, __) {}, count: 0)),
throwsCastError);
});
test("keys", () {
var lazy = wrapper.keys;
expect(() => lazy.first, throwsCastError);
});
});
group("doesn't throw a CastError for", () {
test("[]", () {
expect(wrapper["foo"], isNull);
expect(wrapper[1], equals(1));
expect(wrapper[7], isNull);
});
test("[]=", () {
wrapper["foo"] = 5;
expect(inner, equals({"foo": 5, 1: 1, 2: 2, 3: 3, 4: 4}));
});
test("addAll()", () {
wrapper.addAll({"foo": 1, "bar": 2});
expect(inner, equals({"foo": 1, "bar": 2, 1: 1, 2: 2, 3: 3, 4: 4}));
});
test("clear()", () {
wrapper.clear();
expect(wrapper, isEmpty);
});
test("containsKey()", () {
expect(wrapper.containsKey(1), isTrue);
expect(wrapper.containsKey(7), isFalse);
expect(wrapper.containsKey("foo"), isFalse);
});
test("containsValue()", () {
expect(wrapper.containsValue(1), isTrue);
expect(wrapper.containsValue(7), isFalse);
expect(wrapper.containsValue("foo"), isFalse);
});
test("isEmpty", () {
expect(wrapper.isEmpty, isFalse);
});
test("isNotEmpty", () {
expect(wrapper.isNotEmpty, isTrue);
});
test("length", () {
expect(wrapper.length, equals(4));
});
test("putIfAbsent()", () {
expect(wrapper.putIfAbsent("foo", () => 1), equals(1));
expect(inner, equals({"foo": 1, 1: 1, 2: 2, 3: 3, 4: 4}));
});
test("remove()", () {
expect(wrapper.remove(1), equals(1));
expect(inner, equals({2: 2, 3: 3, 4: 4}));
expect(wrapper.remove("foo"), isNull);
expect(wrapper.remove(7), isNull);
});
test("values", () {
expect(wrapper.values, unorderedEquals([1, 2, 3, 4]));
});
test("toString()", () {
expect(wrapper.toString(), allOf([
startsWith("{"),
contains("1: 1"),
contains("2: 2"),
contains("3: 3"),
contains("4: 4"),
endsWith("}")
]));
});
});
}, skip: "Re-enable this when test can run DDC (test#414).");
group("with invalid value types", () {
var inner;
var wrapper;
setUp(() {
inner = <Object, Object>{"foo": "bar", "baz": "bang"};
wrapper = DelegatingMap.typed/*<String, int>*/(inner);
});
group("throws a CastError for", () {
test("forEach()", () {
expect(() => wrapper.forEach(expectAsync((_, __) {}, count: 0)),
throwsCastError);
});
test("[]", () {
expect(() => wrapper["foo"], throwsCastError);
expect(wrapper["qux"], isNull);
});
test("putIfAbsent()", () {
expect(() => wrapper.putIfAbsent("foo", () => 1), throwsCastError);
});
test("remove()", () {
expect(() => wrapper.remove("foo"), throwsCastError);
});
test("values", () {
var lazy = wrapper.values;
expect(() => lazy.first, throwsCastError);
});
});
group("doesn't throw a CastError for", () {
test("[]=", () {
wrapper["foo"] = 5;
expect(inner, equals({"foo": 5, "baz": "bang"}));
});
test("addAll()", () {
wrapper.addAll({"foo": 1, "qux": 2});
expect(inner, equals({"foo": 1, "baz": "bang", "qux": 2}));
});
test("clear()", () {
wrapper.clear();
expect(wrapper, isEmpty);
});
test("containsKey()", () {
expect(wrapper.containsKey("foo"), isTrue);
expect(wrapper.containsKey(1), isFalse);
expect(wrapper.containsKey("qux"), isFalse);
});
test("containsValue()", () {
expect(wrapper.containsValue("bar"), isTrue);
expect(wrapper.containsValue(1), isFalse);
expect(wrapper.containsValue("foo"), isFalse);
});
test("isEmpty", () {
expect(wrapper.isEmpty, isFalse);
});
test("isNotEmpty", () {
expect(wrapper.isNotEmpty, isTrue);
});
test("keys", () {
expect(wrapper.keys, unorderedEquals(["foo", "baz"]));
});
test("length", () {
expect(wrapper.length, equals(2));
});
test("putIfAbsent()", () {
expect(wrapper.putIfAbsent("qux", () => 1), equals(1));
expect(inner, equals({"foo": "bar", "baz": "bang", "qux": 1}));
});
test("remove()", () {
expect(wrapper.remove("qux"), isNull);
expect(wrapper.remove(7), isNull);
});
test("toString()", () {
expect(wrapper.toString(), allOf([
startsWith("{"),
contains("foo: bar"),
contains("baz: bang"),
endsWith("}")
]));
});
});
}, skip: "Re-enable this when test can run DDC (test#414).");
}