// Copyright 2014 The Chromium 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 "cobalt/media/filters/h264_bitstream_buffer.h"
#include "starboard/types.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace cobalt {
namespace media {

namespace {
const uint64_t kTestPattern = 0xfedcba0987654321;
}

class H264BitstreamBufferAppendBitsTest
    : public ::testing::TestWithParam<uint64_t> {};

// TODO(posciak): More tests!

TEST_P(H264BitstreamBufferAppendBitsTest, AppendAndVerifyBits) {
  H264BitstreamBuffer b;
  uint64_t num_bits = GetParam();
  // TODO(posciak): Tests for >64 bits.
  ASSERT_LE(num_bits, 64u);
  uint64_t num_bytes = (num_bits + 7) / 8;

  b.AppendBits(num_bits, kTestPattern);
  b.FlushReg();

  EXPECT_EQ(b.BytesInBuffer(), num_bytes);

  uint8_t* ptr = b.data();
  uint64_t got = 0;
  uint64_t expected = kTestPattern;

  if (num_bits < 64) expected &= ((1ull << num_bits) - 1);

  while (num_bits > 8) {
    got |= (*ptr & 0xff);
    num_bits -= 8;
    got <<= (num_bits > 8 ? 8 : num_bits);
    ptr++;
  }
  if (num_bits > 0) {
    uint64_t temp = (*ptr & 0xff);
    temp >>= (8 - num_bits);
    got |= temp;
  }
  EXPECT_EQ(got, expected) << std::hex << "0x" << got << " vs 0x" << expected;
}

INSTANTIATE_TEST_CASE_P(AppendNumBits, H264BitstreamBufferAppendBitsTest,
                        ::testing::Range(static_cast<uint64_t>(1),
                                         static_cast<uint64_t>(65)));
}  // namespace media
}  // namespace cobalt
