xref: /llvm-project/lldb/test/API/lang/cpp/fpnan/TestFPNaN.py (revision 9690b30ba9acc3deb1068deb37f3b507826b27fe)
1"""
2Test floating point expressions with zero, NaN, dernormalized and infinite
3numbers.
4"""
5
6import lldb
7from lldbsuite.test.lldbtest import *
8from lldbsuite.test import lldbutil
9
10
11class FPNaNTestCase(TestBase):
12    def setUp(self):
13        # Call super's setUp().
14        TestBase.setUp(self)
15        # Find the line number to break inside main().
16        self.line = line_number("main.cpp", "// Set break point at this line.")
17
18    def test(self):
19        self.build()
20        exe = self.getBuildArtifact("a.out")
21        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
22
23        # Break inside the main.
24        lldbutil.run_break_set_by_file_and_line(
25            self, "main.cpp", self.line, num_expected_locations=1
26        )
27
28        self.runCmd("run", RUN_SUCCEEDED)
29        # Zero and denorm
30        self.expect(
31            "expr +0.0",
32            VARIABLES_DISPLAYED_CORRECTLY,
33            substrs=["double", "0"],
34        )
35        self.expect(
36            "expr -0.0",
37            VARIABLES_DISPLAYED_CORRECTLY,
38            substrs=["double", "0"],
39        )
40        self.expect(
41            "expr 0.0 / 0",
42            VARIABLES_DISPLAYED_CORRECTLY,
43            substrs=["double", "NaN"],
44        )
45        self.expect(
46            "expr 0 / 0.0",
47            VARIABLES_DISPLAYED_CORRECTLY,
48            substrs=["double", "NaN"],
49        )
50        self.expect(
51            "expr 1 / +0.0",
52            VARIABLES_DISPLAYED_CORRECTLY,
53            substrs=["double", "+Inf"],
54        )
55        self.expect(
56            "expr 1 / -0.0",
57            VARIABLES_DISPLAYED_CORRECTLY,
58            substrs=["double", "-Inf"],
59        )
60        self.expect(
61            "expr +0.0 / +0.0 != +0.0 / +0.0",
62            VARIABLES_DISPLAYED_CORRECTLY,
63            substrs=["bool", "true"],
64        )
65        self.expect(
66            "expr -1.f * 0",
67            VARIABLES_DISPLAYED_CORRECTLY,
68            substrs=["float", "-0"],
69        )
70        self.expect(
71            "expr 0x0.123p-1",
72            VARIABLES_DISPLAYED_CORRECTLY,
73            substrs=["double", "0.0355224609375"],
74        )
75        # NaN
76        self.expect(
77            "expr fnan < fnan",
78            VARIABLES_DISPLAYED_CORRECTLY,
79            substrs=["bool", "false"],
80        )
81        self.expect(
82            "expr fnan <= fnan",
83            VARIABLES_DISPLAYED_CORRECTLY,
84            substrs=["bool", "false"],
85        )
86        self.expect(
87            "expr fnan > fnan",
88            VARIABLES_DISPLAYED_CORRECTLY,
89            substrs=["bool", "false"],
90        )
91        self.expect(
92            "expr fnan >= fnan",
93            VARIABLES_DISPLAYED_CORRECTLY,
94            substrs=["bool", "false"],
95        )
96        self.expect(
97            "expr fnan == fnan",
98            VARIABLES_DISPLAYED_CORRECTLY,
99            substrs=["bool", "false"],
100        )
101        self.expect(
102            "expr fnan != fnan",
103            VARIABLES_DISPLAYED_CORRECTLY,
104            substrs=["bool", "true"],
105        )
106        self.expect(
107            "expr 1.0 <= fnan",
108            VARIABLES_DISPLAYED_CORRECTLY,
109            substrs=["bool", "false"],
110        )
111        self.expect(
112            "expr 1.0f < fnan",
113            VARIABLES_DISPLAYED_CORRECTLY,
114            substrs=["bool", "false"],
115        )
116        self.expect(
117            "expr 1.0f != fnan",
118            VARIABLES_DISPLAYED_CORRECTLY,
119            substrs=["bool", "true"],
120        )
121        self.expect(
122            "expr (unsigned int) fdenorm",
123            VARIABLES_DISPLAYED_CORRECTLY,
124            substrs=["int", "0"],
125        )
126        self.expect(
127            "expr (unsigned int) (1.0f + fdenorm)",
128            VARIABLES_DISPLAYED_CORRECTLY,
129            substrs=["int", "1"],
130        )
131