mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 04:16:51 +00:00
407428311f
Change-Id: I277a4f29d39c2c4d2669931b5f4837db65589167 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/149522 Auto-Submit: Kevin Moore <kevmoo@google.com> Commit-Queue: Leaf Petersen <leafp@google.com> Reviewed-by: Leaf Petersen <leafp@google.com>
144 lines
3.8 KiB
Dart
144 lines
3.8 KiB
Dart
// Copyright (c) 2019, 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.
|
|
|
|
// Tests getters and setters where one or both is defined
|
|
// by an extension.
|
|
|
|
import "package:expect/expect.dart";
|
|
|
|
main() {
|
|
C c = C();
|
|
// v1: C get, C set
|
|
expectGet("C.v1", c.v1);
|
|
expectSet("C.v1=1", c.v1 = Result("1"));
|
|
// v2: C get, E1 get/set, C wins.
|
|
expectGet("C.v2", c.v2);
|
|
expectSet("E1.v2=2", E1(c).v2 = Result("2"));
|
|
// v3: E1 get/set, C set, C wins.
|
|
expectGet("E1.v3", E1(c).v3);
|
|
expectSet("C.v3=3", c.v3 = Result("3"));
|
|
// v4: E1 get/set
|
|
expectGet("E1.v4", c.v4);
|
|
expectSet("E1.v4=4", c.v4 = Result("4"));
|
|
// v5: E1 get, E2 set, neither more specific.
|
|
expectGet("E1.v5", E1(c).v5);
|
|
expectSet("E2.v5=5", E2(c).v5 = Result("5"));
|
|
|
|
expectSet("C.v1=C.v1+1", c.v1++);
|
|
expectSet("E1.v4=E1.v4+1", c.v4++);
|
|
|
|
expectSet("C.v1=C.v1+a", c.v1 += "a");
|
|
expectSet("C.v1=C.v1-b", c.v1 -= "b");
|
|
expectSet("E1.v4=E1.v4-b", c.v4 -= "b");
|
|
|
|
// Explicit application used by all accesses of read/write operations
|
|
expectSet("E1.v1=E1.v1+1", E1(c).v1++);
|
|
expectSet("E1.v2=E1.v2+1", E1(c).v2++);
|
|
expectSet("E1.v3=E1.v3+1", E1(c).v3++);
|
|
// Same using `+= 1` instead of `++`.
|
|
expectSet("E1.v1=E1.v1+1", E1(c).v1 += 1);
|
|
expectSet("E1.v2=E1.v2+1", E1(c).v2 += 1);
|
|
expectSet("E1.v3=E1.v3+1", E1(c).v3 += 1);
|
|
// Same fully expanded.
|
|
expectSet("E1.v1=E1.v1+1", E1(c).v1 = E1(c).v1 + 1);
|
|
expectSet("E1.v2=E1.v2+1", E1(c).v2 = E1(c).v2 + 1);
|
|
expectSet("E1.v3=E1.v3+1", E1(c).v3 = E1(c).v3 + 1);
|
|
|
|
// Cascades work.
|
|
expectSet(
|
|
"E1.v4=E1.v4+[C.v1=C.v1-[C.v3=a]]",
|
|
c
|
|
..v3 = Result("a")
|
|
..v1 -= Result("[$lastSetter]")
|
|
..v4 += Result("[$lastSetter]"));
|
|
}
|
|
|
|
/// Expect the value of [result] to be the [expected] string
|
|
expectGet(String expected, Result result) {
|
|
Expect.equals(expected, result.value);
|
|
}
|
|
|
|
/// Expect the [lastSetter] value set by evaluating [assignment] to be
|
|
/// [expected].
|
|
expectSet(String expected, void assignment) {
|
|
Expect.equals(expected, lastSetter);
|
|
}
|
|
|
|
/// Last value passed to any of our tested setters.
|
|
String? lastSetter = null;
|
|
|
|
/// A type which supports a `+` operation accepting `int`,
|
|
/// so we can test `+=` and `++`.
|
|
class Result {
|
|
final String value;
|
|
Result(this.value);
|
|
Result operator +(Object o) => Result("$value+$o");
|
|
Result operator -(Object o) => Result("$value-$o");
|
|
String toString() => value;
|
|
}
|
|
|
|
/// Target type for extensions.
|
|
///
|
|
/// Declares [v1] getter and setter, [v2] getter and [v3] setter.
|
|
class C {
|
|
Result get v1 => Result("C.v1");
|
|
void set v1(Result value) {
|
|
lastSetter = "C.v1=$value";
|
|
}
|
|
|
|
Result get v2 => Result("C.v2");
|
|
|
|
void set v3(Result value) {
|
|
lastSetter = "C.v3=$value";
|
|
}
|
|
}
|
|
|
|
/// Primary extension on [C].
|
|
///
|
|
/// Declares [v1], [v2] and [v3] getters and setters.
|
|
///
|
|
/// Declares [v4] getter and setter, and [v5] getter
|
|
/// which are supplemented by a setter from the [E2] extension.
|
|
extension E1 on C {
|
|
// Same basename as C getter and setter.
|
|
Result get v1 => Result("E1.v1");
|
|
|
|
void set v1(Result value) {
|
|
lastSetter = "E1.v1=$value";
|
|
}
|
|
|
|
// Same basename as C getter.
|
|
Result get v2 => Result("E1.v2");
|
|
|
|
void set v2(Result value) {
|
|
lastSetter = "E1.v2=$value";
|
|
}
|
|
|
|
// Same basename as C setter.
|
|
Result get v3 => Result("E1.v3");
|
|
|
|
void set v3(Result value) {
|
|
lastSetter = "E1.v3=$value";
|
|
}
|
|
|
|
// No other declarations with same basename.
|
|
Result get v4 => Result("E1.v4");
|
|
|
|
void set v4(Result value) {
|
|
lastSetter = "E1.v4=$value";
|
|
}
|
|
|
|
// Same basename as E2 setter.
|
|
Result get v5 => Result("E1.v5");
|
|
}
|
|
|
|
/// A different extension than [E1] on [C].
|
|
///
|
|
/// Declares [v5] setter.
|
|
extension E2 on C {
|
|
void set v5(Result value) {
|
|
lastSetter = "E2.v5=$value";
|
|
}
|
|
}
|