// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/registry/packed_event_codes.h"

#include <gtest/gtest.h>

namespace cobalt::config {

TEST(PackEventCodes, AllowsEmptyIterator) {
  ASSERT_EQ(PackEventCodes((std::vector<uint32_t>){}), 0u);
}

TEST(PackEventCodes, AcceptsSingleElement) {
  ASSERT_EQ(PackEventCodes((std::vector<uint32_t>){939}), 939u);
}

TEST(PackEventCodes, AcceptsFiveElements) {
  ASSERT_EQ(PackEventCodes((std::vector<uint32_t>){
                0b1111100000,
                0b1110011100,
                0b1101111011,
                0b1111010110,
                0b1010110101,
            }),
            0b10101101011111010110110111101111100111001111100000u);
}

TEST(PackEventCodes, IgnoresExtraElements) {
  ASSERT_EQ(PackEventCodes((std::vector<uint32_t>){
                0b1111100000,
                0b1110011100,
                0b1101111011,
                0b1111010110,
                0b1010110101,

                // These two should be ignored.
                0b1010101010,
                0b1101101111,
            }),
            0b10101101011111010110110111101111100111001111100000u);
}

TEST(PackEventCodes, DoesNotOverflow) {
  ASSERT_EQ(PackEventCodes((std::vector<uint32_t>){32769}), 0x1000000000000001u);
  ASSERT_EQ(PackEventCodes((std::vector<uint32_t>){0, 32769}), 0x1000000000008000u);
  ASSERT_EQ(PackEventCodes((std::vector<uint32_t>){0, 0, 32769}), 0x1000000040000000u);
  ASSERT_EQ(PackEventCodes((std::vector<uint32_t>){0, 0, 0, 32769}), 0x1000200000000000u);
}

TEST(PackEventCodes, UpgradesToV1) {
  ASSERT_EQ(PackEventCodes(std::vector<uint32_t>{1023}), 1023u);
  // Sets version field and encodes using 15 bits.
  ASSERT_EQ(PackEventCodes(std::vector<uint32_t>{1024}), 0x1000000000000400u);
}

TEST(UnpackEventCodes, AcceptsNullEventCodes) {
  ASSERT_EQ(UnpackEventCodes(0), ((std::vector<uint32_t>){0, 0, 0, 0, 0}));
}

TEST(UnpackEventCodes, DecodesSingleElement) {
  ASSERT_EQ(UnpackEventCodes(939u), ((std::vector<uint32_t>){939, 0, 0, 0, 0}));
}

TEST(UnpackEventCodes, UnpacksFiveElements) {
  ASSERT_EQ(UnpackEventCodes(0b10101101011111010110110111101111100111001111100000u),
            ((std::vector<uint32_t>){
                0b1111100000,
                0b1110011100,
                0b1101111011,
                0b1111010110,
                0b1010110101,
            }));
}

TEST(UnpackEventCodes, UnpacksFourV1Elements) {
  ASSERT_EQ(UnpackEventCodes(0b1101101010010101101011111010110110111101111100111001111100000u),
            ((std::vector<uint32_t>){
                0b111001111100000u,
                0b110111101111100u,
                0b101011111010110u,
                0b101101010010101u,
            }));
}

TEST(UnpackEventCodes, ReturnsZeroesOnUnknownVersion) {
  ASSERT_EQ(
      // This packed_event_codes has a version of 2, which we don't know how to
      // decode.
      UnpackEventCodes(0x200ABCDEF1234567), ((std::vector<uint32_t>){0, 0, 0, 0, 0}));
}

TEST(BackAndForth, PackUnpackIsStable) {
  // TODO(zmbush): Look into clearing up this test.
  std::vector<std::vector<uint32_t>> tests = {
      {0, 0, 0, 0, 0},        {100, 0, 0, 0, 0},        {100, 200, 0, 0, 0},
      {100, 200, 300, 0, 0},  {100, 200, 300, 400, 0},  {100, 200, 300, 400, 500},
      {1024 - 1, 0, 0, 0, 0}, {1024, 0, 0, 0},          {1024, 3005, 0, 0},
      {1024, 3005, 4010, 0},  {1024, 3005, 4010, 30000}};

  for (const auto &test : tests) {
    ASSERT_EQ(UnpackEventCodes(PackEventCodes(test)), test);
  }
}

}  // namespace cobalt::config
