mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 18:19:44 +00:00
ccaea0ef80
Change-Id: Ia76fb4b8354127638af281ad735c3e4aee99ef0c Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/128309 Auto-Submit: Bob Nystrom <rnystrom@google.com> Reviewed-by: Lasse R.H. Nielsen <lrn@google.com> Commit-Queue: Bob Nystrom <rnystrom@google.com>
156 lines
4.2 KiB
Dart
156 lines
4.2 KiB
Dart
// Copyright (c) 2013, 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";
|
|
|
|
class MyList<E> extends ListBase<E> {
|
|
List<E> _list;
|
|
|
|
MyList(List<E> this._list);
|
|
|
|
int get length => _list.length;
|
|
|
|
void set length(int x) {
|
|
_list.length = x;
|
|
}
|
|
|
|
E operator [](int idx) => _list[idx];
|
|
|
|
void operator []=(int idx, E value) {
|
|
_list[idx] = value;
|
|
}
|
|
}
|
|
|
|
class MyNoSuchMethodList<E> extends Object
|
|
with ListMixin<E>
|
|
implements List<E> {
|
|
List<E> _list;
|
|
|
|
MyNoSuchMethodList(List<E> this._list);
|
|
|
|
noSuchMethod(Invocation invocation) {
|
|
if (invocation.memberName == #length && invocation.isGetter) {
|
|
return _list.length;
|
|
}
|
|
if (invocation.memberName == const Symbol("length=") &&
|
|
invocation.isSetter) {
|
|
_list.length = invocation.positionalArguments.first;
|
|
return null;
|
|
}
|
|
if (invocation.memberName == const Symbol("[]") &&
|
|
invocation.positionalArguments.length == 1) {
|
|
return _list[invocation.positionalArguments.first];
|
|
}
|
|
if (invocation.memberName == const Symbol("[]=") &&
|
|
invocation.positionalArguments.length == 2) {
|
|
_list[invocation.positionalArguments.first] =
|
|
invocation.positionalArguments[1];
|
|
return null;
|
|
}
|
|
return super.noSuchMethod(invocation);
|
|
}
|
|
}
|
|
|
|
// Class that behaves like a list but does not implement List.
|
|
class MyIndexableNoSuchMethod<E> {
|
|
List<E> _list;
|
|
|
|
MyIndexableNoSuchMethod(List<E> this._list);
|
|
|
|
noSuchMethod(Invocation invocation) {
|
|
if (invocation.memberName == #length && invocation.isGetter) {
|
|
return _list.length;
|
|
}
|
|
if (invocation.memberName == const Symbol("length=") &&
|
|
invocation.isSetter) {
|
|
_list.length = invocation.positionalArguments.first;
|
|
return null;
|
|
}
|
|
if (invocation.memberName == const Symbol("prototype")) {
|
|
return 42;
|
|
}
|
|
|
|
if (invocation.memberName == const Symbol("[]") &&
|
|
invocation.positionalArguments.length == 1) {
|
|
return _list[invocation.positionalArguments.first];
|
|
}
|
|
if (invocation.memberName == const Symbol("[]=") &&
|
|
invocation.positionalArguments.length == 2) {
|
|
_list[invocation.positionalArguments.first] =
|
|
invocation.positionalArguments[1];
|
|
return null;
|
|
}
|
|
return super.noSuchMethod(invocation);
|
|
}
|
|
}
|
|
|
|
void testRetainWhere() {
|
|
List<int> list = <int>[1, 2, 3];
|
|
list.retainWhere((x) => x % 2 == 0);
|
|
Expect.equals(1, list.length);
|
|
Expect.equals(2, list.first);
|
|
Expect.equals(2, list[0]);
|
|
|
|
list = new MyList<int>([1, 2, 3]);
|
|
list.retainWhere((x) => x % 2 == 0);
|
|
Expect.equals(1, list.length);
|
|
Expect.equals(2, list.first);
|
|
Expect.equals(2, list[0]);
|
|
|
|
list = new MyNoSuchMethodList<int>([1, 2, 3]);
|
|
list.retainWhere((x) => x % 2 == 0);
|
|
Expect.equals(1, list.length);
|
|
Expect.equals(2, list.first);
|
|
Expect.equals(2, list[0]);
|
|
|
|
// Equivalent tests where the type of the List is known statically.
|
|
{
|
|
var l = new MyList<int>([1, 2, 3]);
|
|
l.retainWhere((x) => x % 2 == 0);
|
|
Expect.equals(1, l.length);
|
|
Expect.equals(2, l.first);
|
|
Expect.equals(2, l[0]);
|
|
}
|
|
|
|
{
|
|
var l = new MyNoSuchMethodList<int>([1, 2, 3]);
|
|
l.retainWhere((x) => x % 2 == 0);
|
|
Expect.equals(1, l.length);
|
|
Expect.equals(2, l.first);
|
|
Expect.equals(2, l[0]);
|
|
}
|
|
|
|
// Equivalent tests where the type of the List is not known.
|
|
{
|
|
dynamic l = new MyList<int>([1, 2, 3]);
|
|
l.retainWhere((x) => x % 2 == 0);
|
|
Expect.equals(1, l.length);
|
|
Expect.equals(2, l.first);
|
|
Expect.equals(2, l[0]);
|
|
}
|
|
|
|
{
|
|
dynamic l = new MyNoSuchMethodList<int>([1, 2, 3]);
|
|
l.retainWhere((x) => x % 2 == 0);
|
|
Expect.equals(1, l.length);
|
|
Expect.equals(2, l.first);
|
|
Expect.equals(2, l[0]);
|
|
}
|
|
|
|
{
|
|
dynamic indexable = new MyIndexableNoSuchMethod<int>([1, 2, 3]);
|
|
Expect.equals(3, indexable.length);
|
|
Expect.equals(1, indexable[0]);
|
|
Expect.equals(3, indexable[2]);
|
|
indexable.length = 2;
|
|
Expect.equals(2, indexable.length);
|
|
Expect.equals(42, indexable.prototype);
|
|
}
|
|
}
|
|
|
|
void main() {
|
|
testRetainWhere();
|
|
}
|