/*

 * Copyright (c) 2023 Huawei Device Co., Ltd.

 * Licensed under the Apache License, Version 2.0 (the "License");

 * you may not use this file except in compliance with the License.

 * You may obtain a copy of the License at

 *

 *     http://www.apache.org/licenses/LICENSE-2.0

 *

 * Unless required by applicable law or agreed to in writing, software

 * distributed under the License is distributed on an "AS IS" BASIS,

 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

 * See the License for the specific language governing permissions and

 * limitations under the License.

 */

declare function print(arg:any, arg1?:any):string;



class cpu {

    public mode: number = 1;

    constructor() {

        this.mode = 4;

    }

    public static add(a: number, b: number): number {

        print(a);

        cpu.sub(a, b);

        var out : number = a + b;

        return out;

    }

    get kind() { 

        print(this.mode);

        return this.mode;

    }

    public static sub(a: number, b: number): number {

        print(b);

        var out : number = a + b;

        return out;

    }

    

    static Constant = 1;

    static Curve = 2;

    static TwoC = 3;

    static TwoCC = 4;

    static test1 = 1;

    static test2 = 2;

    static test3 = 3;

    static test4 = 4;

    static test5 = 1;

    static test6 = 2;

    static test7 = 3;

    static test8 = 4;

    static test9 = 1;

    static test10 = 2;

    static test11 = 3;

    static test12 = 4;

    static test13 = 1;

    static test14 = 2;

    static test14 = 3;

    static test15 = 4;

    static test16 = 1;

    static test17 = 2;

    static test18 = 3;

    static test19 = 4;

    static test20 = 1;

    static test21 = 2;

    static test22 = 3;

    static test23 = 4;

    static test24 = 1;

    static test25 = 2;

    static test26 = 3;

    static test27 = 4;

    static test28 = 2;

    static test29 = 3;

    static test30 = 1;

    static test31 = 2;

    static test32 = 3;

    static test33 = 4;

    static test34 = 1;

    static test35 = 2;

    static test36 = 3;

    static test37 = 4;

    static test38 = 2;

    static test39 = 3;

    static test40 = 1;

    static test41 = 2;

    static test42 = 3;

    static test43 = 4;

    static test44 = 1;

    static test45 = 2;

    static test46 = 3;

    static test47 = 4;

    static test48 = 2;

    static test49 = 3;

    static test50 = 1;

    static test51 = 2;

    static test52 = 3;

    static test53 = 4;

    static test54 = 1;

    static test55 = 2;

    static test56 = 3;

    static test57 = 4;

    static test58 = 2;

    static test59 = 3;

    static test60 = 1;

    static test61 = 2;

    static test62 = 3;

    static test63 = 4;

    static test64 = 1;

    static test65 = 2;

    static test66 = 3;

    static test67 = 4;

    static test68 = 2;

    static test69 = 3;

    static test70 = 1;

    static test71 = 2;

    static test72 = 3;

    static test73 = 4;

    static test74 = 1;

    static test75 = 2;

    static test76 = 3;

    static test77 = 4;

    static test78 = 2;

    static test79 = 3;

    static test80 = 1;

    static test81 = 2;

    static test82 = 3;

    static test83 = 4;

    static test84 = 1;

    static test85 = 2;

    static test86 = 3;

    static test87 = 4;

    static test88 = 2;

    static test89 = 3;

    static test90 = 1;

    static test91 = 2;

    static test92 = 3;

    static test93 = 4;

    static test94 = 1;

    static test95 = 2;

    static test96 = 3;

    static test97 = 4;

    static test98 = 2;

    static test99 = 3;

    static test100 = 2;

    static test101 = 3;

    static test102 = 4;

    static test103 = 1;

    static test104 = 2;

    static test104 = 3;

    static test105 = 4;

    static test106 = 1;

    static test107 = 2;

    static test108 = 3;

    static test109 = 4;

    static test110 = 2;

    static test111 = 3;

    static test112 = 4;

    static test113 = 1;

    static test114 = 2;

    static test114 = 3;

    static test115 = 4;

    static test116 = 1;

    static test117 = 2;

    static test118 = 3;

    static test119 = 4;

}

class cpu1 {

    public mode: number = 1;

    constructor() {

        this.mode = 4;

    }



    public static color1(op: number): number {

        return op;

    }



    public static color(color1:string, op: number): number;



    public static color(color1:number, op: number): number;



    public static color(color1: string | number, op: number): void {

        print("method is ok");

    }



    public static color2(op: number): number {

        return op;

    }



    get kind() { 

        print(this.mode);

        return this.mode;

    }

    static Constant = 1;

    static Curve = 2;

    static TwoC = 3;

    static TwoCC = 4;

}

function foo():number {

	return cpu.Curve;

}

print(foo());

cpu.add(1, 3);

var systems: cpu = new cpu();

print(systems.kind);

cpu.sub(1, 4);

print(cpu1.TwoC);

print(cpu1.length);

cpu1.color();



try {

    cpu1.length = 4;

} catch (e) {

    print(e)

}



class Info {

    isHit: boolean = false;

    hitCount: int = 0;

    distance: number;



    constructor() {

        this.distance = 0;

    }



    toString() :string {

        return 'Intersection [' + this.distance + ']';

    }

}



class Shape {

    intersect(ray: number) : Info {

        return undefined;

    }

    func1(a:any,...A:any) : void {

        for (let p in A) {

            print(A[p]);

        }

    }

}



class Scene {

    shapes : Shape[];

    constructor() {

        this.shapes = new Array();

    }

}



class Sphere extends Shape {

    radius: number;



    constructor(radius: number) {

        super();

        this.radius = radius;

    }



    intersect(ray: number) : Info {

        var info = new Info();

        print("intersect");

        return info;

    }



    func1() : void {

        print("func1")

    }

}



function testIntersection(scene: Scene): number {

    var hits = 0;

    for(var i= 0; i<scene.shapes.length; i++){

        var shape = scene.shapes[i];

        var info = shape.intersect(hits);

        shape.func1(hits);

    }

    return hits;

}



function renderScene(){

    var scene = new Scene();



    var sphere = new Sphere(3);



    var sphere1 = new Sphere(4);



    scene.shapes.push(sphere);

    scene.shapes.push(sphere1);



    testIntersection(scene);

}

renderScene();

let sh = new Shape();

sh.func1(1, 2);



class Node{

    public map : string;

    public nodeType : number;

    public parentNode : Node;

    public childNode : Node;



    constructor(radius: number) {

        this.map = "hh";

        this.nodeType = 1;

        this.parentNode = null;

        this.childNode = null;

    }



    public lookup(names: string) : void {

        var el = this;

        while (el) {

            var map = el.map;

            if (map == names) {

                print(map)

            }

            el = el.nodeType == 1 ? el.childNode : el.parentNode;

            const tmp = Node.Constant;

            print(el);

        }

    }



    static Constant = 1;

    static Curve = 2;

    static TwoC = 3;

}

Object.defineProperty(Node, "property1", {

    value: 32,

    writable: false

});

let obj = new Node();

obj.lookup("hh");