blob: b8cf654682e809aa19de24c904e6445570ac96b6 [file] [log] [blame]
Elliott Hughes7dd8e202015-09-04 16:26:51 -07001/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Elliott Hughesb6351622015-12-04 22:00:26 -080017#include "android-base/parseint.h"
Elliott Hughes7dd8e202015-09-04 16:26:51 -070018
19#include <gtest/gtest.h>
20
21TEST(parseint, signed_smoke) {
Elliott Hughes31d04db2016-10-11 17:09:00 -070022 int i = 0;
Spencer Lowd6460972015-09-11 20:01:29 -070023 ASSERT_FALSE(android::base::ParseInt("x", &i));
24 ASSERT_FALSE(android::base::ParseInt("123x", &i));
Elliott Hughes7dd8e202015-09-04 16:26:51 -070025
Spencer Lowd6460972015-09-11 20:01:29 -070026 ASSERT_TRUE(android::base::ParseInt("123", &i));
Elliott Hughes7dd8e202015-09-04 16:26:51 -070027 ASSERT_EQ(123, i);
Tom Cherry9e58f1b2018-08-22 14:38:02 -070028 i = 0;
29 EXPECT_TRUE(android::base::ParseInt(" 123", &i));
30 EXPECT_EQ(123, i);
Spencer Lowd6460972015-09-11 20:01:29 -070031 ASSERT_TRUE(android::base::ParseInt("-123", &i));
Elliott Hughes7dd8e202015-09-04 16:26:51 -070032 ASSERT_EQ(-123, i);
Tom Cherry9e58f1b2018-08-22 14:38:02 -070033 i = 0;
34 EXPECT_TRUE(android::base::ParseInt(" -123", &i));
35 EXPECT_EQ(-123, i);
Elliott Hughes7dd8e202015-09-04 16:26:51 -070036
Elliott Hughes31d04db2016-10-11 17:09:00 -070037 short s = 0;
Spencer Lowd6460972015-09-11 20:01:29 -070038 ASSERT_TRUE(android::base::ParseInt("1234", &s));
Elliott Hughes7dd8e202015-09-04 16:26:51 -070039 ASSERT_EQ(1234, s);
40
Spencer Lowd6460972015-09-11 20:01:29 -070041 ASSERT_TRUE(android::base::ParseInt("12", &i, 0, 15));
Elliott Hughes7dd8e202015-09-04 16:26:51 -070042 ASSERT_EQ(12, i);
Spencer Lowd6460972015-09-11 20:01:29 -070043 ASSERT_FALSE(android::base::ParseInt("-12", &i, 0, 15));
44 ASSERT_FALSE(android::base::ParseInt("16", &i, 0, 15));
Steven Morelandc4f40bf2018-07-20 11:02:47 -070045
46 ASSERT_FALSE(android::base::ParseInt<int>("x", nullptr));
47 ASSERT_FALSE(android::base::ParseInt<int>("123x", nullptr));
48 ASSERT_TRUE(android::base::ParseInt<int>("1234", nullptr));
Elliott Hughes7dd8e202015-09-04 16:26:51 -070049}
50
51TEST(parseint, unsigned_smoke) {
Elliott Hughes31d04db2016-10-11 17:09:00 -070052 unsigned int i = 0u;
Spencer Lowd6460972015-09-11 20:01:29 -070053 ASSERT_FALSE(android::base::ParseUint("x", &i));
54 ASSERT_FALSE(android::base::ParseUint("123x", &i));
Elliott Hughes7dd8e202015-09-04 16:26:51 -070055
Spencer Lowd6460972015-09-11 20:01:29 -070056 ASSERT_TRUE(android::base::ParseUint("123", &i));
Elliott Hughes7dd8e202015-09-04 16:26:51 -070057 ASSERT_EQ(123u, i);
Tom Cherry9e58f1b2018-08-22 14:38:02 -070058 i = 0u;
59 EXPECT_TRUE(android::base::ParseUint(" 123", &i));
60 EXPECT_EQ(123u, i);
Spencer Lowd6460972015-09-11 20:01:29 -070061 ASSERT_FALSE(android::base::ParseUint("-123", &i));
Tom Cherry9e58f1b2018-08-22 14:38:02 -070062 EXPECT_FALSE(android::base::ParseUint(" -123", &i));
Elliott Hughes7dd8e202015-09-04 16:26:51 -070063
Elliott Hughes31d04db2016-10-11 17:09:00 -070064 unsigned short s = 0u;
Spencer Lowd6460972015-09-11 20:01:29 -070065 ASSERT_TRUE(android::base::ParseUint("1234", &s));
Elliott Hughes7dd8e202015-09-04 16:26:51 -070066 ASSERT_EQ(1234u, s);
67
Spencer Lowd6460972015-09-11 20:01:29 -070068 ASSERT_TRUE(android::base::ParseUint("12", &i, 15u));
Elliott Hughes7dd8e202015-09-04 16:26:51 -070069 ASSERT_EQ(12u, i);
Spencer Lowd6460972015-09-11 20:01:29 -070070 ASSERT_FALSE(android::base::ParseUint("-12", &i, 15u));
71 ASSERT_FALSE(android::base::ParseUint("16", &i, 15u));
Steven Morelandc4f40bf2018-07-20 11:02:47 -070072
73 ASSERT_FALSE(android::base::ParseUint<unsigned short>("x", nullptr));
74 ASSERT_FALSE(android::base::ParseUint<unsigned short>("123x", nullptr));
75 ASSERT_TRUE(android::base::ParseUint<unsigned short>("1234", nullptr));
Tom Cherry9e58f1b2018-08-22 14:38:02 -070076
77 unsigned long long int lli;
78 EXPECT_FALSE(android::base::ParseUint("-123", &lli));
79 EXPECT_FALSE(android::base::ParseUint(" -123", &lli));
Elliott Hughes7dd8e202015-09-04 16:26:51 -070080}
81
82TEST(parseint, no_implicit_octal) {
Elliott Hughes31d04db2016-10-11 17:09:00 -070083 int i = 0;
Spencer Lowd6460972015-09-11 20:01:29 -070084 ASSERT_TRUE(android::base::ParseInt("0123", &i));
Elliott Hughes7dd8e202015-09-04 16:26:51 -070085 ASSERT_EQ(123, i);
86
Elliott Hughes31d04db2016-10-11 17:09:00 -070087 unsigned int u = 0u;
Spencer Lowd6460972015-09-11 20:01:29 -070088 ASSERT_TRUE(android::base::ParseUint("0123", &u));
Elliott Hughes7dd8e202015-09-04 16:26:51 -070089 ASSERT_EQ(123u, u);
90}
Elliott Hughesefa901e2015-11-02 09:01:53 -080091
92TEST(parseint, explicit_hex) {
Elliott Hughes31d04db2016-10-11 17:09:00 -070093 int i = 0;
Elliott Hughesefa901e2015-11-02 09:01:53 -080094 ASSERT_TRUE(android::base::ParseInt("0x123", &i));
95 ASSERT_EQ(0x123, i);
Tom Cherry9e58f1b2018-08-22 14:38:02 -070096 i = 0;
97 EXPECT_TRUE(android::base::ParseInt(" 0x123", &i));
98 EXPECT_EQ(0x123, i);
Elliott Hughesefa901e2015-11-02 09:01:53 -080099
Elliott Hughes31d04db2016-10-11 17:09:00 -0700100 unsigned int u = 0u;
Elliott Hughesefa901e2015-11-02 09:01:53 -0800101 ASSERT_TRUE(android::base::ParseUint("0x123", &u));
102 ASSERT_EQ(0x123u, u);
Tom Cherry9e58f1b2018-08-22 14:38:02 -0700103 u = 0u;
104 EXPECT_TRUE(android::base::ParseUint(" 0x123", &u));
105 EXPECT_EQ(0x123u, u);
Elliott Hughesefa901e2015-11-02 09:01:53 -0800106}
Elliott Hughes31d04db2016-10-11 17:09:00 -0700107
108TEST(parseint, string) {
109 int i = 0;
110 ASSERT_TRUE(android::base::ParseInt(std::string("123"), &i));
111 ASSERT_EQ(123, i);
112
113 unsigned int u = 0u;
114 ASSERT_TRUE(android::base::ParseUint(std::string("123"), &u));
115 ASSERT_EQ(123u, u);
116}
117
118TEST(parseint, untouched_on_failure) {
119 int i = 123;
120 ASSERT_FALSE(android::base::ParseInt("456x", &i));
121 ASSERT_EQ(123, i);
122
123 unsigned int u = 123u;
Tom Cherry7d264e52018-08-22 15:14:06 -0700124 ASSERT_FALSE(android::base::ParseUint("456x", &u));
Elliott Hughes31d04db2016-10-11 17:09:00 -0700125 ASSERT_EQ(123u, u);
126}
Elliott Hughes06768992018-04-19 19:48:25 -0700127
128TEST(parseint, ParseByteCount) {
129 uint64_t i = 0;
130 ASSERT_TRUE(android::base::ParseByteCount("123b", &i));
131 ASSERT_EQ(123ULL, i);
132
133 ASSERT_TRUE(android::base::ParseByteCount("8k", &i));
134 ASSERT_EQ(8ULL * 1024, i);
135
136 ASSERT_TRUE(android::base::ParseByteCount("8M", &i));
137 ASSERT_EQ(8ULL * 1024 * 1024, i);
138
139 ASSERT_TRUE(android::base::ParseByteCount("6g", &i));
140 ASSERT_EQ(6ULL * 1024 * 1024 * 1024, i);
141
142 ASSERT_TRUE(android::base::ParseByteCount("1T", &i));
143 ASSERT_EQ(1ULL * 1024 * 1024 * 1024 * 1024, i);
144
145 ASSERT_TRUE(android::base::ParseByteCount("2p", &i));
146 ASSERT_EQ(2ULL * 1024 * 1024 * 1024 * 1024 * 1024, i);
147
148 ASSERT_TRUE(android::base::ParseByteCount("4e", &i));
149 ASSERT_EQ(4ULL * 1024 * 1024 * 1024 * 1024 * 1024 * 1024, i);
150}
151
152TEST(parseint, ParseByteCount_invalid_suffix) {
153 unsigned u;
154 ASSERT_FALSE(android::base::ParseByteCount("1x", &u));
155}
156
157TEST(parseint, ParseByteCount_overflow) {
158 uint64_t u64;
159 ASSERT_FALSE(android::base::ParseByteCount("4294967295E", &u64));
160
161 uint16_t u16;
162 ASSERT_TRUE(android::base::ParseByteCount("63k", &u16));
163 ASSERT_EQ(63U * 1024, u16);
164 ASSERT_TRUE(android::base::ParseByteCount("65535b", &u16));
165 ASSERT_EQ(65535U, u16);
166 ASSERT_FALSE(android::base::ParseByteCount("65k", &u16));
167}