1425bb815Sopenharmony_ci/* Copyright JS Foundation and other contributors, http://js.foundation
2425bb815Sopenharmony_ci *
3425bb815Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4425bb815Sopenharmony_ci * you may not use this file except in compliance with the License.
5425bb815Sopenharmony_ci * You may obtain a copy of the License at
6425bb815Sopenharmony_ci *
7425bb815Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8425bb815Sopenharmony_ci *
9425bb815Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10425bb815Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS
11425bb815Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12425bb815Sopenharmony_ci * See the License for the specific language governing permissions and
13425bb815Sopenharmony_ci * limitations under the License.
14425bb815Sopenharmony_ci */
15425bb815Sopenharmony_ci
16425bb815Sopenharmony_ciclass Animal {
17425bb815Sopenharmony_ci  constructor (name) {
18425bb815Sopenharmony_ci    this.name = name;
19425bb815Sopenharmony_ci  }
20425bb815Sopenharmony_ci
21425bb815Sopenharmony_ci  hello () {
22425bb815Sopenharmony_ci    return "Hello I am " + this.name;
23425bb815Sopenharmony_ci  }
24425bb815Sopenharmony_ci
25425bb815Sopenharmony_ci  static speak () {
26425bb815Sopenharmony_ci    return "Animals roar.";
27425bb815Sopenharmony_ci  }
28425bb815Sopenharmony_ci
29425bb815Sopenharmony_ci  static explain () {
30425bb815Sopenharmony_ci    return "I can walk,";
31425bb815Sopenharmony_ci  }
32425bb815Sopenharmony_ci
33425bb815Sopenharmony_ci  whoAmI () {
34425bb815Sopenharmony_ci    return "I am an Animal.";
35425bb815Sopenharmony_ci  }
36425bb815Sopenharmony_ci
37425bb815Sopenharmony_ci  breath () {
38425bb815Sopenharmony_ci    return "I am breathing.";
39425bb815Sopenharmony_ci  }
40425bb815Sopenharmony_ci
41425bb815Sopenharmony_ci  get myName () {
42425bb815Sopenharmony_ci    return this.name;
43425bb815Sopenharmony_ci  }
44425bb815Sopenharmony_ci
45425bb815Sopenharmony_ci  set rename (name) {
46425bb815Sopenharmony_ci    this.name = name;
47425bb815Sopenharmony_ci  }
48425bb815Sopenharmony_ci}
49425bb815Sopenharmony_ci
50425bb815Sopenharmony_ciclass Dog extends Animal {
51425bb815Sopenharmony_ci  constructor (name, barks) {
52425bb815Sopenharmony_ci    super (name);
53425bb815Sopenharmony_ci    this.barks = barks;
54425bb815Sopenharmony_ci  }
55425bb815Sopenharmony_ci
56425bb815Sopenharmony_ci  hello () {
57425bb815Sopenharmony_ci    return super.hello () + " and I can " + (this.barks ? "bark" : "not bark");
58425bb815Sopenharmony_ci  }
59425bb815Sopenharmony_ci
60425bb815Sopenharmony_ci  whoAmI () {
61425bb815Sopenharmony_ci    return "I am a Dog.";
62425bb815Sopenharmony_ci  }
63425bb815Sopenharmony_ci
64425bb815Sopenharmony_ci  static speak () {
65425bb815Sopenharmony_ci    return "Dogs bark.";
66425bb815Sopenharmony_ci  }
67425bb815Sopenharmony_ci
68425bb815Sopenharmony_ci  static explain () {
69425bb815Sopenharmony_ci    return super.explain () + " jump,";
70425bb815Sopenharmony_ci  }
71425bb815Sopenharmony_ci
72425bb815Sopenharmony_ci  bark () {
73425bb815Sopenharmony_ci    return this.barks ? "Woof" : "----";
74425bb815Sopenharmony_ci  }
75425bb815Sopenharmony_ci}
76425bb815Sopenharmony_ci
77425bb815Sopenharmony_ciclass Doge extends Dog {
78425bb815Sopenharmony_ci  constructor (name, barks, awesomeness) {
79425bb815Sopenharmony_ci    super (name, barks);
80425bb815Sopenharmony_ci    this.awesomeness = awesomeness;
81425bb815Sopenharmony_ci  }
82425bb815Sopenharmony_ci
83425bb815Sopenharmony_ci  hello () {
84425bb815Sopenharmony_ci    return super.hello () + " and I'm " + (this.awesomeness > 9000 ? "super awesome" : "awesome") + ".";
85425bb815Sopenharmony_ci  }
86425bb815Sopenharmony_ci
87425bb815Sopenharmony_ci  whoAmI ( ) {
88425bb815Sopenharmony_ci    return "I am a Doge.";
89425bb815Sopenharmony_ci  }
90425bb815Sopenharmony_ci
91425bb815Sopenharmony_ci  static speak () {
92425bb815Sopenharmony_ci    return "Doges wow.";
93425bb815Sopenharmony_ci  }
94425bb815Sopenharmony_ci
95425bb815Sopenharmony_ci  static explain () {
96425bb815Sopenharmony_ci    return super.explain () + " dance.";
97425bb815Sopenharmony_ci  }
98425bb815Sopenharmony_ci}
99425bb815Sopenharmony_ci
100425bb815Sopenharmony_civar doge = new Doge ("doggoe", true, 10000);
101425bb815Sopenharmony_ciassert (doge.name === "doggoe");
102425bb815Sopenharmony_cidoge.rename = "doggo";
103425bb815Sopenharmony_ciassert (doge.myName === "doggo");
104425bb815Sopenharmony_ciassert (doge.barks === true);
105425bb815Sopenharmony_ciassert (doge.awesomeness === 10000);
106425bb815Sopenharmony_ciassert (doge.hello () === "Hello I am doggo and I can bark and I'm super awesome.");
107425bb815Sopenharmony_ciassert (doge.whoAmI () === "I am a Doge.");
108425bb815Sopenharmony_ciassert (doge.breath () === "I am breathing.");
109425bb815Sopenharmony_ciassert (doge.bark () === "Woof");
110425bb815Sopenharmony_ciassert (Doge.speak () === "Doges wow.");
111425bb815Sopenharmony_ciassert (Doge.explain () === "I can walk, jump, dance.");
112425bb815Sopenharmony_ciassert (doge instanceof Animal);
113425bb815Sopenharmony_ciassert (doge instanceof Dog);
114425bb815Sopenharmony_ciassert (doge instanceof Doge);
115425bb815Sopenharmony_ciassert (Dog.prototype.constructor === Dog)
116425bb815Sopenharmony_ciassert (Doge.prototype.constructor === Doge)
117