gameboy superoptimizer
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

97 lines
2.6 KiB

  1. from gbso.cpu.insn import ADD_A_N, ADD_A_R, DEC_HL, LD_RR_NN
  2. from gbso.program.mutate import *
  3. # NOTE: All of these trial counts and probabilities could be a lot more precise,
  4. # but it is easier to just throw extra trials at the problem.
  5. def test_mutate_swap():
  6. trials = 1000
  7. swapped_count = 0
  8. insn_a = ADD_A_R(R8.C)
  9. insn_b = DEC_HL()
  10. prgm = Program(insns=[insn_a, insn_b])
  11. for _ in range(trials):
  12. new_prgm = mutate_swap(prgm)
  13. assert len(new_prgm.insns) == 2
  14. assert isinstance(new_prgm.insns[0], Insn)
  15. assert isinstance(new_prgm.insns[1], Insn)
  16. assert new_prgm.insns == prgm.insns or new_prgm.insns == [insn_b, insn_a]
  17. if new_prgm.insns != prgm.insns:
  18. swapped_count += 1
  19. assert abs(0.5 - (swapped_count / trials)) < 0.05
  20. def test_mutate_insn():
  21. trials = 1000
  22. seen_add_insns = 0
  23. seen_unused = 0
  24. add_insn = ADD_A_N(128)
  25. prgm = Program(insns=[add_insn])
  26. for _ in range(trials):
  27. new_prgm = mutate_insn(prgm, 0.5)
  28. assert len(new_prgm.insns) == 1
  29. assert isinstance(new_prgm.insns[0], Insn)
  30. if new_prgm.insns[0] == add_insn:
  31. seen_add_insns += 1
  32. elif new_prgm.insns[0] == UNUSED():
  33. seen_unused += 1
  34. assert seen_add_insns < 10
  35. assert abs(0.5 - (seen_unused / trials)) < 0.05
  36. def test_create_random_insn():
  37. insn = create_random_insn(ADD_A_R)
  38. assert type(insn) == ADD_A_R
  39. assert type(insn.r) == R8
  40. insn = create_random_insn(ADD_A_N)
  41. assert type(insn) == ADD_A_N
  42. assert type(insn.n) == int
  43. insn = create_random_insn(LD_RR_NN)
  44. assert type(insn) == LD_RR_NN
  45. assert type(insn.rr) == R16
  46. assert type(insn.nn) == int
  47. def test_create_random_operand():
  48. op = create_random_operand(Operand.R8)
  49. assert type(op) == R8
  50. op = create_random_operand(Operand.R16)
  51. assert type(op) == R16
  52. for _ in range(100):
  53. op = create_random_operand(Operand.R16_NO_SP)
  54. assert type(op) == R16
  55. assert op != R16.SP
  56. for _ in range(100):
  57. op = create_random_operand(Operand.IMM3)
  58. assert type(op) == int
  59. assert op >= 0 and op < 8
  60. for _ in range(300):
  61. op = create_random_operand(Operand.IMM8)
  62. assert type(op) == int
  63. assert op >= 0 and op < 256
  64. for _ in range(500):
  65. op = create_random_operand(Operand.IMM16)
  66. assert type(op) == int
  67. assert op >= 0 and op < 65536
  68. for _ in range(300):
  69. op = create_random_operand(Operand.SIMM8)
  70. assert type(op) == int
  71. assert op >= -128 and op < 128