from cpu6502 import *
import os.path
import unittest


class TestCPU6502(unittest.TestCase):

   def setUp(self):
       self.cpu = CPU6502()
       self.cpu.pc = 0x7000
       self.cpu.start = self.cpu.pc
       self.debug = False
       print("")
       print("---------------------------")
       print("test method: %s" % self._testMethodName)

   def check_flags(self, neg, zero, carry):
       self.assertEqual(self.cpu.flag_n, neg)
       self.assertEqual(self.cpu.flag_z, zero)
       self.assertEqual(self.cpu.flag_c, carry)

   def check_a(self, val, neg, zero, carry):
       self.assertEqual(self.cpu.reg_a, val)
       self.check_flags(neg, zero, carry)

   def check_x(self, val, neg, zero, carry):
       self.assertEqual(self.cpu.reg_x, val)
       self.check_flags(neg, zero, carry)

   def listing(self):
       self.cpu.end = self.cpu.pc
       self.cpu.disass()

   def run_test(self, debug=False):
       self.cpu.resetcyc()
       if self.debug:
           self.listing()
       self.cpu.run()
       if self.debug:
           self.cpu.registers()
           print("")
           print("Cycles: %d" % (self.cpu.cycles))
           print("")
       self.assertEqual(0xff, self.cpu.sp)

   def test_brk_file(self):
       # Interrupt-Ausloeser
       fp = open(self.cpu.brk_file, 'w')
       fp.close()
       # Assembler-Programm
       self.cpu.addcmd('lda #', 0x20)
       # Befehle werden nicht mehr ausgefuehrt
       self.cpu.addcmd('ldx #', 0x10)
       self.cpu.addcmd('brk')
       self.run_test()
       self.check_a(0x20, False, False, False)
       self.check_x(0, False, False, False)
       self.assertFalse(os.path.exists(self.cpu.brk_file))


if __name__ == '__main__':
   unittest.main()