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
16
17class C<T> {
18    constructor (p: T) { this.v = p; }
19    v : T;
20}
21
22type Alias1Array<T> = T[];
23type Alias2Array<T> = C<T>[];
24type Alias3Array<T> = C<T>[][];
25type Alias4Array<T> = ((p: T) => double)[];
26type Alias5Array<T> = (p: T[]) => double;
27type Alias6Array<T> = (p: T[], q: T) => double;
28type Alias7Array<T1, T2> = (p: T1[], q: T2) => double;
29type Alias8Array<T> = [T][];
30type Alias9Array<T> = [C<T>][];
31
32function main() 
33{
34    let v1 : double[] = [1,2,3];                       // double[]
35    v1[0] = new Int(4);
36    assert (v1[0] == 4);
37    assert (v1[1] == 2);
38    assert (v1[2] == 3);
39    
40    let v2 : Alias1Array<double> =  [5, 6, 7];         // double[]
41    v2[0] = new Int(8);
42    assert (v2[0] == 8);
43    assert (v2[1] == 6);
44    assert (v2[2] == 7);
45
46    let v3 : Alias2Array<double> = [new C<double>(9)];  // C<Double>[]
47    assert(v3[0].v == 9);
48    v3[0].v = 10;
49    assert(v3[0].v == 10);
50
51    let v4 : Alias3Array<double> = [[new C<double>(11)]];  // C<Double>[][]
52    assert(v4[0][0].v == 11);
53    v4[0][0].v = 12;
54    assert(v4[0][0].v == 12);
55
56    let v5 : Alias4Array<double> = [(p : double) : double => { return p; }];  // [(p: Double)=>Double]
57    assert(v5[0](13) == 13);
58
59    let v6 : Alias5Array<double> = (p : double[]) : double => { return p[0]; };  // (p: double[])=>Double
60    assert(v6([14.0]) == 14);
61
62    // let v7 : Alias6Array<double> = (p : double[], q: double) : double => { return p[0]; };  // (p: Double[], q: Double)=>Double
63    // assert(v7([15.0], 16) == 15);
64
65    let v9 : Alias7Array<double, double> = (p : double[], q: double) : double => { return p[0]; };  // (p: double[], q: Double)=>Double
66    assert(v9([17.0], 18) == 17);
67
68    let v10 : Alias8Array<double> = [[new Int(18)]];  //  [double][]
69    assert(v10[0][0] == 18);
70
71    let v11 : Alias9Array<double> = [[new C<double>(19)]]; // [C<Double>][]
72    assert(v11[0][0].v == 19);
73}
74