import unittest
from unittest.mock import MagicMock
from /mnt/e/genesis-system/core/rwl/reporting.report_generator import ReportGenerator
import matplotlib.pyplot as plt

class TestReportGenerator(unittest.TestCase):

    def test_generate_markdown_report_with_data_and_graphs(self):
        execution_data = {
            "Total Loops": 100,
            "Average Loop Time": 0.1
        }

        # Create a mock graph
        fig, ax = plt.subplots()
        ax.plot([1, 2, 3], [4, 5, 6])
        ax.set_title("Test Graph")
        graphs = {"Test Graph": fig}

        report_generator = ReportGenerator(execution_data, graphs)
        report = report_generator.generate_markdown_report()

        self.assertIn("# Execution Report", report)
        self.assertIn("## Metrics", report)
        self.assertIn("- **Total Loops:** 100", report)
        self.assertIn("## Graphs", report)
        self.assertIn("### Test Graph", report)
        self.assertIn("data:image/png;base64,", report)
        self.assertIn("## Recommendations", report)

    def test_generate_markdown_report_with_no_data(self):
        report_generator = ReportGenerator({}, {})
        report = report_generator.generate_markdown_report()

        self.assertIn("No execution data available.", report)
        self.assertIn("No graphs available.", report)

    def test_generate_recommendations(self):
        execution_data = {"Total Loops": 50}
        report_generator = ReportGenerator(execution_data, {})
        recommendations = report_generator.generate_recommendations()
        self.assertIsInstance(recommendations, str)
        self.assertIn("optimizing the Ralph Wiggum Loop", recommendations)

    def test_generate_markdown_report_handles_graph_error(self):
        # Mock a graph that raises an exception during saving
        mock_graph = MagicMock()
        mock_graph.savefig.side_effect = Exception("Simulated graph error")
        graphs = {"Faulty Graph": mock_graph}

        report_generator = ReportGenerator({}, graphs)
        report = report_generator.generate_markdown_report()

        self.assertIn("Error displaying graph: Simulated graph error", report)


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