Home | History | Annotate | Download | only in wtf
      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 
     33 #include "wtf/SaturatedArithmetic.h"
     34 #include <gtest/gtest.h>
     35 #include <limits.h>
     36 
     37 namespace {
     38 
     39 TEST(WTF, SaturatedArithmeticAddition)
     40 {
     41     ASSERT_EQ(saturatedAddition(0, 0), 0);
     42     ASSERT_EQ(saturatedAddition(0, 1), 1);
     43     ASSERT_EQ(saturatedAddition(0, 100), 100);
     44     ASSERT_EQ(saturatedAddition(100, 50), 150);
     45 
     46     ASSERT_EQ(saturatedAddition(0, -1), -1);
     47     ASSERT_EQ(saturatedAddition(1, -1), 0);
     48     ASSERT_EQ(saturatedAddition(100, -50), 50);
     49     ASSERT_EQ(saturatedAddition(50, -100), -50);
     50 
     51     ASSERT_EQ(saturatedAddition(INT_MAX - 1, 0), INT_MAX - 1);
     52     ASSERT_EQ(saturatedAddition(INT_MAX - 1, 1), INT_MAX);
     53     ASSERT_EQ(saturatedAddition(INT_MAX - 1, 2), INT_MAX);
     54     ASSERT_EQ(saturatedAddition(0, INT_MAX - 1), INT_MAX - 1);
     55     ASSERT_EQ(saturatedAddition(1, INT_MAX - 1), INT_MAX);
     56     ASSERT_EQ(saturatedAddition(2, INT_MAX - 1), INT_MAX);
     57     ASSERT_EQ(saturatedAddition(INT_MAX - 1, INT_MAX - 1), INT_MAX);
     58     ASSERT_EQ(saturatedAddition(INT_MAX, INT_MAX), INT_MAX);
     59 
     60     ASSERT_EQ(saturatedAddition(INT_MIN, 0), INT_MIN);
     61     ASSERT_EQ(saturatedAddition(INT_MIN + 1, 0), INT_MIN + 1);
     62     ASSERT_EQ(saturatedAddition(INT_MIN + 1, 1), INT_MIN + 2);
     63     ASSERT_EQ(saturatedAddition(INT_MIN + 1, 2), INT_MIN + 3);
     64     ASSERT_EQ(saturatedAddition(INT_MIN + 1, -1), INT_MIN);
     65     ASSERT_EQ(saturatedAddition(INT_MIN + 1, -2), INT_MIN);
     66     ASSERT_EQ(saturatedAddition(0, INT_MIN + 1), INT_MIN + 1);
     67     ASSERT_EQ(saturatedAddition(-1, INT_MIN + 1), INT_MIN);
     68     ASSERT_EQ(saturatedAddition(-2, INT_MIN + 1), INT_MIN);
     69 
     70     ASSERT_EQ(saturatedAddition(INT_MAX / 2, 10000), INT_MAX / 2 + 10000);
     71     ASSERT_EQ(saturatedAddition(INT_MAX / 2 + 1, INT_MAX / 2 + 1), INT_MAX);
     72     ASSERT_EQ(saturatedAddition(INT_MIN, INT_MAX), -1);
     73 }
     74 
     75 TEST(WTF, SaturatedArithmeticSubtraction)
     76 {
     77     ASSERT_EQ(saturatedSubtraction(0, 0), 0);
     78     ASSERT_EQ(saturatedSubtraction(0, 1), -1);
     79     ASSERT_EQ(saturatedSubtraction(0, 100), -100);
     80     ASSERT_EQ(saturatedSubtraction(100, 50), 50);
     81 
     82     ASSERT_EQ(saturatedSubtraction(0, -1), 1);
     83     ASSERT_EQ(saturatedSubtraction(1, -1), 2);
     84     ASSERT_EQ(saturatedSubtraction(100, -50), 150);
     85     ASSERT_EQ(saturatedSubtraction(50, -100), 150);
     86 
     87     ASSERT_EQ(saturatedSubtraction(INT_MAX, 0), INT_MAX);
     88     ASSERT_EQ(saturatedSubtraction(INT_MAX, 1), INT_MAX - 1);
     89     ASSERT_EQ(saturatedSubtraction(INT_MAX - 1, 0), INT_MAX - 1);
     90     ASSERT_EQ(saturatedSubtraction(INT_MAX - 1, -1), INT_MAX);
     91     ASSERT_EQ(saturatedSubtraction(INT_MAX - 1, -2), INT_MAX);
     92     ASSERT_EQ(saturatedSubtraction(0, INT_MAX - 1), -INT_MAX + 1);
     93     ASSERT_EQ(saturatedSubtraction(-1, INT_MAX - 1), -INT_MAX);
     94     ASSERT_EQ(saturatedSubtraction(-2, INT_MAX - 1), -INT_MAX - 1);
     95     ASSERT_EQ(saturatedSubtraction(-3, INT_MAX - 1), -INT_MAX - 1);
     96 
     97     ASSERT_EQ(saturatedSubtraction(INT_MIN, 0), INT_MIN);
     98     ASSERT_EQ(saturatedSubtraction(INT_MIN + 1, 0), INT_MIN + 1);
     99     ASSERT_EQ(saturatedSubtraction(INT_MIN + 1, 1), INT_MIN);
    100     ASSERT_EQ(saturatedSubtraction(INT_MIN + 1, 2), INT_MIN);
    101 
    102     ASSERT_EQ(saturatedSubtraction(INT_MIN, INT_MIN), 0);
    103     ASSERT_EQ(saturatedSubtraction(INT_MAX, INT_MAX), 0);
    104     ASSERT_EQ(saturatedSubtraction(INT_MAX, INT_MIN), INT_MAX);
    105 }
    106 
    107 } // namespace
    108