blob: 22dda0bdb62ae5702076dd783c3ee997aef3646e [file] [log] [blame]
Howard Hinnantcbbf6332010-06-02 18:20:39 +00001//===----------------------------------------------------------------------===//
2//
Chandler Carruth57b08b02019-01-19 10:56:40 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Howard Hinnantcbbf6332010-06-02 18:20:39 +00006//
7//===----------------------------------------------------------------------===//
8
9// <string>
10
11// float stof(const string& str, size_t *idx = 0);
12// float stof(const wstring& str, size_t *idx = 0);
13
14#include <string>
15#include <cmath>
16#include <cassert>
Billy Robert O'Neal IIIed2f9a62018-08-08 00:40:32 +000017#include <stdexcept>
Howard Hinnantcbbf6332010-06-02 18:20:39 +000018
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000019#include "test_macros.h"
20
JF Bastien2df59c52019-02-04 20:31:13 +000021int main(int, char**)
Howard Hinnantcbbf6332010-06-02 18:20:39 +000022{
23 assert(std::stof("0") == 0);
24 assert(std::stof(L"0") == 0);
25 assert(std::stof("-0") == 0);
26 assert(std::stof(L"-0") == 0);
27 assert(std::stof("-10") == -10);
28 assert(std::stof(L"-10.5") == -10.5);
29 assert(std::stof(" 10") == 10);
30 assert(std::stof(L" 10") == 10);
31 size_t idx = 0;
32 assert(std::stof("10g", &idx) == 10);
33 assert(idx == 2);
34 idx = 0;
35 assert(std::stof(L"10g", &idx) == 10);
36 assert(idx == 2);
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000037#ifndef TEST_HAS_NO_EXCEPTIONS
Howard Hinnant1afbaba2013-01-14 18:59:43 +000038 idx = 0;
Howard Hinnantcbbf6332010-06-02 18:20:39 +000039 try
40 {
41 assert(std::stof("1.e60", &idx) == INFINITY);
Howard Hinnant1afbaba2013-01-14 18:59:43 +000042 assert(false);
Howard Hinnantcbbf6332010-06-02 18:20:39 +000043 }
44 catch (const std::out_of_range&)
45 {
Howard Hinnant1afbaba2013-01-14 18:59:43 +000046 assert(idx == 0);
Howard Hinnantcbbf6332010-06-02 18:20:39 +000047 }
48 try
49 {
50 assert(std::stof(L"1.e60", &idx) == INFINITY);
Howard Hinnant1afbaba2013-01-14 18:59:43 +000051 assert(false);
Howard Hinnantcbbf6332010-06-02 18:20:39 +000052 }
53 catch (const std::out_of_range&)
54 {
Howard Hinnant1afbaba2013-01-14 18:59:43 +000055 assert(idx == 0);
Howard Hinnantcbbf6332010-06-02 18:20:39 +000056 }
57 idx = 0;
58 try
59 {
60 assert(std::stof("1.e360", &idx) == INFINITY);
61 assert(false);
62 }
63 catch (const std::out_of_range&)
64 {
65 assert(idx == 0);
66 }
67 try
68 {
69 assert(std::stof(L"1.e360", &idx) == INFINITY);
70 assert(false);
71 }
72 catch (const std::out_of_range&)
73 {
74 assert(idx == 0);
75 }
76 try
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000077#endif
Howard Hinnantcbbf6332010-06-02 18:20:39 +000078 {
79 assert(std::stof("INF", &idx) == INFINITY);
80 assert(idx == 3);
81 }
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000082#ifndef TEST_HAS_NO_EXCEPTIONS
Howard Hinnantcbbf6332010-06-02 18:20:39 +000083 catch (const std::out_of_range&)
84 {
85 assert(false);
86 }
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000087#endif
Howard Hinnantcbbf6332010-06-02 18:20:39 +000088 idx = 0;
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000089#ifndef TEST_HAS_NO_EXCEPTIONS
Howard Hinnantcbbf6332010-06-02 18:20:39 +000090 try
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000091#endif
Howard Hinnantcbbf6332010-06-02 18:20:39 +000092 {
93 assert(std::stof(L"INF", &idx) == INFINITY);
94 assert(idx == 3);
95 }
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +000096#ifndef TEST_HAS_NO_EXCEPTIONS
Howard Hinnantcbbf6332010-06-02 18:20:39 +000097 catch (const std::out_of_range&)
98 {
99 assert(false);
100 }
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +0000101#endif
Howard Hinnantcbbf6332010-06-02 18:20:39 +0000102 idx = 0;
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +0000103#ifndef TEST_HAS_NO_EXCEPTIONS
Howard Hinnantcbbf6332010-06-02 18:20:39 +0000104 try
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +0000105#endif
Howard Hinnantcbbf6332010-06-02 18:20:39 +0000106 {
107 assert(std::isnan(std::stof("NAN", &idx)));
108 assert(idx == 3);
109 }
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +0000110#ifndef TEST_HAS_NO_EXCEPTIONS
Howard Hinnantcbbf6332010-06-02 18:20:39 +0000111 catch (const std::out_of_range&)
112 {
113 assert(false);
114 }
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +0000115#endif
Howard Hinnantcbbf6332010-06-02 18:20:39 +0000116 idx = 0;
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +0000117#ifndef TEST_HAS_NO_EXCEPTIONS
Howard Hinnantcbbf6332010-06-02 18:20:39 +0000118 try
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +0000119#endif
Howard Hinnantcbbf6332010-06-02 18:20:39 +0000120 {
121 assert(std::isnan(std::stof(L"NAN", &idx)));
122 assert(idx == 3);
123 }
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +0000124#ifndef TEST_HAS_NO_EXCEPTIONS
Howard Hinnantcbbf6332010-06-02 18:20:39 +0000125 catch (const std::out_of_range&)
126 {
127 assert(false);
128 }
129 idx = 0;
130 try
131 {
132 std::stof("", &idx);
133 assert(false);
134 }
135 catch (const std::invalid_argument&)
136 {
137 assert(idx == 0);
138 }
139 try
140 {
141 std::stof(L"", &idx);
142 assert(false);
143 }
144 catch (const std::invalid_argument&)
145 {
146 assert(idx == 0);
147 }
148 try
149 {
150 std::stof(" - 8", &idx);
151 assert(false);
152 }
153 catch (const std::invalid_argument&)
154 {
155 assert(idx == 0);
156 }
157 try
158 {
159 std::stof(L" - 8", &idx);
160 assert(false);
161 }
162 catch (const std::invalid_argument&)
163 {
164 assert(idx == 0);
165 }
166 try
167 {
168 std::stof("a1", &idx);
169 assert(false);
170 }
171 catch (const std::invalid_argument&)
172 {
173 assert(idx == 0);
174 }
175 try
176 {
177 std::stof(L"a1", &idx);
178 assert(false);
179 }
180 catch (const std::invalid_argument&)
181 {
182 assert(idx == 0);
183 }
Roger Ferrer Ibanez84c152a2016-11-14 10:44:26 +0000184#endif
JF Bastien2df59c52019-02-04 20:31:13 +0000185
186 return 0;
Howard Hinnantcbbf6332010-06-02 18:20:39 +0000187}