1 // Copyright 2018 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "slice-extent.h"
6
7 #include <utility>
8
9 #include <fbl/unique_ptr.h>
10 #include <unittest/unittest.h>
11
12 namespace fvm {
13 namespace {
14
15 // Verifies that given starting vslice, the extent describes an empty extent.
InitializationValues()16 bool InitializationValues() {
17 BEGIN_TEST;
18 SliceExtent extent(1);
19 EXPECT_EQ(extent.start(), 1);
20 EXPECT_EQ(extent.end(), 1);
21 EXPECT_EQ(extent.size(), 0);
22 EXPECT_TRUE(extent.is_empty());
23 END_TEST;
24 }
25
26 // Verify that added slices are retrieveable.
AddSlice()27 bool AddSlice() {
28 BEGIN_TEST;
29 SliceExtent extent(1);
30 // This would be our first virtual slice with offset 1.
31 ASSERT_TRUE(extent.push_back(/*pslice*/ 10));
32 EXPECT_EQ(extent.get(/*vslice*/ 1), 10);
33 EXPECT_EQ(extent.start(), 1);
34 EXPECT_EQ(extent.end(), 2);
35 EXPECT_EQ(extent.size(), 1);
36 EXPECT_EQ(extent.get(1), 10);
37 END_TEST;
38 }
39
40 // Verify that removing the single slice of an extent makes it empty.
EmptyExtent()41 bool EmptyExtent() {
42 BEGIN_TEST;
43 SliceExtent extent(1);
44 EXPECT_TRUE(extent.is_empty());
45 extent.push_back(1);
46 EXPECT_FALSE(extent.is_empty());
47 extent.pop_back();
48 EXPECT_TRUE(extent.is_empty());
49 END_TEST;
50 }
51
52 // Verify that Split produces two disjoint extents at the specified vslice.
SplitExtent()53 bool SplitExtent() {
54 BEGIN_TEST;
55 SliceExtent extent(1);
56 // vslice 1
57 extent.push_back(2);
58 // vslice 2
59 extent.push_back(30);
60 // vslice 3
61 extent.push_back(14);
62 // vslice 4
63 extent.push_back(5);
64
65 fbl::unique_ptr<SliceExtent> extent_2 = extent.Split(2);
66 ASSERT_TRUE(extent_2);
67
68 EXPECT_EQ(extent.start(), 1);
69 EXPECT_EQ(extent.end(), 3);
70 EXPECT_EQ(extent.get(1), 2);
71 EXPECT_EQ(extent.get(2), 30);
72
73 EXPECT_EQ(extent_2->start(), 3);
74 EXPECT_EQ(extent_2->end(), 5);
75 EXPECT_EQ(extent_2->get(3), 14);
76 EXPECT_EQ(extent_2->get(4), 5);
77
78 END_TEST;
79 }
80
81 // Verify that Merge produces a correct extent.
MergeExtent()82 bool MergeExtent() {
83 BEGIN_TEST;
84 SliceExtent extent(1);
85 SliceExtent extent_2(3);
86 // vslice 1
87 extent.push_back(2);
88 // vslice 2
89 extent.push_back(3);
90
91 // vslice 3
92 extent_2.push_back(4);
93 // vslice 4
94 extent_2.push_back(5);
95
96 ASSERT_TRUE(extent.Merge(std::move(extent_2)));
97
98 EXPECT_EQ(extent.start(), 1);
99 EXPECT_EQ(extent.end(), 5);
100 EXPECT_EQ(extent.get(1), 2);
101 EXPECT_EQ(extent.get(2), 3);
102 EXPECT_EQ(extent.get(3), 4);
103 EXPECT_EQ(extent.get(4), 5);
104
105 END_TEST;
106 }
107
108 BEGIN_TEST_CASE(SliceExtentTest)
109 RUN_TEST(InitializationValues)
110 RUN_TEST(AddSlice)
111 RUN_TEST(EmptyExtent)
112 RUN_TEST(SplitExtent)
113 RUN_TEST(MergeExtent)
114 END_TEST_CASE(SliceExtentTest)
115 } // namespace
116 } // namespace fvm
117