13af6ab5fSopenharmony_ci/*
23af6ab5fSopenharmony_ci * Copyright (c) 2022-2024 Huawei Device Co., Ltd.
33af6ab5fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
43af6ab5fSopenharmony_ci * you may not use this file except in compliance with the License.
53af6ab5fSopenharmony_ci * You may obtain a copy of the License at
63af6ab5fSopenharmony_ci *
73af6ab5fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
83af6ab5fSopenharmony_ci *
93af6ab5fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
103af6ab5fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
113af6ab5fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123af6ab5fSopenharmony_ci * See the License for the specific language governing permissions and
133af6ab5fSopenharmony_ci * limitations under the License.
143af6ab5fSopenharmony_ci */
153af6ab5fSopenharmony_ci
163af6ab5fSopenharmony_ciimport { foo, bar } from "./oh_modules/ohos_lib"
173af6ab5fSopenharmony_ci
183af6ab5fSopenharmony_cifunction restSpread() {
193af6ab5fSopenharmony_ci  const arr = [1, 2, 3];
203af6ab5fSopenharmony_ci  function test(a, ...t) {
213af6ab5fSopenharmony_ci    console.log(a); // 1
223af6ab5fSopenharmony_ci    console.log(t[0]); // 2
233af6ab5fSopenharmony_ci    console.log(t[1]); // 3
243af6ab5fSopenharmony_ci  }
253af6ab5fSopenharmony_ci  test(1, ...arr);
263af6ab5fSopenharmony_ci}
273af6ab5fSopenharmony_ci
283af6ab5fSopenharmony_ciclass MyGenerator {
293af6ab5fSopenharmony_ci  public *getValues() {
303af6ab5fSopenharmony_ci    // you can put the return type Generator<number>, but it is ot necessary as ts will infer
313af6ab5fSopenharmony_ci    let index = 1;
323af6ab5fSopenharmony_ci    while (true) {
333af6ab5fSopenharmony_ci      yield index;
343af6ab5fSopenharmony_ci      index = index + 1;
353af6ab5fSopenharmony_ci
363af6ab5fSopenharmony_ci      if (index > 10) {
373af6ab5fSopenharmony_ci        break;
383af6ab5fSopenharmony_ci      }
393af6ab5fSopenharmony_ci    }
403af6ab5fSopenharmony_ci  }
413af6ab5fSopenharmony_ci}
423af6ab5fSopenharmony_ci
433af6ab5fSopenharmony_cifunction defaultTypeParam<t, tt = string>(i: t, j: tt) {
443af6ab5fSopenharmony_ci  const c = i;
453af6ab5fSopenharmony_ci  const s = j;
463af6ab5fSopenharmony_ci}
473af6ab5fSopenharmony_ci
483af6ab5fSopenharmony_cifunction arrowFunctionTest() {
493af6ab5fSopenharmony_ci  const empty = () => {}; // no return type
503af6ab5fSopenharmony_ci
513af6ab5fSopenharmony_ci  const double = (x: number) => x * 2; // no return type
523af6ab5fSopenharmony_ci
533af6ab5fSopenharmony_ci  const square = (x): number => x * x; // no param type
543af6ab5fSopenharmony_ci
553af6ab5fSopenharmony_ci  const sqrt = (x) => Math.sqrt(x); // shortcut syntax
563af6ab5fSopenharmony_ci  const even = [1, 2, 3, 4, 5, 6].filter((x) => x % 2 === 0); // shortcut syntax
573af6ab5fSopenharmony_ci
583af6ab5fSopenharmony_ci  const foo = (x: number, y): boolean => x == y; // types are partly omitted
593af6ab5fSopenharmony_ci
603af6ab5fSopenharmony_ci  const generic = <T, E>(t: T, e: E) => t; // Generic lambda
613af6ab5fSopenharmony_ci}
623af6ab5fSopenharmony_ci
633af6ab5fSopenharmony_cifunction fooThis(i: number): void {
643af6ab5fSopenharmony_ci  this.c = 10;
653af6ab5fSopenharmony_ci}
663af6ab5fSopenharmony_ciclass C {
673af6ab5fSopenharmony_ci  c: number;
683af6ab5fSopenharmony_ci  m = fooThis;
693af6ab5fSopenharmony_ci}
703af6ab5fSopenharmony_ci
713af6ab5fSopenharmony_cifunction choose<T>(x: T, y: T): T {
723af6ab5fSopenharmony_ci  return Math.random() < 0.5 ? x : y;
733af6ab5fSopenharmony_ci}
743af6ab5fSopenharmony_ciconst choice1 = choose(10, 20);
753af6ab5fSopenharmony_ciconst choice2 = choose<string>('apple', 'orange');
763af6ab5fSopenharmony_ci
773af6ab5fSopenharmony_ciclass Collection<T> {
783af6ab5fSopenharmony_ci  items: T[] = [];
793af6ab5fSopenharmony_ci
803af6ab5fSopenharmony_ci  constructor(...args: T[]) {
813af6ab5fSopenharmony_ci    if (!args) return;
823af6ab5fSopenharmony_ci
833af6ab5fSopenharmony_ci    for (const arg of args) this.items.push(arg);
843af6ab5fSopenharmony_ci  }
853af6ab5fSopenharmony_ci}
863af6ab5fSopenharmony_ciconst col = new Collection<number>(1, 2, 3);
873af6ab5fSopenharmony_ciconst col2 = new Collection('a', 'b', 'c');
883af6ab5fSopenharmony_ci
893af6ab5fSopenharmony_cifunction f(a: string): number {
903af6ab5fSopenharmony_ci  return 42;
913af6ab5fSopenharmony_ci}
923af6ab5fSopenharmony_ci
933af6ab5fSopenharmony_cifoo(f(null));
943af6ab5fSopenharmony_cifoo(null);
953af6ab5fSopenharmony_ci
963af6ab5fSopenharmony_cifoo(() => {
973af6ab5fSopenharmony_ci  f(null);
983af6ab5fSopenharmony_ci});
993af6ab5fSopenharmony_ci
1003af6ab5fSopenharmony_cibar(() => {
1013af6ab5fSopenharmony_ci  f(null);
1023af6ab5fSopenharmony_ci}, null, f(null));
1033af6ab5fSopenharmony_ci
1043af6ab5fSopenharmony_cibar(() => {
1053af6ab5fSopenharmony_ci  bar(() => {
1063af6ab5fSopenharmony_ci    f(null);
1073af6ab5fSopenharmony_ci  }, null, f(null));
1083af6ab5fSopenharmony_ci}, null, foo(f(null)));
1093af6ab5fSopenharmony_ci
1103af6ab5fSopenharmony_citype PropDecorator = () => void;
1113af6ab5fSopenharmony_cilet Builder: PropDecorator;
1123af6ab5fSopenharmony_ci
1133af6ab5fSopenharmony_ci// this test is useless until we use custom tsc
1143af6ab5fSopenharmony_ci@Builder
1153af6ab5fSopenharmony_cifunction buildSwiper() {
1163af6ab5fSopenharmony_ci  f(null)
1173af6ab5fSopenharmony_ci  foo(null) {
1183af6ab5fSopenharmony_ci    f(null)
1193af6ab5fSopenharmony_ci      foo(null) {
1203af6ab5fSopenharmony_ci        f(null)
1213af6ab5fSopenharmony_ci        foo(() => {
1223af6ab5fSopenharmony_ci        f(null)
1233af6ab5fSopenharmony_ci      })
1243af6ab5fSopenharmony_ci    }
1253af6ab5fSopenharmony_ci    .foo(null)
1263af6ab5fSopenharmony_ci  }
1273af6ab5fSopenharmony_ci}
128