1/*
2 * Copyright (c) 2012, Google Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 *
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the
13 * distribution.
14 * * Neither the name of Google Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31#include "config.h"
32#include "limits.h"
33#include <wtf/SaturatedArithmetic.h>
34
35namespace TestWebKitAPI {
36
37TEST(WTF, SaturatedArithmeticAddition)
38{
39 ASSERT_EQ(saturatedAddition(0, 0), 0);
40 ASSERT_EQ(saturatedAddition(0, 1), 1);
41 ASSERT_EQ(saturatedAddition(0, 100), 100);
42 ASSERT_EQ(saturatedAddition(100, 50), 150);
43
44 ASSERT_EQ(saturatedAddition(0, -1), -1);
45 ASSERT_EQ(saturatedAddition(1, -1), 0);
46 ASSERT_EQ(saturatedAddition(100, -50), 50);
47 ASSERT_EQ(saturatedAddition(50, -100), -50);
48
49 ASSERT_EQ(saturatedAddition(INT_MAX - 1, 0), INT_MAX - 1);
50 ASSERT_EQ(saturatedAddition(INT_MAX - 1, 1), INT_MAX);
51 ASSERT_EQ(saturatedAddition(INT_MAX - 1, 2), INT_MAX);
52 ASSERT_EQ(saturatedAddition(0, INT_MAX - 1), INT_MAX - 1);
53 ASSERT_EQ(saturatedAddition(1, INT_MAX - 1), INT_MAX);
54 ASSERT_EQ(saturatedAddition(2, INT_MAX - 1), INT_MAX);
55 ASSERT_EQ(saturatedAddition(INT_MAX - 1, INT_MAX - 1), INT_MAX);
56 ASSERT_EQ(saturatedAddition(INT_MAX, INT_MAX), INT_MAX);
57
58 ASSERT_EQ(saturatedAddition(INT_MIN, 0), INT_MIN);
59 ASSERT_EQ(saturatedAddition(INT_MIN + 1, 0), INT_MIN + 1);
60 ASSERT_EQ(saturatedAddition(INT_MIN + 1, 1), INT_MIN + 2);
61 ASSERT_EQ(saturatedAddition(INT_MIN + 1, 2), INT_MIN + 3);
62 ASSERT_EQ(saturatedAddition(INT_MIN + 1, -1), INT_MIN);
63 ASSERT_EQ(saturatedAddition(INT_MIN + 1, -2), INT_MIN);
64 ASSERT_EQ(saturatedAddition(0, INT_MIN + 1), INT_MIN + 1);
65 ASSERT_EQ(saturatedAddition(-1, INT_MIN + 1), INT_MIN);
66 ASSERT_EQ(saturatedAddition(-2, INT_MIN + 1), INT_MIN);
67
68 ASSERT_EQ(saturatedAddition(INT_MAX / 2, 10000), INT_MAX / 2 + 10000);
69 ASSERT_EQ(saturatedAddition(INT_MAX / 2 + 1, INT_MAX / 2 + 1), INT_MAX);
70 ASSERT_EQ(saturatedAddition(INT_MIN, INT_MAX), -1);
71}
72
73TEST(WTF, SaturatedArithmeticSubtraction)
74{
75 ASSERT_EQ(saturatedSubtraction(0, 0), 0);
76 ASSERT_EQ(saturatedSubtraction(0, 1), -1);
77 ASSERT_EQ(saturatedSubtraction(0, 100), -100);
78 ASSERT_EQ(saturatedSubtraction(100, 50), 50);
79
80 ASSERT_EQ(saturatedSubtraction(0, -1), 1);
81 ASSERT_EQ(saturatedSubtraction(1, -1), 2);
82 ASSERT_EQ(saturatedSubtraction(100, -50), 150);
83 ASSERT_EQ(saturatedSubtraction(50, -100), 150);
84
85 ASSERT_EQ(saturatedSubtraction(INT_MAX, 0), INT_MAX);
86 ASSERT_EQ(saturatedSubtraction(INT_MAX, 1), INT_MAX - 1);
87 ASSERT_EQ(saturatedSubtraction(INT_MAX - 1, 0), INT_MAX - 1);
88 ASSERT_EQ(saturatedSubtraction(INT_MAX - 1, -1), INT_MAX);
89 ASSERT_EQ(saturatedSubtraction(INT_MAX - 1, -2), INT_MAX);
90 ASSERT_EQ(saturatedSubtraction(0, INT_MAX - 1), -INT_MAX + 1);
91 ASSERT_EQ(saturatedSubtraction(-1, INT_MAX - 1), -INT_MAX);
92 ASSERT_EQ(saturatedSubtraction(-2, INT_MAX - 1), -INT_MAX - 1);
93 ASSERT_EQ(saturatedSubtraction(-3, INT_MAX - 1), -INT_MAX - 1);
94
95 ASSERT_EQ(saturatedSubtraction(INT_MIN, 0), INT_MIN);
96 ASSERT_EQ(saturatedSubtraction(INT_MIN + 1, 0), INT_MIN + 1);
97 ASSERT_EQ(saturatedSubtraction(INT_MIN + 1, 1), INT_MIN);
98 ASSERT_EQ(saturatedSubtraction(INT_MIN + 1, 2), INT_MIN);
99
100 ASSERT_EQ(saturatedSubtraction(INT_MIN, INT_MIN), 0);
101 ASSERT_EQ(saturatedSubtraction(INT_MAX, INT_MAX), 0);
102 ASSERT_EQ(saturatedSubtraction(INT_MAX, INT_MIN), INT_MAX);
103}
104
105} // namespace TestWebKitAPI
106