silphius/app/swcx/evaluators/binary.test.js

178 lines
5.0 KiB
JavaScript
Raw Normal View History

2024-06-16 08:01:01 -05:00
import {expect, test} from 'vitest';
import evaluate from '@/swcx/evaluate.js';
2024-06-18 21:46:51 -05:00
import expression from '@/swcx/test/expression.js';
2024-06-16 08:01:01 -05:00
test('evaluates +', async () => {
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('10 + 2')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: 12});
});
test('evaluates -', async () => {
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('10 - 2')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: 8});
});
test('evaluates /', async () => {
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('10 / 2')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: 5});
});
test('evaluates %', async () => {
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('10 % 3')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: 1});
});
test('evaluates *', async () => {
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('10 * 2')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: 20});
});
test('evaluates >', async () => {
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('10 > 2')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: true});
});
test('evaluates <', async () => {
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('10 < 2')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: false});
});
test('evaluates in', async () => {
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('"i" in {i: 69}')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: true});
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('"j" in {i: 69}')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: false});
});
test('evaluates >=', async () => {
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('10 >= 2')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: true});
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('2 >= 2')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: true});
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('1 >= 2')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: false});
});
test('evaluates <=', async () => {
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('10 <= 2')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: false});
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('2 <= 2')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: true});
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('1 <= 2')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: true});
});
test('evaluates **', async () => {
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('2 ** 16')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: 65536});
});
test('evaluates ===', async () => {
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('10 === "10"')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: false});
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('10 === 10')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: true});
});
test('evaluates !==', async () => {
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('10 !== "10"')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: true});
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('10 !== 10')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: false});
});
test('evaluates ^', async () => {
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('7 ^ 2')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: 5});
});
test('evaluates &', async () => {
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('5 & 3')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: 1});
});
test('evaluates |', async () => {
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('1 | 2')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: 3});
});
test('evaluates >>', async () => {
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('8 >> 1')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: 4});
});
test('evaluates <<', async () => {
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('2 << 1')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: 4});
});
test('evaluates >>>', async () => {
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('-1 >>> 1')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: 2147483647});
});
test('evaluates ==', async () => {
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('10 == "10"')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: true});
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('10 == 10')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: true});
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('10 == "ten"')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: false});
});
test('evaluates !=', async () => {
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('10 != "10"')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: false});
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('10 != 10')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: false});
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('10 != "ten"')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: true});
});
test('evaluates ||', async () => {
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('true || true')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: true});
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('true || false')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: true});
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('false || false')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: false});
});
test('evaluates &&', async () => {
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('true && true')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: true});
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('true && false')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: false});
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('false && false')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: false});
});
test('evaluates ??', async () => {
const scope = {
get() { return undefined; },
};
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('null ?? 1')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: 1});
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('undefined ?? 1'), {scope}))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: 1});
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('2 ?? 1')))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: 2});
});
test('evaluates instanceof', async () => {
const scope = {
get() { return Object; },
};
2024-06-18 21:46:51 -05:00
expect(evaluate(await expression('({}) instanceof Object'), {scope}))
2024-06-16 08:01:01 -05:00
.to.deep.include({value: true});
});
test('evaluates promised expressions', async () => {
2024-06-18 21:46:51 -05:00
const evaluated = evaluate(await expression('(await 1) + (await 2)'));
2024-06-16 08:01:01 -05:00
expect(evaluated.async)
.to.equal(true);
expect(await evaluated.value)
.to.equal(3);
});