blob: a827b0cb7a236197c0fa5c2b2b69ed91f87da24b [file] [log] [blame]
// Copyright (c) 2020, 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 "dart:collection";
import "package:expect/expect.dart";
import 'cast_helper.dart';
void main() {
testDowncast();
testUpcast();
}
void testDowncast() {
var map = new Map.fromIterables(elements, elements);
var dMap = Map.castFrom<C?, C?, D?, D?>(map);
Expect.isTrue(dMap is Map<D?, D?>);
Expect.equals(null, dMap[new C()]);
Expect.throws(() => dMap[c]); // C is not D?.
Expect.isTrue(dMap.containsKey(c)); // containsKey should not be typed.
Expect.equals(d, dMap[d]);
Expect.throws(() => dMap[e]); // E is not D?.
Expect.isTrue(dMap.containsKey(null));
Expect.equals(null, dMap[null]);
Expect.equals(5, dMap.length);
Expect.throws(() => dMap.remove(c)); // Removes key but fails to return value.
Expect.equals(4, dMap.length);
Expect.equals(null, dMap[c]);
// Test keys and values.
Expect.isTrue(dMap.keys is Iterable<D?>);
Expect.isTrue(dMap.values is Iterable<D?>);
Expect.throws(() => dMap.keys.toList());
Expect.throws(() => dMap.values.toList());
}
void testUpcast() {
var map = new Map.fromIterables(elements, elements);
var objectMap = Map.castFrom<C?, C?, Object?, Object?>(map);
Expect.equals(5, objectMap.length);
Expect.equals(c, objectMap[c]);
Expect.isTrue(objectMap.containsKey(c));
Expect.equals(c, objectMap.remove(c));
Expect.equals(4, objectMap.length);
// Test keys and values.
Expect.isTrue(objectMap.keys is Iterable<Object?>);
Expect.isTrue(objectMap.values is Iterable<Object?>);
var expected = new List<Object?>.from(elements);
expected.remove(c);
Expect.listEquals(expected, objectMap.keys.toList());
Expect.listEquals(expected, objectMap.values.toList());
}