blob: 39d206e36e53fe4e7f8c0e4bfec4de77e1e279aa [file] [log] [blame]
// Copyright (c) 2024, 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.
// This test verifies different corner cases around calling functions in
// Dart.
import 'package:expect/expect.dart';
import 'calling_conventions_il_test.dart';
class ChildWithBoxedParameterOverride extends Base {
ChildWithBoxedParameterOverride(super.o);
@override
@pragma('vm:never-inline')
String f([String v = 'ok!']) {
Expect.equals('ok', o.substring(0, 2));
Expect.equals('ok', v.substring(0, 2));
return o + v;
}
@override
@pragma('vm:never-inline')
String fOptional([String v = 'ok!']) {
Expect.equals('ok', o.substring(0, 2));
Expect.equals('ok', v.substring(0, 2));
return o + v;
}
@override
@pragma('vm:never-inline')
String fNamed({String v = 'ok!'}) {
Expect.equals('ok', o.substring(0, 2));
Expect.equals('ok', v.substring(0, 2));
return o + v;
}
@override
@pragma('vm:never-inline')
int fIntInt(dynamic a, [int b = 0]) {
Expect.equals('ok', o.substring(0, 2));
return a + b;
}
@override
@pragma('vm:never-inline')
double fIntDouble(dynamic a, [double b = 0.0]) {
Expect.equals('ok', o.substring(0, 2));
return a + b;
}
@override
@pragma('vm:never-inline')
double fDoubleDouble(dynamic a, [double b = 0.0]) {
Expect.equals('ok', o.substring(0, 2));
return a + b;
}
@override
@pragma('vm:never-inline')
int fIntOptionalInt([dynamic a = 0, int b = 0]) {
Expect.equals('ok', o.substring(0, 2));
return a + b;
}
@override
@pragma('vm:never-inline')
double fIntOptionalDouble([dynamic a = 0, double b = 0.0]) {
Expect.equals('ok', o.substring(0, 2));
return a + b;
}
@override
@pragma('vm:never-inline')
double fDoubleOptionalDouble([dynamic a = 0.0, double b = 0.0]) {
Expect.equals('ok', o.substring(0, 2));
return a + b;
}
@override
@pragma('vm:never-inline')
int fIntNamedInt(dynamic a, {int b = 0}) {
Expect.equals('ok', o.substring(0, 2));
return a + b;
}
@override
@pragma('vm:never-inline')
double fIntNamedDouble(dynamic a, {double b = 0.0}) {
Expect.equals('ok', o.substring(0, 2));
return a + b;
}
@override
@pragma('vm:never-inline')
double fDoubleNamedDouble(dynamic a, {double b = 0.0}) {
Expect.equals('ok', o.substring(0, 2));
return a + b;
}
}
class Wrapper {
final dynamic val;
Wrapper(this.val);
operator +(dynamic arg) {
return val + arg;
}
}
void testDirectCalls3(String str, int ia, int ib) {
final da = ia.toDouble();
final db = ib.toDouble();
final child = ChildWithBoxedParameterOverride(str);
Expect.equals("ok+ok+", child.f(str));
Expect.equals("ok+ok!", child.fOptional());
Expect.equals("ok+ok+", child.fOptional(str));
Expect.equals("ok+ok!", child.fNamed());
Expect.equals("ok+ok+", child.fNamed(v: str));
Expect.equals(142, child.fIntInt(Wrapper(ia), ib));
Expect.equals(142, child.fIntDouble(Wrapper(ia), db));
Expect.equals(142, child.fDoubleDouble(Wrapper(da), db));
Expect.equals(42, child.fIntOptionalInt(Wrapper(ia)));
Expect.equals(142, child.fIntOptionalInt(Wrapper(ia), ib));
Expect.equals(42, child.fIntOptionalDouble(Wrapper(ia)));
Expect.equals(142, child.fIntOptionalDouble(Wrapper(ia), db));
Expect.equals(42, child.fDoubleOptionalDouble(Wrapper(da)));
Expect.equals(142, child.fDoubleOptionalDouble(Wrapper(da), db));
Expect.equals(42, child.fIntNamedInt(Wrapper(ia)));
Expect.equals(142, child.fIntNamedInt(Wrapper(ia), b: ib));
Expect.equals(42, child.fIntNamedDouble(Wrapper(ia)));
Expect.equals(142, child.fIntNamedDouble(Wrapper(ia), b: db));
Expect.equals(42, child.fDoubleNamedDouble(Wrapper(da)));
Expect.equals(142, child.fDoubleNamedDouble(Wrapper(da), b: db));
}
void main(List<String> args) {
runTests(args, [
...directCallsTests,
testDirectCalls3,
], [
...childClassFactories,
ChildWithBoxedParameterOverride.new,
]);
}