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
16import { foo, bar } from "./oh_modules/ohos_lib"
17
18function restSpread() {
19  const arr = [1, 2, 3];
20  function test(a, ...t) {
21    console.log(a); // 1
22    console.log(t[0]); // 2
23    console.log(t[1]); // 3
24  }
25  test(1, ...arr);
26}
27
28class MyGenerator {
29  public *getValues() {
30    // you can put the return type Generator<number>, but it is ot necessary as ts will infer
31    let index = 1;
32    while (true) {
33      yield index;
34      index = index + 1;
35
36      if (index > 10) {
37        break;
38      }
39    }
40  }
41}
42
43function defaultTypeParam<t, tt = string>(i: t, j: tt) {
44  const c = i;
45  const s = j;
46}
47
48function arrowFunctionTest() {
49  const empty = () => {}; // no return type
50
51  const double = (x: number) => x * 2; // no return type
52
53  const square = (x): number => x * x; // no param type
54
55  const sqrt = (x) => Math.sqrt(x); // shortcut syntax
56  const even = [1, 2, 3, 4, 5, 6].filter((x) => x % 2 === 0); // shortcut syntax
57
58  const foo = (x: number, y): boolean => x == y; // types are partly omitted
59
60  const generic = <T, E>(t: T, e: E) => t; // Generic lambda
61}
62
63function fooThis(i: number): void {
64  this.c = 10;
65}
66class C {
67  c: number;
68  m = fooThis;
69}
70
71function choose<T>(x: T, y: T): T {
72  return Math.random() < 0.5 ? x : y;
73}
74const choice1 = choose(10, 20);
75const choice2 = choose<string>('apple', 'orange');
76
77class Collection<T> {
78  items: T[] = [];
79
80  constructor(...args: T[]) {
81    if (!args) return;
82
83    for (const arg of args) this.items.push(arg);
84  }
85}
86const col = new Collection<number>(1, 2, 3);
87const col2 = new Collection('a', 'b', 'c');
88
89function f(a: string): number {
90  return 42;
91}
92
93foo(f(null));
94foo(null);
95
96foo(() => {
97  f(null);
98});
99
100bar(() => {
101  f(null);
102}, null, f(null));
103
104bar(() => {
105  bar(() => {
106    f(null);
107  }, null, f(null));
108}, null, foo(f(null)));
109
110type PropDecorator = () => void;
111let Builder: PropDecorator;
112
113// this test is useless until we use custom tsc
114@Builder
115function buildSwiper() {
116  f(null)
117  foo(null) {
118    f(null)
119      foo(null) {
120        f(null)
121        foo(() => {
122        f(null)
123      })
124    }
125    .foo(null)
126  }
127}
128