1/*
2 * Copyright (c) 2023-2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16class MyType {
17    x: int = 10;
18    constructor() { }
19    constructor(a: int) {
20        this.x = a;
21    }
22}
23
24function main(): void {
25    assert foo1() == 8;
26
27    assert foo2() == 30;
28    assert foo2(new MyType(5)) == 25;
29
30    assert foo3(new MyType(5)) == 55;
31    assert foo3(new MyType(5), new MyType(10)) == 45;
32
33    assert foo4() == 0;
34
35    assert foo5() == 0;
36    assert foo5(new MyType(5)) == -1;
37
38    assert foo6(new MyType(5)) == 0;
39    assert foo6(new MyType(5), new MyType(10)) == -1;
40
41    assert foo7() == 0;
42    assert foo8() == 0;
43
44    assert foo9(new MyType(10)) == 15;
45    assert foo10(new MyType(10)) == 25;
46
47    assert foo11(new MyType(10), new MyType(5)) == 20;
48    assert foo12(new MyType(10), new MyType(5)) == 30;
49}
50
51function foo1(a: MyType|null = new MyType(8)): int {
52    if (a == null) {
53        return -1;
54    }
55    return a.x;
56}
57
58function foo2(a: MyType = new MyType(10), b: MyType = new MyType(20)): int {
59    return a.x + b.x;
60}
61
62function foo3(a: MyType = new MyType(10), b: MyType = new MyType(20), c: MyType = new MyType(30)): int {
63    assert a.x == 5;
64
65    return a.x + b.x + c.x;
66}
67
68function foo4(a?: MyType): int {
69    if (a == null) {
70        return 0;
71    }
72    return a.x;
73}
74
75function foo5(a?: MyType, b?: MyType): int {
76    if (a == null && b == null) {
77        return 0;
78    }
79    if (b == null) {
80        return -1;
81    }
82    return a!.x + b.x;
83}
84
85function foo6(a?: MyType, b?: MyType, c?: MyType): int {
86    assert a!.x == 5;
87    if (b == null && c == null) {
88        return 0;
89    }
90    if (c == null) {
91        return -1;
92    }
93
94    return a!.x + b!.x + c.x;
95}
96
97function foo7(a: MyType = new MyType(5), b?: MyType): int {
98    if (b == null) {
99        return 0;
100    }
101    return a.x + b.x;
102}
103
104function foo8(a?: MyType, b: MyType = new MyType(5), c?: MyType): int {
105    assert b.x == 5;
106
107    if (a == null && c == null) {
108        return 0;
109    }
110
111    return a!.x + b.x + c!.x;
112}
113
114function foo9(a: MyType, b: MyType = new MyType(5)): int {
115    return a.x + b.x;
116}
117
118function foo10(a: MyType, b: MyType = new MyType(5), c: MyType = new MyType(10)): int {
119    return a.x + b.x + c.x;
120}
121
122function foo11(a: MyType, b: MyType, c: MyType = new MyType(5)): int {
123    return a.x + b.x + c.x;
124}
125
126function foo12(a: MyType, b: MyType, c: MyType = new MyType(10), d: MyType = new MyType(5)): int {
127    return a.x + b.x + c.x + d.x;
128}
129