def test_isAnyPointExcluded_unmatchedPairs(self):
        """Test the isAnyPointExcluded method when an odd number of arguments are provided."""
        mockLogger = mock.Mock()
        unit = ExcludeRegionState(mockLogger)
        aRegion = RectangularRegion(x1=0, y1=0, x2=5, y2=5)
        unit.addRegion(aRegion)

        with self.assertRaises(IndexError):
            unit.isAnyPointExcluded(0)
    def test_isAnyPointExcluded_oneRegion(self):
        """Test the isAnyPointExcluded method when one region is defined."""
        mockLogger = mock.Mock()
        unit = ExcludeRegionState(mockLogger)
        aRegion = RectangularRegion(x1=0, y1=0, x2=5, y2=5)
        unit.addRegion(aRegion)

        self.assertTrue(unit.isAnyPointExcluded(0, 0),
                        "(0,0) should be excluded (one region)")
        self.assertFalse(unit.isAnyPointExcluded(10, 10),
                         "(10,10) should NOT be excluded (one region)")
    def test_isAnyPointExcluded_exclusionDisabled(self):
        """Test the isAnyPointExcluded method when exclusion is disabled."""
        mockLogger = mock.Mock()
        unit = ExcludeRegionState(mockLogger)
        aRegion = RectangularRegion(x1=0, y1=0, x2=5, y2=5)
        unit.addRegion(aRegion)
        unit.disableExclusion("Disable for test")

        self.assertFalse(unit.isAnyPointExcluded(0, 0),
                         "(0,0) should NOT be excluded (exclusion disabled)")
        self.assertFalse(
            unit.isAnyPointExcluded(10, 10),
            "(10,10) should NOT be excluded (exclusion disabled)")
    def test_isAnyPointExcluded_noRegions(self):
        """Test the isAnyPointExcluded method when no regions are defined."""
        mockLogger = mock.Mock()
        unit = ExcludeRegionState(mockLogger)

        self.assertFalse(
            unit.isAnyPointExcluded(0, 0),
            "(0,0) should NOT be excluded when no regions are defined")
        self.assertFalse(
            unit.isAnyPointExcluded(10, 10),
            "(10,10) should NOT be excluded when no regions are defined")
        self.assertFalse(
            unit.isAnyPointExcluded(0, 0, 10, 10),
            "Neither (0,0) nor (10,10) should be excluded when no regions are defined"
        )
    def test_isAnyPointExcluded_unitMultiplier(self):
        """Test the isAnyPointExcluded method honors the unit multipler in effect."""
        mockLogger = mock.Mock()
        unit = ExcludeRegionState(mockLogger)
        unit.position.setUnitMultiplier(INCH_TO_MM_FACTOR)
        aRegion = RectangularRegion(x1=INCH_TO_MM_FACTOR,
                                    y1=INCH_TO_MM_FACTOR,
                                    x2=2 * INCH_TO_MM_FACTOR,
                                    y2=2 * INCH_TO_MM_FACTOR)
        unit.addRegion(aRegion)

        self.assertTrue(unit.isAnyPointExcluded(1, 1),
                        "(1 inch, 1 inch) should be excluded")
        self.assertTrue(unit.isAnyPointExcluded(2, 2),
                        "(2 inch, 2 inch) should be excluded")
        self.assertFalse(unit.isAnyPointExcluded(2.1, 2),
                         "(2.1 inch, 2 inch) should NOT be excluded")
    def test_isAnyPointExcluded_middleExcluded(self):
        """Test the isAnyPointExcluded method a point other than the first or last is excluded."""
        mockLogger = mock.Mock()
        unit = ExcludeRegionState(mockLogger)
        aRegion = RectangularRegion(x1=0, y1=0, x2=5, y2=5)
        unit.addRegion(aRegion)

        self.assertTrue(unit.isAnyPointExcluded(10, 10, 0, 0, 20, 20),
                        "(0,0) should be excluded (middle)")
    def test_isAnyPointExcluded_lastExcluded(self):
        """Test the isAnyPointExcluded method when only the last point is excluded."""
        mockLogger = mock.Mock()
        unit = ExcludeRegionState(mockLogger)
        aRegion = RectangularRegion(x1=0, y1=0, x2=5, y2=5)
        unit.addRegion(aRegion)

        self.assertTrue(unit.isAnyPointExcluded(10, 10, 0, 0),
                        "(0,0) should be excluded (last)")
    def test_isAnyPointExcluded_noArguments(self):
        """Test the isAnyPointExcluded method when no arguments are provided."""
        mockLogger = mock.Mock()
        unit = ExcludeRegionState(mockLogger)
        aRegion = RectangularRegion(x1=0, y1=0, x2=5, y2=5)
        unit.addRegion(aRegion)

        self.assertFalse(
            unit.isAnyPointExcluded(),
            "isAnyPointExcluded should return false when passed no arguments")
    def test_isAnyPointExcluded_multRegions(self):
        """Test the isAnyPointExcluded method when multiple regions are defined."""
        mockLogger = mock.Mock()
        unit = ExcludeRegionState(mockLogger)

        aRegion = RectangularRegion(x1=0, y1=0, x2=5, y2=5)
        anotherRegion = CircularRegion(cx=20, cy=20, r=10)

        unit.addRegion(aRegion)
        unit.addRegion(anotherRegion)

        self.assertTrue(unit.isAnyPointExcluded(0, 0),
                        "(0,0) should be excluded (mult regions)")
        self.assertFalse(unit.isAnyPointExcluded(10, 10),
                         "(10,10) should NOT be excluded (mult regions)")

        self.assertTrue(unit.isAnyPointExcluded(20, 20),
                        "(20,20) should be excluded (mult regions)")
        self.assertFalse(unit.isAnyPointExcluded(30, 10),
                         "(30,10) should NOT be excluded (mult regions)")

        self.assertFalse(
            unit.isAnyPointExcluded(10, 10, 30, 10),
            "Neither (10,10) nor (30,10) should be excluded (mult regions)")