Brainfuck tests
This commit is contained in:
parent
4a24fd1589
commit
acc2dd2ae6
26
run_tests.py
26
run_tests.py
|
@ -26,6 +26,7 @@ import unittest, subprocess, filecmp, argparse, os.path, os, shutil
|
||||||
REFERENCE_DIR = os.path.join(os.path.abspath(os.path.dirname(__file__)), "test_data")
|
REFERENCE_DIR = os.path.join(os.path.abspath(os.path.dirname(__file__)), "test_data")
|
||||||
|
|
||||||
JSON_TESTS = [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1]
|
JSON_TESTS = [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1]
|
||||||
|
BF_TESTS = [0, 0, 0, 0, 0, 0]
|
||||||
|
|
||||||
def make_json_test(idx, should_fail=0):
|
def make_json_test(idx, should_fail=0):
|
||||||
def test(self):
|
def test(self):
|
||||||
|
@ -60,6 +61,28 @@ def make_json_test(idx, should_fail=0):
|
||||||
|
|
||||||
return test
|
return test
|
||||||
|
|
||||||
|
def make_bf_test(idx, should_fail=False):
|
||||||
|
def test(self):
|
||||||
|
argpath = os.path.join(REFERENCE_DIR, "bf%03d.bf" % idx)
|
||||||
|
inpath = os.path.join(REFERENCE_DIR, "bf%03d.in" % idx)
|
||||||
|
infile = open(inpath)
|
||||||
|
exppath = os.path.join(REFERENCE_DIR, "bf%03d.exp" % idx)
|
||||||
|
outpath = os.path.join(data_dir, "bf%03d.out" % idx)
|
||||||
|
outfile = open(outpath, "w")
|
||||||
|
|
||||||
|
p = subprocess.Popen([os.path.join(args.builddir, "examples", "brainfuck", "bf"), argpath], stdin=infile, stdout=outfile, stderr=subprocess.DEVNULL)
|
||||||
|
p.communicate()
|
||||||
|
infile.close()
|
||||||
|
outfile.close()
|
||||||
|
|
||||||
|
if should_fail:
|
||||||
|
self.assertNotEqual(0, p.returncode)
|
||||||
|
return
|
||||||
|
self.assertEqual(0, p.returncode)
|
||||||
|
self.assertTrue(filecmp.cmp(exppath, outpath), "Testcase %d for bf example failed" % idx)
|
||||||
|
|
||||||
|
return test
|
||||||
|
|
||||||
class Tests(unittest.TestCase):
|
class Tests(unittest.TestCase):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -78,4 +101,7 @@ if __name__ == "__main__":
|
||||||
for i, should_fail in enumerate(JSON_TESTS):
|
for i, should_fail in enumerate(JSON_TESTS):
|
||||||
setattr(Tests, "test_json_%03d" % (i + 1), make_json_test(i + 1, should_fail))
|
setattr(Tests, "test_json_%03d" % (i + 1), make_json_test(i + 1, should_fail))
|
||||||
|
|
||||||
|
for i, should_fail in enumerate(BF_TESTS):
|
||||||
|
setattr(Tests, "test_bf_%03d" % (i + 1), make_bf_test(i + 1, should_fail))
|
||||||
|
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
++++++++[>+>++>+++>++++>+++++>++++++>+++++++>++++++++>+++++++++>++++++++++>+++++++++++>++++++++++++>+++++++++++++>++++++++++++++>+++++++++++++++>++++++++++++++++<<<<<<<<<<<<<<<<-]>>>>>>>>>>.<<<<<<<<<<>>>>>>>>>>>>+.-<<<<<<<<<<<<>>>>>>>>>>>>>>++.--<<<<<<<<<<<<<<>>>>>>>>>>>>>>+++.---<<<<<<<<<<<<<<>>>>>>>>>>>>>>-.+<<<<<<<<<<<<<<>>>>>>>>>>>>>----.++++<<<<<<<<<<<<<>>>>>>>>>>>>>>>---.+++<<<<<<<<<<<<<<<>>>>>>>>>>>>>>+++.---<<<<<<<<<<<<<<>>>>.<<<<>>>>>>>>>>>>>>>----.++++<<<<<<<<<<<<<<<>>>>>>>>>>>>>>-.+<<<<<<<<<<<<<<>>>>.<<<<>>>>>>>>>>>>>>>----.++++<<<<<<<<<<<<<<<>>>>>>>>>>>>>.<<<<<<<<<<<<<>>>>>>>>>>>>>---.+++<<<<<<<<<<<<<>>>>.<<<<>>>>>>>>>>>>>>++.--<<<<<<<<<<<<<<>>>>>>>>>>>>>---.+++<<<<<<<<<<<<<>>>>>>>>>>>>>>+++.---<<<<<<<<<<<<<<>>>>>>>>>>>>+++.---<<<<<<<<<<<<>>>>>>>>>>>>>>>---.+++<<<<<<<<<<<<<<<>>>>>>>>>>>>>---.+++<<<<<<<<<<<<<>>>>+.-<<<<>++.--<.
|
Binary file not shown.
|
@ -0,0 +1,20 @@
|
||||||
|
++ Cell c0 = 2
|
||||||
|
> +++++ Cell c1 = 5
|
||||||
|
|
||||||
|
[ Start your loops with your cell pointer on the loop counter (c1 in our case)
|
||||||
|
< + Add 1 to c0
|
||||||
|
> - Subtract 1 from c1
|
||||||
|
] End your loops with the cell pointer on the loop counter
|
||||||
|
|
||||||
|
At this point our program has added 5 to 2 leaving 7 in c0 and 0 in c1
|
||||||
|
BUT we cannot output this value to the terminal since it's not ASCII encoded!
|
||||||
|
|
||||||
|
To display the ASCII character "7" we must add 48 to the value 7!
|
||||||
|
48 = 6 * 8 so let's use another loop to help us!
|
||||||
|
|
||||||
|
++++ ++++ c1 = 8 and this will be our loop counter again
|
||||||
|
[
|
||||||
|
< +++ +++ Add 6 to c0
|
||||||
|
> - Subtract 1 from c1
|
||||||
|
]
|
||||||
|
< . Print out c0 which has the value 55 which translates to "7"!
|
|
@ -0,0 +1 @@
|
||||||
|
7
|
|
@ -0,0 +1 @@
|
||||||
|
++++++++[>+++++++++<-]>.<+++++[>++++++<-]>-.+++++++..+++.<++++++++[>>++++<<-]>>.<<++++[>------<-]>.<++++[>++++++<-]>.+++.------.--------.>+.
|
|
@ -0,0 +1 @@
|
||||||
|
Hello World!
|
|
@ -0,0 +1 @@
|
||||||
|
Hello World!
|
|
@ -0,0 +1,29 @@
|
||||||
|
-,+[ Read first character and start outer character reading loop
|
||||||
|
-[ Skip forward if character is 0
|
||||||
|
>>++++[>++++++++<-] Set up divisor (32) for division loop
|
||||||
|
(MEMORY LAYOUT: dividend copy remainder divisor quotient zero zero)
|
||||||
|
<+<-[ Set up dividend (x minus 1) and enter division loop
|
||||||
|
>+>+>-[>>>] Increase copy and remainder / reduce divisor / Normal case: skip forward
|
||||||
|
<[[>+<-]>>+>] Special case: move remainder back to divisor and increase quotient
|
||||||
|
<<<<<- Decrement dividend
|
||||||
|
] End division loop
|
||||||
|
]>>>[-]+ End skip loop; zero former divisor and reuse space for a flag
|
||||||
|
>--[-[<->+++[-]]]<[ Zero that flag unless quotient was 2 or 3; zero quotient; check flag
|
||||||
|
++++++++++++<[ If flag then set up divisor (13) for second division loop
|
||||||
|
(MEMORY LAYOUT: zero copy dividend divisor remainder quotient zero zero)
|
||||||
|
>-[>+>>] Reduce divisor; Normal case: increase remainder
|
||||||
|
>[+[<+>-]>+>>] Special case: increase remainder / move it back to divisor / increase quotient
|
||||||
|
<<<<<- Decrease dividend
|
||||||
|
] End division loop
|
||||||
|
>>[<+>-] Add remainder back to divisor to get a useful 13
|
||||||
|
>[ Skip forward if quotient was 0
|
||||||
|
-[ Decrement quotient and skip forward if quotient was 1
|
||||||
|
-<<[-]>> Zero quotient and divisor if quotient was 2
|
||||||
|
]<<[<<->>-]>> Zero divisor and subtract 13 from copy if quotient was 1
|
||||||
|
]<<[<<+>>-] Zero divisor and add 13 to copy if quotient was 0
|
||||||
|
] End outer skip loop (jump to here if ((character minus 1)/32) was not 2 or 3)
|
||||||
|
<[-] Clear remainder from first division if second division was skipped
|
||||||
|
<.[-] Output ROT13ed character from copy and clear it
|
||||||
|
<-,+ Read next character
|
||||||
|
] End character reading loop
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
Yberz vcfhz qbybe fvg nzrg, pbafrgrghe fnqvcfpvat ryvge, frq qvnz abahzl rvezbq
|
||||||
|
grzcbe vaivqhag hg ynober rg qbyber zntan nyvdhlnz reng, frq qvnz ibyhcghn. Ng
|
||||||
|
ireb rbf rg npphfnz rg whfgb qhb qbyberf rg rn erohz. Fgrg pyvgn xnfq thoretera,
|
||||||
|
ab frn gnxvzngn fnapghf rfg Yberz vcfhz qbybe fvg nzrg.
|
|
@ -0,0 +1,4 @@
|
||||||
|
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
|
||||||
|
tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At
|
||||||
|
vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren,
|
||||||
|
no sea takimata sanctus est Lorem ipsum dolor sit amet.
|
|
@ -0,0 +1,29 @@
|
||||||
|
-,+[ Read first character and start outer character reading loop
|
||||||
|
-[ Skip forward if character is 0
|
||||||
|
>>++++[>++++++++<-] Set up divisor (32) for division loop
|
||||||
|
(MEMORY LAYOUT: dividend copy remainder divisor quotient zero zero)
|
||||||
|
<+<-[ Set up dividend (x minus 1) and enter division loop
|
||||||
|
>+>+>-[>>>] Increase copy and remainder / reduce divisor / Normal case: skip forward
|
||||||
|
<[[>+<-]>>+>] Special case: move remainder back to divisor and increase quotient
|
||||||
|
<<<<<- Decrement dividend
|
||||||
|
] End division loop
|
||||||
|
]>>>[-]+ End skip loop; zero former divisor and reuse space for a flag
|
||||||
|
>--[-[<->+++[-]]]<[ Zero that flag unless quotient was 2 or 3; zero quotient; check flag
|
||||||
|
++++++++++++<[ If flag then set up divisor (13) for second division loop
|
||||||
|
(MEMORY LAYOUT: zero copy dividend divisor remainder quotient zero zero)
|
||||||
|
>-[>+>>] Reduce divisor; Normal case: increase remainder
|
||||||
|
>[+[<+>-]>+>>] Special case: increase remainder / move it back to divisor / increase quotient
|
||||||
|
<<<<<- Decrease dividend
|
||||||
|
] End division loop
|
||||||
|
>>[<+>-] Add remainder back to divisor to get a useful 13
|
||||||
|
>[ Skip forward if quotient was 0
|
||||||
|
-[ Decrement quotient and skip forward if quotient was 1
|
||||||
|
-<<[-]>> Zero quotient and divisor if quotient was 2
|
||||||
|
]<<[<<->>-]>> Zero divisor and subtract 13 from copy if quotient was 1
|
||||||
|
]<<[<<+>>-] Zero divisor and add 13 to copy if quotient was 0
|
||||||
|
] End outer skip loop (jump to here if ((character minus 1)/32) was not 2 or 3)
|
||||||
|
<[-] Clear remainder from first division if second division was skipped
|
||||||
|
<.[-] Output ROT13ed character from copy and clear it
|
||||||
|
<-,+ Read next character
|
||||||
|
] End character reading loop
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
|
||||||
|
tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At
|
||||||
|
vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren,
|
||||||
|
no sea takimata sanctus est Lorem ipsum dolor sit amet.
|
|
@ -0,0 +1,4 @@
|
||||||
|
Yberz vcfhz qbybe fvg nzrg, pbafrgrghe fnqvcfpvat ryvge, frq qvnz abahzl rvezbq
|
||||||
|
grzcbe vaivqhag hg ynober rg qbyber zntan nyvdhlnz reng, frq qvnz ibyhcghn. Ng
|
||||||
|
ireb rbf rg npphfnz rg whfgb qhb qbyberf rg rn erohz. Fgrg pyvgn xnfq thoretera,
|
||||||
|
ab frn gnxvzngn fnapghf rfg Yberz vcfhz qbybe fvg nzrg.
|
Loading…
Reference in New Issue