1/*
2 * Copyright (c) 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 C<T> {
17    constructor (p: T) { this.v = p; }
18    v: T;
19 }
20
21type Alias1Tuple<T> = [T];
22type Alias2Tuple<T> = [T, Int];
23type Alias3Tuple<T> = [C<T>, double];
24type Alias4Tuple<T1, T2> = [T1[], T2];
25type Alias5Tuple<T1, T2> = [C<T1>[], T2];
26type Alias6Tuple<T1, T2> = [(p: T1) => double, T2];
27
28
29function main() {
30    let v1: [double] = [new Int(1)];                            //  [double]
31    let v2: [double, Int] = [new Double(2), new Int(3)];        //  [Double, Int]
32
33    let v3: Alias1Tuple<double> = [new Int(4)];                 //  [double] 
34    let v4: Alias2Tuple<double> = [new Double(5), new Int(6)];  //  [Double, Int]
35
36    let v5: Alias3Tuple<double> = [new C<double>(7), 8];        //  [C<Double>, Double]
37    assert(v5[0].v == 7);
38    assert(v5[1] == 8);
39
40    let v6: Alias4Tuple<double, double> = [[new Int(9), new Int(10), new Int(11)], 12];  // [double[], Double]
41    assert(v6[0][0] == 9);
42    assert(v6[0][1] == 10);
43    assert(v6[0][2] == 11);
44    assert(v6[1] == 12);
45
46    let v7: Alias5Tuple<double, double> = [[new C<double>(13)], 14];  // [C<Double>[], Double]
47    assert(v7[0][0].v == 13);
48    assert(v7[1] == 14);
49
50    let v9: Alias6Tuple<double, double> = [(p: double) : double => { return p;}, 16];  // [(p: Double) => Double, Double]
51    assert(v9[0](15) == 15);
52    assert(v9[1] == 16);
53}
54