/*
 *  Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */
#include "video/unique_timestamp_counter.h"

#include <cstdint>

#include "test/gtest.h"

namespace webrtc {
namespace {

TEST(UniqueTimestampCounterTest, InitiallyZero) {
  UniqueTimestampCounter counter;
  EXPECT_EQ(counter.GetUniqueSeen(), 0);
}

TEST(UniqueTimestampCounterTest, CountsUniqueValues) {
  UniqueTimestampCounter counter;
  counter.Add(100);
  counter.Add(100);
  counter.Add(200);
  counter.Add(150);
  counter.Add(100);
  EXPECT_EQ(counter.GetUniqueSeen(), 3);
}

TEST(UniqueTimestampCounterTest, ForgetsOldValuesAfter1000NewValues) {
  const int kNumValues = 1500;
  const int kMaxHistory = 1000;
  const uint32_t value = 0xFFFFFFF0;
  UniqueTimestampCounter counter;
  for (int i = 0; i < kNumValues; ++i) {
    counter.Add(value + 10 * i);
  }
  ASSERT_EQ(counter.GetUniqueSeen(), kNumValues);
  // Slightly old values not affect number of seen unique values.
  for (int i = kNumValues - kMaxHistory; i < kNumValues; ++i) {
    counter.Add(value + 10 * i);
  }
  EXPECT_EQ(counter.GetUniqueSeen(), kNumValues);
  // Very old value will be treated as unique.
  counter.Add(value);
  EXPECT_EQ(counter.GetUniqueSeen(), kNumValues + 1);
}

}  // namespace
}  // namespace webrtc
