src/apps/testapps/testMathExtensionsInternal.c (84 lines of code) (raw):

/* * Copyright 2022 Uber Technologies, Inc. * * 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. */ /** @file * @brief tests functions and macros in mathExtensions.h * * usage: `testMathExtensionsInternal` */ #include "mathExtensions.h" #include "test.h" #include "utility.h" #define ASSERT_SUB_OVERFLOW(a, b) \ t_assert(SUB_INT32S_OVERFLOWS((a), (b)), #a " - " #b " Overflows") #define ASSERT_SUB_DOES_NOT_OVERFLOW(a, b) \ t_assert(!SUB_INT32S_OVERFLOWS((a), (b)), #a " - " #b \ " Does Not " \ "Overflow") #define ASSERT_ADD_OVERFLOW(a, b) \ t_assert(ADD_INT32S_OVERFLOWS((a), (b)), #a " + " #b " Overflows") #define ASSERT_ADD_DOES_NOT_OVERFLOW(a, b) \ t_assert(!ADD_INT32S_OVERFLOWS((a), (b)), #a " + " #b \ " Does Not " \ "Overflow") SUITE(mathExtensionsInternal) { TEST(_ipow) { t_assert(_ipow(7, 0) == 1, "7 ** 0 == 1"); t_assert(_ipow(7, 1) == 7, "7 ** 1 == 7"); t_assert(_ipow(7, 2) == 49, "7 ** 2 == 49"); t_assert(_ipow(1, 20) == 1, "1 ** 20 == 1"); t_assert(_ipow(2, 5) == 32, "2 ** 5 == 32"); } TEST(subOverflows) { ASSERT_SUB_DOES_NOT_OVERFLOW(0, 0); ASSERT_SUB_DOES_NOT_OVERFLOW(INT32_MIN, 0); ASSERT_SUB_OVERFLOW(INT32_MIN, 1); ASSERT_SUB_DOES_NOT_OVERFLOW(INT32_MIN, -1); ASSERT_SUB_DOES_NOT_OVERFLOW(INT32_MIN + 1, 0); ASSERT_SUB_DOES_NOT_OVERFLOW(INT32_MIN + 1, 1); ASSERT_SUB_DOES_NOT_OVERFLOW(INT32_MIN + 1, -1); ASSERT_SUB_OVERFLOW(INT32_MIN + 1, 2); ASSERT_SUB_DOES_NOT_OVERFLOW(INT32_MIN + 1, -2); ASSERT_SUB_DOES_NOT_OVERFLOW(100, 10); ASSERT_SUB_DOES_NOT_OVERFLOW(INT32_MAX, 0); ASSERT_SUB_DOES_NOT_OVERFLOW(INT32_MAX, 1); ASSERT_SUB_OVERFLOW(INT32_MAX, -1); ASSERT_SUB_DOES_NOT_OVERFLOW(INT32_MAX - 1, 1); ASSERT_SUB_DOES_NOT_OVERFLOW(INT32_MAX - 1, -1); ASSERT_SUB_OVERFLOW(INT32_MAX - 1, -2); ASSERT_SUB_OVERFLOW(INT32_MAX - 1, -2); ASSERT_SUB_OVERFLOW(INT32_MIN, INT32_MAX); ASSERT_SUB_OVERFLOW(INT32_MAX, INT32_MIN); ASSERT_SUB_DOES_NOT_OVERFLOW(INT32_MIN, INT32_MIN); ASSERT_SUB_DOES_NOT_OVERFLOW(INT32_MAX, INT32_MAX); ASSERT_SUB_DOES_NOT_OVERFLOW(-1, 0); ASSERT_SUB_DOES_NOT_OVERFLOW(-1, 10); ASSERT_SUB_DOES_NOT_OVERFLOW(-1, -10); ASSERT_SUB_DOES_NOT_OVERFLOW(-1, INT32_MAX); ASSERT_SUB_OVERFLOW(-2, INT32_MAX); ASSERT_SUB_DOES_NOT_OVERFLOW(-1, INT32_MIN); ASSERT_SUB_OVERFLOW(0, INT32_MIN); } TEST(addOverflows) { ASSERT_ADD_DOES_NOT_OVERFLOW(0, 0); ASSERT_ADD_DOES_NOT_OVERFLOW(INT32_MIN, 0); ASSERT_ADD_DOES_NOT_OVERFLOW(INT32_MIN, 1); ASSERT_ADD_OVERFLOW(INT32_MIN, -1); ASSERT_ADD_DOES_NOT_OVERFLOW(INT32_MIN + 1, 0); ASSERT_ADD_DOES_NOT_OVERFLOW(INT32_MIN + 1, 1); ASSERT_ADD_DOES_NOT_OVERFLOW(INT32_MIN + 1, -1); ASSERT_ADD_DOES_NOT_OVERFLOW(INT32_MIN + 1, 2); ASSERT_ADD_OVERFLOW(INT32_MIN + 1, -2); ASSERT_ADD_DOES_NOT_OVERFLOW(100, 10); ASSERT_ADD_DOES_NOT_OVERFLOW(INT32_MAX, 0); ASSERT_ADD_OVERFLOW(INT32_MAX, 1); ASSERT_ADD_DOES_NOT_OVERFLOW(INT32_MAX, -1); ASSERT_ADD_DOES_NOT_OVERFLOW(INT32_MAX - 1, 1); ASSERT_ADD_DOES_NOT_OVERFLOW(INT32_MAX - 1, -1); ASSERT_ADD_DOES_NOT_OVERFLOW(INT32_MAX - 1, -2); ASSERT_ADD_OVERFLOW(INT32_MAX - 1, 2); ASSERT_ADD_DOES_NOT_OVERFLOW(INT32_MIN, INT32_MAX); ASSERT_ADD_DOES_NOT_OVERFLOW(INT32_MAX, INT32_MIN); ASSERT_ADD_OVERFLOW(INT32_MAX, INT32_MAX); ASSERT_ADD_OVERFLOW(INT32_MIN, INT32_MIN); ASSERT_ADD_DOES_NOT_OVERFLOW(-1, 0); ASSERT_ADD_DOES_NOT_OVERFLOW(-1, 10); ASSERT_ADD_DOES_NOT_OVERFLOW(-1, -10); ASSERT_ADD_DOES_NOT_OVERFLOW(-1, INT32_MAX); ASSERT_ADD_DOES_NOT_OVERFLOW(-2, INT32_MAX); ASSERT_ADD_OVERFLOW(-1, INT32_MIN); ASSERT_ADD_DOES_NOT_OVERFLOW(0, INT32_MIN); } }