mirror of
https://github.com/dart-lang/sdk
synced 2024-09-19 15:11:35 +00:00
b101a7d002
Change-Id: Ib33169c3e0ffc870915c189404074a1dea472546 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/196548 Reviewed-by: Bob Nystrom <rnystrom@google.com> Commit-Queue: Leaf Petersen <leafp@google.com>
118 lines
3.2 KiB
Dart
118 lines
3.2 KiB
Dart
// 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.
|
|
|
|
// @dart = 2.9
|
|
|
|
import "dart:typed_data";
|
|
import "package:expect/expect.dart";
|
|
|
|
// Tests of List.copyRange.
|
|
|
|
void main() {
|
|
var list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
|
|
|
|
List.copyRange(list, 3, [10, 11, 12, 13], 0, 4);
|
|
|
|
Expect.listEquals([0, 1, 2, 10, 11, 12, 13, 7, 8, 9], list);
|
|
|
|
List.copyRange(list, 6, [20, 21, 22, 23], 1, 3);
|
|
|
|
Expect.listEquals([0, 1, 2, 10, 11, 12, 21, 22, 8, 9], list);
|
|
|
|
// Empty ranges won't change anything.
|
|
List.copyRange(list, 7, [30, 31, 32, 33], 3, 3);
|
|
List.copyRange(list, list.length, [30, 31, 32, 33], 3, 3);
|
|
|
|
Expect.listEquals([0, 1, 2, 10, 11, 12, 21, 22, 8, 9], list);
|
|
|
|
List.copyRange(list, 0, [40, 41, 42, 43], 0, 2);
|
|
|
|
Expect.listEquals([40, 41, 2, 10, 11, 12, 21, 22, 8, 9], list);
|
|
|
|
// Overlapping self-ranges
|
|
|
|
List.copyRange(list, 2, list, 0, 4);
|
|
|
|
Expect.listEquals([40, 41, 40, 41, 2, 10, 21, 22, 8, 9], list);
|
|
|
|
List.copyRange(list, 4, list, 6, 10);
|
|
|
|
Expect.listEquals([40, 41, 40, 41, 21, 22, 8, 9, 8, 9], list);
|
|
|
|
// Invalid source ranges.
|
|
|
|
Expect.throwsArgumentError(() {
|
|
List.copyRange(list, 0, [0, 0, 0], -1, 1);
|
|
});
|
|
|
|
Expect.throwsArgumentError(() {
|
|
List.copyRange(list, 0, [0, 0, 0], 0, 4);
|
|
});
|
|
|
|
Expect.throwsArgumentError(() {
|
|
List.copyRange(list, 0, [0, 0, 0], 2, 1);
|
|
});
|
|
|
|
Expect.throwsArgumentError(() {
|
|
List.copyRange(list, 0, [], 1, 1);
|
|
});
|
|
|
|
// Invalid target range.
|
|
Expect.throwsArgumentError(() {
|
|
List.copyRange(list, list.length - 3, [0, 0, 0, 0], 0, 4);
|
|
});
|
|
|
|
// Invalid target range.
|
|
Expect.throwsArgumentError(() {
|
|
List.copyRange(list, list.length + 1, [0, 0, 0, 0], 0, 0);
|
|
});
|
|
|
|
// Argument errors throw before changing anything, so list is unchanged.
|
|
Expect.listEquals([40, 41, 40, 41, 21, 22, 8, 9, 8, 9], list);
|
|
|
|
// Omitting start/end (or passing null).
|
|
List.copyRange(list, 2, [1, 2, 3]);
|
|
|
|
Expect.listEquals([40, 41, 1, 2, 3, 22, 8, 9, 8, 9], list);
|
|
|
|
List.copyRange(list, 5, [1, 2, 3], 1);
|
|
|
|
Expect.listEquals([40, 41, 1, 2, 3, 2, 3, 9, 8, 9], list);
|
|
|
|
// Other kinds of lists.
|
|
var listu8 = new Uint8List.fromList([1, 2, 3, 4]);
|
|
var list16 = new Int16List.fromList([11, 12, -13, -14]);
|
|
List.copyRange(listu8, 2, list16, 1, 3);
|
|
Expect.listEquals([1, 2, 12, 256 - 13], listu8);
|
|
|
|
var clist = const <int>[1, 2, 3, 4];
|
|
var flist = new List<int>(4)..setAll(0, [10, 11, 12, 13]);
|
|
List.copyRange(flist, 1, clist, 1, 3);
|
|
Expect.listEquals([10, 2, 3, 13], flist);
|
|
|
|
// Invoking with a type parameter that is a supertype of the list types
|
|
// is valid and useful.
|
|
List<int> ilist = <int>[1, 2, 3, 4];
|
|
List<num> nlist = <num>[11, 12, 13, 14];
|
|
|
|
List.copyRange<num>(ilist, 1, nlist, 1, 3);
|
|
Expect.listEquals([1, 12, 13, 4], ilist);
|
|
List.copyRange<Object>(ilist, 1, nlist, 0, 2);
|
|
Expect.listEquals([1, 11, 12, 4], ilist);
|
|
List.copyRange<dynamic>(ilist, 1, nlist, 2, 4);
|
|
Expect.listEquals([1, 13, 14, 4], ilist);
|
|
|
|
var d = new D();
|
|
List<B> bdlist = <B>[d];
|
|
List<C> cdlist = <C>[null];
|
|
List.copyRange<Object>(cdlist, 0, bdlist, 0, 1);
|
|
Expect.identical(d, cdlist[0]);
|
|
}
|
|
|
|
class B {}
|
|
|
|
class C {}
|
|
|
|
class D implements B, C {}
|