"""
Tests calling builtin functions using expression evaluation.
"""

from __future__ import print_function


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


class ExprCommandCallBuiltinFunction(TestBase):

    mydir = TestBase.compute_mydir(__file__)

    # Builtins are expanded by Clang, so debug info shouldn't matter.
    NO_DEBUG_INFO_TESTCASE = True

    def setUp(self):
        TestBase.setUp(self)
        # Find the line number to break for main.c.
        self.line = line_number(
            'main.cpp',
            '// Please test these expressions while stopped at this line:')

    def test(self):
        self.build()

        # Set breakpoint in main and run exe
        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
        lldbutil.run_break_set_by_file_and_line(
            self, "main.cpp", self.line, num_expected_locations=-1, loc_exact=True)

        self.runCmd("run", RUN_SUCCEEDED)

        interp = self.dbg.GetCommandInterpreter()
        result = lldb.SBCommandReturnObject()

        # Test different builtin functions.

        self.expect("expr __builtin_isinf(0.0f)", substrs=["(int) $", " = 0\n"])
        self.expect("expr __builtin_isnormal(0.0f)", substrs=["(int) $", " = 0\n"])
        self.expect("expr __builtin_constant_p(1)", substrs=["(int) $", " = 1\n"])
        self.expect("expr __builtin_abs(-14)", substrs=["(int) $", " = 14\n"])
