def test_no_header(self): """ A program without a header is not a program. """ with pytest.raises(RuntimeError): parser.parse_program("\n".join([ "INBOX", "OUTBOX", ]))
def test_small_program(self): """ A header followed by instructions is a valid program. """ ops = parser.parse_program("\n".join([ "-- HUMAN RESOURCE MACHINE PROGRAM --", "INBOX", "OUTBOX", ])) assert map(str, ops) == ['INBOX', 'OUTBOX']
def test_header_after_nonsense(self): """ Anything before the header is ignored. """ ops = parser.parse_program("\n".join([ "This is an empty program.", "", "It is my empty program, but you can have it if you want.", "-- HUMAN RESOURCE MACHINE PROGRAM --", ])) assert ops == []
def test_small_program_after_nonsense(self): """ A program can include documentation or whatever before the header. """ ops = parser.parse_program("\n".join([ "This is a small program that copies a single value from input", "to output.", "", "-- HUMAN RESOURCE MACHINE PROGRAM --", "INBOX", "OUTBOX", ])) assert map(str, ops) == ['INBOX', 'OUTBOX']
def test_memset(self): """ A program can include some initial memory values. """ ops = parser.parse_program("\n".join([ "-- HUMAN RESOURCE MACHINE PROGRAM --", "COPYFROM 0", "OUTBOX", "COPYFROM 1", "OUTBOX", ".memset 0 1", ".memset 1 a", ])) assert map(str, ops) == [ 'COPYFROM 0', 'OUTBOX', 'COPYFROM 1', 'OUTBOX', '.memset 0 1', '.memset 1 a']
def test_addresses(self): """ A memory operation can use direct or indirect addressing. """ ops = parser.parse_program("\n".join([ "-- HUMAN RESOURCE MACHINE PROGRAM --", "COPYFROM [0]", "OUTBOX", "COPYFROM 1", "OUTBOX", ".memset 0 2", ".memset 1 a", ".memset 2 b", ])) assert map(str, ops) == [ 'COPYFROM [0]', 'OUTBOX', 'COPYFROM 1', 'OUTBOX', '.memset 0 2', '.memset 1 a', '.memset 2 b']
def entry_point(argv): try: program_filename = argv[1] except IndexError: print "I can't run a program if you don't give me one." return 1 try: input_filename = argv[2] except IndexError: print "I can't run a program if you don't give me input." return 1 try: memory_filename = argv[3] except IndexError: memory_filename = None program = parse_program(read(program_filename)) input_data = parse_input_data(read(input_filename)) assert memory_filename is None, "Not implemented yet." mainloop(program, input_data) return 0
def program(*lines): instructions = ["-- HUMAN RESOURCE MACHINE PROGRAM --"] + list(lines) return parse_program("\n".join(instructions))
def test_empty_program(self): """ An empty string is not a program. """ with pytest.raises(RuntimeError): parser.parse_program("")
def test_header_only(self): """ A header on its own is an empty program. """ ops = parser.parse_program("-- HUMAN RESOURCE MACHINE PROGRAM --") assert ops == []