1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2017 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "src/core/SkSafeMath.h" 9cb93a386Sopenharmony_ci#include "tests/Test.h" 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ciDEF_TEST(SafeMath, r) { 12cb93a386Sopenharmony_ci size_t max = std::numeric_limits<size_t>::max(); 13cb93a386Sopenharmony_ci 14cb93a386Sopenharmony_ci { 15cb93a386Sopenharmony_ci size_t halfMax = max >> 1; 16cb93a386Sopenharmony_ci size_t halfMaxPlus1 = halfMax + 1; 17cb93a386Sopenharmony_ci SkSafeMath safe; 18cb93a386Sopenharmony_ci REPORTER_ASSERT(r, safe.add(halfMax, halfMax) == 2 * halfMax); 19cb93a386Sopenharmony_ci REPORTER_ASSERT(r, safe); 20cb93a386Sopenharmony_ci REPORTER_ASSERT(r, safe.add(halfMax, halfMaxPlus1) == max); 21cb93a386Sopenharmony_ci REPORTER_ASSERT(r, safe); 22cb93a386Sopenharmony_ci REPORTER_ASSERT(r, safe.add(max, 1) == 0); 23cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !safe); 24cb93a386Sopenharmony_ci } 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_ci { 27cb93a386Sopenharmony_ci SkSafeMath safe; 28cb93a386Sopenharmony_ci (void) safe.add(max, max); 29cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !safe); 30cb93a386Sopenharmony_ci } 31cb93a386Sopenharmony_ci 32cb93a386Sopenharmony_ci { 33cb93a386Sopenharmony_ci size_t bits = (sizeof(size_t) * 8); 34cb93a386Sopenharmony_ci size_t halfBits = bits / 2; 35cb93a386Sopenharmony_ci size_t sqrtMax = max >> halfBits; 36cb93a386Sopenharmony_ci size_t sqrtMaxPlus1 = sqrtMax + 1; 37cb93a386Sopenharmony_ci SkSafeMath safe; 38cb93a386Sopenharmony_ci REPORTER_ASSERT(r, safe.mul(sqrtMax, sqrtMax) == sqrtMax * sqrtMax); 39cb93a386Sopenharmony_ci REPORTER_ASSERT(r, safe); 40cb93a386Sopenharmony_ci REPORTER_ASSERT(r, safe.mul(sqrtMax, sqrtMaxPlus1) == sqrtMax << halfBits); 41cb93a386Sopenharmony_ci REPORTER_ASSERT(r, safe); 42cb93a386Sopenharmony_ci REPORTER_ASSERT(r, safe.mul(sqrtMaxPlus1, sqrtMaxPlus1) == 0); 43cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !safe); 44cb93a386Sopenharmony_ci } 45cb93a386Sopenharmony_ci 46cb93a386Sopenharmony_ci { 47cb93a386Sopenharmony_ci SkSafeMath safe; 48cb93a386Sopenharmony_ci (void) safe.mul(max, max); 49cb93a386Sopenharmony_ci REPORTER_ASSERT(r, !safe); 50cb93a386Sopenharmony_ci } 51cb93a386Sopenharmony_ci} 52