"""Test that the Objective-C syntax for dictionary/array literals and indexing works"""


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

from ObjCNewSyntaxTest import ObjCNewSyntaxTest


class ObjCNewSyntaxTestCaseLiteral(ObjCNewSyntaxTest):
    @skipIf(macos_version=["<", "10.12"])
    @expectedFailureAll(archs=["i[3-6]86"])
    def test_char_literal(self):
        self.runToBreakpoint()

        self.expect(
            "expr --object-description -- @'a'",
            VARIABLES_DISPLAYED_CORRECTLY,
            substrs=[str(ord("a"))],
        )

    @skipIf(macos_version=["<", "10.12"])
    @expectedFailureAll(archs=["i[3-6]86"])
    def test_integer_literals(self):
        self.runToBreakpoint()

        self.expect(
            "expr --object-description -- @1",
            VARIABLES_DISPLAYED_CORRECTLY,
            substrs=["1"],
        )

        self.expect(
            "expr --object-description -- @1l",
            VARIABLES_DISPLAYED_CORRECTLY,
            substrs=["1"],
        )

        self.expect(
            "expr --object-description -- @1ul",
            VARIABLES_DISPLAYED_CORRECTLY,
            substrs=["1"],
        )

        self.expect(
            "expr --object-description -- @1ll",
            VARIABLES_DISPLAYED_CORRECTLY,
            substrs=["1"],
        )

        self.expect(
            "expr --object-description -- @1ull",
            VARIABLES_DISPLAYED_CORRECTLY,
            substrs=["1"],
        )

    @skipIf(macos_version=["<", "10.12"])
    @expectedFailureAll(archs=["i[3-6]86"])
    def test_float_literal(self):
        self.runToBreakpoint()

        self.runCmd("settings set target.prefer-dynamic-value no-dynamic-values")

        self.expect(
            "expr -- @123.45",
            VARIABLES_DISPLAYED_CORRECTLY,
            substrs=["NSNumber", "123.45"],
        )

    @skipIf(macos_version=["<", "10.12"])
    @expectedFailureAll(archs=["i[3-6]86"])
    def test_expressions_in_literals(self):
        self.runToBreakpoint()

        self.runCmd("settings set target.prefer-dynamic-value no-dynamic-values")

        self.expect(
            "expr --object-description -- @( 1 + 3 )",
            VARIABLES_DISPLAYED_CORRECTLY,
            substrs=["4"],
        )
        self.expect(
            'expr -- @((char*)"Hello world" + 6)',
            VARIABLES_DISPLAYED_CORRECTLY,
            substrs=["NSString", "world"],
        )
