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