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:
Lasse Reichstein Holst Nielsen
2020-06-12 16:36:40 +00:00
committed by commit-bot@chromium.org
parent 9be1160700
commit 6f4bc6a9be
4 changed files with 200 additions and 0 deletions
@@ -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();
@@ -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);
}
@@ -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();
@@ -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);
}