mirror of
https://github.com/leporello-js/leporello-js
synced 2026-01-13 13:04:30 -08:00
refactor tests
This commit is contained in:
@@ -709,6 +709,10 @@ const get_value_explorer = (state, index) => {
|
|||||||
|
|
||||||
if(frame.type == 'function_expr' && frame.body.type != 'do') {
|
if(frame.type == 'function_expr' && frame.body.type != 'do') {
|
||||||
const result = frame.children[1].result
|
const result = frame.children[1].result
|
||||||
|
if(result == null) {
|
||||||
|
// Error in arguments, body not evaluated
|
||||||
|
return null
|
||||||
|
}
|
||||||
return {
|
return {
|
||||||
index: frame.children[1].index,
|
index: frame.children[1].index,
|
||||||
length: frame.children[1].length,
|
length: frame.children[1].length,
|
||||||
|
|||||||
110
test/test.js
110
test/test.js
@@ -18,7 +18,6 @@ import {
|
|||||||
assert_equal,
|
assert_equal,
|
||||||
stringify,
|
stringify,
|
||||||
do_parse,
|
do_parse,
|
||||||
eval_tree,
|
|
||||||
assert_code_evals_to, assert_code_evals_to_async,
|
assert_code_evals_to, assert_code_evals_to_async,
|
||||||
assert_code_error, assert_code_error_async,
|
assert_code_error, assert_code_error_async,
|
||||||
parse_modules,
|
parse_modules,
|
||||||
@@ -63,8 +62,8 @@ export const tests = [
|
|||||||
}),
|
}),
|
||||||
|
|
||||||
test('empty program', () => {
|
test('empty program', () => {
|
||||||
const tree = eval_tree('')
|
const i = test_initial_state('')
|
||||||
const frame = eval_frame(tree)
|
const frame = active_frame(i)
|
||||||
assert_equal(frame.children, [])
|
assert_equal(frame.children, [])
|
||||||
assert_equal(frame.result, {ok: true})
|
assert_equal(frame.result, {ok: true})
|
||||||
}),
|
}),
|
||||||
@@ -84,8 +83,8 @@ export const tests = [
|
|||||||
}),
|
}),
|
||||||
|
|
||||||
test('Only semicolons', () => {
|
test('Only semicolons', () => {
|
||||||
const tree = eval_tree(';;;;')
|
const i = test_initial_state(';;;;')
|
||||||
const frame = eval_frame(tree)
|
const frame = active_frame(i)
|
||||||
assert_equal(frame.children, [])
|
assert_equal(frame.children, [])
|
||||||
assert_equal(frame.result, {ok: true})
|
assert_equal(frame.result, {ok: true})
|
||||||
}),
|
}),
|
||||||
@@ -181,14 +180,13 @@ export const tests = [
|
|||||||
}),
|
}),
|
||||||
|
|
||||||
test('closure', () => {
|
test('closure', () => {
|
||||||
const tree = eval_tree(
|
const code = `
|
||||||
`
|
const x = 1
|
||||||
const x = 1
|
const y = () => x;
|
||||||
const y = () => x;
|
y()
|
||||||
y()
|
`
|
||||||
`
|
const i = test_initial_state(code, code.indexOf('x;'))
|
||||||
)
|
const frame = active_frame(i)
|
||||||
const frame = eval_frame(tree.children[0])
|
|
||||||
assert_equal(frame.children[1].result.value, 1)
|
assert_equal(frame.children[1].result.value, 1)
|
||||||
}),
|
}),
|
||||||
|
|
||||||
@@ -391,12 +389,12 @@ export const tests = [
|
|||||||
}),
|
}),
|
||||||
|
|
||||||
test('out of order decl', () => {
|
test('out of order decl', () => {
|
||||||
const tree = eval_tree( `
|
const i = test_initial_state( `
|
||||||
const y = () => x;
|
const y = () => x;
|
||||||
const x = 1;
|
const x = 1;
|
||||||
y();
|
y();
|
||||||
`)
|
`)
|
||||||
assert_equal(tree.children[0].value, 1)
|
assert_equal(root_calltree_node(i).children[0].value, 1)
|
||||||
}),
|
}),
|
||||||
|
|
||||||
test('nested closure', () => {
|
test('nested closure', () => {
|
||||||
@@ -698,10 +696,10 @@ export const tests = [
|
|||||||
}),
|
}),
|
||||||
|
|
||||||
test('eval_frame binary', () => {
|
test('eval_frame binary', () => {
|
||||||
const tree = eval_tree(`
|
const i = test_initial_state(`
|
||||||
1 + 1
|
1 + 1
|
||||||
`)
|
`)
|
||||||
assert_equal(eval_frame(tree).children[0].result.value, 2)
|
assert_equal(active_frame(i).children[0].result.value, 2)
|
||||||
}),
|
}),
|
||||||
|
|
||||||
test('eval_frame instanceof', () => {
|
test('eval_frame instanceof', () => {
|
||||||
@@ -710,45 +708,47 @@ export const tests = [
|
|||||||
}),
|
}),
|
||||||
|
|
||||||
test('eval_frame grouping', () => {
|
test('eval_frame grouping', () => {
|
||||||
const tree = eval_tree('(1+1)')
|
const i = test_initial_state('(1+1)')
|
||||||
assert_equal(eval_frame(tree).children[0].result.value, 2)
|
assert_equal(active_frame(i).children[0].result.value, 2)
|
||||||
}),
|
}),
|
||||||
|
|
||||||
test('eval_frame member_access', () => {
|
test('eval_frame member_access', () => {
|
||||||
const tree = eval_tree('{foo: "bar"}["foo"]')
|
const i = test_initial_state('{foo: "bar"}["foo"]')
|
||||||
assert_equal(eval_frame(tree).children[0].result.value, 'bar')
|
assert_equal(active_frame(i).children[0].result.value, 'bar')
|
||||||
}),
|
}),
|
||||||
|
|
||||||
test('eval_frame new', () => {
|
test('eval_frame new', () => {
|
||||||
const tree = eval_tree('new Error("foobar")')
|
const i = test_initial_state('new Error("foobar")')
|
||||||
assert_equal(eval_frame(tree).children[0].result.value.message, 'foobar')
|
assert_equal(active_frame(i).children[0].result.value.message, 'foobar')
|
||||||
}),
|
}),
|
||||||
|
|
||||||
test('eval_frame function_call', () => {
|
test('eval_frame function_call', () => {
|
||||||
const tree = eval_tree(`
|
const i = test_initial_state(`
|
||||||
const x = () => 1;
|
const x = () => 1;
|
||||||
2 * x();
|
2 * x();
|
||||||
`)
|
`)
|
||||||
assert_equal(eval_frame(tree).children[1].result.value, 2)
|
assert_equal(active_frame(i).children[1].result.value, 2)
|
||||||
}),
|
}),
|
||||||
|
|
||||||
test('eval_frame function_body_expr', () => {
|
test('eval_frame function_body_expr', () => {
|
||||||
const tree = eval_tree(`
|
const code = `
|
||||||
const x = y => y;
|
const x = y => y;
|
||||||
x(2);
|
x(2);
|
||||||
`)
|
`
|
||||||
assert_equal(eval_frame(tree.children[0]).children[1].result, {ok: true, value: 2})
|
const i = test_initial_state(code, code.indexOf('y;'))
|
||||||
|
assert_equal(active_frame(i).children[1].result, {ok: true, value: 2})
|
||||||
}),
|
}),
|
||||||
|
|
||||||
test('eval_frame function_body_do', () => {
|
test('eval_frame function_body_do', () => {
|
||||||
const tree = eval_tree(`
|
const code = `
|
||||||
const x = y => {
|
const x = y => {
|
||||||
return y;
|
return y;
|
||||||
const z = 1;
|
const z = 1;
|
||||||
};
|
};
|
||||||
x(2);
|
x(2);
|
||||||
`)
|
`
|
||||||
const frame = eval_frame(tree.children[0])
|
const i = test_initial_state(code, code.indexOf('return y'))
|
||||||
|
const frame = active_frame(i)
|
||||||
const ret = frame.children[1].children[0]
|
const ret = frame.children[1].children[0]
|
||||||
const z_after_ret = frame.children[1].children[1]
|
const z_after_ret = frame.children[1].children[1]
|
||||||
assert_equal(ret.result, {ok: true})
|
assert_equal(ret.result, {ok: true})
|
||||||
@@ -756,14 +756,14 @@ export const tests = [
|
|||||||
}),
|
}),
|
||||||
|
|
||||||
test('eval_frame if', () => {
|
test('eval_frame if', () => {
|
||||||
const tree = eval_tree(`
|
const i = test_initial_state(`
|
||||||
if(1) {
|
if(1) {
|
||||||
const x = 1;
|
const x = 1;
|
||||||
} else {
|
} else {
|
||||||
const x = 1;
|
const x = 1;
|
||||||
}
|
}
|
||||||
`)
|
`)
|
||||||
const frame = eval_frame(tree)
|
const frame = active_frame(i)
|
||||||
const _if = frame.children[0]
|
const _if = frame.children[0]
|
||||||
assert_equal(_if.children[0].result, {ok: true, value: 1})
|
assert_equal(_if.children[0].result, {ok: true, value: 1})
|
||||||
assert_equal(_if.children[1].result, {ok: true})
|
assert_equal(_if.children[1].result, {ok: true})
|
||||||
@@ -771,12 +771,12 @@ export const tests = [
|
|||||||
}),
|
}),
|
||||||
|
|
||||||
test('eval_frame if without else', () => {
|
test('eval_frame if without else', () => {
|
||||||
const tree = eval_tree(`
|
const i = test_initial_state(`
|
||||||
if(1) {
|
if(1) {
|
||||||
const x = 1;
|
const x = 1;
|
||||||
}
|
}
|
||||||
`)
|
`)
|
||||||
const frame = eval_frame(tree)
|
const frame = active_frame(i)
|
||||||
const _if = frame.children[0]
|
const _if = frame.children[0]
|
||||||
assert_equal(_if.children.length, 2)
|
assert_equal(_if.children.length, 2)
|
||||||
assert_equal(_if.children[0].result, {ok: true, value: 1})
|
assert_equal(_if.children[0].result, {ok: true, value: 1})
|
||||||
@@ -801,65 +801,63 @@ export const tests = [
|
|||||||
}),
|
}),
|
||||||
|
|
||||||
test('eval_frame error', () => {
|
test('eval_frame error', () => {
|
||||||
const tree = eval_tree(`
|
const code = `
|
||||||
const x = ({a}) => 0;
|
const x = ({a}) => 0;
|
||||||
x(null);
|
x(null);
|
||||||
`)
|
`
|
||||||
const frame = eval_frame(tree.children[0])
|
const frame = active_frame(
|
||||||
|
test_initial_state(code, code.indexOf('0'))
|
||||||
|
)
|
||||||
assert_equal(frame.result, {ok: false})
|
assert_equal(frame.result, {ok: false})
|
||||||
}),
|
}),
|
||||||
|
|
||||||
test('eval_frame binary &&', () => {
|
test('eval_frame binary &&', () => {
|
||||||
const tree = eval_tree(`
|
const frame = active_frame(test_initial_state(`
|
||||||
const x = () => 1;
|
const x = () => 1;
|
||||||
const y = () => 2;
|
const y = () => 2;
|
||||||
false && x();
|
false && x();
|
||||||
y();
|
y();
|
||||||
`)
|
`))
|
||||||
const frame = eval_frame(tree)
|
|
||||||
assert_equal(frame.children[3].result.value, 2)
|
assert_equal(frame.children[3].result.value, 2)
|
||||||
}),
|
}),
|
||||||
|
|
||||||
test('eval_frame binary ||', () => {
|
test('eval_frame binary ||', () => {
|
||||||
const tree = eval_tree(`
|
const frame = active_frame(test_initial_state(`
|
||||||
const x = () => 1;
|
const x = () => 1;
|
||||||
const y = () => 2;
|
const y = () => 2;
|
||||||
true || x();
|
true || x();
|
||||||
y();
|
y();
|
||||||
`)
|
`))
|
||||||
const frame = eval_frame(tree)
|
|
||||||
assert_equal(frame.children[3].result.value, 2)
|
assert_equal(frame.children[3].result.value, 2)
|
||||||
}),
|
}),
|
||||||
|
|
||||||
test('eval_frame binary ??', () => {
|
test('eval_frame binary ??', () => {
|
||||||
const tree = eval_tree(`
|
const frame = active_frame(test_initial_state(`
|
||||||
const x = () => 1;
|
const x = () => 1;
|
||||||
const y = () => 2;
|
const y = () => 2;
|
||||||
1 ?? x();
|
1 ?? x();
|
||||||
y();
|
y();
|
||||||
`)
|
`))
|
||||||
const frame = eval_frame(tree)
|
|
||||||
assert_equal(frame.children[3].result.value, 2)
|
assert_equal(frame.children[3].result.value, 2)
|
||||||
}),
|
}),
|
||||||
|
|
||||||
test('eval_frame null call', () => {
|
test('eval_frame null call', () => {
|
||||||
const tree = eval_tree(`null()`)
|
const frame = active_frame(test_initial_state(`null()`))
|
||||||
const frame = eval_frame(tree)
|
|
||||||
assert_equal(frame.children[0].result.ok, false)
|
assert_equal(frame.children[0].result.ok, false)
|
||||||
}),
|
}),
|
||||||
|
|
||||||
test('eval_frame non-function call bug', () => {
|
test('eval_frame non-function call bug', () => {
|
||||||
const tree = eval_tree(`Object.assign({}, {}); null()`)
|
const frame = active_frame(test_initial_state(`Object.assign({}, {}); null()`))
|
||||||
const frame = eval_frame(tree)
|
|
||||||
assert_equal(frame.children[frame.children.length - 1].result.ok, false)
|
assert_equal(frame.children[frame.children.length - 1].result.ok, false)
|
||||||
}),
|
}),
|
||||||
|
|
||||||
test('eval_frame destructuring args', () => {
|
test('eval_frame destructuring args', () => {
|
||||||
const tree = eval_tree(`
|
const code = `
|
||||||
const x = (...a) => a;
|
const x = (...a) => a;
|
||||||
x(1,2,3);
|
x(1,2,3);
|
||||||
`)
|
`
|
||||||
const frame = eval_frame(tree.children[0])
|
const i = test_initial_state(code, code.indexOf('a;'))
|
||||||
|
const frame = active_frame(i)
|
||||||
assert_equal(frame.children[0].children[0].children[0].result.value, [1,2,3])
|
assert_equal(frame.children[0].children[0].children[0].result.value, [1,2,3])
|
||||||
}),
|
}),
|
||||||
|
|
||||||
@@ -871,8 +869,8 @@ export const tests = [
|
|||||||
}
|
}
|
||||||
y()
|
y()
|
||||||
`
|
`
|
||||||
const tree = eval_tree(code)
|
const i = test_initial_state(code, code.indexOf('return z'))
|
||||||
const frame = eval_frame(tree.children[0])
|
const frame = active_frame(i)
|
||||||
assert_equal(
|
assert_equal(
|
||||||
// value for z in return statement
|
// value for z in return statement
|
||||||
frame.children[1].children[0].children[0].result.value,
|
frame.children[1].children[0].children[0].result.value,
|
||||||
|
|||||||
@@ -59,17 +59,6 @@ export const parse_modules = (entry, modules) =>
|
|||||||
new Set(Object.getOwnPropertyNames(globalThis.app_window))
|
new Set(Object.getOwnPropertyNames(globalThis.app_window))
|
||||||
)
|
)
|
||||||
|
|
||||||
export const eval_tree = code => {
|
|
||||||
const parse_result = do_parse(code)
|
|
||||||
assert_equal(parse_result.ok, true)
|
|
||||||
return eval_modules(
|
|
||||||
{
|
|
||||||
modules: {'': parse_result.node},
|
|
||||||
sorted: ['']
|
|
||||||
}
|
|
||||||
).calltree
|
|
||||||
}
|
|
||||||
|
|
||||||
export const assert_code_evals_to = (codestring, expected) => {
|
export const assert_code_evals_to = (codestring, expected) => {
|
||||||
const s = test_initial_state(codestring)
|
const s = test_initial_state(codestring)
|
||||||
if(!s.parse_result.ok) {
|
if(!s.parse_result.ok) {
|
||||||
|
|||||||
Reference in New Issue
Block a user