1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright (c) 2009 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/linked_list.h"
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/basictypes.h"
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/gtest/include/gtest/gtest.h"
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace base {
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace {
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass Node : public LinkNode<Node> {
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  explicit Node(int id) : id_(id) {}
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int id() const { return id_; }
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private:
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int id_;
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass MultipleInheritanceNodeBase {
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MultipleInheritanceNodeBase() : field_taking_up_space_(0) {}
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int field_taking_up_space_;
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass MultipleInheritanceNode : public MultipleInheritanceNodeBase,
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                public LinkNode<MultipleInheritanceNode> {
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MultipleInheritanceNode() {}
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Checks that when iterating |list| (either from head to tail, or from
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// tail to head, as determined by |forward|), we get back |node_ids|,
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// which is an array of size |num_nodes|.
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid ExpectListContentsForDirection(const LinkedList<Node>& list,
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int num_nodes, const int* node_ids, bool forward) {
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int i = 0;
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (const LinkNode<Node>* node = (forward ? list.head() : list.tail());
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott       node != list.end();
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott       node = (forward ? node->next() : node->previous())) {
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ASSERT_LT(i, num_nodes);
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int index_of_id = forward ? i : num_nodes - i - 1;
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(node_ids[index_of_id], node->value()->id());
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ++i;
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(num_nodes, i);
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid ExpectListContents(const LinkedList<Node>& list,
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        int num_nodes,
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                        const int* node_ids) {
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    SCOPED_TRACE("Iterating forward (from head to tail)");
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ExpectListContentsForDirection(list, num_nodes, node_ids, true);
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    SCOPED_TRACE("Iterating backward (from tail to head)");
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ExpectListContentsForDirection(list, num_nodes, node_ids, false);
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(LinkedList, Empty) {
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  LinkedList<Node> list;
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(list.end(), list.head());
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(list.end(), list.tail());
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ExpectListContents(list, 0, NULL);
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(LinkedList, Append) {
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  LinkedList<Node> list;
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ExpectListContents(list, 0, NULL);
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Node n1(1);
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  list.Append(&n1);
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&n1, list.head());
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&n1, list.tail());
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const int expected[] = {1};
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ExpectListContents(list, arraysize(expected), expected);
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Node n2(2);
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  list.Append(&n2);
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&n1, list.head());
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&n2, list.tail());
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const int expected[] = {1, 2};
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ExpectListContents(list, arraysize(expected), expected);
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Node n3(3);
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  list.Append(&n3);
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&n1, list.head());
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&n3, list.tail());
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const int expected[] = {1, 2, 3};
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ExpectListContents(list, arraysize(expected), expected);
103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(LinkedList, RemoveFromList) {
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  LinkedList<Node> list;
108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Node n1(1);
110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Node n2(2);
111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Node n3(3);
112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Node n4(4);
113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Node n5(5);
114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  list.Append(&n1);
116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  list.Append(&n2);
117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  list.Append(&n3);
118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  list.Append(&n4);
119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  list.Append(&n5);
120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&n1, list.head());
122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&n5, list.tail());
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {
124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const int expected[] = {1, 2, 3, 4, 5};
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ExpectListContents(list, arraysize(expected), expected);
126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Remove from the middle.
129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  n3.RemoveFromList();
130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&n1, list.head());
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&n5, list.tail());
133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {
134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const int expected[] = {1, 2, 4, 5};
135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ExpectListContents(list, arraysize(expected), expected);
136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Remove from the tail.
139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  n5.RemoveFromList();
140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&n1, list.head());
142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&n4, list.tail());
143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {
144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const int expected[] = {1, 2, 4};
145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ExpectListContents(list, arraysize(expected), expected);
146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Remove from the head.
149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  n1.RemoveFromList();
150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&n2, list.head());
152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&n4, list.tail());
153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {
154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const int expected[] = {2, 4};
155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ExpectListContents(list, arraysize(expected), expected);
156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Empty the list.
159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  n2.RemoveFromList();
160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  n4.RemoveFromList();
161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ExpectListContents(list, 0, NULL);
163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(list.end(), list.head());
164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(list.end(), list.tail());
165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Fill the list once again.
167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  list.Append(&n1);
168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  list.Append(&n2);
169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  list.Append(&n3);
170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  list.Append(&n4);
171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  list.Append(&n5);
172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&n1, list.head());
174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&n5, list.tail());
175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {
176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const int expected[] = {1, 2, 3, 4, 5};
177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ExpectListContents(list, arraysize(expected), expected);
178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(LinkedList, InsertBefore) {
182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  LinkedList<Node> list;
183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Node n1(1);
185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Node n2(2);
186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Node n3(3);
187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Node n4(4);
188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  list.Append(&n1);
190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  list.Append(&n2);
191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&n1, list.head());
193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&n2, list.tail());
194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {
195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const int expected[] = {1, 2};
196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ExpectListContents(list, arraysize(expected), expected);
197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  n3.InsertBefore(&n2);
200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&n1, list.head());
202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&n2, list.tail());
203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {
204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const int expected[] = {1, 3, 2};
205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ExpectListContents(list, arraysize(expected), expected);
206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  n4.InsertBefore(&n1);
209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&n4, list.head());
211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&n2, list.tail());
212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {
213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const int expected[] = {4, 1, 3, 2};
214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ExpectListContents(list, arraysize(expected), expected);
215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(LinkedList, InsertAfter) {
219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  LinkedList<Node> list;
220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Node n1(1);
222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Node n2(2);
223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Node n3(3);
224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Node n4(4);
225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  list.Append(&n1);
227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  list.Append(&n2);
228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&n1, list.head());
230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&n2, list.tail());
231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {
232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const int expected[] = {1, 2};
233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ExpectListContents(list, arraysize(expected), expected);
234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  n3.InsertAfter(&n2);
237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&n1, list.head());
239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&n3, list.tail());
240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {
241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const int expected[] = {1, 2, 3};
242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ExpectListContents(list, arraysize(expected), expected);
243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  n4.InsertAfter(&n1);
246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&n1, list.head());
248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&n3, list.tail());
249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {
250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const int expected[] = {1, 4, 2, 3};
251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ExpectListContents(list, arraysize(expected), expected);
252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(LinkedList, MultipleInheritanceNode) {
256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MultipleInheritanceNode node;
257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&node, node.value());
258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace
261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace base
262