MIRROR: javascript for 馃悳's, a tiny runtime with big ambitions
1import { test, summary } from './helpers.js';
2
3console.log('Getter/Setter Tests\n');
4
5let obj1 = {
6 get value() {
7 return 42;
8 }
9};
10test('basic getter', obj1.value, 42);
11
12let obj2 = {
13 _count: 0,
14 get count() {
15 return this._count;
16 },
17 set count(val) {
18 this._count = val;
19 }
20};
21test('getter initial value', obj2.count, 0);
22obj2.count = 10;
23test('setter updates value', obj2.count, 10);
24
25let obj3 = {
26 firstName: 'John',
27 lastName: 'Doe',
28 get fullName() {
29 return this.firstName + ' ' + this.lastName;
30 }
31};
32test('computed getter', obj3.fullName, 'John Doe');
33
34let obj4 = {
35 get 'special-key'() {
36 return 'special';
37 }
38};
39test('string key getter', obj4['special-key'], 'special');
40
41let obj5 = {
42 get 0() {
43 return 'zero';
44 }
45};
46test('number key getter', obj5[0], 'zero');
47
48let obj6 = {
49 _x: 0,
50 _y: 0,
51 get x() {
52 return this._x;
53 },
54 set x(v) {
55 this._x = v;
56 },
57 get y() {
58 return this._y;
59 },
60 set y(v) {
61 this._y = v;
62 }
63};
64obj6.x = 5;
65obj6.y = 10;
66test('multiple getters x', obj6.x, 5);
67test('multiple getters y', obj6.y, 10);
68
69let obj7 = {
70 get data() {
71 return { a: 1, b: 2 };
72 }
73};
74test('getter returns object', obj7.data.a, 1);
75
76let obj8 = {
77 _age: 0,
78 get age() {
79 return this._age;
80 },
81 set age(val) {
82 if (val < 0) val = 0;
83 this._age = val;
84 }
85};
86obj8.age = -5;
87test('setter validation', obj8.age, 0);
88obj8.age = 25;
89test('setter valid value', obj8.age, 25);
90
91let obj9 = {
92 get readonly() {
93 return 'constant';
94 }
95};
96test('getter-only read', obj9.readonly, 'constant');
97obj9.readonly = 'changed';
98test('getter-only unchanged', obj9.readonly, 'constant');
99
100let strictError = (function () {
101 'use strict';
102 try {
103 let strictObj = {
104 get x() {
105 return 1;
106 }
107 };
108 strictObj.x = 2;
109 return false;
110 } catch (e) {
111 return e instanceof TypeError;
112 }
113})();
114test('strict mode getter-only throws', strictError, true);
115
116let obj10 = {
117 multiplier: 3,
118 _value: 7,
119 get computed() {
120 return this._value * this.multiplier;
121 }
122};
123test('getter with this', obj10.computed, 21);
124
125let sideEffect = 0;
126let obj11 = {
127 set trigger(val) {
128 sideEffect = val * 2;
129 }
130};
131obj11.trigger = 5;
132test('setter side effect', sideEffect, 10);
133
134summary();