import unittest
from unittest.mock import patch
from io import StringIO
from .guard_fortress import GuardFortress, GuardDog

class TestGuardFortress(unittest.TestCase):

    def setUp(self):
        self.guard_dog = GuardDog()
        self.fortress = GuardFortress(self.guard_dog)

    def test_enable_fortress_mode(self):
        self.assertTrue(self.guard_dog.allow_direct_memory_access)
        self.assertTrue(self.guard_dog.allow_command_injection)
        self.assertTrue(self.guard_dog.allow_system_clock_tampering)
        self.assertTrue(self.guard_dog.allow_buffer_overflows)

        self.fortress.enable_fortress_mode()

        self.assertFalse(self.guard_dog.allow_direct_memory_access)
        self.assertFalse(self.guard_dog.allow_command_injection)
        self.assertFalse(self.guard_dog.allow_system_clock_tampering)
        self.assertFalse(self.guard_dog.allow_buffer_overflows)
        self.assertTrue(self.fortress.enabled)
        self.assertEqual(len(self.fortress.bypass_vectors_blocked), 4)

    def test_disable_fortress_mode(self):
        self.fortress.enable_fortress_mode()
        self.fortress.disable_fortress_mode()

        self.assertTrue(self.guard_dog.allow_direct_memory_access)
        self.assertTrue(self.guard_dog.allow_command_injection)
        self.assertTrue(self.guard_dog.allow_system_clock_tampering)
        self.assertTrue(self.guard_dog.allow_buffer_overflows)
        self.assertFalse(self.fortress.enabled)
        self.assertEqual(len(self.fortress.bypass_vectors_blocked), 0)

    @patch('sys.stdout', new_callable=StringIO)
    def test_enable_fortress_mode_already_enabled(self, stdout):
        self.fortress.enable_fortress_mode()
        self.fortress.enable_fortress_mode()
        self.assertEqual(stdout.getvalue().strip(), "Guard Fortress Mode: ENABLED\nGuard Fortress Mode: Already enabled.")

    @patch('sys.stdout', new_callable=StringIO)
    def test_disable_fortress_mode_already_disabled(self, stdout):
        self.fortress.disable_fortress_mode()
        self.assertEqual(stdout.getvalue().strip(), "Guard Fortress Mode: Already disabled.")

    def test_bypass_vectors_blocked_list(self):
        self.fortress.enable_fortress_mode()
        self.assertEqual(len(self.fortress.bypass_vectors_blocked), 4)
        self.assertIn("Direct Memory Access", self.fortress.bypass_vectors_blocked)
        self.assertIn("Command Injection", self.fortress.bypass_vectors_blocked)
        self.assertIn("System Clock Tampering", self.fortress.bypass_vectors_blocked)
        self.assertIn("Buffer Overflows", self.fortress.bypass_vectors_blocked)

        self.fortress.disable_fortress_mode()
        self.assertEqual(len(self.fortress.bypass_vectors_blocked), 0)

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