178 lines
4.8 KiB
JavaScript
178 lines
4.8 KiB
JavaScript
import {expect, test} from 'vitest';
|
|
|
|
import {first} from '@/swcx/builders.js';
|
|
import evaluate from '@/swcx/evaluate.js';
|
|
|
|
test('evaluates +', async () => {
|
|
expect(evaluate(await first('10 + 2')))
|
|
.to.deep.include({value: 12});
|
|
});
|
|
|
|
test('evaluates -', async () => {
|
|
expect(evaluate(await first('10 - 2')))
|
|
.to.deep.include({value: 8});
|
|
});
|
|
|
|
test('evaluates /', async () => {
|
|
expect(evaluate(await first('10 / 2')))
|
|
.to.deep.include({value: 5});
|
|
});
|
|
|
|
test('evaluates %', async () => {
|
|
expect(evaluate(await first('10 % 3')))
|
|
.to.deep.include({value: 1});
|
|
});
|
|
|
|
test('evaluates *', async () => {
|
|
expect(evaluate(await first('10 * 2')))
|
|
.to.deep.include({value: 20});
|
|
});
|
|
|
|
test('evaluates >', async () => {
|
|
expect(evaluate(await first('10 > 2')))
|
|
.to.deep.include({value: true});
|
|
});
|
|
|
|
test('evaluates <', async () => {
|
|
expect(evaluate(await first('10 < 2')))
|
|
.to.deep.include({value: false});
|
|
});
|
|
|
|
test('evaluates in', async () => {
|
|
expect(evaluate(await first('"i" in {i: 69}')))
|
|
.to.deep.include({value: true});
|
|
expect(evaluate(await first('"j" in {i: 69}')))
|
|
.to.deep.include({value: false});
|
|
});
|
|
|
|
test('evaluates >=', async () => {
|
|
expect(evaluate(await first('10 >= 2')))
|
|
.to.deep.include({value: true});
|
|
expect(evaluate(await first('2 >= 2')))
|
|
.to.deep.include({value: true});
|
|
expect(evaluate(await first('1 >= 2')))
|
|
.to.deep.include({value: false});
|
|
});
|
|
|
|
test('evaluates <=', async () => {
|
|
expect(evaluate(await first('10 <= 2')))
|
|
.to.deep.include({value: false});
|
|
expect(evaluate(await first('2 <= 2')))
|
|
.to.deep.include({value: true});
|
|
expect(evaluate(await first('1 <= 2')))
|
|
.to.deep.include({value: true});
|
|
});
|
|
|
|
test('evaluates **', async () => {
|
|
expect(evaluate(await first('2 ** 16')))
|
|
.to.deep.include({value: 65536});
|
|
});
|
|
|
|
test('evaluates ===', async () => {
|
|
expect(evaluate(await first('10 === "10"')))
|
|
.to.deep.include({value: false});
|
|
expect(evaluate(await first('10 === 10')))
|
|
.to.deep.include({value: true});
|
|
});
|
|
|
|
test('evaluates !==', async () => {
|
|
expect(evaluate(await first('10 !== "10"')))
|
|
.to.deep.include({value: true});
|
|
expect(evaluate(await first('10 !== 10')))
|
|
.to.deep.include({value: false});
|
|
});
|
|
|
|
test('evaluates ^', async () => {
|
|
expect(evaluate(await first('7 ^ 2')))
|
|
.to.deep.include({value: 5});
|
|
});
|
|
|
|
test('evaluates &', async () => {
|
|
expect(evaluate(await first('5 & 3')))
|
|
.to.deep.include({value: 1});
|
|
});
|
|
|
|
test('evaluates |', async () => {
|
|
expect(evaluate(await first('1 | 2')))
|
|
.to.deep.include({value: 3});
|
|
});
|
|
|
|
test('evaluates >>', async () => {
|
|
expect(evaluate(await first('8 >> 1')))
|
|
.to.deep.include({value: 4});
|
|
});
|
|
|
|
test('evaluates <<', async () => {
|
|
expect(evaluate(await first('2 << 1')))
|
|
.to.deep.include({value: 4});
|
|
});
|
|
|
|
test('evaluates >>>', async () => {
|
|
expect(evaluate(await first('-1 >>> 1')))
|
|
.to.deep.include({value: 2147483647});
|
|
});
|
|
|
|
test('evaluates ==', async () => {
|
|
expect(evaluate(await first('10 == "10"')))
|
|
.to.deep.include({value: true});
|
|
expect(evaluate(await first('10 == 10')))
|
|
.to.deep.include({value: true});
|
|
expect(evaluate(await first('10 == "ten"')))
|
|
.to.deep.include({value: false});
|
|
});
|
|
|
|
test('evaluates !=', async () => {
|
|
expect(evaluate(await first('10 != "10"')))
|
|
.to.deep.include({value: false});
|
|
expect(evaluate(await first('10 != 10')))
|
|
.to.deep.include({value: false});
|
|
expect(evaluate(await first('10 != "ten"')))
|
|
.to.deep.include({value: true});
|
|
});
|
|
|
|
test('evaluates ||', async () => {
|
|
expect(evaluate(await first('true || true')))
|
|
.to.deep.include({value: true});
|
|
expect(evaluate(await first('true || false')))
|
|
.to.deep.include({value: true});
|
|
expect(evaluate(await first('false || false')))
|
|
.to.deep.include({value: false});
|
|
});
|
|
|
|
test('evaluates &&', async () => {
|
|
expect(evaluate(await first('true && true')))
|
|
.to.deep.include({value: true});
|
|
expect(evaluate(await first('true && false')))
|
|
.to.deep.include({value: false});
|
|
expect(evaluate(await first('false && false')))
|
|
.to.deep.include({value: false});
|
|
});
|
|
|
|
test('evaluates ??', async () => {
|
|
const scope = {
|
|
get() { return undefined; },
|
|
};
|
|
expect(evaluate(await first('null ?? 1')))
|
|
.to.deep.include({value: 1});
|
|
expect(evaluate(await first('undefined ?? 1'), {scope}))
|
|
.to.deep.include({value: 1});
|
|
expect(evaluate(await first('2 ?? 1')))
|
|
.to.deep.include({value: 2});
|
|
});
|
|
|
|
test('evaluates instanceof', async () => {
|
|
const scope = {
|
|
get() { return Object; },
|
|
};
|
|
expect(evaluate(await first('({}) instanceof Object'), {scope}))
|
|
.to.deep.include({value: true});
|
|
});
|
|
|
|
test('evaluates promised expressions', async () => {
|
|
const evaluated = evaluate(await first('(await 1) + (await 2)'));
|
|
expect(evaluated.async)
|
|
.to.equal(true);
|
|
expect(await evaluated.value)
|
|
.to.equal(3);
|
|
});
|