13af6ab5fSopenharmony_ci/*
23af6ab5fSopenharmony_ci * Copyright (c) 2023-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_ciconst num: int = 1;
173af6ab5fSopenharmony_ciconst param: int = 2;
183af6ab5fSopenharmony_ci
193af6ab5fSopenharmony_ciclass A {
203af6ab5fSopenharmony_ci    static invoke(): int {
213af6ab5fSopenharmony_ci        return num;
223af6ab5fSopenharmony_ci    }
233af6ab5fSopenharmony_ci}
243af6ab5fSopenharmony_ci
253af6ab5fSopenharmony_ciclass B extends A {
263af6ab5fSopenharmony_ci
273af6ab5fSopenharmony_ci}
283af6ab5fSopenharmony_ci
293af6ab5fSopenharmony_ciclass C extends A {
303af6ab5fSopenharmony_ci    static invoke(a: int): int {
313af6ab5fSopenharmony_ci        return a;
323af6ab5fSopenharmony_ci    }
333af6ab5fSopenharmony_ci}
343af6ab5fSopenharmony_ci
353af6ab5fSopenharmony_ciclass D extends A {
363af6ab5fSopenharmony_ci    static invoke(cb: ()=>void): int {
373af6ab5fSopenharmony_ci        cb();
383af6ab5fSopenharmony_ci        return num;
393af6ab5fSopenharmony_ci    }
403af6ab5fSopenharmony_ci}
413af6ab5fSopenharmony_ci
423af6ab5fSopenharmony_cifunction call_static_invoke_method() {
433af6ab5fSopenharmony_ci    assert A() == num : "expected: " + num + " actual: " + A();
443af6ab5fSopenharmony_ci    assert B() == num : "expected: " + num + " actual: " + B();
453af6ab5fSopenharmony_ci    assert C(param) == param : "expected: " + param + " actual: " + C(param);
463af6ab5fSopenharmony_ci    let d = D() {};
473af6ab5fSopenharmony_ci    assert d == num : "expected: " + num + " actual: " + d;
483af6ab5fSopenharmony_ci}
493af6ab5fSopenharmony_ci
503af6ab5fSopenharmony_ciclass Z {
513af6ab5fSopenharmony_ci    z_: int = 0;
523af6ab5fSopenharmony_ci
533af6ab5fSopenharmony_ci    build(): int {
543af6ab5fSopenharmony_ci        return this.z_;
553af6ab5fSopenharmony_ci    }
563af6ab5fSopenharmony_ci
573af6ab5fSopenharmony_ci    static instantiate<T extends Z>(factory: ()=>T): T {
583af6ab5fSopenharmony_ci        let z = factory();
593af6ab5fSopenharmony_ci        z.build();
603af6ab5fSopenharmony_ci        return z;
613af6ab5fSopenharmony_ci    }
623af6ab5fSopenharmony_ci}
633af6ab5fSopenharmony_ci
643af6ab5fSopenharmony_ciclass Y {
653af6ab5fSopenharmony_ci    static instantiate<T extends Y>(factory: ()=>T, num: int): T {
663af6ab5fSopenharmony_ci        num++;
673af6ab5fSopenharmony_ci        let y = factory();
683af6ab5fSopenharmony_ci        return y;
693af6ab5fSopenharmony_ci    }
703af6ab5fSopenharmony_ci}
713af6ab5fSopenharmony_ci
723af6ab5fSopenharmony_cifunction call_static_instantiate_method() {
733af6ab5fSopenharmony_ci    Z();
743af6ab5fSopenharmony_ci    Y(1);
753af6ab5fSopenharmony_ci}
763af6ab5fSopenharmony_ci
773af6ab5fSopenharmony_cifunction main() {
783af6ab5fSopenharmony_ci    call_static_invoke_method();
793af6ab5fSopenharmony_ci    call_static_instantiate_method();
803af6ab5fSopenharmony_ci}
81