1//===----------------------------------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// <string>
11
12// long double stold(const string& str, size_t *idx = 0);
13// long double stold(const wstring& str, size_t *idx = 0);
14
15#include <iostream>
16
17#include <string>
18#include <cmath>
19#include <cassert>
20
21#include "test_macros.h"
22
23int main()
24{
25    assert(std::stold("0") == 0);
26    assert(std::stold(L"0") == 0);
27    assert(std::stold("-0") == 0);
28    assert(std::stold(L"-0") == 0);
29    assert(std::stold("-10") == -10);
30    assert(std::stold(L"-10.5") == -10.5);
31    assert(std::stold(" 10") == 10);
32    assert(std::stold(L" 10") == 10);
33    size_t idx = 0;
34    assert(std::stold("10g", &idx) == 10);
35    assert(idx == 2);
36    idx = 0;
37    assert(std::stold(L"10g", &idx) == 10);
38    assert(idx == 2);
39#ifndef TEST_HAS_NO_EXCEPTIONS
40    try
41#endif
42    {
43        assert(std::stold("1.e60", &idx) == 1.e60L);
44        assert(idx == 5);
45    }
46#ifndef TEST_HAS_NO_EXCEPTIONS
47    catch (const std::out_of_range&)
48    {
49        assert(false);
50    }
51    try
52#endif
53    {
54        assert(std::stold(L"1.e60", &idx) == 1.e60L);
55        assert(idx == 5);
56    }
57#ifndef TEST_HAS_NO_EXCEPTIONS
58    catch (const std::out_of_range&)
59    {
60        assert(false);
61    }
62#endif
63    idx = 0;
64#ifndef TEST_HAS_NO_EXCEPTIONS
65    try
66    {
67        assert(std::stold("1.e6000", &idx) == INFINITY);
68        assert(false);
69    }
70    catch (const std::out_of_range&)
71    {
72        assert(idx == 0);
73    }
74    try
75    {
76        assert(std::stold(L"1.e6000", &idx) == INFINITY);
77        assert(false);
78    }
79    catch (const std::out_of_range&)
80    {
81        assert(idx == 0);
82    }
83    try
84#endif
85    {
86        assert(std::stold("INF", &idx) == INFINITY);
87        assert(idx == 3);
88    }
89#ifndef TEST_HAS_NO_EXCEPTIONS
90    catch (const std::out_of_range&)
91    {
92        assert(false);
93    }
94#endif
95    idx = 0;
96#ifndef TEST_HAS_NO_EXCEPTIONS
97    try
98#endif
99    {
100        assert(std::stold(L"INF", &idx) == INFINITY);
101        assert(idx == 3);
102    }
103#ifndef TEST_HAS_NO_EXCEPTIONS
104    catch (const std::out_of_range&)
105    {
106        assert(false);
107    }
108#endif
109    idx = 0;
110#ifndef TEST_HAS_NO_EXCEPTIONS
111    try
112#endif
113    {
114        assert(std::isnan(std::stold("NAN", &idx)));
115        assert(idx == 3);
116    }
117#ifndef TEST_HAS_NO_EXCEPTIONS
118    catch (const std::out_of_range&)
119    {
120        assert(false);
121    }
122#endif
123    idx = 0;
124#ifndef TEST_HAS_NO_EXCEPTIONS
125    try
126#endif
127    {
128        assert(std::isnan(std::stold(L"NAN", &idx)));
129        assert(idx == 3);
130    }
131#ifndef TEST_HAS_NO_EXCEPTIONS
132    catch (const std::out_of_range&)
133    {
134        assert(false);
135    }
136    idx = 0;
137    try
138    {
139        std::stold("", &idx);
140        assert(false);
141    }
142    catch (const std::invalid_argument&)
143    {
144        assert(idx == 0);
145    }
146    try
147    {
148        std::stold(L"", &idx);
149        assert(false);
150    }
151    catch (const std::invalid_argument&)
152    {
153        assert(idx == 0);
154    }
155    try
156    {
157        std::stold("  - 8", &idx);
158        assert(false);
159    }
160    catch (const std::invalid_argument&)
161    {
162        assert(idx == 0);
163    }
164    try
165    {
166        std::stold(L"  - 8", &idx);
167        assert(false);
168    }
169    catch (const std::invalid_argument&)
170    {
171        assert(idx == 0);
172    }
173    try
174    {
175        std::stold("a1", &idx);
176        assert(false);
177    }
178    catch (const std::invalid_argument&)
179    {
180        assert(idx == 0);
181    }
182    try
183    {
184        std::stold(L"a1", &idx);
185        assert(false);
186    }
187    catch (const std::invalid_argument&)
188    {
189        assert(idx == 0);
190    }
191#endif
192}
193