blob: a762e5904ddc7f851307e12ccec170d81707432b [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT
#include <lib/unittest/unittest.h>
#include <fbl/macros.h>
#include <ktl/bit.h>
#include "tests.h"
namespace {
bool popcount32_test() {
BEGIN_TEST;
EXPECT_EQ(0, ktl::popcount<uint32_t>(0x00000000));
EXPECT_EQ(8, ktl::popcount<uint32_t>(0x11111111));
EXPECT_EQ(8, ktl::popcount<uint32_t>(0x22222222));
EXPECT_EQ(16, ktl::popcount<uint32_t>(0x33333333));
EXPECT_EQ(8, ktl::popcount<uint32_t>(0x44444444));
EXPECT_EQ(16, ktl::popcount<uint32_t>(0x55555555));
EXPECT_EQ(16, ktl::popcount<uint32_t>(0x66666666));
EXPECT_EQ(24, ktl::popcount<uint32_t>(0x77777777));
EXPECT_EQ(8, ktl::popcount<uint32_t>(0x88888888));
EXPECT_EQ(16, ktl::popcount<uint32_t>(0x99999999));
EXPECT_EQ(16, ktl::popcount<uint32_t>(0xAAAAAAAA));
EXPECT_EQ(24, ktl::popcount<uint32_t>(0xBBBBBBBB));
EXPECT_EQ(16, ktl::popcount<uint32_t>(0xCCCCCCCC));
EXPECT_EQ(24, ktl::popcount<uint32_t>(0xDDDDDDDD));
EXPECT_EQ(24, ktl::popcount<uint32_t>(0xEEEEEEEE));
EXPECT_EQ(32, ktl::popcount<uint32_t>(0xFFFFFFFF));
EXPECT_EQ(16, ktl::popcount<uint32_t>(0xAAAAAAAA));
EXPECT_EQ(16, ktl::popcount<uint32_t>(0x55555555));
EXPECT_EQ(16, ktl::popcount<uint32_t>(0x33333333));
EXPECT_EQ(16, ktl::popcount<uint32_t>(0xCCCCCCCC));
EXPECT_EQ(16, ktl::popcount<uint32_t>(0x66666666));
EXPECT_EQ(8, ktl::popcount<uint32_t>(0x18181818));
EXPECT_EQ(14, ktl::popcount<uint32_t>(0x1A980EF1));
EXPECT_EQ(17, ktl::popcount<uint32_t>(0x365D906F));
EXPECT_EQ(15, ktl::popcount<uint32_t>(0x73044E7C));
EXPECT_EQ(14, ktl::popcount<uint32_t>(0x709E02CE));
EXPECT_EQ(17, ktl::popcount<uint32_t>(0xCB22E1FC));
EXPECT_EQ(13, ktl::popcount<uint32_t>(0x40694CC7));
EXPECT_EQ(15, ktl::popcount<uint32_t>(0x2D0967CC));
EXPECT_EQ(14, ktl::popcount<uint32_t>(0x544BA3C1));
END_TEST;
}
bool popcount64_test() {
BEGIN_TEST;
EXPECT_EQ(0, ktl::popcount<uint64_t>(0x0000000000000000));
EXPECT_EQ(16, ktl::popcount<uint64_t>(0x1111111111111111));
EXPECT_EQ(16, ktl::popcount<uint64_t>(0x2222222222222222));
EXPECT_EQ(32, ktl::popcount<uint64_t>(0x3333333333333333));
EXPECT_EQ(16, ktl::popcount<uint64_t>(0x4444444444444444));
EXPECT_EQ(32, ktl::popcount<uint64_t>(0x5555555555555555));
EXPECT_EQ(32, ktl::popcount<uint64_t>(0x6666666666666666));
EXPECT_EQ(48, ktl::popcount<uint64_t>(0x7777777777777777));
EXPECT_EQ(16, ktl::popcount<uint64_t>(0x8888888888888888));
EXPECT_EQ(32, ktl::popcount<uint64_t>(0x9999999999999999));
EXPECT_EQ(32, ktl::popcount<uint64_t>(0xAAAAAAAAAAAAAAAA));
EXPECT_EQ(48, ktl::popcount<uint64_t>(0xBBBBBBBBBBBBBBBB));
EXPECT_EQ(32, ktl::popcount<uint64_t>(0xCCCCCCCCCCCCCCCC));
EXPECT_EQ(48, ktl::popcount<uint64_t>(0xDDDDDDDDDDDDDDDD));
EXPECT_EQ(48, ktl::popcount<uint64_t>(0xEEEEEEEEEEEEEEEE));
EXPECT_EQ(64, ktl::popcount<uint64_t>(0xFFFFFFFFFFFFFFFF));
EXPECT_EQ(32, ktl::popcount<uint64_t>(0xAAAAAAAAAAAAAAAA));
EXPECT_EQ(32, ktl::popcount<uint64_t>(0x5555555555555555));
EXPECT_EQ(32, ktl::popcount<uint64_t>(0x3333333333333333));
EXPECT_EQ(32, ktl::popcount<uint64_t>(0xCCCCCCCCCCCCCCCC));
EXPECT_EQ(32, ktl::popcount<uint64_t>(0x6666666666666666));
EXPECT_EQ(16, ktl::popcount<uint64_t>(0x1818181818181818));
EXPECT_EQ(22, ktl::popcount<uint64_t>(0x5D082F020202FC84));
EXPECT_EQ(31, ktl::popcount<uint64_t>(0x1D1B5C1D0BD09676));
EXPECT_EQ(36, ktl::popcount<uint64_t>(0x2E35DDF4B958A6F8));
EXPECT_EQ(27, ktl::popcount<uint64_t>(0xAAEE326421692C22));
EXPECT_EQ(29, ktl::popcount<uint64_t>(0xA6A270643F48E26C));
EXPECT_EQ(35, ktl::popcount<uint64_t>(0xB9D42774D92B9E39));
EXPECT_EQ(36, ktl::popcount<uint64_t>(0x7C1DE6347A7BD41B));
EXPECT_EQ(34, ktl::popcount<uint64_t>(0x69C8F8C4EB58F2B9));
END_TEST;
}
bool popcount_disallowed_types_test() {
BEGIN_TEST;
#if TEST_WILL_NOT_COMPILE || 0
ASSERT_EQ(-1, ktl::popcount(12.7));
#endif
#if TEST_WILL_NOT_COMPILE || 0
ASSERT_EQ(-1, ktl::popcount(-7));
#endif
#if TEST_WILL_NOT_COMPILE || 0
struct Foo {
int x;
} foo{5};
ASSERT_EQ(-1, ktl::popcount(foo));
#endif
END_TEST;
}
} // namespace
UNITTEST_START_TESTCASE(popcount_tests)
UNITTEST("32 bit", popcount32_test)
UNITTEST("64 bit", popcount64_test)
UNITTEST("disallowed_types", popcount_disallowed_types_test)
UNITTEST_END_TESTCASE(popcount_tests, "popcount", "Unit tests for popcount")