2018-09-07 17:07:13 +02:00
|
|
|
// Copyright 2018 the V8 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.
|
|
|
|
|
2020-07-13 10:39:42 +02:00
|
|
|
#include "src/heap/list.h"
|
2018-09-07 17:07:13 +02:00
|
|
|
#include "testing/gtest-support.h"
|
|
|
|
|
|
|
|
namespace v8 {
|
2020-07-13 10:39:42 +02:00
|
|
|
namespace internal {
|
|
|
|
namespace heap {
|
2018-09-07 17:07:13 +02:00
|
|
|
|
|
|
|
class TestChunk {
|
|
|
|
public:
|
2020-07-13 10:39:42 +02:00
|
|
|
heap::ListNode<TestChunk>& list_node() { return list_node_; }
|
2020-10-15 20:17:08 +02:00
|
|
|
const heap::ListNode<TestChunk>& list_node() const { return list_node_; }
|
2020-07-13 10:39:42 +02:00
|
|
|
heap::ListNode<TestChunk> list_node_;
|
2018-09-07 17:07:13 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
TEST(List, InsertAtTailAndRemove) {
|
|
|
|
List<TestChunk> list;
|
|
|
|
EXPECT_TRUE(list.Empty());
|
2025-04-29 08:03:15 +02:00
|
|
|
EXPECT_EQ(0u, list.size());
|
2018-09-07 17:07:13 +02:00
|
|
|
TestChunk t1;
|
|
|
|
list.PushBack(&t1);
|
|
|
|
EXPECT_FALSE(list.Empty());
|
2025-04-29 08:03:15 +02:00
|
|
|
EXPECT_EQ(1u, list.size());
|
2018-09-07 17:07:13 +02:00
|
|
|
EXPECT_TRUE(list.Contains(&t1));
|
|
|
|
list.Remove(&t1);
|
|
|
|
EXPECT_TRUE(list.Empty());
|
2025-04-29 08:03:15 +02:00
|
|
|
EXPECT_EQ(0u, list.size());
|
2018-09-07 17:07:13 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST(List, InsertAtHeadAndRemove) {
|
|
|
|
List<TestChunk> list;
|
|
|
|
EXPECT_TRUE(list.Empty());
|
2025-04-29 08:03:15 +02:00
|
|
|
EXPECT_EQ(0u, list.size());
|
2018-09-07 17:07:13 +02:00
|
|
|
TestChunk t1;
|
|
|
|
list.PushFront(&t1);
|
|
|
|
EXPECT_FALSE(list.Empty());
|
2025-04-29 08:03:15 +02:00
|
|
|
EXPECT_EQ(1u, list.size());
|
2018-09-07 17:07:13 +02:00
|
|
|
list.Remove(&t1);
|
|
|
|
EXPECT_TRUE(list.Empty());
|
2025-04-29 08:03:15 +02:00
|
|
|
EXPECT_EQ(0u, list.size());
|
2018-09-07 17:07:13 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST(List, InsertMultipleAtTailAndRemoveFromTail) {
|
|
|
|
List<TestChunk> list;
|
|
|
|
EXPECT_TRUE(list.Empty());
|
2025-04-29 08:03:15 +02:00
|
|
|
EXPECT_EQ(0u, list.size());
|
|
|
|
const size_t kSize = 10;
|
2018-09-07 17:07:13 +02:00
|
|
|
TestChunk chunks[kSize];
|
2025-04-29 08:03:15 +02:00
|
|
|
for (size_t i = 0; i < kSize; i++) {
|
2018-09-07 17:07:13 +02:00
|
|
|
list.PushBack(&chunks[i]);
|
|
|
|
EXPECT_EQ(list.back(), &chunks[i]);
|
2025-04-29 08:03:15 +02:00
|
|
|
EXPECT_EQ(i + 1, list.size());
|
2018-09-07 17:07:13 +02:00
|
|
|
}
|
2025-04-29 08:03:15 +02:00
|
|
|
EXPECT_EQ(kSize, list.size());
|
|
|
|
for (size_t i = kSize - 1; i > 0; i--) {
|
2018-09-07 17:07:13 +02:00
|
|
|
list.Remove(&chunks[i]);
|
|
|
|
EXPECT_EQ(list.back(), &chunks[i - 1]);
|
2025-04-29 08:03:15 +02:00
|
|
|
EXPECT_EQ(i, list.size());
|
2018-09-07 17:07:13 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
list.Remove(&chunks[0]);
|
|
|
|
EXPECT_TRUE(list.Empty());
|
2025-04-29 08:03:15 +02:00
|
|
|
EXPECT_EQ(0u, list.size());
|
2018-09-07 17:07:13 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST(List, InsertMultipleAtHeadAndRemoveFromHead) {
|
|
|
|
List<TestChunk> list;
|
|
|
|
EXPECT_TRUE(list.Empty());
|
2025-04-29 08:03:15 +02:00
|
|
|
EXPECT_EQ(0u, list.size());
|
|
|
|
const size_t kSize = 10;
|
2018-09-07 17:07:13 +02:00
|
|
|
TestChunk chunks[kSize];
|
2025-04-29 08:03:15 +02:00
|
|
|
for (size_t i = 0; i < kSize; i++) {
|
2018-09-07 17:07:13 +02:00
|
|
|
list.PushFront(&chunks[i]);
|
|
|
|
EXPECT_EQ(list.front(), &chunks[i]);
|
2025-04-29 08:03:15 +02:00
|
|
|
EXPECT_EQ(i + 1, list.size());
|
2018-09-07 17:07:13 +02:00
|
|
|
}
|
2025-04-29 08:03:15 +02:00
|
|
|
EXPECT_EQ(kSize, list.size());
|
|
|
|
for (size_t i = kSize - 1; i > 0; i--) {
|
2018-09-07 17:07:13 +02:00
|
|
|
list.Remove(&chunks[i]);
|
|
|
|
EXPECT_EQ(list.front(), &chunks[i - 1]);
|
2025-04-29 08:03:15 +02:00
|
|
|
EXPECT_EQ(i, list.size());
|
2018-09-07 17:07:13 +02:00
|
|
|
}
|
|
|
|
list.Remove(&chunks[0]);
|
|
|
|
EXPECT_TRUE(list.Empty());
|
2025-04-29 08:03:15 +02:00
|
|
|
EXPECT_EQ(0u, list.size());
|
2018-09-07 17:07:13 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST(List, InsertMultipleAtTailAndRemoveFromMiddle) {
|
|
|
|
List<TestChunk> list;
|
|
|
|
EXPECT_TRUE(list.Empty());
|
2025-04-29 08:03:15 +02:00
|
|
|
EXPECT_EQ(0u, list.size());
|
|
|
|
const size_t kSize = 10;
|
2018-09-07 17:07:13 +02:00
|
|
|
TestChunk chunks[kSize];
|
2025-04-29 08:03:15 +02:00
|
|
|
for (size_t i = 0; i < kSize; i++) {
|
2018-09-07 17:07:13 +02:00
|
|
|
list.PushBack(&chunks[i]);
|
|
|
|
EXPECT_EQ(list.back(), &chunks[i]);
|
2025-04-29 08:03:15 +02:00
|
|
|
EXPECT_EQ(i + 1, list.size());
|
2018-09-07 17:07:13 +02:00
|
|
|
}
|
2025-04-29 08:03:15 +02:00
|
|
|
EXPECT_EQ(kSize, list.size());
|
|
|
|
size_t i, j;
|
|
|
|
for (i = kSize / 2 - 1, j = kSize / 2; j < kSize; i--, j++) {
|
2018-09-07 17:07:13 +02:00
|
|
|
list.Remove(&chunks[i]);
|
2025-04-29 08:03:15 +02:00
|
|
|
EXPECT_EQ(i * 2 + 1, list.size());
|
2018-09-07 17:07:13 +02:00
|
|
|
list.Remove(&chunks[j]);
|
2025-04-29 08:03:15 +02:00
|
|
|
EXPECT_EQ(i * 2, list.size());
|
2018-09-07 17:07:13 +02:00
|
|
|
}
|
|
|
|
EXPECT_TRUE(list.Empty());
|
2025-04-29 08:03:15 +02:00
|
|
|
EXPECT_EQ(0u, list.size());
|
2018-09-07 17:07:13 +02:00
|
|
|
}
|
|
|
|
|
2020-07-13 10:39:42 +02:00
|
|
|
} // namespace heap
|
|
|
|
} // namespace internal
|
2018-09-07 17:07:13 +02:00
|
|
|
} // namespace v8
|