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') {
|
||||
const result = frame.children[1].result
|
||||
if(result == null) {
|
||||
// Error in arguments, body not evaluated
|
||||
return null
|
||||
}
|
||||
return {
|
||||
index: frame.children[1].index,
|
||||
length: frame.children[1].length,
|
||||
|
||||
110
test/test.js
110
test/test.js
@@ -18,7 +18,6 @@ import {
|
||||
assert_equal,
|
||||
stringify,
|
||||
do_parse,
|
||||
eval_tree,
|
||||
assert_code_evals_to, assert_code_evals_to_async,
|
||||
assert_code_error, assert_code_error_async,
|
||||
parse_modules,
|
||||
@@ -63,8 +62,8 @@ export const tests = [
|
||||
}),
|
||||
|
||||
test('empty program', () => {
|
||||
const tree = eval_tree('')
|
||||
const frame = eval_frame(tree)
|
||||
const i = test_initial_state('')
|
||||
const frame = active_frame(i)
|
||||
assert_equal(frame.children, [])
|
||||
assert_equal(frame.result, {ok: true})
|
||||
}),
|
||||
@@ -84,8 +83,8 @@ export const tests = [
|
||||
}),
|
||||
|
||||
test('Only semicolons', () => {
|
||||
const tree = eval_tree(';;;;')
|
||||
const frame = eval_frame(tree)
|
||||
const i = test_initial_state(';;;;')
|
||||
const frame = active_frame(i)
|
||||
assert_equal(frame.children, [])
|
||||
assert_equal(frame.result, {ok: true})
|
||||
}),
|
||||
@@ -181,14 +180,13 @@ export const tests = [
|
||||
}),
|
||||
|
||||
test('closure', () => {
|
||||
const tree = eval_tree(
|
||||
`
|
||||
const x = 1
|
||||
const y = () => x;
|
||||
y()
|
||||
`
|
||||
)
|
||||
const frame = eval_frame(tree.children[0])
|
||||
const code = `
|
||||
const x = 1
|
||||
const y = () => x;
|
||||
y()
|
||||
`
|
||||
const i = test_initial_state(code, code.indexOf('x;'))
|
||||
const frame = active_frame(i)
|
||||
assert_equal(frame.children[1].result.value, 1)
|
||||
}),
|
||||
|
||||
@@ -391,12 +389,12 @@ export const tests = [
|
||||
}),
|
||||
|
||||
test('out of order decl', () => {
|
||||
const tree = eval_tree( `
|
||||
const i = test_initial_state( `
|
||||
const y = () => x;
|
||||
const x = 1;
|
||||
y();
|
||||
`)
|
||||
assert_equal(tree.children[0].value, 1)
|
||||
assert_equal(root_calltree_node(i).children[0].value, 1)
|
||||
}),
|
||||
|
||||
test('nested closure', () => {
|
||||
@@ -698,10 +696,10 @@ export const tests = [
|
||||
}),
|
||||
|
||||
test('eval_frame binary', () => {
|
||||
const tree = eval_tree(`
|
||||
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 instanceof', () => {
|
||||
@@ -710,45 +708,47 @@ export const tests = [
|
||||
}),
|
||||
|
||||
test('eval_frame grouping', () => {
|
||||
const tree = eval_tree('(1+1)')
|
||||
assert_equal(eval_frame(tree).children[0].result.value, 2)
|
||||
const i = test_initial_state('(1+1)')
|
||||
assert_equal(active_frame(i).children[0].result.value, 2)
|
||||
}),
|
||||
|
||||
test('eval_frame member_access', () => {
|
||||
const tree = eval_tree('{foo: "bar"}["foo"]')
|
||||
assert_equal(eval_frame(tree).children[0].result.value, 'bar')
|
||||
const i = test_initial_state('{foo: "bar"}["foo"]')
|
||||
assert_equal(active_frame(i).children[0].result.value, 'bar')
|
||||
}),
|
||||
|
||||
test('eval_frame new', () => {
|
||||
const tree = eval_tree('new Error("foobar")')
|
||||
assert_equal(eval_frame(tree).children[0].result.value.message, 'foobar')
|
||||
const i = test_initial_state('new Error("foobar")')
|
||||
assert_equal(active_frame(i).children[0].result.value.message, 'foobar')
|
||||
}),
|
||||
|
||||
test('eval_frame function_call', () => {
|
||||
const tree = eval_tree(`
|
||||
const i = test_initial_state(`
|
||||
const x = () => 1;
|
||||
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', () => {
|
||||
const tree = eval_tree(`
|
||||
const code = `
|
||||
const x = y => y;
|
||||
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', () => {
|
||||
const tree = eval_tree(`
|
||||
const code = `
|
||||
const x = y => {
|
||||
return y;
|
||||
const z = 1;
|
||||
};
|
||||
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 z_after_ret = frame.children[1].children[1]
|
||||
assert_equal(ret.result, {ok: true})
|
||||
@@ -756,14 +756,14 @@ export const tests = [
|
||||
}),
|
||||
|
||||
test('eval_frame if', () => {
|
||||
const tree = eval_tree(`
|
||||
const i = test_initial_state(`
|
||||
if(1) {
|
||||
const x = 1;
|
||||
} else {
|
||||
const x = 1;
|
||||
}
|
||||
`)
|
||||
const frame = eval_frame(tree)
|
||||
const frame = active_frame(i)
|
||||
const _if = frame.children[0]
|
||||
assert_equal(_if.children[0].result, {ok: true, value: 1})
|
||||
assert_equal(_if.children[1].result, {ok: true})
|
||||
@@ -771,12 +771,12 @@ export const tests = [
|
||||
}),
|
||||
|
||||
test('eval_frame if without else', () => {
|
||||
const tree = eval_tree(`
|
||||
const i = test_initial_state(`
|
||||
if(1) {
|
||||
const x = 1;
|
||||
}
|
||||
`)
|
||||
const frame = eval_frame(tree)
|
||||
const frame = active_frame(i)
|
||||
const _if = frame.children[0]
|
||||
assert_equal(_if.children.length, 2)
|
||||
assert_equal(_if.children[0].result, {ok: true, value: 1})
|
||||
@@ -801,65 +801,63 @@ export const tests = [
|
||||
}),
|
||||
|
||||
test('eval_frame error', () => {
|
||||
const tree = eval_tree(`
|
||||
const code = `
|
||||
const x = ({a}) => 0;
|
||||
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})
|
||||
}),
|
||||
|
||||
test('eval_frame binary &&', () => {
|
||||
const tree = eval_tree(`
|
||||
const frame = active_frame(test_initial_state(`
|
||||
const x = () => 1;
|
||||
const y = () => 2;
|
||||
false && x();
|
||||
y();
|
||||
`)
|
||||
const frame = eval_frame(tree)
|
||||
`))
|
||||
assert_equal(frame.children[3].result.value, 2)
|
||||
}),
|
||||
|
||||
test('eval_frame binary ||', () => {
|
||||
const tree = eval_tree(`
|
||||
const frame = active_frame(test_initial_state(`
|
||||
const x = () => 1;
|
||||
const y = () => 2;
|
||||
true || x();
|
||||
y();
|
||||
`)
|
||||
const frame = eval_frame(tree)
|
||||
`))
|
||||
assert_equal(frame.children[3].result.value, 2)
|
||||
}),
|
||||
|
||||
test('eval_frame binary ??', () => {
|
||||
const tree = eval_tree(`
|
||||
const frame = active_frame(test_initial_state(`
|
||||
const x = () => 1;
|
||||
const y = () => 2;
|
||||
1 ?? x();
|
||||
y();
|
||||
`)
|
||||
const frame = eval_frame(tree)
|
||||
`))
|
||||
assert_equal(frame.children[3].result.value, 2)
|
||||
}),
|
||||
|
||||
test('eval_frame null call', () => {
|
||||
const tree = eval_tree(`null()`)
|
||||
const frame = eval_frame(tree)
|
||||
const frame = active_frame(test_initial_state(`null()`))
|
||||
assert_equal(frame.children[0].result.ok, false)
|
||||
}),
|
||||
|
||||
test('eval_frame non-function call bug', () => {
|
||||
const tree = eval_tree(`Object.assign({}, {}); null()`)
|
||||
const frame = eval_frame(tree)
|
||||
const frame = active_frame(test_initial_state(`Object.assign({}, {}); null()`))
|
||||
assert_equal(frame.children[frame.children.length - 1].result.ok, false)
|
||||
}),
|
||||
|
||||
test('eval_frame destructuring args', () => {
|
||||
const tree = eval_tree(`
|
||||
const code = `
|
||||
const x = (...a) => a;
|
||||
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])
|
||||
}),
|
||||
|
||||
@@ -871,8 +869,8 @@ export const tests = [
|
||||
}
|
||||
y()
|
||||
`
|
||||
const tree = eval_tree(code)
|
||||
const frame = eval_frame(tree.children[0])
|
||||
const i = test_initial_state(code, code.indexOf('return z'))
|
||||
const frame = active_frame(i)
|
||||
assert_equal(
|
||||
// value for z in return statement
|
||||
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))
|
||||
)
|
||||
|
||||
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) => {
|
||||
const s = test_initial_state(codestring)
|
||||
if(!s.parse_result.ok) {
|
||||
|
||||
Reference in New Issue
Block a user