Index: media/blink/lru_unittest.cc |
diff --git a/media/blink/lru_unittest.cc b/media/blink/lru_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..bc78d11fc82f38e271541a01a8f7c9e902c4a743 |
--- /dev/null |
+++ b/media/blink/lru_unittest.cc |
@@ -0,0 +1,152 @@ |
+// Copyright 2015 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 <stdint.h> |
+ |
+#include <list> |
+#include <string> |
+ |
+#include "base/logging.h" |
+#include "base/strings/stringprintf.h" |
+#include "media/blink/lru.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace { |
+ |
+const int kTestSize = 16; |
+ |
+class SimpleLRU { |
+ public: |
+ void Insert(int x) { |
+ DCHECK(!Contains(x)); |
+ data_.push_back(x); |
+ } |
+ |
+ void Remove(int x) { |
+ for (std::list<int>::iterator i = data_.begin(); |
+ i != data_.end(); |
+ ++i) { |
+ if (*i == x) { |
+ data_.erase(i); |
+ DCHECK(!Contains(x)); |
+ return; |
+ } |
+ } |
+ LOG(FATAL) << "Remove non-existing element " << x; |
+ } |
+ |
+ void Use(int x) { |
+ if (Contains(x)) Remove(x); |
+ Insert(x); |
+ } |
+ |
+ bool Empty() const { return data_.empty(); } |
+ |
+ int Pop() { |
+ DCHECK(!Empty()); |
+ int ret = data_.front(); |
+ data_.pop_front(); |
+ return ret; |
+ } |
+ |
+ bool Contains(int x) const { |
+ for (std::list<int>::const_iterator i = data_.begin(); |
+ i != data_.end(); |
+ ++i) { |
+ if (*i == x) { |
+ return true; |
+ } |
+ } |
+ return false; |
+ } |
+ |
+ private: |
+ std::list<int> data_; |
+}; |
+ |
+class LRUTest : public testing::Test { |
+ public: |
+ void Insert(int x) { |
+ truth_.Insert(x); |
+ testee_.Insert(x); |
+ Compare(); |
+ } |
+ |
+ void Remove(int x) { |
+ truth_.Remove(x); |
+ testee_.Remove(x); |
+ Compare(); |
+ } |
+ |
+ void Use(int x) { |
+ truth_.Use(x); |
+ testee_.Use(x); |
+ Compare(); |
+ } |
+ |
+ int Pop() { |
+ int truth_value = truth_.Pop(); |
+ int testee_value = testee_.Pop(); |
+ EXPECT_EQ(truth_value, testee_value); |
+ Compare(); |
+ return truth_value; |
+ } |
+ |
+ void Compare() { |
+ for (int i = 0; i < kTestSize; i++) { |
+ EXPECT_EQ(truth_.Contains(i), testee_.Contains(i)) << "i =" << i; |
+ } |
+ EXPECT_EQ(truth_.Empty(), testee_.Empty()); |
+ } |
+ |
+ bool Empty() const { |
+ EXPECT_EQ(truth_.Empty(), testee_.Empty()); |
+ return truth_.Empty(); |
+ } |
+ |
+ bool Contains(int i) const { |
+ EXPECT_EQ(truth_.Contains(i), testee_.Contains(i)); |
+ return testee_.Contains(i); |
+ } |
+ |
+ void Clear() { |
+ while (!Empty()) Pop(); |
+ } |
+ |
+ |
+ private: |
+ SimpleLRU truth_; |
+ media::LRU<int> testee_; |
+}; |
+ |
+} |
+ |
+TEST_F(LRUTest, RandomTest) { |
+ for (int j = 0; j < 100; j++) { |
+ Clear(); |
+ for (int i = 0; i < 1000; i++) { |
+ int value = rand() % kTestSize; |
DaleCurtis
2015/10/19 21:45:25
Rand tests are generally discouraged:
https://code
|
+ switch (rand() % 3) { |
+ case 0: |
+ if (!Empty()) Pop(); |
+ break; |
+ |
+ case 1: |
+ Use(value); |
+ break; |
+ |
+ case 2: |
+ if (Contains(value)) { |
+ Remove(value); |
+ } else { |
+ Insert(value); |
+ } |
+ break; |
+ } |
+ if (HasFailure()) { |
+ return; |
+ } |
+ } |
+ } |
+} |