1b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Copyright (c) 2009 The Chromium Authors. All rights reserved. 2b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Use of this source code is governed by a BSD-style license that can be 3b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// found in the LICENSE file. 4b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 5b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// This file contains the unit tests for the bit utilities. 6b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 7b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/bits.h" 8cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko 9cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include <stddef.h> 10cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko 11cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include <limits> 12cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko 13b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "testing/gtest/include/gtest/gtest.h" 14b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 15b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace base { 16b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace bits { 17b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 18b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(BitsTest, Log2Floor) { 19b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(-1, Log2Floor(0)); 20b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(0, Log2Floor(1)); 21b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1, Log2Floor(2)); 22b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1, Log2Floor(3)); 23b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2, Log2Floor(4)); 24b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (int i = 3; i < 31; ++i) { 25b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned int value = 1U << i; 26b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(i, Log2Floor(value)); 27b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(i, Log2Floor(value + 1)); 28b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(i, Log2Floor(value + 2)); 29b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(i - 1, Log2Floor(value - 1)); 30b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(i - 1, Log2Floor(value - 2)); 31b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 32b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(31, Log2Floor(0xffffffffU)); 33b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 34b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 35b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST(BitsTest, Log2Ceiling) { 36b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(-1, Log2Ceiling(0)); 37b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(0, Log2Ceiling(1)); 38b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1, Log2Ceiling(2)); 39b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2, Log2Ceiling(3)); 40b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2, Log2Ceiling(4)); 41b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat for (int i = 3; i < 31; ++i) { 42b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned int value = 1U << i; 43b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(i, Log2Ceiling(value)); 44b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(i + 1, Log2Ceiling(value + 1)); 45b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(i + 1, Log2Ceiling(value + 2)); 46b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(i, Log2Ceiling(value - 1)); 47b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(i, Log2Ceiling(value - 2)); 48b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 49b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(32, Log2Ceiling(0xffffffffU)); 50b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 51b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 52cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex VakulenkoTEST(BitsTest, Align) { 53cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko const size_t kSizeTMax = std::numeric_limits<size_t>::max(); 54cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko EXPECT_EQ(0ul, Align(0, 4)); 55cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko EXPECT_EQ(4ul, Align(1, 4)); 56cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko EXPECT_EQ(4096ul, Align(1, 4096)); 57cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko EXPECT_EQ(4096ul, Align(4096, 4096)); 58cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko EXPECT_EQ(4096ul, Align(4095, 4096)); 59cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko EXPECT_EQ(8192ul, Align(4097, 4096)); 60cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko EXPECT_EQ(kSizeTMax - 31, Align(kSizeTMax - 62, 32)); 61cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko EXPECT_EQ(kSizeTMax / 2 + 1, Align(1, kSizeTMax / 2 + 1)); 62cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko} 63cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko 64b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace bits 65b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace base 66