xref: /llvm-project/libcxx/test/std/strings/string.conversions/stoi.pass.cpp (revision f4c1258d5633fcf06385ff3fd1f4bf57ab971964)
1 //===----------------------------------------------------------------------===//
2 //
3 // 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
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // <string>
10 
11 // int stoi(const string& str, size_t *idx = 0, int base = 10);
12 // int stoi(const wstring& str, size_t *idx = 0, int base = 10);
13 
14 #include <string>
15 #include <cassert>
16 #include <stdexcept>
17 
18 #include "test_macros.h"
19 
20 int main(int, char**)
21 {
22     assert(std::stoi("0") == 0);
23     assert(std::stoi("-0") == 0);
24     assert(std::stoi("-10") == -10);
25     assert(std::stoi(" 10") == 10);
26     {
27         size_t idx = 0;
28         assert(std::stoi("10g", &idx, 16) == 16);
29         assert(idx == 2);
30     }
31 #ifndef TEST_HAS_NO_EXCEPTIONS
32     if (std::numeric_limits<long>::max() > std::numeric_limits<int>::max()) {
33         size_t idx = 0;
34         try {
35             std::stoi("0x100000000", &idx, 16);
36             assert(false);
37         } catch (const std::out_of_range&) {
38 
39         }
40     }
41     {
42         size_t idx = 0;
43         try {
44             std::stoi("", &idx);
45             assert(false);
46         } catch (const std::invalid_argument&) {
47             assert(idx == 0);
48         }
49     }
50     {
51         size_t idx = 0;
52         try {
53             std::stoi("  - 8", &idx);
54             assert(false);
55         } catch (const std::invalid_argument&) {
56             assert(idx == 0);
57         }
58     }
59     {
60         size_t idx = 0;
61         try {
62             std::stoi("a1", &idx);
63             assert(false);
64         } catch (const std::invalid_argument&) {
65             assert(idx == 0);
66         }
67     }
68 #endif // TEST_HAS_NO_EXCEPTIONS
69 
70 #ifndef TEST_HAS_NO_WIDE_CHARACTERS
71     assert(std::stoi(L"0") == 0);
72     assert(std::stoi(L"-0") == 0);
73     assert(std::stoi(L"-10") == -10);
74     assert(std::stoi(L" 10") == 10);
75     {
76         size_t idx = 0;
77         assert(std::stoi(L"10g", &idx, 16) == 16);
78         assert(idx == 2);
79     }
80 #ifndef TEST_HAS_NO_EXCEPTIONS
81     if (std::numeric_limits<long>::max() > std::numeric_limits<int>::max()) {
82         size_t idx = 0;
83         try {
84             std::stoi(L"0x100000000", &idx, 16);
85             assert(false);
86         } catch (const std::out_of_range&) {
87 
88         }
89     }
90     {
91         size_t idx = 0;
92         try {
93             std::stoi(L"", &idx);
94             assert(false);
95         } catch (const std::invalid_argument&) {
96             assert(idx == 0);
97         }
98     }
99     {
100         size_t idx = 0;
101         try {
102             std::stoi(L"  - 8", &idx);
103             assert(false);
104         } catch (const std::invalid_argument&) {
105             assert(idx == 0);
106         }
107     }
108     {
109         size_t idx = 0;
110         try {
111             std::stoi(L"a1", &idx);
112             assert(false);
113         } catch (const std::invalid_argument&) {
114             assert(idx == 0);
115         }
116     }
117 #endif // TEST_HAS_NO_EXCEPTIONS
118 #endif // TEST_HAS_NO_WIDE_CHARACTERS
119 
120   return 0;
121 }
122