refactor tests

This commit is contained in:
Dmitry Vasilev
2023-12-20 20:16:42 +08:00
parent de40cc9b8a
commit 212179b788
3 changed files with 58 additions and 67 deletions

View File

@@ -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,

View File

@@ -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,

View File

@@ -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) {