MIRROR: javascript for 馃悳's, a tiny runtime with big ambitions
1import { test, summary } from './helpers.js';
2
3console.log('Operator Tests\n');
4
5test('5 == 5', 5 == 5, true);
6test('5 === 5', 5 === 5, true);
7test('5 != 10', 5 != 10, true);
8test('5 !== 10', 5 !== 10, true);
9test('5 == 10', 5 == 10, false);
10test('5 != 5', 5 != 5, false);
11
12test("'hello' == 'hello'", 'hello' == 'hello', true);
13test("'hello' === 'hello'", 'hello' === 'hello', true);
14test("'hello' != 'world'", 'hello' != 'world', true);
15test("'hello' == 'world'", 'hello' == 'world', false);
16
17test('true == true', true == true, true);
18test('true === true', true === true, true);
19test('true != false', true != false, true);
20test('false == false', false == false, true);
21
22test('undefined == undefined', undefined == undefined, true);
23test('undefined === undefined', undefined === undefined, true);
24test('null == null', null == null, true);
25test('null === null', null === null, true);
26test('undefined == null', undefined == null, true);
27test('undefined === null', undefined === null, false);
28
29test('5 !== "5"', 5 !== '5', true);
30test('true !== 1', true !== 1, true);
31
32let obj1 = { x: 1 };
33let obj2 = { x: 1 };
34let obj3 = obj1;
35test('obj1 == obj2 (diff refs)', obj1 == obj2, false);
36test('obj1 === obj3 (same ref)', obj1 === obj3, true);
37
38let arr1 = [1, 2, 3];
39let arr2 = [1, 2, 3];
40let arr3 = arr1;
41test('arr1 == arr2 (diff refs)', arr1 == arr2, false);
42test('arr1 === arr3 (same ref)', arr1 === arr3, true);
43
44test('5 > 3', 5 > 3, true);
45test('3 < 5', 3 < 5, true);
46test('5 >= 5', 5 >= 5, true);
47test('5 <= 5', 5 <= 5, true);
48test('5 > 5', 5 > 5, false);
49test('5 < 5', 5 < 5, false);
50
51test('2 + 3', 2 + 3, 5);
52test('5 - 3', 5 - 3, 2);
53test('4 * 3', 4 * 3, 12);
54test('12 / 4', 12 / 4, 3);
55test('10 % 3', 10 % 3, 1);
56test('2 ** 3', 2 ** 3, 8);
57
58test('true && true', true && true, true);
59test('true && false', true && false, false);
60test('true || false', true || false, true);
61test('false || false', false || false, false);
62test('!true', !true, false);
63test('!false', !false, true);
64
65test('5 & 3', 5 & 3, 1);
66test('5 | 3', 5 | 3, 7);
67test('5 ^ 3', 5 ^ 3, 6);
68test('~5', ~5, -6);
69test('5 << 1', 5 << 1, 10);
70test('5 >> 1', 5 >> 1, 2);
71test('-5 >>> 1', (-5 >>> 1) > 0, true);
72
73test('typeof 5', typeof 5, 'number');
74test("typeof 'hello'", typeof 'hello', 'string');
75test('typeof true', typeof true, 'boolean');
76test('typeof undefined', typeof undefined, 'undefined');
77test('typeof null', typeof null, 'object');
78test('typeof {}', typeof {}, 'object');
79test('typeof []', typeof [], 'object');
80test('typeof function(){}', typeof function(){}, 'function');
81
82test("'a' in {a:1}", 'a' in {a:1}, true);
83test("'b' in {a:1}", 'b' in {a:1}, false);
84
85test('[] instanceof Array', [] instanceof Array, true);
86test('{} instanceof Object', {} instanceof Object, true);
87
88test('ternary true', true ? 'yes' : 'no', 'yes');
89test('ternary false', false ? 'yes' : 'no', 'no');
90
91test('nullish ?? default', null ?? 'default', 'default');
92test('nullish defined', 'value' ?? 'default', 'value');
93test('nullish 0', 0 ?? 'default', 0);
94
95test('optional ?.', { a: { b: 1 } }?.a?.b, 1);
96test('optional ?. undefined', { a: {} }?.a?.b, undefined);
97test('optional ?. null chain', null?.a?.b, undefined);
98
99let x = 5;
100test('++x prefix', ++x, 6);
101test('x++ postfix', x++, 6);
102test('after x++', x, 7);
103test('--x prefix', --x, 6);
104
105let y = 10;
106y += 5;
107test('+= assignment', y, 15);
108y -= 3;
109test('-= assignment', y, 12);
110y *= 2;
111test('*= assignment', y, 24);
112y /= 4;
113test('/= assignment', y, 6);
114
115summary();