Add test for mixin application constructor forwarding of default values.
Bug: http://drtbug.com/31767 Change-Id: I25a877244d588b642c1c027caee381cfa847c07d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/120644 Commit-Queue: Lasse R.H. Nielsen <lrn@google.com> Reviewed-by: Johnni Winther <johnniwinther@google.com>
This commit is contained in:
committed by
commit-bot@chromium.org
parent
9be1160700
commit
6f4bc6a9be
+23
@@ -0,0 +1,23 @@
|
||||
// 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.
|
||||
|
||||
import "mixin_constructor_parameter_forwarding_test.dart";
|
||||
|
||||
// A private class that the mixin application cannot access syntactically,
|
||||
// yet it needs an instance of it for the default value.
|
||||
class _Private {
|
||||
const _Private();
|
||||
}
|
||||
|
||||
class B2<T> implements B<T> {
|
||||
final T x;
|
||||
final Object y;
|
||||
const B2(T x, [Object y = const _Private()])
|
||||
: x = x,
|
||||
y = y;
|
||||
}
|
||||
|
||||
// Leaking the constant value in a non-constant way which cannot be used
|
||||
// for the default value of the mixin application.
|
||||
Object get privateValue => const _Private();
|
||||
+77
@@ -0,0 +1,77 @@
|
||||
// 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 that mixin application forwarding constructors correctly forward
|
||||
// optional parameter default values.
|
||||
|
||||
import "package:expect/expect.dart";
|
||||
|
||||
import "mixin_constructor_parameter_forwarding_helper.dart"
|
||||
show B2, privateValue;
|
||||
|
||||
class B<T> {
|
||||
final T x;
|
||||
final Object y;
|
||||
const B(T x, [Object y = 0])
|
||||
: x = x,
|
||||
y = y;
|
||||
const B.b1(T x, {Object y = 0})
|
||||
: x = x,
|
||||
y = y;
|
||||
const B.b2(T x, [Object y = const <int>[0]])
|
||||
: x = x,
|
||||
y = y;
|
||||
}
|
||||
|
||||
mixin M1 on B<int> {
|
||||
void check(int x, Object y) {
|
||||
Expect.identical(x, this.x);
|
||||
Expect.identical(y, this.y);
|
||||
}
|
||||
}
|
||||
|
||||
mixin M2<T> on B<T> {
|
||||
void check(T x, Object y) {
|
||||
Expect.identical(x, this.x);
|
||||
Expect.identical(y, this.y);
|
||||
}
|
||||
}
|
||||
|
||||
class A1 = B<int> with M1;
|
||||
class A2 = B<int> with M2<int>;
|
||||
class P1 = B2<int> with M2<int>;
|
||||
|
||||
main() {
|
||||
A1(1, 2).check(1, 2);
|
||||
A1.b1(1, y: 2).check(1, 2);
|
||||
A1.b2(1, 2).check(1, 2);
|
||||
A2(1, 2).check(1, 2);
|
||||
A2.b1(1, y: 2).check(1, 2);
|
||||
A2.b2(1, 2).check(1, 2);
|
||||
P1(1, 2).check(1, 2);
|
||||
|
||||
A1(1).check(1, 0);
|
||||
A1.b1(1).check(1, 0);
|
||||
A1.b2(1).check(1, const <int>[0]);
|
||||
A2(1).check(1, 0);
|
||||
A2.b1(1).check(1, 0);
|
||||
A2.b2(1).check(1, const <int>[0]);
|
||||
P1(1).check(1, privateValue);
|
||||
|
||||
const A1(1, 2).check(1, 2);
|
||||
const A1.b1(1, y: 2).check(1, 2);
|
||||
const A1.b2(1, 2).check(1, 2);
|
||||
const A2(1, 2).check(1, 2);
|
||||
const A2.b1(1, y: 2).check(1, 2);
|
||||
const A2.b2(1, 2).check(1, 2);
|
||||
const P1(1, 2).check(1, 2);
|
||||
|
||||
const A1(1).check(1, 0);
|
||||
const A1.b1(1).check(1, 0);
|
||||
const A1.b2(1).check(1, const <int>[0]);
|
||||
const A2(1).check(1, 0);
|
||||
const A2.b1(1).check(1, 0);
|
||||
const A2.b2(1).check(1, const <int>[0]);
|
||||
const P1(1).check(1, privateValue);
|
||||
}
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
// 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.
|
||||
|
||||
import "mixin_constructor_parameter_forwarding_test.dart";
|
||||
|
||||
// A private class that the mixin application cannot access syntactically,
|
||||
// yet it needs an instance of it for the default value.
|
||||
class _Private {
|
||||
const _Private();
|
||||
}
|
||||
|
||||
class B2<T> implements B<T> {
|
||||
final T x;
|
||||
final Object y;
|
||||
const B2(T x, [Object y = const _Private()])
|
||||
: x = x,
|
||||
y = y;
|
||||
}
|
||||
|
||||
// Leaking the constant value in a non-constant way which cannot be used
|
||||
// for the default value of the mixin application.
|
||||
Object get privateValue => const _Private();
|
||||
+77
@@ -0,0 +1,77 @@
|
||||
// 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 that mixin application forwarding constructors correctly forward
|
||||
// optional parameter default values.
|
||||
|
||||
import "package:expect/expect.dart";
|
||||
|
||||
import "mixin_constructor_parameter_forwarding_helper.dart"
|
||||
show B2, privateValue;
|
||||
|
||||
class B<T> {
|
||||
final T x;
|
||||
final Object y;
|
||||
const B(T x, [Object y = 0])
|
||||
: x = x,
|
||||
y = y;
|
||||
const B.b1(T x, {Object y = 0})
|
||||
: x = x,
|
||||
y = y;
|
||||
const B.b2(T x, [Object y = const <int>[0]])
|
||||
: x = x,
|
||||
y = y;
|
||||
}
|
||||
|
||||
mixin M1 on B<int> {
|
||||
void check(int x, Object y) {
|
||||
Expect.identical(x, this.x);
|
||||
Expect.identical(y, this.y);
|
||||
}
|
||||
}
|
||||
|
||||
mixin M2<T> on B<T> {
|
||||
void check(T x, Object y) {
|
||||
Expect.identical(x, this.x);
|
||||
Expect.identical(y, this.y);
|
||||
}
|
||||
}
|
||||
|
||||
class A1 = B<int> with M1;
|
||||
class A2 = B<int> with M2<int>;
|
||||
class P1 = B2<int> with M2<int>;
|
||||
|
||||
main() {
|
||||
A1(1, 2).check(1, 2);
|
||||
A1.b1(1, y: 2).check(1, 2);
|
||||
A1.b2(1, 2).check(1, 2);
|
||||
A2(1, 2).check(1, 2);
|
||||
A2.b1(1, y: 2).check(1, 2);
|
||||
A2.b2(1, 2).check(1, 2);
|
||||
P1(1, 2).check(1, 2);
|
||||
|
||||
A1(1).check(1, 0);
|
||||
A1.b1(1).check(1, 0);
|
||||
A1.b2(1).check(1, const <int>[0]);
|
||||
A2(1).check(1, 0);
|
||||
A2.b1(1).check(1, 0);
|
||||
A2.b2(1).check(1, const <int>[0]);
|
||||
P1(1).check(1, privateValue);
|
||||
|
||||
const A1(1, 2).check(1, 2);
|
||||
const A1.b1(1, y: 2).check(1, 2);
|
||||
const A1.b2(1, 2).check(1, 2);
|
||||
const A2(1, 2).check(1, 2);
|
||||
const A2.b1(1, y: 2).check(1, 2);
|
||||
const A2.b2(1, 2).check(1, 2);
|
||||
const P1(1, 2).check(1, 2);
|
||||
|
||||
const A1(1).check(1, 0);
|
||||
const A1.b1(1).check(1, 0);
|
||||
const A1.b2(1).check(1, const <int>[0]);
|
||||
const A2(1).check(1, 0);
|
||||
const A2.b1(1).check(1, 0);
|
||||
const A2.b2(1).check(1, const <int>[0]);
|
||||
const P1(1).check(1, privateValue);
|
||||
}
|
||||
Reference in New Issue
Block a user