import typing
from . import SoETestBase


class SequenceBreaksTest(SoETestBase):
    """Tests that 'on' doesn't put sequence breaks in logic. This is also the test base for in-logic."""
    options: typing.Dict[str, typing.Any] = {"sequence_breaks": "on"}

    def test_sequence_breaks_access(self) -> None:
        in_logic = self.options["sequence_breaks"] == "logic"

        # some locations that just need any weapon + sequence break
        break_reachable = [
            "Sons of Sth.", "Mad Monk", "Magmar",
            "Fireball",
            "Volcano Room1 #73", "Pyramid top #135",
        ]
        # some locations that should still be unreachable
        break_unreachable = [
            "Aquagoth", "Megataur", "Tiny", "Rimsala",
            "Barrier", "Call Up", "Levitate", "Stop", "Drain", "Escape",
            "Greenhouse #275", "E. Crustacia #107", "Energy Core #285", "Vanilla Gauge #57",
        ]

        self.assertLocationReachability(reachable=break_reachable, unreachable=break_unreachable, satisfied=False)
        self.collect_by_name("Gladiator Sword")
        self.assertLocationReachability(reachable=break_reachable, unreachable=break_unreachable, satisfied=in_logic)
        self.collect_by_name("Spider Claw")  # Gauge now just needs non-sword
        self.assertEqual(self.can_reach_location("Vanilla Gauge #57"), in_logic)
        self.collect_by_name("Bronze Spear")  # Escape now just needs either Megataur or Rimsala dead
        self.assertEqual(self.can_reach_location("Escape"), in_logic)

    def test_sequence_breaks_goal(self) -> None:
        in_logic = self.options["sequence_breaks"] == "logic"

        # don't need Energy Core with sequence breaks in logic
        for item in ["Gladiator Sword", "Diamond Eye", "Wheel", "Gauge"]:
            self.assertBeatable(False)
            self.collect_by_name(item)
        self.assertBeatable(in_logic)


class SequenceBreaksInLogicTest(SequenceBreaksTest):
    """Tests that stuff that should be reachable/unreachable with sequence breaks actually is."""
    options: typing.Dict[str, typing.Any] = {"sequence_breaks": "logic"}