blob: 9c8ea748db0a44e48a8c4436f69f3579d4cda19b [file] [log] [blame]
// Copyright 2011 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <algorithm>
#include <set>
#include <gtest/gtest.h>
#include "include/list.h"
#include "include/util.h"
namespace gestures {
class ListTest : public ::testing::Test {};
namespace {
struct Node {
explicit Node() : val_(-1) {}
explicit Node(int val) : val_(val) {}
int val_;
Node* next_;
Node* prev_;
};
void VerifyList(List<Node>& list) {
Node* first = list.Head()->prev_; // sentinel
Node* second = list.Head(); // next elt (sentinel or first element)
std::set<Node*> seen_nodes;
if (!list.Empty())
EXPECT_NE(first, second);
else
EXPECT_EQ(first, second);
seen_nodes.insert(second);
for (size_t i = 0; i <= list.size(); ++i) {
EXPECT_EQ(first->next_, second);
EXPECT_EQ(second->prev_, first);
if (i < list.size()) {
first = second;
second = second->next_;
EXPECT_FALSE(SetContainsValue(seen_nodes, second));
seen_nodes.insert(second);
}
}
EXPECT_EQ(seen_nodes.size(), list.size() + 1);
// second should now be sentinal tail
Node* sen_tail = list.Tail()->next_;
EXPECT_EQ(second, sen_tail);
}
}
TEST(ListTest, SimpleTest) {
List<Node> list;
VerifyList(list);
EXPECT_TRUE(list.Empty());
EXPECT_EQ(0, list.size());
list.PushFront(new Node(4));
VerifyList(list);
EXPECT_FALSE(list.Empty());
EXPECT_EQ(1, list.size());
list.PushFront(new Node(5));
VerifyList(list);
EXPECT_EQ(2, list.size());
EXPECT_EQ(4, list.Tail()->val_);
EXPECT_EQ(5, list.Head()->val_);
list.PushBack(new Node(3));
VerifyList(list);
EXPECT_EQ(3, list.size());
Node* node = list.PopFront();
VerifyList(list);
ASSERT_TRUE(node);
EXPECT_EQ(5, node->val_);
delete node;
node = list.PopBack();
VerifyList(list);
ASSERT_TRUE(node);
EXPECT_EQ(3, node->val_);
delete node;
node = list.PopBack();
VerifyList(list);
ASSERT_TRUE(node);
EXPECT_EQ(4, node->val_);
delete node;
node = list.PopBack();
VerifyList(list);
EXPECT_EQ(NULL, node);
}
} // namespace gestures