// 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")
