def test_loop(self): m = Machine(program='+++++') self.assertEqual(5, m.run()) self.assertEqual(5, m.mem_at(0)) m.reset_program() m.load_program('[-]') self.assertEqual(11, m.run()) self.assertEqual(0, m.mcell)
def test_digits(self): m = Machine() from string import digits program = '+'*14 + '=' + '-'*14 + '>'.join('+'*i for i in range(len(digits))) program += '<'*(program.count('>')) program += '>'.join('?' for _ in range(len(digits))) m.load_program(program) m.run() for index, val in enumerate(digits): self.assertEqual(ord(val), m.mem_at(index))
def test_ascii_uppercase(self): m = Machine() from string import ascii_uppercase program = '+'*13 + '=' + '-'*13 + '>'.join('+'*i for i in range(len(ascii_uppercase))) program += '<'*(program.count('>')) program += '>'.join('?' for _ in range(len(ascii_uppercase))) m.load_program(program) m.run() for index, val in enumerate(ascii_uppercase): self.assertEqual(ord(val), m.mem_at(index))
def test_tbas(self): m = Machine() from tbas.badge_io import tbas_chars program = '+'*15 + '=' + '-'*15 + '>'.join('+'*i for i in range(len(tbas_chars))) program += '<'*(program.count('>')) program += '>'.join('?' for _ in range(len(tbas_chars))) m.load_program(program) m.run() for index, val in enumerate(tbas_chars): self.assertEqual(ord(val), m.mem_at(index))
def test_mptr_inc_dec(self): m = Machine(program='+++>+++>+++>++++') m.run() self.assertEqual(3, m.mem_at(0)) self.assertEqual(3, m.mem_at(1)) self.assertEqual(3, m.mem_at(2)) self.assertEqual(4, m.mcell) m.reset_program() m.load_program('>>>-<--<---<----') m.run() self.assertEqual(0, m.mcell) self.assertEqual(0, m.mem_at(1)) self.assertEqual(1, m.mem_at(2)) self.assertEqual(3, m.mem_at(3))
def test_multiply(self): from tbas.corpus import multiply_numbers m = Machine(program=multiply_numbers(3, 5)) m.run() self.assertEqual(15, m.mcell) m.clean_init() m.load_program(multiply_numbers(5, 8, 2)) m.run() self.assertEqual(42, m.mcell) m.clean_init() m.load_program(multiply_numbers(10, 7, -1)) m.run() self.assertEqual(69, m.mcell) # nice
def interpret_program(program_string: str, machine: Machine = None, t=65536): if machine is None: machine = Machine() timeout = t machine.load_program(program_string) should_continue = True while should_continue and timeout > 0: try: should_continue = machine.step_once() except Exception as e: machine.debug_printout() raise e timeout -= 1 print() if timeout == 0: machine.debug_printout() assert False, "Program used too many cycles"
def test_buffer_program(self): m = Machine() program_string = '++++++=?' m.load_program(program_string) m.run() self.assertEqual(program_string, str(m.buffer))