1/*
2 * Copyright (c) 2022-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
16
17function func1(a: number): void {
18
19}
20func1(5);
21
22function func2(a: number): number {
23    return a;
24}
25
26type callAbleObj1 = {
27    (a: number): number
28}
29
30function func3(fn: callAbleObj1): number {
31    return fn(5);
32}
33
34var obj1: callAbleObj1;
35func1(func2(func3(obj1)));
36
37function func4(a: number): number {
38    a++;
39    return a < 0 ? func4(a) : a;
40}
41
42func4(-5);
43func4(0);
44
45function func5(a: number, b: string, ...c) {
46    return 5;
47}
48
49func5(1, "foo");
50func5(1, "foo", 2, true, {});
51
52function func6(a: any, b?: string[], ...c: number[]) {
53    return true;
54}
55
56func6(2);
57func6(false, ["foo"]);
58func6({}, ["foo"], 2, 3, 4);
59
60var func7: { (a: number, b: string): number, (...a): string };
61var b: string = func7();
62var c: string = func7(1);
63var d: number = func7(1, "foo");
64
65var func8: { (a?: number, ...c): boolean, (a: any, b: string[], ...c: number[]): string, (a: number, b: boolean): number };
66var e: boolean = func8();
67var f: boolean = func8(1);
68var g: boolean = func8(2, true);
69var h: boolean = func8(2, ["foo", "bar"], {});
70var i: string = func8({}, ["bar"]);
71var j: string = func8({}, ["bar"], 3, 4, 5);
72
73function func9(a: number, b: string): number;
74function func9(a: string, b: number): number | string;
75function func9(a: number | string, b?: number | string): number | string | boolean {
76    return true;
77}
78
79var k: number = func9(1, "foo");
80var l: number | string = func9("bar", 2);
81
82function func10(a: { x: number, y: string }): number[];
83function func10(a: { x: string, y: number }): number[];
84function func10(a: { x: number | string }) {
85    return [1, 2, 3];
86}
87
88var m: number[] = func10({ x: 1, y: "foo" });
89var m: number[] = func10({ x: "bar", y: 2 });
90