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