#snobol4
The third attempt at creating a testing process for SNOBOL4. Now we have a JS script at reads the canonical-data.json and outputs a test.sno that runs and reports. This is what would be generated for two-fer.
Critique requested.
-include 'bq.sno'
define('get_working_directory()tmp') :(get_working_directory.end)
get_working_directory tmp = bq("pwd")
tmp = reverse(tmp)
tmp ? break('/') . tmp
get_working_directory = reverse(tmp) :(return)
get_working_directory.end
define('script_sucker(script)codeblock,unit,line') :(script_sucker.end)
script_sucker
codeblock = ''
unit = io_findunit()
input(.file, unit, , script) :f(script_sucker.fail)
script_sucker.loop
line = file :f(script_sucker.done)
line pos(0) 'END' rpos(0) :s(script_sucker.loop)
codeblock = codeblock line ';' :(script_sucker.loop)
script_sucker.done
endfile(file)
detach(.file)
script_sucker = codeblock :(return)
script_sucker.fail
output = script ' not found' :(freturn)
script_sucker.end
test.count = 0
fail.count = 0
pass.count = 0
define('compare_and_report(testname,result,expected)lhs,rhs,bhs') :(compare_and_report.end)
compare_and_report
test.count = test.count + 1
datatype(result) len(1) . lhs
datatype(expected) len(1) . rhs
bhs = 'compare_and_report.' lhs rhs
:($bhs)
compare_and_report.is
eq(result, 0 + expected) :s(compare_and_report.pass)f(compare_and_report.fail)
compare_and_report.si
eq(0 + result, expected) :s(compare_and_report.pass)f(compare_and_report.fail)
compare_and_report.ii
eq(result, expected) :s(compare_and_report.pass)f(compare_and_report.fail)
compare_and_report.ss
compare_and_report = ident(result, expected) :s(compare_and_report.pass)f(compare_and_report.fail)
compare_and_report.pass
pass.count = pass.count + 1
compare_and_report = testname ' ... OK' :(return)
compare_and_report.fail
fail.count = fail.count + 1
compare_and_report = testname ' ... FAIL' :(return)
compare_and_report.end
corecode = script_sucker('./two-fer.sno') :f(end)
* no name given
codeblock = corecode ' :(test.1) ;'
compiled = code(codeblock)
input.name = ''
:<compiled>
test.1
expected = 'One for you, one for me.'
output = compare_and_report('no name given',result, expected)
* a name given
codeblock = corecode ' :(test.2) ;'
compiled = code(codeblock)
input.name = 'Alice'
:<compiled>
test.2
expected = 'One for Alice, one for me.'
output = compare_and_report('a name given',result, expected)
* another name given
codeblock = corecode ' :(test.3) ;'
compiled = code(codeblock)
input.name = 'Bob'
:<compiled>
test.3
expected = 'One for Bob, one for me.'
output = compare_and_report('another name given',result, expected)
tests_done
output = test.count " tests. " pass.count " passes, " fail.count " failure."
END