Files
sdk/tests/corelib/cast_strong_test.dart
Ryan Macnak 56636971dc [test_runner] Remove nnbd mode options.
In particular, this means the VM tests stop getting invoked with the now-invalid --sound-null-safety flag.

Change-Id: Ia8f5a59e0bf1fd7094508fdc4bb146ebf3034148
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/431360
Reviewed-by: Bob Nystrom <rnystrom@google.com>
Reviewed-by: Kallen Tu <kallentu@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
2025-06-02 10:59:31 -07:00

103 lines
3.1 KiB
Dart

// 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() {
testIterable();
testList();
testMap();
testSet();
}
testIterable() {
var iterable = new Iterable<C?>.generate(elements.length, (n) => elements[n]);
// Downcast non-nullable.
// An iterable that (likely) can do direct access.
var dIterableDirect = Iterable.castFrom<C?, D>(iterable);
Expect.equals(d, dIterableDirect.elementAt(1));
// null is not D.
Expect.throws(() => dIterableDirect.skip(3).elementAt(1));
// An iterable that cannot do direct access.
var dIterableNonDirect = Iterable.castFrom<C?, D>(
iterable.where((_) => true),
);
Expect.equals(d, dIterableNonDirect.elementAt(1));
// null is not D.
Expect.throws(() => dIterableNonDirect.skip(3).elementAt(1));
// Iterable that definitely won't survive accessing element 3.
var iterableLimited = new Iterable<C?>.generate(
elements.length,
(n) => n == 3 ? throw "untouchable" : elements[n],
);
var dIterableLimited = Iterable.castFrom<C?, D>(iterableLimited);
Expect.equals(d, dIterableLimited.elementAt(1));
// null is not D.
Expect.throws(() => dIterableLimited.skip(3).elementAt(1));
// Upcast non-nullable.
var objectIterable = Iterable.castFrom<C?, Object>(iterable);
// null is not Object.
Expect.throws(() => objectIterable.skip(3).elementAt(1));
}
testList() {
var list = new List<C?>.from(elements);
// Downcast non-nullable.
var dList = List.castFrom<C?, D>(list);
Expect.equals(d, dList[1]);
Expect.throws(() => dList.last); // null is not D.
// Upcast non-nullable.
var objectList = List.castFrom<C?, Object>(list);
Expect.throws(() => objectList.last); // null is not Object.
}
testMap() {
var map = new Map.fromIterables(elements, elements);
// Downcast non-nullable.
var dMap = Map.castFrom<C?, C?, D, D>(map);
Expect.equals(d, dMap[d]);
Expect.isTrue(dMap.containsKey(null));
Expect.equals(null, dMap[null]);
// 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());
// Upcast non-nullable.
var objectMap = Map.castFrom<C?, C?, Object, Object>(map);
Expect.isTrue(objectMap.containsKey(null));
Expect.equals(null, objectMap[null]);
// Test keys and values
Expect.isTrue(objectMap.keys is Iterable<Object>);
Expect.isTrue(objectMap.values is Iterable<Object>);
// null is not Object.
Expect.throws(() => objectMap.keys.toList());
Expect.throws(() => objectMap.values.toList());
}
testSet() {
var setEls = new Set<C?>.from(elements);
// Downcast non-nullable.
var dSet = Set.castFrom<C?, D>(setEls);
Expect.equals(d, dSet.elementAt(1));
Expect.throws(() => dSet.last); // null is not D.
// Upcast non-nullable.
var objectSet = Set.castFrom<C?, Object>(setEls);
Expect.throws(() => objectSet.last); // null is not Object.
}