parent
7a4b914089
commit
1456f600a8
@ -0,0 +1,113 @@ |
|||||||
|
const { ButtonMachine } = require('../../src/node_modules/buttons'); |
||||||
|
|
||||||
|
const run_code = (expecting, code, debug=false) => { |
||||||
|
let machine = new ButtonMachine(code); |
||||||
|
|
||||||
|
machine.run(debug); |
||||||
|
|
||||||
|
expect(machine.stack_top).toBe(expecting); |
||||||
|
|
||||||
|
return machine; |
||||||
|
} |
||||||
|
|
||||||
|
it('Can do addition', () => { |
||||||
|
run_code(3, [ |
||||||
|
['PUSH', 1], |
||||||
|
['PUSH', 2], |
||||||
|
['ADD'], |
||||||
|
]) |
||||||
|
}); |
||||||
|
|
||||||
|
it('Can do subtraction', () => { |
||||||
|
run_code(1, [ |
||||||
|
['PUSH', 2], |
||||||
|
['PUSH', 1], |
||||||
|
['SUB'], |
||||||
|
]) |
||||||
|
}) |
||||||
|
|
||||||
|
it('Can do multiplication', () => { |
||||||
|
run_code(20, [ |
||||||
|
['PUSH', 10], |
||||||
|
['PUSH', 2], |
||||||
|
['MUL'], |
||||||
|
]) |
||||||
|
}) |
||||||
|
|
||||||
|
it('Can do division', () => { |
||||||
|
run_code(5, [ |
||||||
|
['PUSH', 10], |
||||||
|
['PUSH', 2], |
||||||
|
['DIV'], |
||||||
|
]) |
||||||
|
}) |
||||||
|
|
||||||
|
it('Can do modulus', () => { |
||||||
|
run_code(0, [ |
||||||
|
['PUSH', 10], |
||||||
|
['PUSH', 2], |
||||||
|
['MOD'], |
||||||
|
]) |
||||||
|
}) |
||||||
|
|
||||||
|
it('Can loop until the end of ticks', () => { |
||||||
|
run_code(43, [ |
||||||
|
['PUSH', 1], |
||||||
|
['PUSH', 1], |
||||||
|
['ADD'], |
||||||
|
['JUMP', 1] |
||||||
|
]); |
||||||
|
}); |
||||||
|
|
||||||
|
|
||||||
|
it('Can do zero test for jump', () => { |
||||||
|
run_code(0, [ |
||||||
|
['PUSH', 20], // start at 20
|
||||||
|
['PUSH', 1], // decrement by 1
|
||||||
|
['SUB'],
|
||||||
|
['JZ', 5], // if we're at 0 jumps to the end
|
||||||
|
['JUMP', 1] // the previous test fails so it jumps to loop again
|
||||||
|
]); |
||||||
|
}); |
||||||
|
|
||||||
|
|
||||||
|
it('Can do NOT zero test for jump', () => { |
||||||
|
run_code(-19, [ |
||||||
|
['PUSH', -20], // start at 20
|
||||||
|
['PUSH', 1], // decrement by 1
|
||||||
|
['ADD'],
|
||||||
|
['JNZ', 5], // if we're at 0 jumps to the end
|
||||||
|
['JUMP', 1] // the previous test fails so it jumps to loop again
|
||||||
|
]); |
||||||
|
}); |
||||||
|
|
||||||
|
it('Can store and restor', () => { |
||||||
|
run_code(150, [ |
||||||
|
['PUSH', 100], // start with 100
|
||||||
|
['STOR', 'AX'], // put it in the regA register
|
||||||
|
['PUSH', 50], // push 50 on too
|
||||||
|
['ADD'], // add those for 150
|
||||||
|
['RSTOR', 'AX'],// recover the original 100
|
||||||
|
['SUB'] // sub and should be 150
|
||||||
|
]); |
||||||
|
}); |
||||||
|
|
||||||
|
it('Halts on bad registers', () => { |
||||||
|
run_code(0, [ |
||||||
|
['PUSH', 0], |
||||||
|
['STOR', 'AX'], |
||||||
|
['RSTOR', 'BAD NAME'], // should cause a halt here
|
||||||
|
['PUSH', 100], |
||||||
|
['ADD'] |
||||||
|
]); |
||||||
|
}); |
||||||
|
|
||||||
|
it('Can halt on purpose', () => { |
||||||
|
let machine = run_code(0, [ |
||||||
|
['PUSH', 0], |
||||||
|
['HALT', 'Done on purpose.'] |
||||||
|
]); |
||||||
|
|
||||||
|
expect(machine.halted).toBe(true); |
||||||
|
expect(machine.error).toBe('Done on purpose.'); |
||||||
|
}); |
Loading…
Reference in new issue