// 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/popcount.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");
