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


class TestCaseClassTemplateNonTypeParameterPack(TestBase):
    @expectedFailureAll(
        oslist=["windows"], archs=["i[3-6]86", "x86_64"]
    )  # Fails to read memory from target.
    @no_debug_info_test
    def test(self):
        self.build()
        self.dbg.CreateTarget(self.getBuildArtifact("a.out"))

        self.expect_expr(
            "emptyNonTypePack",
            result_type="NonTypePack<>",
            result_children=[ValueCheck(name="a", type="int")],
        )
        self.expect_expr(
            "oneElemNonTypePack",
            result_type="NonTypePack<1>",
            result_children=[ValueCheck(name="a", type="int")],
        )
        self.expect_expr(
            "twoElemNonTypePack",
            result_type="NonTypePack<1, 2>",
            result_children=[ValueCheck(name="a", type="int")],
        )

        self.expect_expr(
            "emptyAnonNonTypePack",
            result_type="AnonNonTypePack<>",
            result_children=[ValueCheck(name="b", type="int")],
        )
        self.expect_expr(
            "oneElemAnonNonTypePack",
            result_type="AnonNonTypePack<1>",
            result_children=[ValueCheck(name="b", type="int")],
        )
        self.expect_expr(
            "twoElemAnonNonTypePack",
            result_type="AnonNonTypePack<1, 2>",
            result_children=[ValueCheck(name="b", type="int")],
        )

        self.expect_expr(
            "emptyAnonNonTypePackAfterTypeParam",
            result_type="AnonNonTypePackAfterTypeParam<int>",
            result_children=[ValueCheck(name="c", type="int")],
        )
        self.expect_expr(
            "oneElemAnonNonTypePackAfterTypeParam",
            result_type="AnonNonTypePackAfterTypeParam<int, 1>",
            result_children=[ValueCheck(name="c", type="int")],
        )

        self.expect_expr(
            "emptyAnonNonTypePackAfterAnonTypeParam",
            result_type="AnonNonTypePackAfterAnonTypeParam<int>",
            result_children=[ValueCheck(name="d", type="float")],
        )
        self.expect_expr(
            "oneElemAnonNonTypePackAfterAnonTypeParam",
            result_type="AnonNonTypePackAfterAnonTypeParam<int, 1>",
            result_children=[ValueCheck(name="d", type="float")],
        )

        self.expect_expr(
            "emptyNonTypePackAfterAnonTypeParam",
            result_type="NonTypePackAfterAnonTypeParam<int>",
            result_children=[ValueCheck(name="e", type="int")],
        )
        self.expect_expr(
            "oneElemNonTypePackAfterAnonTypeParam",
            result_type="NonTypePackAfterAnonTypeParam<int, 1>",
            result_children=[ValueCheck(name="e", type="int")],
        )

        self.expect_expr(
            "emptyNonTypePackAfterTypeParam",
            result_type="NonTypePackAfterTypeParam<int>",
            result_children=[ValueCheck(name="f", type="int")],
        )
        self.expect_expr(
            "oneElemNonTypePackAfterTypeParam",
            result_type="NonTypePackAfterTypeParam<int, 1>",
            result_children=[ValueCheck(name="f", type="int")],
        )

        self.expect_expr(
            "emptyAnonNonTypePackAfterNonTypeParam",
            result_type="AnonNonTypePackAfterNonTypeParam<1>",
            result_children=[ValueCheck(name="g", type="int")],
        )
        self.expect_expr(
            "oneElemAnonNonTypePackAfterNonTypeParam",
            result_type="AnonNonTypePackAfterNonTypeParam<1, 2>",
            result_children=[ValueCheck(name="g", type="int")],
        )

        self.expect_expr(
            "emptyAnonNonTypePackAfterAnonNonTypeParam",
            result_type="AnonNonTypePackAfterAnonNonTypeParam<1>",
            result_children=[ValueCheck(name="h", type="float")],
        )
        self.expect_expr(
            "oneElemAnonNonTypePackAfterAnonNonTypeParam",
            result_type="AnonNonTypePackAfterAnonNonTypeParam<1, 2>",
            result_children=[ValueCheck(name="h", type="float")],
        )

        self.expect_expr(
            "emptyNonTypePackAfterAnonNonTypeParam",
            result_type="NonTypePackAfterAnonNonTypeParam<1>",
            result_children=[ValueCheck(name="i", type="int")],
        )
        self.expect_expr(
            "oneElemNonTypePackAfterAnonNonTypeParam",
            result_type="NonTypePackAfterAnonNonTypeParam<1, 2>",
            result_children=[ValueCheck(name="i", type="int")],
        )

        self.expect_expr(
            "emptyNonTypePackAfterNonTypeParam",
            result_type="NonTypePackAfterNonTypeParam<1>",
            result_children=[ValueCheck(name="j", type="int")],
        )
        self.expect_expr(
            "oneElemNonTypePackAfterNonTypeParam",
            result_type="NonTypePackAfterNonTypeParam<1, 2>",
            result_children=[ValueCheck(name="j", type="int")],
        )
