def test_op_output(self): """ Tests output op code Use io.StringIO() to capture the output """ e = ElfCPU() # Interrupts off e.load_string('4,5,104,66,99,55') e.interrupts = False result = None with patch('sys.stdout', new=io.StringIO()) as output: e.execute() result = output.getvalue() result = result.splitlines() # First is a reference to memory address 5 self.assertEqual(result[0].strip(), '55') # Second is an immediate value self.assertEqual(result[1].strip(), '66') # Interrupts on e.load_string('4,5,104,66,99,55') e.interrupts = True with self.assertRaises(OutputInterrupt): e.execute() self.assertEqual(e.output_buffer, 55) # Don't clear buffer with self.assertRaises(OutputOverflow): e.execute() # Restart test e.reset() e.load_string('4,5,104,66,99,55') e.interrupts = True with self.assertRaises(OutputInterrupt): e.execute() self.assertEqual(e.output_buffer, 55) # Clear buffer del e.output_buffer with self.assertRaises(OutputInterrupt): e.execute() self.assertEqual(e.output_buffer, 66)
def test_op_input(self): """ Tests input op code Use unittest.mock.patch to fake the input value """ e = ElfCPU() # Interrupts off e.load_string('3,3,99,-1') e.interrupts = False with patch('builtins.input', return_value='1234'): e.execute() self.assertEqual(e.peek(3), 1234) # Interrupts on e.load_string('3,5,3,5,99,-1') e.interrupts = True with self.assertRaises(InputInterrupt): e.step() # Should be back at pc = 0 self.assertEqual(e.pc, 0) # Load input e.input_buffer = 567 # Loading again overflows with self.assertRaises(InputOverflow): e.input_buffer = 123 # Execute the input instruction e.step() self.assertEqual(e.peek(5), 567) # Exec next input instruction with self.assertRaises(InputInterrupt): e.step() e.input_buffer = 987 # Execute until end e.execute() self.assertEqual(e.peek(5), 987)
thruster = 0 with open('input.txt') as f: intcode = ''.join(f.readlines()) # Iterate through phases for phase in phases: input_signal = 0 # Iterate through amps for position in range(5): # Clear state amp.reset() # Reload code amp.load_string(intcode) # Interrupts on amp.interrupts = True # Run until phase is requested try: amp.execute() except InputInterrupt: pass # Provide phase amp.input_buffer = phase[position] # Run until input signal is requested try: amp.execute() except InputInterrupt: pass