"""
Test TestBase test functions.
"""

import io

from lldbsuite.test.lldbtest import *
from lldbsuite.test_event import build_exception


class TestBuildMethod(Base):
    SHARED_BUILD_TESTCASE = False

    def setUp(self):
        super().setUp()
        self._traces = []
        self.traceAlways = True

    # override the parent trace method
    def trace(self, *args, **kwargs):
        buf = io.StringIO()
        print(*args, file=buf, **kwargs)
        self._traces.append(buf.getvalue())

    def test_build_fails_helpfully(self):
        try:
            self.build(dictionary={"CXX_SOURCES": "nonexisting-file.cpp"})
        except build_exception.BuildError as e:
            self.assertIn("nonexisting-file.cpp", str(e))
        else:
            self.fail("BuildError not raised!")

    def test_build_logs_traces(self):
        self.build(dictionary={"CXX_SOURCES": "return0.cpp"})
        self.assertIn("CXX_SOURCES", self._traces[0])
        self.assertIn("return0.o", self._traces[1])
