# Test the SBAPI for GetStatistics()

import json
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil


class TestStatsAPI(TestBase):
    NO_DEBUG_INFO_TESTCASE = True

    def test_stats_api(self):
        self.build()
        exe = self.getBuildArtifact("a.out")
        target = self.dbg.CreateTarget(exe)

        # Test enabling/disabling stats
        self.assertFalse(target.GetCollectingStats())
        target.SetCollectingStats(True)
        self.assertTrue(target.GetCollectingStats())
        target.SetCollectingStats(False)
        self.assertFalse(target.GetCollectingStats())

        # Test the function to get the statistics in JSON'ish.
        stats = target.GetStatistics()
        stream = lldb.SBStream()
        res = stats.GetAsJSON(stream)
        debug_stats = json.loads(stream.GetData())
        self.assertEqual(
            "targets" in debug_stats,
            True,
            'Make sure the "targets" key in in target.GetStatistics()',
        )
        self.assertEqual(
            "modules" in debug_stats,
            True,
            'Make sure the "modules" key in in target.GetStatistics()',
        )
        stats_json = debug_stats["targets"][0]
        self.assertEqual(
            "expressionEvaluation" in stats_json,
            True,
            'Make sure the "expressionEvaluation" key in in target.GetStatistics()["targets"][0]',
        )
        self.assertEqual(
            "frameVariable" in stats_json,
            True,
            'Make sure the "frameVariable" key in in target.GetStatistics()["targets"][0]',
        )
        expressionEvaluation = stats_json["expressionEvaluation"]
        self.assertEqual(
            "successes" in expressionEvaluation,
            True,
            'Make sure the "successes" key in in "expressionEvaluation" dictionary"',
        )
        self.assertEqual(
            "failures" in expressionEvaluation,
            True,
            'Make sure the "failures" key in in "expressionEvaluation" dictionary"',
        )
        frameVariable = stats_json["frameVariable"]
        self.assertEqual(
            "successes" in frameVariable,
            True,
            'Make sure the "successes" key in in "frameVariable" dictionary"',
        )
        self.assertEqual(
            "failures" in frameVariable,
            True,
            'Make sure the "failures" key in in "frameVariable" dictionary"',
        )
