mirror of
https://github.com/google/pebble.git
synced 2025-03-19 18:41:21 +00:00
268 lines
9.5 KiB
C
268 lines
9.5 KiB
C
/*
|
|
* Copyright 2024 Google LLC
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include <stdint.h>
|
|
#include <string.h>
|
|
#include <limits.h>
|
|
|
|
#include "clar.h"
|
|
|
|
// "Define" libc functions we're testing
|
|
#include "pblibc_private.h"
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//! Tests
|
|
|
|
void test_strtol__basic(void) {
|
|
cl_assert_equal_i(strtol("500", NULL, 10), 500);
|
|
cl_assert_equal_i(strtol("765", NULL, 10), 765);
|
|
cl_assert_equal_i(strtol("573888", NULL, 10), 573888);
|
|
cl_assert_equal_i(strtol("713713", NULL, 10), 713713);
|
|
|
|
cl_assert_equal_i(strtol("2147483646", NULL, 10), 2147483646);
|
|
cl_assert_equal_i(strtol("-2147483647", NULL, 10), -2147483647);
|
|
}
|
|
|
|
void test_strtol__whitespace_pfx(void) {
|
|
cl_assert_equal_i(strtol(" 500", NULL, 10), 500);
|
|
cl_assert_equal_i(strtol(" 765", NULL, 10), 765);
|
|
cl_assert_equal_i(strtol(" 573888", NULL, 10), 573888);
|
|
cl_assert_equal_i(strtol(" 713713", NULL, 10), 713713);
|
|
}
|
|
|
|
void test_strtol__suffix(void) {
|
|
cl_assert_equal_i(strtol("500hurf", NULL, 10), 500);
|
|
cl_assert_equal_i(strtol("765berserker", NULL, 10), 765);
|
|
cl_assert_equal_i(strtol("573888 redmage", NULL, 10), 573888);
|
|
cl_assert_equal_i(strtol("713713 4 job fiesta111", NULL, 10), 713713);
|
|
}
|
|
|
|
void test_strtol__sign(void) {
|
|
cl_assert_equal_i(strtol("+500", NULL, 10), 500);
|
|
cl_assert_equal_i(strtol("-765", NULL, 10), -765);
|
|
cl_assert_equal_i(strtol(" -573888", NULL, 10), -573888);
|
|
cl_assert_equal_i(strtol(" +713713", NULL, 10), +713713);
|
|
}
|
|
|
|
void test_strtol__error(void) {
|
|
cl_assert_equal_i(strtol("2147483647", NULL, 10), 2147483647); // last valid value
|
|
cl_assert_equal_i(strtol("-2147483648", NULL, 10), -2147483648); // last valid value
|
|
cl_assert_equal_i(strtol("3294967287", NULL, 10), INT_MAX); // signed integer overflow
|
|
cl_assert_equal_i(strtol("2147483648", NULL, 10), INT_MAX);
|
|
cl_assert_equal_i(strtol("-2147483649", NULL, 10), INT_MIN);
|
|
}
|
|
|
|
static const struct {
|
|
intmax_t value;
|
|
int base;
|
|
const char *str;
|
|
} s_base_test_data[] = {
|
|
{ 2147483646LL, 2, "1111111111111111111111111111110", },
|
|
{ 2147483646LL, 2, "1111111111111111111111111111110", },
|
|
{ -2147483647LL, 2, "-1111111111111111111111111111111", },
|
|
{ -2147483647LL, 2, "-1111111111111111111111111111111", },
|
|
{ 2147483646LL, 3, "12112122212110202100", },
|
|
{ 2147483646LL, 3, "12112122212110202100", },
|
|
{ -2147483647LL, 3, "-12112122212110202101", },
|
|
{ -2147483647LL, 3, "-12112122212110202101", },
|
|
{ 2147483646LL, 4, "1333333333333332", },
|
|
{ 2147483646LL, 4, "1333333333333332", },
|
|
{ -2147483647LL, 4, "-1333333333333333", },
|
|
{ -2147483647LL, 4, "-1333333333333333", },
|
|
{ 2147483646LL, 5, "13344223434041", },
|
|
{ 2147483646LL, 5, "13344223434041", },
|
|
{ -2147483647LL, 5, "-13344223434042", },
|
|
{ -2147483647LL, 5, "-13344223434042", },
|
|
{ 2147483646LL, 6, "553032005530", },
|
|
{ 2147483646LL, 6, "553032005530", },
|
|
{ -2147483647LL, 6, "-553032005531", },
|
|
{ -2147483647LL, 6, "-553032005531", },
|
|
{ 2147483646LL, 7, "104134211160", },
|
|
{ 2147483646LL, 7, "104134211160", },
|
|
{ -2147483647LL, 7, "-104134211161", },
|
|
{ -2147483647LL, 7, "-104134211161", },
|
|
{ 2147483646LL, 8, "17777777776", },
|
|
{ 2147483646LL, 8, "17777777776", },
|
|
{ -2147483647LL, 8, "-17777777777", },
|
|
{ -2147483647LL, 8, "-17777777777", },
|
|
{ 2147483646LL, 9, "5478773670", },
|
|
{ 2147483646LL, 9, "5478773670", },
|
|
{ -2147483647LL, 9, "-5478773671", },
|
|
{ -2147483647LL, 9, "-5478773671", },
|
|
{ 2147483646LL, 10, "2147483646", },
|
|
{ 2147483646LL, 10, "2147483646", },
|
|
{ -2147483647LL, 10, "-2147483647", },
|
|
{ -2147483647LL, 10, "-2147483647", },
|
|
{ 2147483646LL, 11, "A02220280", },
|
|
{ 2147483646LL, 11, "a02220280", },
|
|
{ -2147483647LL, 11, "-A02220281", },
|
|
{ -2147483647LL, 11, "-a02220281", },
|
|
{ 2147483646LL, 12, "4BB2308A6", },
|
|
{ 2147483646LL, 12, "4bb2308a6", },
|
|
{ -2147483647LL, 12, "-4BB2308A7", },
|
|
{ -2147483647LL, 12, "-4bb2308a7", },
|
|
{ 2147483646LL, 13, "282BA4AA9", },
|
|
{ 2147483646LL, 13, "282ba4aa9", },
|
|
{ -2147483647LL, 13, "-282BA4AAA", },
|
|
{ -2147483647LL, 13, "-282ba4aaa", },
|
|
{ 2147483646LL, 14, "1652CA930", },
|
|
{ 2147483646LL, 14, "1652ca930", },
|
|
{ -2147483647LL, 14, "-1652CA931", },
|
|
{ -2147483647LL, 14, "-1652ca931", },
|
|
{ 2147483646LL, 15, "C87E66B6", },
|
|
{ 2147483646LL, 15, "c87e66b6", },
|
|
{ -2147483647LL, 15, "-C87E66B7", },
|
|
{ -2147483647LL, 15, "-c87e66b7", },
|
|
{ 2147483646LL, 16, "7FFFFFFE", },
|
|
{ 2147483646LL, 16, "7ffffffe", },
|
|
{ -2147483647LL, 16, "-7FFFFFFF", },
|
|
{ -2147483647LL, 16, "-7fffffff", },
|
|
{ 2147483646LL, 17, "53G7F547", },
|
|
{ 2147483646LL, 17, "53g7f547", },
|
|
{ -2147483647LL, 17, "-53G7F548", },
|
|
{ -2147483647LL, 17, "-53g7f548", },
|
|
{ 2147483646LL, 18, "3928G3H0", },
|
|
{ 2147483646LL, 18, "3928g3h0", },
|
|
{ -2147483647LL, 18, "-3928G3H1", },
|
|
{ -2147483647LL, 18, "-3928g3h1", },
|
|
{ 2147483646LL, 19, "27C57H31", },
|
|
{ 2147483646LL, 19, "27c57h31", },
|
|
{ -2147483647LL, 19, "-27C57H32", },
|
|
{ -2147483647LL, 19, "-27c57h32", },
|
|
{ 2147483646LL, 20, "1DB1F926", },
|
|
{ 2147483646LL, 20, "1db1f926", },
|
|
{ -2147483647LL, 20, "-1DB1F927", },
|
|
{ -2147483647LL, 20, "-1db1f927", },
|
|
{ 2147483646LL, 21, "140H2D90", },
|
|
{ 2147483646LL, 21, "140h2d90", },
|
|
{ -2147483647LL, 21, "-140H2D91", },
|
|
{ -2147483647LL, 21, "-140h2d91", },
|
|
{ 2147483646LL, 22, "IKF5BF0", },
|
|
{ 2147483646LL, 22, "ikf5bf0", },
|
|
{ -2147483647LL, 22, "-IKF5BF1", },
|
|
{ -2147483647LL, 22, "-ikf5bf1", },
|
|
{ 2147483646LL, 23, "EBELF94", },
|
|
{ 2147483646LL, 23, "ebelf94", },
|
|
{ -2147483647LL, 23, "-EBELF95", },
|
|
{ -2147483647LL, 23, "-ebelf95", },
|
|
{ 2147483646LL, 24, "B5GGE56", },
|
|
{ 2147483646LL, 24, "b5gge56", },
|
|
{ -2147483647LL, 24, "-B5GGE57", },
|
|
{ -2147483647LL, 24, "-b5gge57", },
|
|
{ 2147483646LL, 25, "8JMDNKL", },
|
|
{ 2147483646LL, 25, "8jmdnkl", },
|
|
{ -2147483647LL, 25, "-8JMDNKM", },
|
|
{ -2147483647LL, 25, "-8jmdnkm", },
|
|
{ 2147483646LL, 26, "6OJ8IOM", },
|
|
{ 2147483646LL, 26, "6oj8iom", },
|
|
{ -2147483647LL, 26, "-6OJ8ION", },
|
|
{ -2147483647LL, 26, "-6oj8ion", },
|
|
{ 2147483646LL, 27, "5EHNCK9", },
|
|
{ 2147483646LL, 27, "5ehnck9", },
|
|
{ -2147483647LL, 27, "-5EHNCKA", },
|
|
{ -2147483647LL, 27, "-5ehncka", },
|
|
{ 2147483646LL, 28, "4CLM98E", },
|
|
{ 2147483646LL, 28, "4clm98e", },
|
|
{ -2147483647LL, 28, "-4CLM98F", },
|
|
{ -2147483647LL, 28, "-4clm98f", },
|
|
{ 2147483646LL, 29, "3HK7986", },
|
|
{ 2147483646LL, 29, "3hk7986", },
|
|
{ -2147483647LL, 29, "-3HK7987", },
|
|
{ -2147483647LL, 29, "-3hk7987", },
|
|
{ 2147483646LL, 30, "2SB6CS6", },
|
|
{ 2147483646LL, 30, "2sb6cs6", },
|
|
{ -2147483647LL, 30, "-2SB6CS7", },
|
|
{ -2147483647LL, 30, "-2sb6cs7", },
|
|
{ 2147483646LL, 31, "2D09UC0", },
|
|
{ 2147483646LL, 31, "2d09uc0", },
|
|
{ -2147483647LL, 31, "-2D09UC1", },
|
|
{ -2147483647LL, 31, "-2d09uc1", },
|
|
{ 2147483646LL, 32, "1VVVVVU", },
|
|
{ 2147483646LL, 32, "1vvvvvu", },
|
|
{ -2147483647LL, 32, "-1VVVVVV", },
|
|
{ -2147483647LL, 32, "-1vvvvvv", },
|
|
{ 2147483646LL, 33, "1LSQTL0", },
|
|
{ 2147483646LL, 33, "1lsqtl0", },
|
|
{ -2147483647LL, 33, "-1LSQTL1", },
|
|
{ -2147483647LL, 33, "-1lsqtl1", },
|
|
{ 2147483646LL, 34, "1D8XQRO", },
|
|
{ 2147483646LL, 34, "1d8xqro", },
|
|
{ -2147483647LL, 34, "-1D8XQRP", },
|
|
{ -2147483647LL, 34, "-1d8xqrp", },
|
|
{ 2147483646LL, 35, "15V22UL", },
|
|
{ 2147483646LL, 35, "15v22ul", },
|
|
{ -2147483647LL, 35, "-15V22UM", },
|
|
{ -2147483647LL, 35, "-15v22um", },
|
|
{ 2147483646LL, 36, "ZIK0ZI", },
|
|
{ 2147483646LL, 36, "zik0zi", },
|
|
{ -2147483647LL, 36, "-ZIK0ZJ", },
|
|
{ -2147483647LL, 36, "-zik0zj", },
|
|
{ 0,0,"" },
|
|
};
|
|
|
|
void test_strtol__altbase(void) {
|
|
for(int i = 0; s_base_test_data[i].base != 0; i++) {
|
|
cl_assert_equal_i(strtol(s_base_test_data[i].str, NULL, s_base_test_data[i].base),
|
|
s_base_test_data[i].value);
|
|
}
|
|
}
|
|
|
|
void test_strtol__zerobase(void) {
|
|
cl_assert_equal_i(strtol("573bb", NULL, 0), 573);
|
|
cl_assert_equal_i(strtol("0x573", NULL, 0), 0x573);
|
|
cl_assert_equal_i(strtol("0573", NULL, 0), 0573);
|
|
cl_assert_equal_i(strtol(" +573bb", NULL, 0), 573);
|
|
cl_assert_equal_i(strtol(" +0x573ghghghgh", NULL, 0), 0x573);
|
|
cl_assert_equal_i(strtol(" +0573faf", NULL, 0), 0573);
|
|
cl_assert_equal_i(strtol(" -573bb", NULL, 0), -573);
|
|
cl_assert_equal_i(strtol(" -0x573ghghghgh", NULL, 0), -0x573);
|
|
cl_assert_equal_i(strtol(" -0573faf", NULL, 0), -0573);
|
|
}
|
|
|
|
void test_strtol__bogus(void) {
|
|
cl_assert_equal_i(strtol(" ", NULL, 10), 0);
|
|
cl_assert_equal_i(strtol(" -", NULL, 10), 0);
|
|
cl_assert_equal_i(strtol("-", NULL, 10), 0);
|
|
cl_assert_equal_i(strtol(" +", NULL, 10), 0);
|
|
cl_assert_equal_i(strtol("+", NULL, 10), 0);
|
|
cl_assert_equal_i(strtol(" -+123", NULL, 10), 0);
|
|
cl_assert_equal_i(strtol("+-123", NULL, 10), 0);
|
|
}
|
|
|
|
void test_strtol__end(void) {
|
|
char *end;
|
|
char *s;
|
|
|
|
s = "";
|
|
strtol(s, &end, 10);
|
|
cl_assert_equal_p(s, end);
|
|
cl_assert_equal_i('\0', *end);
|
|
|
|
s = "123";
|
|
strtol(s, &end, 10);
|
|
cl_assert_equal_p(s+3, end);
|
|
cl_assert_equal_i('\0', *end);
|
|
|
|
s = "123a";
|
|
strtol(s, &end, 10);
|
|
cl_assert_equal_p(s+3, end);
|
|
cl_assert_equal_i('a', *end);
|
|
|
|
s = "a123";
|
|
strtol(s, &end, 10);
|
|
cl_assert_equal_p(s, end);
|
|
cl_assert_equal_i('a', *end);
|
|
}
|