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
16function main():void{
17    let boo = new bar()
18
19    assert boo.foo1() == 10;
20    assert boo.foo2() == "a";
21    assert boo.foo3() == true;
22
23    assert boo.foo4() == 30;
24    assert boo.foo4(new Int(5)) == 25;
25
26    assert boo.foo5(new Int(5)) == 55;
27    assert boo.foo5(new Int(5),new Int(10)) == 45;
28
29
30    assert boo.foo6() == undefined;
31    assert boo.foo7() == undefined;
32    assert boo.foo8() == undefined;
33
34    assert boo.foo9() == 0;
35    assert boo.foo9(new Int(5)) == -1;
36
37    assert boo.foo10(new Int(5)) == 0;
38    assert boo.foo10(new Int(5),new Int(10)) == -1;
39
40    assert boo.foo11() == 0;
41    assert boo.foo12() == 0;
42
43    assert boo.foo13(new Int(10)) == 15;
44    assert boo.foo14(new Int(10)) == 25;
45
46    assert boo.foo15(new Int(10),new Int(5)) == 20;
47    assert boo.foo16(new Int(10),new Int(5)) == 30;
48}
49
50class bar {
51    foo1(a : Int = 10) : Int {
52        return a;
53    }
54
55    foo2(a : string = "a") : string {
56        return a;
57    }
58
59    foo3(a : Boolean = true) : Boolean {
60        return a;
61    }
62
63    foo4(a : Int = 10, b : Int = 20) : Int {
64        return a + b;
65    }
66
67    foo5(a : Int = 10, b : Int = 20, c : Int = 30) : Int {
68        assert a == 5;
69
70        return a + b + c;
71    }
72
73    foo6(a? : Int) : Int|undefined {
74        return a;
75    }
76
77    foo7(a? : string) : string|undefined {
78        return a;
79    }
80
81    foo8(a? : Boolean) : Boolean|undefined {
82        return a;
83    }
84
85    foo9(a? : Int, b? : Int) : Int {
86        if(a == undefined && b == undefined){
87            return 0;
88        }
89        if(b == undefined){
90            return -1;
91        }
92        return a! + b;
93    }
94
95    foo10(a? : Int, b? : Int, c? : Int) : Int {
96        assert a! == 5;
97        if(b == undefined && c == undefined){
98            return 0;
99        }
100        if(c == undefined){
101            return -1;
102        }
103
104        return a! + b! + c;
105    }
106
107    foo11(a : Int = 5, b? : Int) : Int {
108        if(b == undefined){
109            return 0;
110        }
111        return a + b;
112    }
113
114    foo12(a? : Int, b : Int = 5, c? : Int) : Int {
115        assert b == 5;
116
117        if(a == undefined && c == undefined){
118            return 0;
119        }
120
121        return a! + b + c!;
122    }
123
124    foo13(a : Int, b : Int = 5) : Int {
125        return a + b;
126    }
127
128    foo14(a : Int, b : Int = 5, c : Int = 10) : Int {
129        return a + b + c;
130    }
131
132    foo15(a : Int, b : Int, c : Int = 5) : Int {
133        return a + b + c;
134    }
135
136    foo16(a : Int, b : Int, c : Int = 10, d : Int = 5) : Int {
137        return a + b + c + d;
138    }
139}
140