14514f5e3Sopenharmony_ci/*
24514f5e3Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
34514f5e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
44514f5e3Sopenharmony_ci * you may not use this file except in compliance with the License.
54514f5e3Sopenharmony_ci * You may obtain a copy of the License at
64514f5e3Sopenharmony_ci *
74514f5e3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
84514f5e3Sopenharmony_ci *
94514f5e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
104514f5e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
114514f5e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124514f5e3Sopenharmony_ci * See the License for the specific language governing permissions and
134514f5e3Sopenharmony_ci * limitations under the License.
144514f5e3Sopenharmony_ci */
154514f5e3Sopenharmony_ci
164514f5e3Sopenharmony_ci// 1. sendable can only inherit from sendable
174514f5e3Sopenharmony_citry {
184514f5e3Sopenharmony_ci  class SendableParent {
194514f5e3Sopenharmony_ci    constructor() {
204514f5e3Sopenharmony_ci      'use sendable';
214514f5e3Sopenharmony_ci    }
224514f5e3Sopenharmony_ci  }
234514f5e3Sopenharmony_ci  class SendableChild extends SendableParent {
244514f5e3Sopenharmony_ci    constructor() {
254514f5e3Sopenharmony_ci      'use sendable';
264514f5e3Sopenharmony_ci      super();
274514f5e3Sopenharmony_ci    }
284514f5e3Sopenharmony_ci  }
294514f5e3Sopenharmony_ci  print('sendable inherit from sendable succeed.');
304514f5e3Sopenharmony_ci} catch (err) {
314514f5e3Sopenharmony_ci  print('sendable inherit from sendable failed. err: ' + err + ', code: ' + err.code);
324514f5e3Sopenharmony_ci}
334514f5e3Sopenharmony_citry {
344514f5e3Sopenharmony_ci  class Parent {
354514f5e3Sopenharmony_ci    constructor() {}
364514f5e3Sopenharmony_ci  }
374514f5e3Sopenharmony_ci  class SendableChild extends Parent {
384514f5e3Sopenharmony_ci    constructor() {
394514f5e3Sopenharmony_ci      'use sendable';
404514f5e3Sopenharmony_ci      super();
414514f5e3Sopenharmony_ci    }
424514f5e3Sopenharmony_ci  }
434514f5e3Sopenharmony_ci  print('sendable inherit from sendable succeed.');
444514f5e3Sopenharmony_ci} catch (err) {
454514f5e3Sopenharmony_ci  print('sendable inherit from non-sendable failed. err: ' + err + ', code: ' + err.code);
464514f5e3Sopenharmony_ci}
474514f5e3Sopenharmony_citry {
484514f5e3Sopenharmony_ci  class A {
494514f5e3Sopenharmony_ci    constructor() {
504514f5e3Sopenharmony_ci      'use sendable';
514514f5e3Sopenharmony_ci    }
524514f5e3Sopenharmony_ci  }
534514f5e3Sopenharmony_ci  class B extends A {
544514f5e3Sopenharmony_ci    constructor() {
554514f5e3Sopenharmony_ci      'use sendable';
564514f5e3Sopenharmony_ci      super();
574514f5e3Sopenharmony_ci    }
584514f5e3Sopenharmony_ci  }
594514f5e3Sopenharmony_ci  let b = new B();
604514f5e3Sopenharmony_ci  b.__proto__ = new A();
614514f5e3Sopenharmony_ci  print('sendable change proto succeed.');
624514f5e3Sopenharmony_ci} catch (err) {
634514f5e3Sopenharmony_ci  print('sendable change proto failed. err: ' + err + ', code: ' + err.code);
644514f5e3Sopenharmony_ci}
654514f5e3Sopenharmony_ci
664514f5e3Sopenharmony_ci// 2. non-sendable can not inherit from sendable
674514f5e3Sopenharmony_citry {
684514f5e3Sopenharmony_ci  class Parent {
694514f5e3Sopenharmony_ci    constructor() {}
704514f5e3Sopenharmony_ci  }
714514f5e3Sopenharmony_ci  class Child extends Parent {
724514f5e3Sopenharmony_ci    constructor() {
734514f5e3Sopenharmony_ci      super();
744514f5e3Sopenharmony_ci    }
754514f5e3Sopenharmony_ci  }
764514f5e3Sopenharmony_ci  print('non-sendable inherit from non-sendable succeed.');
774514f5e3Sopenharmony_ci} catch (err) {
784514f5e3Sopenharmony_ci  print('non-sendable inherit from non-sendable failed. err: ' + err + ', code: ' + err.code);
794514f5e3Sopenharmony_ci}
804514f5e3Sopenharmony_citry {
814514f5e3Sopenharmony_ci  class SendableParent {
824514f5e3Sopenharmony_ci    constructor() {
834514f5e3Sopenharmony_ci      'use sendable';
844514f5e3Sopenharmony_ci    }
854514f5e3Sopenharmony_ci  }
864514f5e3Sopenharmony_ci  class Child extends SendableParent {
874514f5e3Sopenharmony_ci    constructor() {
884514f5e3Sopenharmony_ci      super();
894514f5e3Sopenharmony_ci    }
904514f5e3Sopenharmony_ci  }
914514f5e3Sopenharmony_ci  print('non-sendable inherit from sendable succeed.');
924514f5e3Sopenharmony_ci} catch (err) {
934514f5e3Sopenharmony_ci  print('non-sendable inherit from sendable failed. err: ' + err + ', code: ' + err.code);
944514f5e3Sopenharmony_ci}
954514f5e3Sopenharmony_ci
964514f5e3Sopenharmony_ci// 3. non-sendable can not implement sendable
974514f5e3Sopenharmony_ci
984514f5e3Sopenharmony_ci// 4. sendable can only contain sendable
994514f5e3Sopenharmony_citry {
1004514f5e3Sopenharmony_ci  class A {
1014514f5e3Sopenharmony_ci    constructor() {
1024514f5e3Sopenharmony_ci      'use sendable';
1034514f5e3Sopenharmony_ci    }
1044514f5e3Sopenharmony_ci  }
1054514f5e3Sopenharmony_ci  class B {
1064514f5e3Sopenharmony_ci    a: A | null = null;
1074514f5e3Sopenharmony_ci    constructor(a: A) {
1084514f5e3Sopenharmony_ci      'use sendable';
1094514f5e3Sopenharmony_ci      this.a = a;
1104514f5e3Sopenharmony_ci    }
1114514f5e3Sopenharmony_ci  }
1124514f5e3Sopenharmony_ci  let b = new B(new A());
1134514f5e3Sopenharmony_ci  print('sendable contain sendable succeed.');
1144514f5e3Sopenharmony_ci} catch (err) {
1154514f5e3Sopenharmony_ci  print('sendable contain sendable failed. err: ' + err + ', code: ' + err.code);
1164514f5e3Sopenharmony_ci}
1174514f5e3Sopenharmony_citry {
1184514f5e3Sopenharmony_ci  class A {
1194514f5e3Sopenharmony_ci    constructor() {}
1204514f5e3Sopenharmony_ci  }
1214514f5e3Sopenharmony_ci  class B {
1224514f5e3Sopenharmony_ci    a: A | null = null;
1234514f5e3Sopenharmony_ci    constructor(a: A) {
1244514f5e3Sopenharmony_ci      'use sendable';
1254514f5e3Sopenharmony_ci      this.a = a;
1264514f5e3Sopenharmony_ci    }
1274514f5e3Sopenharmony_ci  }
1284514f5e3Sopenharmony_ci  let b = new B(new A());
1294514f5e3Sopenharmony_ci  print('sendable contain non-sendable succeed.');
1304514f5e3Sopenharmony_ci} catch (err) {
1314514f5e3Sopenharmony_ci  print('sendable contain non-sendable failed. err: ' + err + ', code: ' + err.code);
1324514f5e3Sopenharmony_ci}
1334514f5e3Sopenharmony_citry {
1344514f5e3Sopenharmony_ci  class A {
1354514f5e3Sopenharmony_ci    constructor() {}
1364514f5e3Sopenharmony_ci  }
1374514f5e3Sopenharmony_ci  class B {
1384514f5e3Sopenharmony_ci    static a: A | null = new A();
1394514f5e3Sopenharmony_ci    constructor() {
1404514f5e3Sopenharmony_ci      'use sendable';
1414514f5e3Sopenharmony_ci    }
1424514f5e3Sopenharmony_ci  }
1434514f5e3Sopenharmony_ci  print('sendable contain static non-sendable succeed.');
1444514f5e3Sopenharmony_ci} catch (err) {
1454514f5e3Sopenharmony_ci  print('sendable contain static non-sendable failed. err: ' + err + ', code: ' + err.code);
1464514f5e3Sopenharmony_ci}
1474514f5e3Sopenharmony_citry {
1484514f5e3Sopenharmony_ci  class B {
1494514f5e3Sopenharmony_ci    static b: B;
1504514f5e3Sopenharmony_ci    constructor() {
1514514f5e3Sopenharmony_ci      'use sendable';
1524514f5e3Sopenharmony_ci    }
1534514f5e3Sopenharmony_ci  }
1544514f5e3Sopenharmony_ci  print('sendable contain undefined succeed.');
1554514f5e3Sopenharmony_ci} catch (err) {
1564514f5e3Sopenharmony_ci  print('sendable contain undefined failed. err: ' + err + ', code: ' + err.code);
1574514f5e3Sopenharmony_ci}
1584514f5e3Sopenharmony_ci
1594514f5e3Sopenharmony_ci// 5. template type of collections must be sendable
1604514f5e3Sopenharmony_ci
1614514f5e3Sopenharmony_ci// 6. sendable can not use ! assertion
1624514f5e3Sopenharmony_ci
1634514f5e3Sopenharmony_ci// 7. sendable can not use computeed property names
1644514f5e3Sopenharmony_ci
1654514f5e3Sopenharmony_ci// 8. sendable can not use variables in current context
1664514f5e3Sopenharmony_citry {
1674514f5e3Sopenharmony_ci  class B {
1684514f5e3Sopenharmony_ci    constructor() {
1694514f5e3Sopenharmony_ci      'use sendable';
1704514f5e3Sopenharmony_ci    }
1714514f5e3Sopenharmony_ci  }
1724514f5e3Sopenharmony_ci  function bar(): B {
1734514f5e3Sopenharmony_ci    return new B();
1744514f5e3Sopenharmony_ci  }
1754514f5e3Sopenharmony_ci  class C {
1764514f5e3Sopenharmony_ci    constructor() {
1774514f5e3Sopenharmony_ci      'use sendable';
1784514f5e3Sopenharmony_ci    }
1794514f5e3Sopenharmony_ci    v: B = new B();
1804514f5e3Sopenharmony_ci    u: B = bar();
1814514f5e3Sopenharmony_ci    foo() {
1824514f5e3Sopenharmony_ci      return new B();
1834514f5e3Sopenharmony_ci    }
1844514f5e3Sopenharmony_ci  }
1854514f5e3Sopenharmony_ci  print('sendable contain lexenv succeed.');
1864514f5e3Sopenharmony_ci} catch (err) {
1874514f5e3Sopenharmony_ci  print('sendable contain lexenv failed. err: ' + err + ', code: ' + err.code);
1884514f5e3Sopenharmony_ci}
1894514f5e3Sopenharmony_ci
1904514f5e3Sopenharmony_ci// 9. sendable can not use decorator except @sendable
1914514f5e3Sopenharmony_citry {
1924514f5e3Sopenharmony_ci  class A {
1934514f5e3Sopenharmony_ci    constructor() {
1944514f5e3Sopenharmony_ci      'use sendable';
1954514f5e3Sopenharmony_ci      'use concurrent';
1964514f5e3Sopenharmony_ci    }
1974514f5e3Sopenharmony_ci  }
1984514f5e3Sopenharmony_ci  class B {
1994514f5e3Sopenharmony_ci    constructor() {
2004514f5e3Sopenharmony_ci      'use sendable';
2014514f5e3Sopenharmony_ci    }
2024514f5e3Sopenharmony_ci    foo() {
2034514f5e3Sopenharmony_ci      'use concurrent';
2044514f5e3Sopenharmony_ci    }
2054514f5e3Sopenharmony_ci  }
2064514f5e3Sopenharmony_ci  print('sendable with concurrent decorator succeed.');
2074514f5e3Sopenharmony_ci} catch (err) {
2084514f5e3Sopenharmony_ci  print('sendable with concurrent decorator failed. err: ' + err + ', code: ' + err.code);
2094514f5e3Sopenharmony_ci}
2104514f5e3Sopenharmony_ci
2114514f5e3Sopenharmony_ci// 10. sendable can not be initial with object or array
2124514f5e3Sopenharmony_ci
2134514f5e3Sopenharmony_ci// 11. non-sendable can not be `as` sendable
2144514f5e3Sopenharmony_ci
2154514f5e3Sopenharmony_ci// 12. the rest
2164514f5e3Sopenharmony_citry {
2174514f5e3Sopenharmony_ci  class A {
2184514f5e3Sopenharmony_ci    constructor() {
2194514f5e3Sopenharmony_ci      'use sendable';
2204514f5e3Sopenharmony_ci    }
2214514f5e3Sopenharmony_ci  }
2224514f5e3Sopenharmony_ci  let a = new A();
2234514f5e3Sopenharmony_ci  a.age = 0;
2244514f5e3Sopenharmony_ci  print('sendable add property succeed.');
2254514f5e3Sopenharmony_ci} catch (err) {
2264514f5e3Sopenharmony_ci  print('sendable add property failed. err: ' + err + ', code: ' + err.code);
2274514f5e3Sopenharmony_ci}
2284514f5e3Sopenharmony_citry {
2294514f5e3Sopenharmony_ci  class A {
2304514f5e3Sopenharmony_ci    age: number;
2314514f5e3Sopenharmony_ci    constructor() {
2324514f5e3Sopenharmony_ci      'use sendable';
2334514f5e3Sopenharmony_ci    }
2344514f5e3Sopenharmony_ci  }
2354514f5e3Sopenharmony_ci  let a = new A();
2364514f5e3Sopenharmony_ci  a.age = '0';
2374514f5e3Sopenharmony_ci  print('sendable change property succeed.');
2384514f5e3Sopenharmony_ci} catch (err) {
2394514f5e3Sopenharmony_ci  print('sendable change property failed. err: ' + err + ', code: ' + err.code);
2404514f5e3Sopenharmony_ci}
2414514f5e3Sopenharmony_citry {
2424514f5e3Sopenharmony_ci  class A {
2434514f5e3Sopenharmony_ci    age: number;
2444514f5e3Sopenharmony_ci    constructor() {
2454514f5e3Sopenharmony_ci      'use sendable';
2464514f5e3Sopenharmony_ci      this.age = 0;
2474514f5e3Sopenharmony_ci    }
2484514f5e3Sopenharmony_ci  }
2494514f5e3Sopenharmony_ci  let a = new A();
2504514f5e3Sopenharmony_ci  delete a.age;
2514514f5e3Sopenharmony_ci  print('sendable delete property succeed.');
2524514f5e3Sopenharmony_ci} catch (err) {
2534514f5e3Sopenharmony_ci  print('sendable delete property failed. err: ' + err + ', code: ' + err.code);
2544514f5e3Sopenharmony_ci}
2554514f5e3Sopenharmony_ci//sendable can not change attr.
2564514f5e3Sopenharmony_ciclass Test {
2574514f5e3Sopenharmony_ci  v: number = 123
2584514f5e3Sopenharmony_ci  constructor() {
2594514f5e3Sopenharmony_ci    'use sendable'
2604514f5e3Sopenharmony_ci  }
2614514f5e3Sopenharmony_ci}
2624514f5e3Sopenharmony_ci
2634514f5e3Sopenharmony_cilet test = new Test()
2644514f5e3Sopenharmony_citry {
2654514f5e3Sopenharmony_ci  Object.defineProperty(test, 'v', {
2664514f5e3Sopenharmony_ci    value: 42,
2674514f5e3Sopenharmony_ci    writable: false,
2684514f5e3Sopenharmony_ci  });
2694514f5e3Sopenharmony_ci} catch (e) {
2704514f5e3Sopenharmony_ci  print("sendable can not change attr. err: " + e);
2714514f5e3Sopenharmony_ci}
272