LCOV - code coverage report
Current view: top level - test/unittests - utils-unittest.cc (source / functions) Hit Total Coverage
Test: app.info Lines: 72 72 100.0 %
Date: 2019-04-17 Functions: 64 95 67.4 %

          Line data    Source code
       1             : // Copyright 2014 the V8 project authors. All rights reserved.
       2             : // Use of this source code is governed by a BSD-style license that can be
       3             : // found in the LICENSE file.
       4             : 
       5             : #include <limits>
       6             : 
       7             : #include "src/utils.h"
       8             : #include "testing/gtest-support.h"
       9             : 
      10             : namespace v8 {
      11             : namespace internal {
      12             : 
      13             : template <typename T>
      14         108 : class UtilsTest : public ::testing::Test {};
      15             : 
      16             : typedef ::testing::Types<signed char, unsigned char,
      17             :                          short,                    // NOLINT(runtime/int)
      18             :                          unsigned short,           // NOLINT(runtime/int)
      19             :                          int, unsigned int, long,  // NOLINT(runtime/int)
      20             :                          unsigned long,            // NOLINT(runtime/int)
      21             :                          long long,                // NOLINT(runtime/int)
      22             :                          unsigned long long,       // NOLINT(runtime/int)
      23             :                          int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t,
      24             :                          int64_t, uint64_t>
      25             :     IntegerTypes;
      26             : 
      27             : TYPED_TEST_SUITE(UtilsTest, IntegerTypes);
      28             : 
      29       12424 : TYPED_TEST(UtilsTest, SaturateSub) {
      30          17 :   TypeParam min = std::numeric_limits<TypeParam>::min();
      31          17 :   TypeParam max = std::numeric_limits<TypeParam>::max();
      32          35 :   EXPECT_EQ(SaturateSub<TypeParam>(min, 0), min);
      33          35 :   EXPECT_EQ(SaturateSub<TypeParam>(max, 0), max);
      34          52 :   EXPECT_EQ(SaturateSub<TypeParam>(max, min), max);
      35          52 :   EXPECT_EQ(SaturateSub<TypeParam>(min, max), min);
      36          52 :   EXPECT_EQ(SaturateSub<TypeParam>(min, max / 3), min);
      37          52 :   EXPECT_EQ(SaturateSub<TypeParam>(min + 1, 2), min);
      38             :   if (std::numeric_limits<TypeParam>::is_signed) {
      39          21 :     EXPECT_EQ(SaturateSub<TypeParam>(min, min), static_cast<TypeParam>(0));
      40          25 :     EXPECT_EQ(SaturateSub<TypeParam>(0, min), max);
      41          25 :     EXPECT_EQ(SaturateSub<TypeParam>(max / 3, min), max);
      42          25 :     EXPECT_EQ(SaturateSub<TypeParam>(max / 5, min), max);
      43          25 :     EXPECT_EQ(SaturateSub<TypeParam>(min / 3, max), min);
      44          25 :     EXPECT_EQ(SaturateSub<TypeParam>(min / 9, max), min);
      45          25 :     EXPECT_EQ(SaturateSub<TypeParam>(max, min / 3), max);
      46          25 :     EXPECT_EQ(SaturateSub<TypeParam>(min, max / 3), min);
      47          25 :     EXPECT_EQ(SaturateSub<TypeParam>(max / 3 * 2, min / 2), max);
      48          25 :     EXPECT_EQ(SaturateSub<TypeParam>(min / 3 * 2, max / 2), min);
      49             :   } else {
      50          18 :     EXPECT_EQ(SaturateSub<TypeParam>(min, min), min);
      51          27 :     EXPECT_EQ(SaturateSub<TypeParam>(0, min), min);
      52          27 :     EXPECT_EQ(SaturateSub<TypeParam>(0, max), min);
      53          27 :     EXPECT_EQ(SaturateSub<TypeParam>(max / 3, max), min);
      54          27 :     EXPECT_EQ(SaturateSub<TypeParam>(max - 3, max), min);
      55             :   }
      56             :   TypeParam test_cases[] = {static_cast<TypeParam>(min / 23),
      57             :                             static_cast<TypeParam>(max / 3),
      58             :                             63,
      59             :                             static_cast<TypeParam>(min / 6),
      60             :                             static_cast<TypeParam>(max / 55),
      61             :                             static_cast<TypeParam>(min / 2),
      62             :                             static_cast<TypeParam>(max / 2),
      63             :                             0,
      64             :                             1,
      65             :                             2,
      66             :                             3,
      67             :                             4,
      68          18 :                             42};
      69         954 :   TRACED_FOREACH(TypeParam, x, test_cases) {
      70       12402 :     TRACED_FOREACH(TypeParam, y, test_cases) {
      71             :       if (std::numeric_limits<TypeParam>::is_signed) {
      72        4394 :         EXPECT_EQ(SaturateSub<TypeParam>(x, y), x - y);
      73             :       } else {
      74        4563 :         EXPECT_EQ(SaturateSub<TypeParam>(x, y), y > x ? min : x - y);
      75             :       }
      76             :     }
      77             :   }
      78          18 : }
      79             : 
      80       12424 : TYPED_TEST(UtilsTest, SaturateAdd) {
      81          17 :   TypeParam min = std::numeric_limits<TypeParam>::min();
      82          17 :   TypeParam max = std::numeric_limits<TypeParam>::max();
      83          35 :   EXPECT_EQ(SaturateAdd<TypeParam>(min, min), min);
      84          52 :   EXPECT_EQ(SaturateAdd<TypeParam>(max, max), max);
      85          52 :   EXPECT_EQ(SaturateAdd<TypeParam>(min, min / 3), min);
      86          52 :   EXPECT_EQ(SaturateAdd<TypeParam>(max / 8 * 7, max / 3 * 2), max);
      87          52 :   EXPECT_EQ(SaturateAdd<TypeParam>(min / 3 * 2, min / 8 * 7), min);
      88          52 :   EXPECT_EQ(SaturateAdd<TypeParam>(max / 20 * 18, max / 25 * 18), max);
      89          52 :   EXPECT_EQ(SaturateAdd<TypeParam>(min / 3 * 2, min / 3 * 2), min);
      90          52 :   EXPECT_EQ(SaturateAdd<TypeParam>(max - 1, 2), max);
      91          52 :   EXPECT_EQ(SaturateAdd<TypeParam>(max - 100, 101), max);
      92             :   TypeParam test_cases[] = {static_cast<TypeParam>(min / 23),
      93             :                             static_cast<TypeParam>(max / 3),
      94             :                             63,
      95             :                             static_cast<TypeParam>(min / 6),
      96             :                             static_cast<TypeParam>(max / 55),
      97             :                             static_cast<TypeParam>(min / 2),
      98             :                             static_cast<TypeParam>(max / 2),
      99             :                             0,
     100             :                             1,
     101             :                             2,
     102             :                             3,
     103             :                             4,
     104          18 :                             42};
     105         954 :   TRACED_FOREACH(TypeParam, x, test_cases) {
     106       12402 :     TRACED_FOREACH(TypeParam, y, test_cases) {
     107        8957 :       EXPECT_EQ(SaturateAdd<TypeParam>(x, y), x + y);
     108             :     }
     109             :   }
     110          18 : }
     111             : 
     112       12424 : TYPED_TEST(UtilsTest, PassesFilterTest) {
     113          36 :   EXPECT_TRUE(PassesFilter(CStrVector("abcdefg"), CStrVector("abcdefg")));
     114          36 :   EXPECT_TRUE(PassesFilter(CStrVector("abcdefg"), CStrVector("abcdefg*")));
     115          36 :   EXPECT_TRUE(PassesFilter(CStrVector("abcdefg"), CStrVector("abc*")));
     116          36 :   EXPECT_TRUE(PassesFilter(CStrVector("abcdefg"), CStrVector("*")));
     117          36 :   EXPECT_TRUE(PassesFilter(CStrVector("abcdefg"), CStrVector("-~")));
     118          36 :   EXPECT_TRUE(PassesFilter(CStrVector("abcdefg"), CStrVector("-abcdefgh")));
     119          36 :   EXPECT_TRUE(PassesFilter(CStrVector("abdefg"), CStrVector("-")));
     120          36 :   EXPECT_FALSE(PassesFilter(CStrVector("abcdefg"), CStrVector("-abcdefg")));
     121          36 :   EXPECT_FALSE(PassesFilter(CStrVector("abcdefg"), CStrVector("-abcdefg*")));
     122          36 :   EXPECT_FALSE(PassesFilter(CStrVector("abcdefg"), CStrVector("-abc*")));
     123          36 :   EXPECT_FALSE(PassesFilter(CStrVector("abcdefg"), CStrVector("-*")));
     124          36 :   EXPECT_FALSE(PassesFilter(CStrVector("abcdefg"), CStrVector("~")));
     125          36 :   EXPECT_FALSE(PassesFilter(CStrVector("abcdefg"), CStrVector("")));
     126          36 :   EXPECT_FALSE(PassesFilter(CStrVector("abcdefg"), CStrVector("abcdefgh")));
     127             : 
     128          36 :   EXPECT_TRUE(PassesFilter(CStrVector(""), CStrVector("")));
     129          36 :   EXPECT_TRUE(PassesFilter(CStrVector(""), CStrVector("*")));
     130          36 :   EXPECT_FALSE(PassesFilter(CStrVector(""), CStrVector("-")));
     131          36 :   EXPECT_FALSE(PassesFilter(CStrVector(""), CStrVector("-*")));
     132          36 :   EXPECT_FALSE(PassesFilter(CStrVector(""), CStrVector("a")));
     133          18 : }
     134             : 
     135       15443 : TEST(UtilsTest, IsInBounds) {
     136             : // for column consistency and terseness
     137             : #define INB(x, y, z) EXPECT_TRUE(IsInBounds(x, y, z))
     138             : #define OOB(x, y, z) EXPECT_FALSE(IsInBounds(x, y, z))
     139             :   INB(0, 0, 1);
     140             :   INB(0, 1, 1);
     141             :   INB(1, 0, 1);
     142             : 
     143             :   OOB(0, 2, 1);
     144             :   OOB(2, 0, 1);
     145             : 
     146             :   INB(0, 0, 2);
     147             :   INB(0, 1, 2);
     148             :   INB(0, 2, 2);
     149             : 
     150             :   INB(0, 0, 2);
     151             :   INB(1, 0, 2);
     152             :   INB(2, 0, 2);
     153             : 
     154             :   OOB(0, 3, 2);
     155             :   OOB(3, 0, 2);
     156             : 
     157             :   INB(0, 1, 2);
     158             :   INB(1, 1, 2);
     159             : 
     160             :   OOB(1, 2, 2);
     161             :   OOB(2, 1, 2);
     162             : 
     163             :   const size_t max = std::numeric_limits<size_t>::max();
     164             :   const size_t half = max / 2;
     165             : 
     166             :   // limit cases.
     167             :   INB(0, 0, max);
     168             :   INB(0, 1, max);
     169             :   INB(1, 0, max);
     170             :   INB(max, 0, max);
     171             :   INB(0, max, max);
     172             :   INB(max - 1, 0, max);
     173             :   INB(0, max - 1, max);
     174             :   INB(max - 1, 1, max);
     175             :   INB(1, max - 1, max);
     176             : 
     177             :   INB(half, half, max);
     178             :   INB(half + 1, half, max);
     179             :   INB(half, half + 1, max);
     180             : 
     181             :   OOB(max, 0, 0);
     182             :   OOB(0, max, 0);
     183             :   OOB(max, 0, 1);
     184             :   OOB(0, max, 1);
     185             :   OOB(max, 0, 2);
     186             :   OOB(0, max, 2);
     187             : 
     188             :   OOB(max, 0, max - 1);
     189             :   OOB(0, max, max - 1);
     190             : 
     191             :   // wraparound cases.
     192             :   OOB(max, 1, max);
     193             :   OOB(1, max, max);
     194             :   OOB(max - 1, 2, max);
     195             :   OOB(2, max - 1, max);
     196             :   OOB(half + 1, half + 1, max);
     197             :   OOB(half + 1, half + 1, max);
     198             : 
     199             : #undef INB
     200             : #undef OOB
     201           1 : }
     202             : 
     203             : }  // namespace internal
     204        9264 : }  // namespace v8

Generated by: LCOV version 1.10