/*
 * Copyright (c) 2018, Alliance for Open Media. All rights reserved
 *
 * This source code is subject to the terms of the BSD 2 Clause License and
 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
 * was not distributed with this source code in the LICENSE file, you can
 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
 * Media Patent License 1.0 was not distributed with this source code in the
 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
 */
#include <stdint.h>

#include "aom/aom_integer.h"
#include "gtest/gtest.h"

namespace {
const uint32_t kSizeTestNumValues = 6;
const uint32_t kSizeTestExpectedSizes[kSizeTestNumValues] = {
  1, 1, 2, 3, 4, 5
};
const uint32_t kSizeTestInputs[kSizeTestNumValues] = {
  0, 0x7f, 0x3fff, 0x1fffff, 0xffffff, 0x10000000
};
}  // namespace

TEST(AomLeb128, DecodeTest) {
  const size_t num_leb128_bytes = 3;
  const uint8_t leb128_bytes[num_leb128_bytes] = { 0xE5, 0x8E, 0x26 };
  const uint32_t expected_value = 0x98765;  // 624485
  uint32_t value = 0;
  aom_uleb_decode(&leb128_bytes[0], num_leb128_bytes, &value);
  ASSERT_EQ(expected_value, value);
}

TEST(AomLeb128, EncodeTest) {
  const uint32_t test_value = 0x98765;  // 624485
  const uint32_t expected_value = 0x00E58E26;
  const size_t kWriteBufferSize = 4;
  uint8_t write_buffer[kWriteBufferSize] = { 0 };
  size_t bytes_written = 0;
  ASSERT_EQ(aom_uleb_encode(test_value, kWriteBufferSize, &write_buffer[0],
                            &bytes_written),
            0);
  ASSERT_EQ(bytes_written, 3u);
  uint32_t encoded_value = 0;
  for (size_t i = 0; i < bytes_written; ++i) {
    const int shift = (bytes_written - 1 - i) * 8;
    encoded_value |= write_buffer[i] << shift;
  }
  ASSERT_EQ(expected_value, encoded_value);
}

TEST(AomLeb128, EncDecTest) {
  const uint32_t value = 0x98765;  // 624485
  const size_t kWriteBufferSize = 4;
  uint8_t write_buffer[kWriteBufferSize] = { 0 };
  size_t bytes_written = 0;
  ASSERT_EQ(aom_uleb_encode(value, kWriteBufferSize, &write_buffer[0],
                            &bytes_written),
            0);
  ASSERT_EQ(bytes_written, 3u);
  uint32_t decoded_value = 0;
  aom_uleb_decode(&write_buffer[0], bytes_written, &decoded_value);
  ASSERT_EQ(value, decoded_value);
}

TEST(AomLeb128, FixedSizeEncodeTest) {
  const uint32_t test_value = 0x0;
  const uint32_t expected_value = 0x00808080;
  const size_t kWriteBufferSize = 4;
  uint8_t write_buffer[kWriteBufferSize] = { 0 };
  size_t bytes_written = 0;
  ASSERT_EQ(0, aom_uleb_encode_fixed_size(test_value, kWriteBufferSize,
                                          kWriteBufferSize, &write_buffer[0],
                                          &bytes_written));
  ASSERT_EQ(kWriteBufferSize, bytes_written);
  uint32_t encoded_value = 0;
  for (size_t i = 0; i < bytes_written; ++i) {
    const int shift = (bytes_written - 1 - i) * 8;
    encoded_value |= write_buffer[i] << shift;
  }
  ASSERT_EQ(expected_value, encoded_value);
}

TEST(AomLeb128, FixedSizeEncDecTest) {
  const uint32_t value = 0x1;
  const size_t kWriteBufferSize = 4;
  uint8_t write_buffer[kWriteBufferSize] = { 0 };
  size_t bytes_written = 0;
  ASSERT_EQ(
      aom_uleb_encode_fixed_size(value, kWriteBufferSize, kWriteBufferSize,
                                 &write_buffer[0], &bytes_written),
      0);
  ASSERT_EQ(bytes_written, 4u);
  uint32_t decoded_value = 0;
  aom_uleb_decode(&write_buffer[0], bytes_written, &decoded_value);
  ASSERT_EQ(value, decoded_value);
}

TEST(AomLeb128, SizeTest) {
  for (size_t i = 0; i < kSizeTestNumValues; ++i) {
    ASSERT_EQ(kSizeTestExpectedSizes[i],
              aom_uleb_size_in_bytes(kSizeTestInputs[i]));
  }
}
