xref: /aosp_15_r20/external/google-breakpad/src/common/test_assembler_unittest.cc (revision 9712c20fc9bbfbac4935993a2ca0b3958c5adad2)
1*9712c20fSFrederick Mayle // Copyright 2010 Google LLC
2*9712c20fSFrederick Mayle //
3*9712c20fSFrederick Mayle // Redistribution and use in source and binary forms, with or without
4*9712c20fSFrederick Mayle // modification, are permitted provided that the following conditions are
5*9712c20fSFrederick Mayle // met:
6*9712c20fSFrederick Mayle //
7*9712c20fSFrederick Mayle //     * Redistributions of source code must retain the above copyright
8*9712c20fSFrederick Mayle // notice, this list of conditions and the following disclaimer.
9*9712c20fSFrederick Mayle //     * Redistributions in binary form must reproduce the above
10*9712c20fSFrederick Mayle // copyright notice, this list of conditions and the following disclaimer
11*9712c20fSFrederick Mayle // in the documentation and/or other materials provided with the
12*9712c20fSFrederick Mayle // distribution.
13*9712c20fSFrederick Mayle //     * Neither the name of Google LLC nor the names of its
14*9712c20fSFrederick Mayle // contributors may be used to endorse or promote products derived from
15*9712c20fSFrederick Mayle // this software without specific prior written permission.
16*9712c20fSFrederick Mayle //
17*9712c20fSFrederick Mayle // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*9712c20fSFrederick Mayle // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*9712c20fSFrederick Mayle // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*9712c20fSFrederick Mayle // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*9712c20fSFrederick Mayle // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*9712c20fSFrederick Mayle // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*9712c20fSFrederick Mayle // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*9712c20fSFrederick Mayle // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*9712c20fSFrederick Mayle // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*9712c20fSFrederick Mayle // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*9712c20fSFrederick Mayle // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*9712c20fSFrederick Mayle 
29*9712c20fSFrederick Mayle // Original author: Jim Blandy <[email protected]> <[email protected]>
30*9712c20fSFrederick Mayle 
31*9712c20fSFrederick Mayle // test_assembler_unittest.cc: Unit tests for google_breakpad::TestAssembler.
32*9712c20fSFrederick Mayle 
33*9712c20fSFrederick Mayle #ifdef HAVE_CONFIG_H
34*9712c20fSFrederick Mayle #include <config.h>  // Must come first
35*9712c20fSFrederick Mayle #endif
36*9712c20fSFrederick Mayle 
37*9712c20fSFrederick Mayle #include <string>
38*9712c20fSFrederick Mayle #include <string.h>
39*9712c20fSFrederick Mayle 
40*9712c20fSFrederick Mayle #include "breakpad_googletest_includes.h"
41*9712c20fSFrederick Mayle #include "common/test_assembler.h"
42*9712c20fSFrederick Mayle #include "common/using_std_string.h"
43*9712c20fSFrederick Mayle 
44*9712c20fSFrederick Mayle using google_breakpad::test_assembler::Label;
45*9712c20fSFrederick Mayle using google_breakpad::test_assembler::Section;
46*9712c20fSFrederick Mayle using google_breakpad::test_assembler::kBigEndian;
47*9712c20fSFrederick Mayle using google_breakpad::test_assembler::kLittleEndian;
48*9712c20fSFrederick Mayle using testing::Test;
49*9712c20fSFrederick Mayle 
TEST(ConstructLabel,Simple)50*9712c20fSFrederick Mayle TEST(ConstructLabel, Simple) {
51*9712c20fSFrederick Mayle   Label l;
52*9712c20fSFrederick Mayle }
53*9712c20fSFrederick Mayle 
TEST(ConstructLabel,Undefined)54*9712c20fSFrederick Mayle TEST(ConstructLabel, Undefined) {
55*9712c20fSFrederick Mayle   Label l;
56*9712c20fSFrederick Mayle   EXPECT_FALSE(l.IsKnownConstant());
57*9712c20fSFrederick Mayle }
58*9712c20fSFrederick Mayle 
TEST(ConstructLabelDeathTest,Undefined)59*9712c20fSFrederick Mayle TEST(ConstructLabelDeathTest, Undefined) {
60*9712c20fSFrederick Mayle   Label l;
61*9712c20fSFrederick Mayle   ASSERT_DEATH(l.Value(), "IsKnownConstant\\(&v\\)");
62*9712c20fSFrederick Mayle }
63*9712c20fSFrederick Mayle 
TEST(ConstructLabel,Constant)64*9712c20fSFrederick Mayle TEST(ConstructLabel, Constant) {
65*9712c20fSFrederick Mayle   Label l(0x060b9f974eaf301eULL);
66*9712c20fSFrederick Mayle   uint64_t v;
67*9712c20fSFrederick Mayle   EXPECT_TRUE(l.IsKnownConstant(&v));
68*9712c20fSFrederick Mayle   EXPECT_EQ(v, 0x060b9f974eaf301eULL);
69*9712c20fSFrederick Mayle   EXPECT_EQ(l.Value(), 0x060b9f974eaf301eULL);
70*9712c20fSFrederick Mayle }
71*9712c20fSFrederick Mayle 
TEST(ConstructLabel,Copy)72*9712c20fSFrederick Mayle TEST(ConstructLabel, Copy) {
73*9712c20fSFrederick Mayle   Label l;
74*9712c20fSFrederick Mayle   Label m(l);
75*9712c20fSFrederick Mayle   uint64_t v;
76*9712c20fSFrederick Mayle   EXPECT_TRUE(l.IsKnownOffsetFrom(m, &v));
77*9712c20fSFrederick Mayle   EXPECT_EQ(0U, v);
78*9712c20fSFrederick Mayle }
79*9712c20fSFrederick Mayle 
80*9712c20fSFrederick Mayle // The left-hand-side of a label assignment can be either
81*9712c20fSFrederick Mayle // unconstrained, related, or known. The right-hand-side can be any of
82*9712c20fSFrederick Mayle // those, or an integer.
TEST(Assignment,UnconstrainedToUnconstrained)83*9712c20fSFrederick Mayle TEST(Assignment, UnconstrainedToUnconstrained) {
84*9712c20fSFrederick Mayle   Label l, m;
85*9712c20fSFrederick Mayle   l = m;
86*9712c20fSFrederick Mayle   EXPECT_EQ(0U, l-m);
87*9712c20fSFrederick Mayle   EXPECT_TRUE(l.IsKnownOffsetFrom(m));
88*9712c20fSFrederick Mayle   uint64_t d;
89*9712c20fSFrederick Mayle   EXPECT_TRUE(l.IsKnownOffsetFrom(m, &d));
90*9712c20fSFrederick Mayle   EXPECT_EQ(0U, d);
91*9712c20fSFrederick Mayle   EXPECT_FALSE(l.IsKnownConstant());
92*9712c20fSFrederick Mayle }
93*9712c20fSFrederick Mayle 
TEST(Assignment,UnconstrainedToRelated)94*9712c20fSFrederick Mayle TEST(Assignment, UnconstrainedToRelated) {
95*9712c20fSFrederick Mayle   Label l, m, n;
96*9712c20fSFrederick Mayle   l = n;
97*9712c20fSFrederick Mayle   l = m;
98*9712c20fSFrederick Mayle   EXPECT_EQ(0U, l-m);
99*9712c20fSFrederick Mayle   EXPECT_TRUE(l.IsKnownOffsetFrom(m));
100*9712c20fSFrederick Mayle   uint64_t d;
101*9712c20fSFrederick Mayle   EXPECT_TRUE(l.IsKnownOffsetFrom(m, &d));
102*9712c20fSFrederick Mayle   EXPECT_EQ(0U, d);
103*9712c20fSFrederick Mayle   EXPECT_FALSE(l.IsKnownConstant());
104*9712c20fSFrederick Mayle }
105*9712c20fSFrederick Mayle 
TEST(Assignment,UnconstrainedToKnown)106*9712c20fSFrederick Mayle TEST(Assignment, UnconstrainedToKnown) {
107*9712c20fSFrederick Mayle   Label l, m;
108*9712c20fSFrederick Mayle   l = 0x8fd16e55b20a39c1ULL;
109*9712c20fSFrederick Mayle   l = m;
110*9712c20fSFrederick Mayle   EXPECT_EQ(0U, l-m);
111*9712c20fSFrederick Mayle   EXPECT_TRUE(l.IsKnownOffsetFrom(m));
112*9712c20fSFrederick Mayle   uint64_t d;
113*9712c20fSFrederick Mayle   EXPECT_TRUE(l.IsKnownOffsetFrom(m, &d));
114*9712c20fSFrederick Mayle   EXPECT_EQ(0U, d);
115*9712c20fSFrederick Mayle   EXPECT_TRUE(m.IsKnownConstant());
116*9712c20fSFrederick Mayle   EXPECT_EQ(0x8fd16e55b20a39c1ULL, m.Value());
117*9712c20fSFrederick Mayle }
118*9712c20fSFrederick Mayle 
TEST(Assignment,RelatedToUnconstrained)119*9712c20fSFrederick Mayle TEST(Assignment, RelatedToUnconstrained) {
120*9712c20fSFrederick Mayle   Label l, m, n;
121*9712c20fSFrederick Mayle   m = n;
122*9712c20fSFrederick Mayle   l = m;
123*9712c20fSFrederick Mayle   EXPECT_EQ(0U, l-n);
124*9712c20fSFrederick Mayle   EXPECT_TRUE(l.IsKnownOffsetFrom(n));
125*9712c20fSFrederick Mayle   uint64_t d;
126*9712c20fSFrederick Mayle   EXPECT_TRUE(l.IsKnownOffsetFrom(n, &d));
127*9712c20fSFrederick Mayle   EXPECT_EQ(0U, d);
128*9712c20fSFrederick Mayle   EXPECT_FALSE(l.IsKnownConstant());
129*9712c20fSFrederick Mayle }
130*9712c20fSFrederick Mayle 
TEST(Assignment,RelatedToRelated)131*9712c20fSFrederick Mayle TEST(Assignment, RelatedToRelated) {
132*9712c20fSFrederick Mayle   Label l, m, n, o;
133*9712c20fSFrederick Mayle   l = n;
134*9712c20fSFrederick Mayle   m = o;
135*9712c20fSFrederick Mayle   l = m;
136*9712c20fSFrederick Mayle   EXPECT_EQ(0U, n-o);
137*9712c20fSFrederick Mayle   EXPECT_TRUE(n.IsKnownOffsetFrom(o));
138*9712c20fSFrederick Mayle   uint64_t d;
139*9712c20fSFrederick Mayle   EXPECT_TRUE(n.IsKnownOffsetFrom(o, &d));
140*9712c20fSFrederick Mayle   EXPECT_EQ(0U, d);
141*9712c20fSFrederick Mayle   EXPECT_FALSE(l.IsKnownConstant());
142*9712c20fSFrederick Mayle }
143*9712c20fSFrederick Mayle 
TEST(Assignment,RelatedToKnown)144*9712c20fSFrederick Mayle TEST(Assignment, RelatedToKnown) {
145*9712c20fSFrederick Mayle   Label l, m, n;
146*9712c20fSFrederick Mayle   m = n;
147*9712c20fSFrederick Mayle   l = 0xd2011f8c82ad56f2ULL;
148*9712c20fSFrederick Mayle   l = m;
149*9712c20fSFrederick Mayle   EXPECT_TRUE(l.IsKnownConstant());
150*9712c20fSFrederick Mayle   EXPECT_EQ(0xd2011f8c82ad56f2ULL, l.Value());
151*9712c20fSFrederick Mayle   EXPECT_TRUE(m.IsKnownConstant());
152*9712c20fSFrederick Mayle   EXPECT_EQ(0xd2011f8c82ad56f2ULL, m.Value());
153*9712c20fSFrederick Mayle   EXPECT_TRUE(n.IsKnownConstant());
154*9712c20fSFrederick Mayle   EXPECT_EQ(0xd2011f8c82ad56f2ULL, n.Value());
155*9712c20fSFrederick Mayle }
156*9712c20fSFrederick Mayle 
TEST(Assignment,KnownToUnconstrained)157*9712c20fSFrederick Mayle TEST(Assignment, KnownToUnconstrained) {
158*9712c20fSFrederick Mayle   Label l, m;
159*9712c20fSFrederick Mayle   m = 0x50b024c0d6073887ULL;
160*9712c20fSFrederick Mayle   l = m;
161*9712c20fSFrederick Mayle   EXPECT_TRUE(l.IsKnownConstant());
162*9712c20fSFrederick Mayle   EXPECT_EQ(0x50b024c0d6073887ULL, l.Value());
163*9712c20fSFrederick Mayle   EXPECT_TRUE(m.IsKnownConstant());
164*9712c20fSFrederick Mayle   EXPECT_EQ(0x50b024c0d6073887ULL, m.Value());
165*9712c20fSFrederick Mayle }
166*9712c20fSFrederick Mayle 
TEST(Assignment,KnownToRelated)167*9712c20fSFrederick Mayle TEST(Assignment, KnownToRelated) {
168*9712c20fSFrederick Mayle   Label l, m, n;
169*9712c20fSFrederick Mayle   l = n;
170*9712c20fSFrederick Mayle   m = 0x5348883655c727e5ULL;
171*9712c20fSFrederick Mayle   l = m;
172*9712c20fSFrederick Mayle   EXPECT_TRUE(l.IsKnownConstant());
173*9712c20fSFrederick Mayle   EXPECT_EQ(0x5348883655c727e5ULL, l.Value());
174*9712c20fSFrederick Mayle   EXPECT_TRUE(m.IsKnownConstant());
175*9712c20fSFrederick Mayle   EXPECT_EQ(0x5348883655c727e5ULL, m.Value());
176*9712c20fSFrederick Mayle   EXPECT_TRUE(n.IsKnownConstant());
177*9712c20fSFrederick Mayle   EXPECT_EQ(0x5348883655c727e5ULL, n.Value());
178*9712c20fSFrederick Mayle }
179*9712c20fSFrederick Mayle 
TEST(Assignment,KnownToKnown)180*9712c20fSFrederick Mayle TEST(Assignment, KnownToKnown) {
181*9712c20fSFrederick Mayle   Label l, m;
182*9712c20fSFrederick Mayle   l = 0x36c209c20987564eULL;
183*9712c20fSFrederick Mayle   m = 0x36c209c20987564eULL;
184*9712c20fSFrederick Mayle   l = m;
185*9712c20fSFrederick Mayle   EXPECT_TRUE(l.IsKnownConstant());
186*9712c20fSFrederick Mayle   EXPECT_EQ(0x36c209c20987564eULL, l.Value());
187*9712c20fSFrederick Mayle   EXPECT_TRUE(m.IsKnownConstant());
188*9712c20fSFrederick Mayle   EXPECT_EQ(0x36c209c20987564eULL, m.Value());
189*9712c20fSFrederick Mayle }
190*9712c20fSFrederick Mayle 
TEST(Assignment,ConstantToUnconstrained)191*9712c20fSFrederick Mayle TEST(Assignment, ConstantToUnconstrained) {
192*9712c20fSFrederick Mayle   Label l;
193*9712c20fSFrederick Mayle   l = 0xc02495f4d7f5a957ULL;
194*9712c20fSFrederick Mayle   EXPECT_TRUE(l.IsKnownConstant());
195*9712c20fSFrederick Mayle   EXPECT_EQ(0xc02495f4d7f5a957ULL, l.Value());
196*9712c20fSFrederick Mayle }
197*9712c20fSFrederick Mayle 
TEST(Assignment,ConstantToRelated)198*9712c20fSFrederick Mayle TEST(Assignment, ConstantToRelated) {
199*9712c20fSFrederick Mayle   Label l, m;
200*9712c20fSFrederick Mayle   l = m;
201*9712c20fSFrederick Mayle   l = 0x4577901cf275488dULL;
202*9712c20fSFrederick Mayle   EXPECT_TRUE(l.IsKnownConstant());
203*9712c20fSFrederick Mayle   EXPECT_EQ(0x4577901cf275488dULL, l.Value());
204*9712c20fSFrederick Mayle   EXPECT_TRUE(m.IsKnownConstant());
205*9712c20fSFrederick Mayle   EXPECT_EQ(0x4577901cf275488dULL, m.Value());
206*9712c20fSFrederick Mayle }
207*9712c20fSFrederick Mayle 
TEST(Assignment,ConstantToKnown)208*9712c20fSFrederick Mayle TEST(Assignment, ConstantToKnown) {
209*9712c20fSFrederick Mayle   Label l;
210*9712c20fSFrederick Mayle   l = 0xec0b9c369b7e8ea7ULL;
211*9712c20fSFrederick Mayle   l = 0xec0b9c369b7e8ea7ULL;
212*9712c20fSFrederick Mayle   EXPECT_TRUE(l.IsKnownConstant());
213*9712c20fSFrederick Mayle   EXPECT_EQ(0xec0b9c369b7e8ea7ULL, l.Value());
214*9712c20fSFrederick Mayle }
215*9712c20fSFrederick Mayle 
TEST(AssignmentDeathTest,Self)216*9712c20fSFrederick Mayle TEST(AssignmentDeathTest, Self) {
217*9712c20fSFrederick Mayle   Label l;
218*9712c20fSFrederick Mayle   ASSERT_DEATH(l = l, "binding != this");
219*9712c20fSFrederick Mayle }
220*9712c20fSFrederick Mayle 
TEST(AssignmentDeathTest,IndirectCycle)221*9712c20fSFrederick Mayle TEST(AssignmentDeathTest, IndirectCycle) {
222*9712c20fSFrederick Mayle   Label l, m, n;
223*9712c20fSFrederick Mayle   l = m;
224*9712c20fSFrederick Mayle   m = n;
225*9712c20fSFrederick Mayle   ASSERT_DEATH(n = l, "binding != this");
226*9712c20fSFrederick Mayle }
227*9712c20fSFrederick Mayle 
TEST(AssignmentDeathTest,Cycle)228*9712c20fSFrederick Mayle TEST(AssignmentDeathTest, Cycle) {
229*9712c20fSFrederick Mayle   Label l, m, n, o;
230*9712c20fSFrederick Mayle   l = m;
231*9712c20fSFrederick Mayle   m = n;
232*9712c20fSFrederick Mayle   o = n;
233*9712c20fSFrederick Mayle   ASSERT_DEATH(o = l, "binding != this");
234*9712c20fSFrederick Mayle }
235*9712c20fSFrederick Mayle 
TEST(Addition,LabelConstant)236*9712c20fSFrederick Mayle TEST(Addition, LabelConstant) {
237*9712c20fSFrederick Mayle   Label l, m;
238*9712c20fSFrederick Mayle   m = l + 0x5248d93e8bbe9497ULL;
239*9712c20fSFrederick Mayle   EXPECT_TRUE(m.IsKnownOffsetFrom(l));
240*9712c20fSFrederick Mayle   uint64_t d;
241*9712c20fSFrederick Mayle   EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d));
242*9712c20fSFrederick Mayle   EXPECT_EQ(0x5248d93e8bbe9497ULL, d);
243*9712c20fSFrederick Mayle   EXPECT_FALSE(m.IsKnownConstant());
244*9712c20fSFrederick Mayle }
245*9712c20fSFrederick Mayle 
TEST(Addition,ConstantLabel)246*9712c20fSFrederick Mayle TEST(Addition, ConstantLabel) {
247*9712c20fSFrederick Mayle   Label l, m;
248*9712c20fSFrederick Mayle   m = 0xf51e94e00d6e3c84ULL + l;
249*9712c20fSFrederick Mayle   EXPECT_TRUE(m.IsKnownOffsetFrom(l));
250*9712c20fSFrederick Mayle   uint64_t d;
251*9712c20fSFrederick Mayle   EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d));
252*9712c20fSFrederick Mayle   EXPECT_EQ(0xf51e94e00d6e3c84ULL, d);
253*9712c20fSFrederick Mayle   EXPECT_FALSE(m.IsKnownConstant());
254*9712c20fSFrederick Mayle }
255*9712c20fSFrederick Mayle 
TEST(Addition,KnownLabelConstant)256*9712c20fSFrederick Mayle TEST(Addition, KnownLabelConstant) {
257*9712c20fSFrederick Mayle   Label l, m;
258*9712c20fSFrederick Mayle   l = 0x16286307042ce0d8ULL;
259*9712c20fSFrederick Mayle   m = l + 0x3fdddd91306719d7ULL;
260*9712c20fSFrederick Mayle   EXPECT_TRUE(m.IsKnownOffsetFrom(l));
261*9712c20fSFrederick Mayle   uint64_t d;
262*9712c20fSFrederick Mayle   EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d));
263*9712c20fSFrederick Mayle   EXPECT_EQ(0x3fdddd91306719d7ULL, d);
264*9712c20fSFrederick Mayle   EXPECT_TRUE(m.IsKnownConstant());
265*9712c20fSFrederick Mayle   EXPECT_EQ(0x16286307042ce0d8ULL + 0x3fdddd91306719d7ULL, m.Value());
266*9712c20fSFrederick Mayle }
267*9712c20fSFrederick Mayle 
TEST(Addition,ConstantKnownLabel)268*9712c20fSFrederick Mayle TEST(Addition, ConstantKnownLabel) {
269*9712c20fSFrederick Mayle   Label l, m;
270*9712c20fSFrederick Mayle   l = 0x50f62d0cdd1031deULL;
271*9712c20fSFrederick Mayle   m = 0x1b13462d8577c538ULL + l;
272*9712c20fSFrederick Mayle   EXPECT_TRUE(m.IsKnownOffsetFrom(l));
273*9712c20fSFrederick Mayle   uint64_t d;
274*9712c20fSFrederick Mayle   EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d));
275*9712c20fSFrederick Mayle   EXPECT_EQ(0x1b13462d8577c538ULL, d);
276*9712c20fSFrederick Mayle   EXPECT_TRUE(m.IsKnownConstant());
277*9712c20fSFrederick Mayle   EXPECT_EQ(0x50f62d0cdd1031deULL + 0x1b13462d8577c538ULL, m.Value());
278*9712c20fSFrederick Mayle }
279*9712c20fSFrederick Mayle 
TEST(Subtraction,LabelConstant)280*9712c20fSFrederick Mayle TEST(Subtraction, LabelConstant) {
281*9712c20fSFrederick Mayle   Label l, m;
282*9712c20fSFrederick Mayle   m = l - 0x0620884d21d3138eULL;
283*9712c20fSFrederick Mayle   EXPECT_TRUE(m.IsKnownOffsetFrom(l));
284*9712c20fSFrederick Mayle   uint64_t d;
285*9712c20fSFrederick Mayle   EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d));
286*9712c20fSFrederick Mayle   EXPECT_EQ(-0x0620884d21d3138eULL, d);
287*9712c20fSFrederick Mayle   EXPECT_FALSE(m.IsKnownConstant());
288*9712c20fSFrederick Mayle }
289*9712c20fSFrederick Mayle 
TEST(Subtraction,KnownLabelConstant)290*9712c20fSFrederick Mayle TEST(Subtraction, KnownLabelConstant) {
291*9712c20fSFrederick Mayle   Label l, m;
292*9712c20fSFrederick Mayle   l = 0x6237fbaf9ef7929eULL;
293*9712c20fSFrederick Mayle   m = l - 0x317730995d2ab6eeULL;
294*9712c20fSFrederick Mayle   EXPECT_TRUE(m.IsKnownOffsetFrom(l));
295*9712c20fSFrederick Mayle   uint64_t d;
296*9712c20fSFrederick Mayle   EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d));
297*9712c20fSFrederick Mayle   EXPECT_EQ(-0x317730995d2ab6eeULL, d);
298*9712c20fSFrederick Mayle   EXPECT_TRUE(m.IsKnownConstant());
299*9712c20fSFrederick Mayle   EXPECT_EQ(0x6237fbaf9ef7929eULL - 0x317730995d2ab6eeULL, m.Value());
300*9712c20fSFrederick Mayle }
301*9712c20fSFrederick Mayle 
TEST(SubtractionDeathTest,LabelLabel)302*9712c20fSFrederick Mayle TEST(SubtractionDeathTest, LabelLabel) {
303*9712c20fSFrederick Mayle   Label l, m;
304*9712c20fSFrederick Mayle   ASSERT_DEATH(l - m, "IsKnownOffsetFrom\\(label, &offset\\)");
305*9712c20fSFrederick Mayle }
306*9712c20fSFrederick Mayle 
TEST(Subtraction,LabelLabel)307*9712c20fSFrederick Mayle TEST(Subtraction, LabelLabel) {
308*9712c20fSFrederick Mayle   Label l, m;
309*9712c20fSFrederick Mayle   l = m + 0x7fa77ec63e28a17aULL;
310*9712c20fSFrederick Mayle   EXPECT_EQ(0x7fa77ec63e28a17aULL, l - m);
311*9712c20fSFrederick Mayle   EXPECT_EQ(-0x7fa77ec63e28a17aULL, m - l);
312*9712c20fSFrederick Mayle }
313*9712c20fSFrederick Mayle 
TEST(IsKnownConstant,Undefined)314*9712c20fSFrederick Mayle TEST(IsKnownConstant, Undefined) {
315*9712c20fSFrederick Mayle   Label l;
316*9712c20fSFrederick Mayle   EXPECT_FALSE(l.IsKnownConstant());
317*9712c20fSFrederick Mayle }
318*9712c20fSFrederick Mayle 
TEST(IsKnownConstant,RelatedLabel)319*9712c20fSFrederick Mayle TEST(IsKnownConstant, RelatedLabel) {
320*9712c20fSFrederick Mayle   Label l, m;
321*9712c20fSFrederick Mayle   l = m;
322*9712c20fSFrederick Mayle   EXPECT_FALSE(l.IsKnownConstant());
323*9712c20fSFrederick Mayle   EXPECT_FALSE(m.IsKnownConstant());
324*9712c20fSFrederick Mayle }
325*9712c20fSFrederick Mayle 
TEST(IsKnownConstant,Constant)326*9712c20fSFrederick Mayle TEST(IsKnownConstant, Constant) {
327*9712c20fSFrederick Mayle   Label l;
328*9712c20fSFrederick Mayle   l = 0xf374b1bdd6a22576ULL;
329*9712c20fSFrederick Mayle   EXPECT_TRUE(l.IsKnownConstant());
330*9712c20fSFrederick Mayle }
331*9712c20fSFrederick Mayle 
TEST(IsKnownOffsetFrom,Unrelated)332*9712c20fSFrederick Mayle TEST(IsKnownOffsetFrom, Unrelated) {
333*9712c20fSFrederick Mayle   Label l, m;
334*9712c20fSFrederick Mayle   EXPECT_FALSE(l.IsKnownOffsetFrom(m));
335*9712c20fSFrederick Mayle }
336*9712c20fSFrederick Mayle 
TEST(IsKnownOffsetFrom,Related)337*9712c20fSFrederick Mayle TEST(IsKnownOffsetFrom, Related) {
338*9712c20fSFrederick Mayle   Label l, m;
339*9712c20fSFrederick Mayle   l = m;
340*9712c20fSFrederick Mayle   EXPECT_TRUE(l.IsKnownOffsetFrom(m));
341*9712c20fSFrederick Mayle }
342*9712c20fSFrederick Mayle 
343*9712c20fSFrederick Mayle // Test the construction of chains of related labels, and the
344*9712c20fSFrederick Mayle // propagation of values through them.
345*9712c20fSFrederick Mayle //
346*9712c20fSFrederick Mayle // Although the relations between labels are supposed to behave
347*9712c20fSFrederick Mayle // symmetrically --- that is, 'a = b' should put a and b in
348*9712c20fSFrederick Mayle // indistinguishable states --- there's a distinction made internally
349*9712c20fSFrederick Mayle // between the target (a) and the source (b).
350*9712c20fSFrederick Mayle //
351*9712c20fSFrederick Mayle // So there are five test axes to cover:
352*9712c20fSFrederick Mayle //
353*9712c20fSFrederick Mayle // - Do we construct the chain with assignment ("Assign") or with constructors
354*9712c20fSFrederick Mayle //   ("Construct")?
355*9712c20fSFrederick Mayle //
356*9712c20fSFrederick Mayle // - Do we set the value of the label at the start of the chain
357*9712c20fSFrederick Mayle //   ("Start") or the label at the end ("End")?
358*9712c20fSFrederick Mayle //
359*9712c20fSFrederick Mayle // - Are we testing the propagation of a relationship between variable
360*9712c20fSFrederick Mayle //   values ("Relation"), or the propagation of a known constant value
361*9712c20fSFrederick Mayle //   ("Value")?
362*9712c20fSFrederick Mayle //
363*9712c20fSFrederick Mayle // - Do we set the value before building the chain ("Before") or after
364*9712c20fSFrederick Mayle //   the chain has been built ("After")?
365*9712c20fSFrederick Mayle //
366*9712c20fSFrederick Mayle // - Do we add new relationships to the end of the existing chain
367*9712c20fSFrederick Mayle //   ("Forward") or to the beginning ("Backward")?
368*9712c20fSFrederick Mayle //
369*9712c20fSFrederick Mayle // Of course, "Construct" and "Backward" can't be combined, which
370*9712c20fSFrederick Mayle // eliminates eight combinations, and "Construct", "End", and "Before"
371*9712c20fSFrederick Mayle // can't be combined, which eliminates two more, so there are are 22
372*9712c20fSFrederick Mayle // combinations, not 32.
373*9712c20fSFrederick Mayle 
TEST(LabelChain,AssignStartRelationBeforeForward)374*9712c20fSFrederick Mayle TEST(LabelChain, AssignStartRelationBeforeForward) {
375*9712c20fSFrederick Mayle   Label a, b, c, d;
376*9712c20fSFrederick Mayle   Label x;
377*9712c20fSFrederick Mayle   a = x;
378*9712c20fSFrederick Mayle   b = a + 0x1;
379*9712c20fSFrederick Mayle   c = b + 0x10;
380*9712c20fSFrederick Mayle   d = c + 0x100;
381*9712c20fSFrederick Mayle   EXPECT_EQ(0x111U, d-x);
382*9712c20fSFrederick Mayle   EXPECT_EQ(0x11U,  c-x);
383*9712c20fSFrederick Mayle   EXPECT_EQ(0x1U,   b-x);
384*9712c20fSFrederick Mayle   EXPECT_EQ(0U,     a-x);
385*9712c20fSFrederick Mayle }
386*9712c20fSFrederick Mayle 
TEST(LabelChain,AssignStartRelationBeforeBackward)387*9712c20fSFrederick Mayle TEST(LabelChain, AssignStartRelationBeforeBackward) {
388*9712c20fSFrederick Mayle   Label a, b, c, d;
389*9712c20fSFrederick Mayle   Label x;
390*9712c20fSFrederick Mayle   a = x;
391*9712c20fSFrederick Mayle   d = c + 0x100;
392*9712c20fSFrederick Mayle   c = b + 0x10;
393*9712c20fSFrederick Mayle   b = a + 0x1;
394*9712c20fSFrederick Mayle   EXPECT_EQ(0x111U, d-x);
395*9712c20fSFrederick Mayle   EXPECT_EQ(0x11U,  c-x);
396*9712c20fSFrederick Mayle   EXPECT_EQ(0x1U,   b-x);
397*9712c20fSFrederick Mayle   EXPECT_EQ(0U,     a-x);
398*9712c20fSFrederick Mayle }
399*9712c20fSFrederick Mayle 
TEST(LabelChain,AssignStartRelationAfterForward)400*9712c20fSFrederick Mayle TEST(LabelChain, AssignStartRelationAfterForward) {
401*9712c20fSFrederick Mayle   Label a, b, c, d;
402*9712c20fSFrederick Mayle   Label x;
403*9712c20fSFrederick Mayle   b = a + 0x1;
404*9712c20fSFrederick Mayle   c = b + 0x10;
405*9712c20fSFrederick Mayle   d = c + 0x100;
406*9712c20fSFrederick Mayle   a = x;
407*9712c20fSFrederick Mayle   EXPECT_EQ(0x111U, d-x);
408*9712c20fSFrederick Mayle   EXPECT_EQ(0x11U,  c-x);
409*9712c20fSFrederick Mayle   EXPECT_EQ(0x1U,   b-x);
410*9712c20fSFrederick Mayle   EXPECT_EQ(0U,     a-x);
411*9712c20fSFrederick Mayle }
412*9712c20fSFrederick Mayle 
TEST(LabelChain,AssignStartRelationAfterBackward)413*9712c20fSFrederick Mayle TEST(LabelChain, AssignStartRelationAfterBackward) {
414*9712c20fSFrederick Mayle   Label a, b, c, d;
415*9712c20fSFrederick Mayle   Label x;
416*9712c20fSFrederick Mayle   d = c + 0x100;
417*9712c20fSFrederick Mayle   c = b + 0x10;
418*9712c20fSFrederick Mayle   b = a + 0x1;
419*9712c20fSFrederick Mayle   a = x;
420*9712c20fSFrederick Mayle   EXPECT_EQ(0x111U, d-x);
421*9712c20fSFrederick Mayle   EXPECT_EQ(0x11U,  c-x);
422*9712c20fSFrederick Mayle   EXPECT_EQ(0x1U,   b-x);
423*9712c20fSFrederick Mayle   EXPECT_EQ(0U,     a-x);
424*9712c20fSFrederick Mayle }
425*9712c20fSFrederick Mayle 
TEST(LabelChain,AssignStartValueBeforeForward)426*9712c20fSFrederick Mayle TEST(LabelChain, AssignStartValueBeforeForward) {
427*9712c20fSFrederick Mayle   Label a, b, c, d;
428*9712c20fSFrederick Mayle   a = 0xa131200190546ac2ULL;
429*9712c20fSFrederick Mayle   b = a + 0x1;
430*9712c20fSFrederick Mayle   c = b + 0x10;
431*9712c20fSFrederick Mayle   d = c + 0x100;
432*9712c20fSFrederick Mayle   EXPECT_EQ(0xa131200190546ac2ULL + 0x111U, d.Value());
433*9712c20fSFrederick Mayle   EXPECT_EQ(0xa131200190546ac2ULL + 0x11U,  c.Value());
434*9712c20fSFrederick Mayle   EXPECT_EQ(0xa131200190546ac2ULL + 0x1U,   b.Value());
435*9712c20fSFrederick Mayle   EXPECT_EQ(0xa131200190546ac2ULL + 0U,     a.Value());
436*9712c20fSFrederick Mayle }
437*9712c20fSFrederick Mayle 
TEST(LabelChain,AssignStartValueBeforeBackward)438*9712c20fSFrederick Mayle TEST(LabelChain, AssignStartValueBeforeBackward) {
439*9712c20fSFrederick Mayle   Label a, b, c, d;
440*9712c20fSFrederick Mayle   a = 0x8da17e1670ad4fa2ULL;
441*9712c20fSFrederick Mayle   d = c + 0x100;
442*9712c20fSFrederick Mayle   c = b + 0x10;
443*9712c20fSFrederick Mayle   b = a + 0x1;
444*9712c20fSFrederick Mayle   EXPECT_EQ(0x8da17e1670ad4fa2ULL + 0x111U, d.Value());
445*9712c20fSFrederick Mayle   EXPECT_EQ(0x8da17e1670ad4fa2ULL + 0x11U,  c.Value());
446*9712c20fSFrederick Mayle   EXPECT_EQ(0x8da17e1670ad4fa2ULL + 0x1U,   b.Value());
447*9712c20fSFrederick Mayle   EXPECT_EQ(0x8da17e1670ad4fa2ULL + 0U,     a.Value());
448*9712c20fSFrederick Mayle }
449*9712c20fSFrederick Mayle 
TEST(LabelChain,AssignStartValueAfterForward)450*9712c20fSFrederick Mayle TEST(LabelChain, AssignStartValueAfterForward) {
451*9712c20fSFrederick Mayle   Label a, b, c, d;
452*9712c20fSFrederick Mayle   b = a + 0x1;
453*9712c20fSFrederick Mayle   c = b + 0x10;
454*9712c20fSFrederick Mayle   d = c + 0x100;
455*9712c20fSFrederick Mayle   a = 0x99b8f51bafd41adaULL;
456*9712c20fSFrederick Mayle   EXPECT_EQ(0x99b8f51bafd41adaULL + 0x111U, d.Value());
457*9712c20fSFrederick Mayle   EXPECT_EQ(0x99b8f51bafd41adaULL + 0x11U,  c.Value());
458*9712c20fSFrederick Mayle   EXPECT_EQ(0x99b8f51bafd41adaULL + 0x1U,   b.Value());
459*9712c20fSFrederick Mayle   EXPECT_EQ(0x99b8f51bafd41adaULL + 0U,     a.Value());
460*9712c20fSFrederick Mayle }
461*9712c20fSFrederick Mayle 
TEST(LabelChain,AssignStartValueAfterBackward)462*9712c20fSFrederick Mayle TEST(LabelChain, AssignStartValueAfterBackward) {
463*9712c20fSFrederick Mayle   Label a, b, c, d;
464*9712c20fSFrederick Mayle   d = c + 0x100;
465*9712c20fSFrederick Mayle   c = b + 0x10;
466*9712c20fSFrederick Mayle   b = a + 0x1;
467*9712c20fSFrederick Mayle   a = 0xc86ca1d97ab5df6eULL;
468*9712c20fSFrederick Mayle   EXPECT_EQ(0xc86ca1d97ab5df6eULL + 0x111U, d.Value());
469*9712c20fSFrederick Mayle   EXPECT_EQ(0xc86ca1d97ab5df6eULL + 0x11U,  c.Value());
470*9712c20fSFrederick Mayle   EXPECT_EQ(0xc86ca1d97ab5df6eULL + 0x1U,   b.Value());
471*9712c20fSFrederick Mayle   EXPECT_EQ(0xc86ca1d97ab5df6eULL + 0U,     a.Value());
472*9712c20fSFrederick Mayle }
473*9712c20fSFrederick Mayle 
TEST(LabelChain,AssignEndRelationBeforeForward)474*9712c20fSFrederick Mayle TEST(LabelChain, AssignEndRelationBeforeForward) {
475*9712c20fSFrederick Mayle   Label a, b, c, d;
476*9712c20fSFrederick Mayle   Label x;
477*9712c20fSFrederick Mayle   x = d;
478*9712c20fSFrederick Mayle   b = a + 0x1;
479*9712c20fSFrederick Mayle   c = b + 0x10;
480*9712c20fSFrederick Mayle   d = c + 0x100;
481*9712c20fSFrederick Mayle   EXPECT_EQ(-(uint64_t)0x111U, a-x);
482*9712c20fSFrederick Mayle   EXPECT_EQ(-(uint64_t)0x110U, b-x);
483*9712c20fSFrederick Mayle   EXPECT_EQ(-(uint64_t)0x100U, c-x);
484*9712c20fSFrederick Mayle   EXPECT_EQ(-(uint64_t)0U,     d-x);
485*9712c20fSFrederick Mayle }
486*9712c20fSFrederick Mayle 
TEST(LabelChain,AssignEndRelationBeforeBackward)487*9712c20fSFrederick Mayle TEST(LabelChain, AssignEndRelationBeforeBackward) {
488*9712c20fSFrederick Mayle   Label a, b, c, d;
489*9712c20fSFrederick Mayle   Label x;
490*9712c20fSFrederick Mayle   x = d;
491*9712c20fSFrederick Mayle   d = c + 0x100;
492*9712c20fSFrederick Mayle   c = b + 0x10;
493*9712c20fSFrederick Mayle   b = a + 0x1;
494*9712c20fSFrederick Mayle   EXPECT_EQ(-(uint64_t)0x111U, a-x);
495*9712c20fSFrederick Mayle   EXPECT_EQ(-(uint64_t)0x110U, b-x);
496*9712c20fSFrederick Mayle   EXPECT_EQ(-(uint64_t)0x100U, c-x);
497*9712c20fSFrederick Mayle   EXPECT_EQ(-(uint64_t)0U,     d-x);
498*9712c20fSFrederick Mayle }
499*9712c20fSFrederick Mayle 
TEST(LabelChain,AssignEndRelationAfterForward)500*9712c20fSFrederick Mayle TEST(LabelChain, AssignEndRelationAfterForward) {
501*9712c20fSFrederick Mayle   Label a, b, c, d;
502*9712c20fSFrederick Mayle   Label x;
503*9712c20fSFrederick Mayle   b = a + 0x1;
504*9712c20fSFrederick Mayle   c = b + 0x10;
505*9712c20fSFrederick Mayle   d = c + 0x100;
506*9712c20fSFrederick Mayle   x = d;
507*9712c20fSFrederick Mayle   EXPECT_EQ(-(uint64_t)0x111U, a-x);
508*9712c20fSFrederick Mayle   EXPECT_EQ(-(uint64_t)0x110U, b-x);
509*9712c20fSFrederick Mayle   EXPECT_EQ(-(uint64_t)0x100U, c-x);
510*9712c20fSFrederick Mayle   EXPECT_EQ(-(uint64_t)0x000U, d-x);
511*9712c20fSFrederick Mayle }
512*9712c20fSFrederick Mayle 
TEST(LabelChain,AssignEndRelationAfterBackward)513*9712c20fSFrederick Mayle TEST(LabelChain, AssignEndRelationAfterBackward) {
514*9712c20fSFrederick Mayle   Label a, b, c, d;
515*9712c20fSFrederick Mayle   Label x;
516*9712c20fSFrederick Mayle   d = c + 0x100;
517*9712c20fSFrederick Mayle   c = b + 0x10;
518*9712c20fSFrederick Mayle   b = a + 0x1;
519*9712c20fSFrederick Mayle   x = d;
520*9712c20fSFrederick Mayle   EXPECT_EQ(-(uint64_t)0x111U, a-x);
521*9712c20fSFrederick Mayle   EXPECT_EQ(-(uint64_t)0x110U, b-x);
522*9712c20fSFrederick Mayle   EXPECT_EQ(-(uint64_t)0x100U, c-x);
523*9712c20fSFrederick Mayle   EXPECT_EQ(-(uint64_t)0x000U, d-x);
524*9712c20fSFrederick Mayle }
525*9712c20fSFrederick Mayle 
TEST(LabelChain,AssignEndValueBeforeForward)526*9712c20fSFrederick Mayle TEST(LabelChain, AssignEndValueBeforeForward) {
527*9712c20fSFrederick Mayle   Label a, b, c, d;
528*9712c20fSFrederick Mayle   d = 0xa131200190546ac2ULL;
529*9712c20fSFrederick Mayle   b = a + 0x1;
530*9712c20fSFrederick Mayle   c = b + 0x10;
531*9712c20fSFrederick Mayle   d = c + 0x100;
532*9712c20fSFrederick Mayle   EXPECT_EQ(0xa131200190546ac2ULL - 0x111, a.Value());
533*9712c20fSFrederick Mayle   EXPECT_EQ(0xa131200190546ac2ULL - 0x110, b.Value());
534*9712c20fSFrederick Mayle   EXPECT_EQ(0xa131200190546ac2ULL - 0x100, c.Value());
535*9712c20fSFrederick Mayle   EXPECT_EQ(0xa131200190546ac2ULL - 0x000, d.Value());
536*9712c20fSFrederick Mayle }
537*9712c20fSFrederick Mayle 
TEST(LabelChain,AssignEndValueBeforeBackward)538*9712c20fSFrederick Mayle TEST(LabelChain, AssignEndValueBeforeBackward) {
539*9712c20fSFrederick Mayle   Label a, b, c, d;
540*9712c20fSFrederick Mayle   d = 0x8da17e1670ad4fa2ULL;
541*9712c20fSFrederick Mayle   d = c + 0x100;
542*9712c20fSFrederick Mayle   c = b + 0x10;
543*9712c20fSFrederick Mayle   b = a + 0x1;
544*9712c20fSFrederick Mayle   EXPECT_EQ(0x8da17e1670ad4fa2ULL - 0x111, a.Value());
545*9712c20fSFrederick Mayle   EXPECT_EQ(0x8da17e1670ad4fa2ULL - 0x110, b.Value());
546*9712c20fSFrederick Mayle   EXPECT_EQ(0x8da17e1670ad4fa2ULL - 0x100, c.Value());
547*9712c20fSFrederick Mayle   EXPECT_EQ(0x8da17e1670ad4fa2ULL - 0x000, d.Value());
548*9712c20fSFrederick Mayle }
549*9712c20fSFrederick Mayle 
TEST(LabelChain,AssignEndValueAfterForward)550*9712c20fSFrederick Mayle TEST(LabelChain, AssignEndValueAfterForward) {
551*9712c20fSFrederick Mayle   Label a, b, c, d;
552*9712c20fSFrederick Mayle   b = a + 0x1;
553*9712c20fSFrederick Mayle   c = b + 0x10;
554*9712c20fSFrederick Mayle   d = c + 0x100;
555*9712c20fSFrederick Mayle   d = 0x99b8f51bafd41adaULL;
556*9712c20fSFrederick Mayle   EXPECT_EQ(0x99b8f51bafd41adaULL - 0x111, a.Value());
557*9712c20fSFrederick Mayle   EXPECT_EQ(0x99b8f51bafd41adaULL - 0x110, b.Value());
558*9712c20fSFrederick Mayle   EXPECT_EQ(0x99b8f51bafd41adaULL - 0x100, c.Value());
559*9712c20fSFrederick Mayle   EXPECT_EQ(0x99b8f51bafd41adaULL - 0x000, d.Value());
560*9712c20fSFrederick Mayle }
561*9712c20fSFrederick Mayle 
TEST(LabelChain,AssignEndValueAfterBackward)562*9712c20fSFrederick Mayle TEST(LabelChain, AssignEndValueAfterBackward) {
563*9712c20fSFrederick Mayle   Label a, b, c, d;
564*9712c20fSFrederick Mayle   d = c + 0x100;
565*9712c20fSFrederick Mayle   c = b + 0x10;
566*9712c20fSFrederick Mayle   b = a + 0x1;
567*9712c20fSFrederick Mayle   d = 0xc86ca1d97ab5df6eULL;
568*9712c20fSFrederick Mayle   EXPECT_EQ(0xc86ca1d97ab5df6eULL - 0x111, a.Value());
569*9712c20fSFrederick Mayle   EXPECT_EQ(0xc86ca1d97ab5df6eULL - 0x110, b.Value());
570*9712c20fSFrederick Mayle   EXPECT_EQ(0xc86ca1d97ab5df6eULL - 0x100, c.Value());
571*9712c20fSFrederick Mayle   EXPECT_EQ(0xc86ca1d97ab5df6eULL - 0x000, d.Value());
572*9712c20fSFrederick Mayle }
573*9712c20fSFrederick Mayle 
TEST(LabelChain,ConstructStartRelationBeforeForward)574*9712c20fSFrederick Mayle TEST(LabelChain, ConstructStartRelationBeforeForward) {
575*9712c20fSFrederick Mayle   Label x;
576*9712c20fSFrederick Mayle   Label a(x);
577*9712c20fSFrederick Mayle   Label b(a + 0x1);
578*9712c20fSFrederick Mayle   Label c(b + 0x10);
579*9712c20fSFrederick Mayle   Label d(c + 0x100);
580*9712c20fSFrederick Mayle   EXPECT_EQ(0x111U, d-x);
581*9712c20fSFrederick Mayle   EXPECT_EQ(0x11U,  c-x);
582*9712c20fSFrederick Mayle   EXPECT_EQ(0x1U,   b-x);
583*9712c20fSFrederick Mayle   EXPECT_EQ(0U,     a-x);
584*9712c20fSFrederick Mayle }
585*9712c20fSFrederick Mayle 
TEST(LabelChain,ConstructStartRelationAfterForward)586*9712c20fSFrederick Mayle TEST(LabelChain, ConstructStartRelationAfterForward) {
587*9712c20fSFrederick Mayle   Label x;
588*9712c20fSFrederick Mayle   Label a;
589*9712c20fSFrederick Mayle   Label b(a + 0x1);
590*9712c20fSFrederick Mayle   Label c(b + 0x10);
591*9712c20fSFrederick Mayle   Label d(c + 0x100);
592*9712c20fSFrederick Mayle   a = x;
593*9712c20fSFrederick Mayle   EXPECT_EQ(0x111U, d-x);
594*9712c20fSFrederick Mayle   EXPECT_EQ(0x11U,  c-x);
595*9712c20fSFrederick Mayle   EXPECT_EQ(0x1U,   b-x);
596*9712c20fSFrederick Mayle   EXPECT_EQ(0U,     a-x);
597*9712c20fSFrederick Mayle }
598*9712c20fSFrederick Mayle 
TEST(LabelChain,ConstructStartValueBeforeForward)599*9712c20fSFrederick Mayle TEST(LabelChain, ConstructStartValueBeforeForward) {
600*9712c20fSFrederick Mayle   Label a(0x5d234d177d01ccc8ULL);
601*9712c20fSFrederick Mayle   Label b(a + 0x1);
602*9712c20fSFrederick Mayle   Label c(b + 0x10);
603*9712c20fSFrederick Mayle   Label d(c + 0x100);
604*9712c20fSFrederick Mayle   EXPECT_EQ(0x5d234d177d01ccc8ULL + 0x111U, d.Value());
605*9712c20fSFrederick Mayle   EXPECT_EQ(0x5d234d177d01ccc8ULL + 0x011U, c.Value());
606*9712c20fSFrederick Mayle   EXPECT_EQ(0x5d234d177d01ccc8ULL + 0x001U, b.Value());
607*9712c20fSFrederick Mayle   EXPECT_EQ(0x5d234d177d01ccc8ULL + 0x000U, a.Value());
608*9712c20fSFrederick Mayle }
609*9712c20fSFrederick Mayle 
TEST(LabelChain,ConstructStartValueAfterForward)610*9712c20fSFrederick Mayle TEST(LabelChain, ConstructStartValueAfterForward) {
611*9712c20fSFrederick Mayle   Label a;
612*9712c20fSFrederick Mayle   Label b(a + 0x1);
613*9712c20fSFrederick Mayle   Label c(b + 0x10);
614*9712c20fSFrederick Mayle   Label d(c + 0x100);
615*9712c20fSFrederick Mayle   a = 0xded85d54586e84fcULL;
616*9712c20fSFrederick Mayle   EXPECT_EQ(0xded85d54586e84fcULL + 0x111U, d.Value());
617*9712c20fSFrederick Mayle   EXPECT_EQ(0xded85d54586e84fcULL + 0x011U, c.Value());
618*9712c20fSFrederick Mayle   EXPECT_EQ(0xded85d54586e84fcULL + 0x001U, b.Value());
619*9712c20fSFrederick Mayle   EXPECT_EQ(0xded85d54586e84fcULL + 0x000U, a.Value());
620*9712c20fSFrederick Mayle }
621*9712c20fSFrederick Mayle 
TEST(LabelChain,ConstructEndRelationAfterForward)622*9712c20fSFrederick Mayle TEST(LabelChain, ConstructEndRelationAfterForward) {
623*9712c20fSFrederick Mayle   Label x;
624*9712c20fSFrederick Mayle   Label a;
625*9712c20fSFrederick Mayle   Label b(a + 0x1);
626*9712c20fSFrederick Mayle   Label c(b + 0x10);
627*9712c20fSFrederick Mayle   Label d(c + 0x100);
628*9712c20fSFrederick Mayle   x = d;
629*9712c20fSFrederick Mayle   EXPECT_EQ(-(uint64_t)0x111U, a-x);
630*9712c20fSFrederick Mayle   EXPECT_EQ(-(uint64_t)0x110U, b-x);
631*9712c20fSFrederick Mayle   EXPECT_EQ(-(uint64_t)0x100U, c-x);
632*9712c20fSFrederick Mayle   EXPECT_EQ(-(uint64_t)0x000U, d-x);
633*9712c20fSFrederick Mayle }
634*9712c20fSFrederick Mayle 
TEST(LabelChain,ConstructEndValueAfterForward)635*9712c20fSFrederick Mayle TEST(LabelChain, ConstructEndValueAfterForward) {
636*9712c20fSFrederick Mayle   Label a;
637*9712c20fSFrederick Mayle   Label b(a + 0x1);
638*9712c20fSFrederick Mayle   Label c(b + 0x10);
639*9712c20fSFrederick Mayle   Label d(c + 0x100);
640*9712c20fSFrederick Mayle   d = 0x99b8f51bafd41adaULL;
641*9712c20fSFrederick Mayle   EXPECT_EQ(0x99b8f51bafd41adaULL - 0x111, a.Value());
642*9712c20fSFrederick Mayle   EXPECT_EQ(0x99b8f51bafd41adaULL - 0x110, b.Value());
643*9712c20fSFrederick Mayle   EXPECT_EQ(0x99b8f51bafd41adaULL - 0x100, c.Value());
644*9712c20fSFrederick Mayle   EXPECT_EQ(0x99b8f51bafd41adaULL - 0x000, d.Value());
645*9712c20fSFrederick Mayle }
646*9712c20fSFrederick Mayle 
TEST(LabelTree,KnownValue)647*9712c20fSFrederick Mayle TEST(LabelTree, KnownValue) {
648*9712c20fSFrederick Mayle   Label l, m, n, o, p;
649*9712c20fSFrederick Mayle   l = m;
650*9712c20fSFrederick Mayle   m = n;
651*9712c20fSFrederick Mayle   o = p;
652*9712c20fSFrederick Mayle   p = n;
653*9712c20fSFrederick Mayle   l = 0x536b5de3d468a1b5ULL;
654*9712c20fSFrederick Mayle   EXPECT_EQ(0x536b5de3d468a1b5ULL, o.Value());
655*9712c20fSFrederick Mayle }
656*9712c20fSFrederick Mayle 
TEST(LabelTree,Related)657*9712c20fSFrederick Mayle TEST(LabelTree, Related) {
658*9712c20fSFrederick Mayle   Label l, m, n, o, p;
659*9712c20fSFrederick Mayle   l = m - 1;
660*9712c20fSFrederick Mayle   m = n - 10;
661*9712c20fSFrederick Mayle   o = p + 100;
662*9712c20fSFrederick Mayle   p = n + 1000;
663*9712c20fSFrederick Mayle   EXPECT_EQ(1111U, o - l);
664*9712c20fSFrederick Mayle }
665*9712c20fSFrederick Mayle 
TEST(EquationDeathTest,EqualConstants)666*9712c20fSFrederick Mayle TEST(EquationDeathTest, EqualConstants) {
667*9712c20fSFrederick Mayle   Label m = 0x0d3962f280f07d24ULL;
668*9712c20fSFrederick Mayle   Label n = 0x0d3962f280f07d24ULL;
669*9712c20fSFrederick Mayle   m = n; // no death expected
670*9712c20fSFrederick Mayle }
671*9712c20fSFrederick Mayle 
TEST(EquationDeathTest,EqualIndirectConstants)672*9712c20fSFrederick Mayle TEST(EquationDeathTest, EqualIndirectConstants) {
673*9712c20fSFrederick Mayle   Label m = 0xa347f1e5238fe6a1ULL;
674*9712c20fSFrederick Mayle   Label n;
675*9712c20fSFrederick Mayle   Label o = n;
676*9712c20fSFrederick Mayle   n = 0xa347f1e5238fe6a1ULL;
677*9712c20fSFrederick Mayle   n = m; // no death expected
678*9712c20fSFrederick Mayle }
679*9712c20fSFrederick Mayle 
TEST(EquationDeathTest,ConstantClash)680*9712c20fSFrederick Mayle TEST(EquationDeathTest, ConstantClash) {
681*9712c20fSFrederick Mayle   Label m = 0xd4cc0f4f630ec741ULL;
682*9712c20fSFrederick Mayle   Label n = 0x934cd2d8254fc3eaULL;
683*9712c20fSFrederick Mayle   ASSERT_DEATH(m = n, "addend_ == addend");
684*9712c20fSFrederick Mayle }
685*9712c20fSFrederick Mayle 
TEST(EquationDeathTest,IndirectConstantClash)686*9712c20fSFrederick Mayle TEST(EquationDeathTest, IndirectConstantClash) {
687*9712c20fSFrederick Mayle   Label m = 0xd4cc0f4f630ec741ULL;
688*9712c20fSFrederick Mayle   Label n, o;
689*9712c20fSFrederick Mayle   n = o;
690*9712c20fSFrederick Mayle   o = 0xcfbe3b83ac49ce86ULL;
691*9712c20fSFrederick Mayle   ASSERT_DEATH(m = n, "addend_ == addend");
692*9712c20fSFrederick Mayle }
693*9712c20fSFrederick Mayle 
694*9712c20fSFrederick Mayle // Assigning to a related label may free the next Binding on its
695*9712c20fSFrederick Mayle // chain. This test always passes; it is interesting to memory
696*9712c20fSFrederick Mayle // checkers and coverage analysis.
TEST(LabelReferenceCount,AssignmentFree)697*9712c20fSFrederick Mayle TEST(LabelReferenceCount, AssignmentFree) {
698*9712c20fSFrederick Mayle   Label l;
699*9712c20fSFrederick Mayle   {
700*9712c20fSFrederick Mayle     Label m;
701*9712c20fSFrederick Mayle     l = m;
702*9712c20fSFrederick Mayle   }
703*9712c20fSFrederick Mayle   // This should free m's Binding.
704*9712c20fSFrederick Mayle   l = 0xca8bae92f0376d4fULL;
705*9712c20fSFrederick Mayle   ASSERT_EQ(0xca8bae92f0376d4fULL, l.Value());
706*9712c20fSFrederick Mayle }
707*9712c20fSFrederick Mayle 
708*9712c20fSFrederick Mayle // Finding the value of a label may free the Binding it refers to. This test
709*9712c20fSFrederick Mayle // always passes; it is interesting to memory checkers and coverage analysis.
TEST(LabelReferenceCount,FindValueFree)710*9712c20fSFrederick Mayle TEST(LabelReferenceCount, FindValueFree) {
711*9712c20fSFrederick Mayle   Label l;
712*9712c20fSFrederick Mayle   {
713*9712c20fSFrederick Mayle     Label m, n;
714*9712c20fSFrederick Mayle     l = m;
715*9712c20fSFrederick Mayle     m = n;
716*9712c20fSFrederick Mayle     n = 0x7a0b0c576672daafULL;
717*9712c20fSFrederick Mayle     // At this point, l's Binding refers to m's Binding, which refers
718*9712c20fSFrederick Mayle     // to n's binding.
719*9712c20fSFrederick Mayle   }
720*9712c20fSFrederick Mayle   // Now, l is the only reference keeping the three Bindings alive.
721*9712c20fSFrederick Mayle   // Resolving its value should free l's and m's original bindings.
722*9712c20fSFrederick Mayle   ASSERT_EQ(0x7a0b0c576672daafULL, l.Value());
723*9712c20fSFrederick Mayle }
724*9712c20fSFrederick Mayle 
TEST(ConstructSection,Simple)725*9712c20fSFrederick Mayle TEST(ConstructSection, Simple) {
726*9712c20fSFrederick Mayle   Section s;
727*9712c20fSFrederick Mayle }
728*9712c20fSFrederick Mayle 
TEST(ConstructSection,WithEndian)729*9712c20fSFrederick Mayle TEST(ConstructSection, WithEndian) {
730*9712c20fSFrederick Mayle   Section s(kBigEndian);
731*9712c20fSFrederick Mayle }
732*9712c20fSFrederick Mayle 
733*9712c20fSFrederick Mayle // A fixture class for TestAssembler::Section tests.
734*9712c20fSFrederick Mayle class SectionFixture {
735*9712c20fSFrederick Mayle  public:
736*9712c20fSFrederick Mayle   Section section;
737*9712c20fSFrederick Mayle   string contents;
738*9712c20fSFrederick Mayle   static const uint8_t data[];
739*9712c20fSFrederick Mayle   static const size_t data_size;
740*9712c20fSFrederick Mayle };
741*9712c20fSFrederick Mayle 
742*9712c20fSFrederick Mayle const uint8_t SectionFixture::data[] = {
743*9712c20fSFrederick Mayle   0x87, 0x4f, 0x43, 0x67, 0x30, 0xd0, 0xd4, 0x0e
744*9712c20fSFrederick Mayle };
745*9712c20fSFrederick Mayle 
746*9712c20fSFrederick Mayle #define I0()
747*9712c20fSFrederick Mayle #define I1(a) { a }
748*9712c20fSFrederick Mayle #define I2(a,b) { a,b }
749*9712c20fSFrederick Mayle #define I3(a,b,c) { a,b,c }
750*9712c20fSFrederick Mayle #define I4(a,b,c,d) { a,b,c,d }
751*9712c20fSFrederick Mayle #define I5(a,b,c,d,e) { a,b,c,d,e }
752*9712c20fSFrederick Mayle #define I6(a,b,c,d,e,f) { a,b,c,d,e,f }
753*9712c20fSFrederick Mayle #define I7(a,b,c,d,e,f,g) { a,b,c,d,e,f,g }
754*9712c20fSFrederick Mayle #define I8(a,b,c,d,e,f,g,h) { a,b,c,d,e,f,g,h }
755*9712c20fSFrederick Mayle #define I9(a,b,c,d,e,f,g,h,i) { a,b,c,d,e,f,g,h,i }
756*9712c20fSFrederick Mayle #define ASSERT_BYTES(s, b)                                              \
757*9712c20fSFrederick Mayle   do                                                                    \
758*9712c20fSFrederick Mayle     {                                                                   \
759*9712c20fSFrederick Mayle       static const uint8_t expected_bytes[] = b;                       \
760*9712c20fSFrederick Mayle       ASSERT_EQ(sizeof(expected_bytes), s.size());                      \
761*9712c20fSFrederick Mayle       ASSERT_TRUE(memcmp(s.data(), (const char*) expected_bytes,       \
762*9712c20fSFrederick Mayle                          sizeof(expected_bytes)) == 0);                 \
763*9712c20fSFrederick Mayle     }                                                                   \
764*9712c20fSFrederick Mayle   while(0)
765*9712c20fSFrederick Mayle 
766*9712c20fSFrederick Mayle class Append: public SectionFixture, public Test { };
767*9712c20fSFrederick Mayle 
TEST_F(Append,Bytes)768*9712c20fSFrederick Mayle TEST_F(Append, Bytes) {
769*9712c20fSFrederick Mayle   section.Append(data, sizeof(data));
770*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
771*9712c20fSFrederick Mayle   ASSERT_EQ(sizeof(data), contents.size());
772*9712c20fSFrederick Mayle   EXPECT_TRUE(0 == memcmp(contents.data(), (const char*) data, sizeof(data)));
773*9712c20fSFrederick Mayle }
774*9712c20fSFrederick Mayle 
TEST_F(Append,BytesTwice)775*9712c20fSFrederick Mayle TEST_F(Append, BytesTwice) {
776*9712c20fSFrederick Mayle   section.Append(data, sizeof(data));
777*9712c20fSFrederick Mayle   section.Append(data, sizeof(data));
778*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
779*9712c20fSFrederick Mayle   ASSERT_EQ(2 * sizeof(data), contents.size());
780*9712c20fSFrederick Mayle   ASSERT_TRUE(0 == memcmp(contents.data(), (const char*) data, sizeof(data)));
781*9712c20fSFrederick Mayle   ASSERT_TRUE(0 == memcmp(contents.data() + sizeof(data),
782*9712c20fSFrederick Mayle                           (const char*) data, sizeof(data)));
783*9712c20fSFrederick Mayle }
784*9712c20fSFrederick Mayle 
TEST_F(Append,String)785*9712c20fSFrederick Mayle TEST_F(Append, String) {
786*9712c20fSFrederick Mayle   string s1 = "howdy ";
787*9712c20fSFrederick Mayle   string s2 = "there";
788*9712c20fSFrederick Mayle   section.Append(s1);
789*9712c20fSFrederick Mayle   section.Append(s2);
790*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
791*9712c20fSFrederick Mayle   ASSERT_STREQ(contents.c_str(), "howdy there");
792*9712c20fSFrederick Mayle }
793*9712c20fSFrederick Mayle 
TEST_F(Append,CString)794*9712c20fSFrederick Mayle TEST_F(Append, CString) {
795*9712c20fSFrederick Mayle   section.AppendCString("howdy");
796*9712c20fSFrederick Mayle   section.AppendCString("");
797*9712c20fSFrederick Mayle   section.AppendCString("there");
798*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
799*9712c20fSFrederick Mayle   ASSERT_EQ(string("howdy\0\0there\0", 13), contents);
800*9712c20fSFrederick Mayle }
801*9712c20fSFrederick Mayle 
TEST_F(Append,CStringSize)802*9712c20fSFrederick Mayle TEST_F(Append, CStringSize) {
803*9712c20fSFrederick Mayle   section.AppendCString("howdy", 3);
804*9712c20fSFrederick Mayle   section.AppendCString("there", 5);
805*9712c20fSFrederick Mayle   section.AppendCString("fred", 6);
806*9712c20fSFrederick Mayle   section.AppendCString("natalie", 0);
807*9712c20fSFrederick Mayle   section.AppendCString("", 10);
808*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
809*9712c20fSFrederick Mayle   ASSERT_EQ(string("howtherefred\0\0\0\0\0\0\0\0\0\0\0\0", 24), contents);
810*9712c20fSFrederick Mayle }
811*9712c20fSFrederick Mayle 
TEST_F(Append,RepeatedBytes)812*9712c20fSFrederick Mayle TEST_F(Append, RepeatedBytes) {
813*9712c20fSFrederick Mayle   section.Append((size_t) 10, '*');
814*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
815*9712c20fSFrederick Mayle   ASSERT_STREQ(contents.c_str(), "**********");
816*9712c20fSFrederick Mayle }
817*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralLE1)818*9712c20fSFrederick Mayle TEST_F(Append, GeneralLE1) {
819*9712c20fSFrederick Mayle   section.Append(kLittleEndian, 1, 42);
820*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
821*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I1(42));
822*9712c20fSFrederick Mayle }
823*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralLE2)824*9712c20fSFrederick Mayle TEST_F(Append, GeneralLE2) {
825*9712c20fSFrederick Mayle   section.Append(kLittleEndian, 2, 0x15a1);
826*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
827*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I2(0xa1, 0x15));
828*9712c20fSFrederick Mayle }
829*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralLE3)830*9712c20fSFrederick Mayle TEST_F(Append, GeneralLE3) {
831*9712c20fSFrederick Mayle   section.Append(kLittleEndian, 3, 0x59ae8d);
832*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
833*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I3(0x8d, 0xae, 0x59));
834*9712c20fSFrederick Mayle }
835*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralLE4)836*9712c20fSFrederick Mayle TEST_F(Append, GeneralLE4) {
837*9712c20fSFrederick Mayle   section.Append(kLittleEndian, 4, 0x51603c56);
838*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
839*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I4(0x56, 0x3c, 0x60, 0x51));
840*9712c20fSFrederick Mayle }
841*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralLE5)842*9712c20fSFrederick Mayle TEST_F(Append, GeneralLE5) {
843*9712c20fSFrederick Mayle   section.Append(kLittleEndian, 5, 0x385e2803b4ULL);
844*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
845*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I5(0xb4, 0x03, 0x28, 0x5e, 0x38));
846*9712c20fSFrederick Mayle }
847*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralLE6)848*9712c20fSFrederick Mayle TEST_F(Append, GeneralLE6) {
849*9712c20fSFrederick Mayle   section.Append(kLittleEndian, 6, 0xc7db9534dd1fULL);
850*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
851*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I6(0x1f, 0xdd, 0x34, 0x95, 0xdb, 0xc7));
852*9712c20fSFrederick Mayle }
853*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralLE7)854*9712c20fSFrederick Mayle TEST_F(Append, GeneralLE7) {
855*9712c20fSFrederick Mayle   section.Append(kLittleEndian, 7, 0x1445c9f1b843e6ULL);
856*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
857*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I7(0xe6, 0x43, 0xb8, 0xf1, 0xc9, 0x45, 0x14));
858*9712c20fSFrederick Mayle }
859*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralLE8)860*9712c20fSFrederick Mayle TEST_F(Append, GeneralLE8) {
861*9712c20fSFrederick Mayle   section.Append(kLittleEndian, 8, 0xaf48019dfe5c01e5ULL);
862*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
863*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I8(0xe5, 0x01, 0x5c, 0xfe, 0x9d, 0x01, 0x48, 0xaf));
864*9712c20fSFrederick Mayle }
865*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralBE1)866*9712c20fSFrederick Mayle TEST_F(Append, GeneralBE1) {
867*9712c20fSFrederick Mayle   section.Append(kBigEndian, 1, 0xd0ULL);
868*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
869*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I1(0xd0));
870*9712c20fSFrederick Mayle }
871*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralBE2)872*9712c20fSFrederick Mayle TEST_F(Append, GeneralBE2) {
873*9712c20fSFrederick Mayle   section.Append(kBigEndian, 2, 0x2e7eULL);
874*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
875*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I2(0x2e, 0x7e));
876*9712c20fSFrederick Mayle }
877*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralBE3)878*9712c20fSFrederick Mayle TEST_F(Append, GeneralBE3) {
879*9712c20fSFrederick Mayle   section.Append(kBigEndian, 3, 0x37dad6ULL);
880*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
881*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I3(0x37, 0xda, 0xd6));
882*9712c20fSFrederick Mayle }
883*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralBE4)884*9712c20fSFrederick Mayle TEST_F(Append, GeneralBE4) {
885*9712c20fSFrederick Mayle   section.Append(kBigEndian, 4, 0x715935c7ULL);
886*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
887*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I4(0x71, 0x59, 0x35, 0xc7));
888*9712c20fSFrederick Mayle }
889*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralBE5)890*9712c20fSFrederick Mayle TEST_F(Append, GeneralBE5) {
891*9712c20fSFrederick Mayle   section.Append(kBigEndian, 5, 0x42baeb02b7ULL);
892*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
893*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I5(0x42, 0xba, 0xeb, 0x02, 0xb7));
894*9712c20fSFrederick Mayle }
895*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralBE6)896*9712c20fSFrederick Mayle TEST_F(Append, GeneralBE6) {
897*9712c20fSFrederick Mayle   section.Append(kBigEndian, 6, 0xf1cdf10e7b18ULL);
898*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
899*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I6(0xf1, 0xcd, 0xf1, 0x0e, 0x7b, 0x18));
900*9712c20fSFrederick Mayle }
901*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralBE7)902*9712c20fSFrederick Mayle TEST_F(Append, GeneralBE7) {
903*9712c20fSFrederick Mayle   section.Append(kBigEndian, 7, 0xf50a724f0b0d20ULL);
904*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
905*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I7(0xf5, 0x0a, 0x72, 0x4f, 0x0b, 0x0d, 0x20));
906*9712c20fSFrederick Mayle }
907*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralBE8)908*9712c20fSFrederick Mayle TEST_F(Append, GeneralBE8) {
909*9712c20fSFrederick Mayle   section.Append(kBigEndian, 8, 0xa6b2cb5e98dc9c16ULL);
910*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
911*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I8(0xa6, 0xb2, 0xcb, 0x5e, 0x98, 0xdc, 0x9c, 0x16));
912*9712c20fSFrederick Mayle }
913*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralLE1Label)914*9712c20fSFrederick Mayle TEST_F(Append, GeneralLE1Label) {
915*9712c20fSFrederick Mayle   Label l;
916*9712c20fSFrederick Mayle   section.Append(kLittleEndian, 1, l);
917*9712c20fSFrederick Mayle   l = 42;
918*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
919*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I1(42));
920*9712c20fSFrederick Mayle }
921*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralLE2Label)922*9712c20fSFrederick Mayle TEST_F(Append, GeneralLE2Label) {
923*9712c20fSFrederick Mayle   Label l;
924*9712c20fSFrederick Mayle   section.Append(kLittleEndian, 2, l);
925*9712c20fSFrederick Mayle   l = 0x15a1;
926*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
927*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I2(0xa1, 0x15));
928*9712c20fSFrederick Mayle }
929*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralLE3Label)930*9712c20fSFrederick Mayle TEST_F(Append, GeneralLE3Label) {
931*9712c20fSFrederick Mayle   Label l;
932*9712c20fSFrederick Mayle   section.Append(kLittleEndian, 3, l);
933*9712c20fSFrederick Mayle   l = 0x59ae8d;
934*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
935*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I3(0x8d, 0xae, 0x59));
936*9712c20fSFrederick Mayle }
937*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralLE4Label)938*9712c20fSFrederick Mayle TEST_F(Append, GeneralLE4Label) {
939*9712c20fSFrederick Mayle   Label l;
940*9712c20fSFrederick Mayle   section.Append(kLittleEndian, 4, l);
941*9712c20fSFrederick Mayle   l = 0x51603c56;
942*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
943*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I4(0x56, 0x3c, 0x60, 0x51));
944*9712c20fSFrederick Mayle }
945*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralLE5Label)946*9712c20fSFrederick Mayle TEST_F(Append, GeneralLE5Label) {
947*9712c20fSFrederick Mayle   Label l;
948*9712c20fSFrederick Mayle   section.Append(kLittleEndian, 5, l);
949*9712c20fSFrederick Mayle   l = 0x385e2803b4ULL;
950*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
951*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I5(0xb4, 0x03, 0x28, 0x5e, 0x38));
952*9712c20fSFrederick Mayle }
953*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralLE6Label)954*9712c20fSFrederick Mayle TEST_F(Append, GeneralLE6Label) {
955*9712c20fSFrederick Mayle   Label l;
956*9712c20fSFrederick Mayle   section.Append(kLittleEndian, 6, l);
957*9712c20fSFrederick Mayle   l = 0xc7db9534dd1fULL;
958*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
959*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I6(0x1f, 0xdd, 0x34, 0x95, 0xdb, 0xc7));
960*9712c20fSFrederick Mayle }
961*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralLE7Label)962*9712c20fSFrederick Mayle TEST_F(Append, GeneralLE7Label) {
963*9712c20fSFrederick Mayle   Label l;
964*9712c20fSFrederick Mayle   section.Append(kLittleEndian, 7, l);
965*9712c20fSFrederick Mayle   l = 0x1445c9f1b843e6ULL;
966*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
967*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I7(0xe6, 0x43, 0xb8, 0xf1, 0xc9, 0x45, 0x14));
968*9712c20fSFrederick Mayle }
969*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralLE8Label)970*9712c20fSFrederick Mayle TEST_F(Append, GeneralLE8Label) {
971*9712c20fSFrederick Mayle   Label l;
972*9712c20fSFrederick Mayle   section.Append(kLittleEndian, 8, l);
973*9712c20fSFrederick Mayle   l = 0xaf48019dfe5c01e5ULL;
974*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
975*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I8(0xe5, 0x01, 0x5c, 0xfe, 0x9d, 0x01, 0x48, 0xaf));
976*9712c20fSFrederick Mayle }
977*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralBE1Label)978*9712c20fSFrederick Mayle TEST_F(Append, GeneralBE1Label) {
979*9712c20fSFrederick Mayle   Label l;
980*9712c20fSFrederick Mayle   section.Append(kBigEndian, 1, l);
981*9712c20fSFrederick Mayle   l = 0xd0ULL;
982*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
983*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I1(0xd0));
984*9712c20fSFrederick Mayle }
985*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralBE2Label)986*9712c20fSFrederick Mayle TEST_F(Append, GeneralBE2Label) {
987*9712c20fSFrederick Mayle   Label l;
988*9712c20fSFrederick Mayle   section.Append(kBigEndian, 2, l);
989*9712c20fSFrederick Mayle   l = 0x2e7eULL;
990*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
991*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I2(0x2e, 0x7e));
992*9712c20fSFrederick Mayle }
993*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralBE3Label)994*9712c20fSFrederick Mayle TEST_F(Append, GeneralBE3Label) {
995*9712c20fSFrederick Mayle   Label l;
996*9712c20fSFrederick Mayle   section.Append(kBigEndian, 3, l);
997*9712c20fSFrederick Mayle   l = 0x37dad6ULL;
998*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
999*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I3(0x37, 0xda, 0xd6));
1000*9712c20fSFrederick Mayle }
1001*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralBE4Label)1002*9712c20fSFrederick Mayle TEST_F(Append, GeneralBE4Label) {
1003*9712c20fSFrederick Mayle   Label l;
1004*9712c20fSFrederick Mayle   section.Append(kBigEndian, 4, l);
1005*9712c20fSFrederick Mayle   l = 0x715935c7ULL;
1006*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1007*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I4(0x71, 0x59, 0x35, 0xc7));
1008*9712c20fSFrederick Mayle }
1009*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralBE5Label)1010*9712c20fSFrederick Mayle TEST_F(Append, GeneralBE5Label) {
1011*9712c20fSFrederick Mayle   Label l;
1012*9712c20fSFrederick Mayle   section.Append(kBigEndian, 5, l);
1013*9712c20fSFrederick Mayle   l = 0x42baeb02b7ULL;
1014*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1015*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I5(0x42, 0xba, 0xeb, 0x02, 0xb7));
1016*9712c20fSFrederick Mayle }
1017*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralBE6Label)1018*9712c20fSFrederick Mayle TEST_F(Append, GeneralBE6Label) {
1019*9712c20fSFrederick Mayle   Label l;
1020*9712c20fSFrederick Mayle   section.Append(kBigEndian, 6, l);
1021*9712c20fSFrederick Mayle   l = 0xf1cdf10e7b18ULL;
1022*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1023*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I6(0xf1, 0xcd, 0xf1, 0x0e, 0x7b, 0x18));
1024*9712c20fSFrederick Mayle }
1025*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralBE7Label)1026*9712c20fSFrederick Mayle TEST_F(Append, GeneralBE7Label) {
1027*9712c20fSFrederick Mayle   Label l;
1028*9712c20fSFrederick Mayle   section.Append(kBigEndian, 7, l);
1029*9712c20fSFrederick Mayle   l = 0xf50a724f0b0d20ULL;
1030*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1031*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I7(0xf5, 0x0a, 0x72, 0x4f, 0x0b, 0x0d, 0x20));
1032*9712c20fSFrederick Mayle }
1033*9712c20fSFrederick Mayle 
TEST_F(Append,GeneralBE8Label)1034*9712c20fSFrederick Mayle TEST_F(Append, GeneralBE8Label) {
1035*9712c20fSFrederick Mayle   Label l;
1036*9712c20fSFrederick Mayle   section.Append(kBigEndian, 8, l);
1037*9712c20fSFrederick Mayle   l = 0xa6b2cb5e98dc9c16ULL;
1038*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1039*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I8(0xa6, 0xb2, 0xcb, 0x5e, 0x98, 0xdc, 0x9c, 0x16));
1040*9712c20fSFrederick Mayle }
1041*9712c20fSFrederick Mayle 
TEST_F(Append,B8)1042*9712c20fSFrederick Mayle TEST_F(Append, B8) {
1043*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1044*9712c20fSFrederick Mayle   section.B8(0xd3U);
1045*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1046*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I2(0x2a, 0xd3));
1047*9712c20fSFrederick Mayle }
1048*9712c20fSFrederick Mayle 
TEST_F(Append,B8Label)1049*9712c20fSFrederick Mayle TEST_F(Append, B8Label) {
1050*9712c20fSFrederick Mayle   Label l;
1051*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1052*9712c20fSFrederick Mayle   section.B8(l);
1053*9712c20fSFrederick Mayle   l = 0x4bU;
1054*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1055*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I2(0x2a, 0x4b));
1056*9712c20fSFrederick Mayle }
1057*9712c20fSFrederick Mayle 
TEST_F(Append,B16)1058*9712c20fSFrederick Mayle TEST_F(Append, B16) {
1059*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1060*9712c20fSFrederick Mayle   section.B16(0x472aU);
1061*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1062*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I3(0x2a, 0x47, 0x2a));
1063*9712c20fSFrederick Mayle }
1064*9712c20fSFrederick Mayle 
TEST_F(Append,B16Label)1065*9712c20fSFrederick Mayle TEST_F(Append, B16Label) {
1066*9712c20fSFrederick Mayle   Label l;
1067*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1068*9712c20fSFrederick Mayle   section.B16(l);
1069*9712c20fSFrederick Mayle   l = 0x55e8U;
1070*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1071*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I3(0x2a, 0x55, 0xe8));
1072*9712c20fSFrederick Mayle }
1073*9712c20fSFrederick Mayle 
TEST_F(Append,B32)1074*9712c20fSFrederick Mayle TEST_F(Append, B32) {
1075*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1076*9712c20fSFrederick Mayle   section.B32(0xbd412cbcU);
1077*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1078*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I5(0x2a, 0xbd, 0x41, 0x2c, 0xbc));
1079*9712c20fSFrederick Mayle }
1080*9712c20fSFrederick Mayle 
TEST_F(Append,B32Label)1081*9712c20fSFrederick Mayle TEST_F(Append, B32Label) {
1082*9712c20fSFrederick Mayle   Label l;
1083*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1084*9712c20fSFrederick Mayle   section.B32(l);
1085*9712c20fSFrederick Mayle   l = 0x208e37d5U;
1086*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1087*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I5(0x2a, 0x20, 0x8e, 0x37, 0xd5));
1088*9712c20fSFrederick Mayle }
1089*9712c20fSFrederick Mayle 
TEST_F(Append,B64)1090*9712c20fSFrederick Mayle TEST_F(Append, B64) {
1091*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1092*9712c20fSFrederick Mayle   section.B64(0x3402a013111e68adULL);
1093*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1094*9712c20fSFrederick Mayle   ASSERT_BYTES(contents,
1095*9712c20fSFrederick Mayle                I9(0x2a, 0x34, 0x02, 0xa0, 0x13, 0x11, 0x1e, 0x68, 0xad));
1096*9712c20fSFrederick Mayle }
1097*9712c20fSFrederick Mayle 
TEST_F(Append,B64Label)1098*9712c20fSFrederick Mayle TEST_F(Append, B64Label) {
1099*9712c20fSFrederick Mayle   Label l;
1100*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1101*9712c20fSFrederick Mayle   section.B64(l);
1102*9712c20fSFrederick Mayle   l = 0x355dbfbb4ac6d57fULL;
1103*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1104*9712c20fSFrederick Mayle   ASSERT_BYTES(contents,
1105*9712c20fSFrederick Mayle                I9(0x2a, 0x35, 0x5d, 0xbf, 0xbb, 0x4a, 0xc6, 0xd5, 0x7f));
1106*9712c20fSFrederick Mayle }
1107*9712c20fSFrederick Mayle 
TEST_F(Append,L8)1108*9712c20fSFrederick Mayle TEST_F(Append, L8) {
1109*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1110*9712c20fSFrederick Mayle   section.L8(0x26U);
1111*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1112*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I2(0x2a, 0x26));
1113*9712c20fSFrederick Mayle }
1114*9712c20fSFrederick Mayle 
TEST_F(Append,L8Label)1115*9712c20fSFrederick Mayle TEST_F(Append, L8Label) {
1116*9712c20fSFrederick Mayle   Label l;
1117*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1118*9712c20fSFrederick Mayle   section.L8(l);
1119*9712c20fSFrederick Mayle   l = 0xa8U;
1120*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1121*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I2(0x2a, 0xa8));
1122*9712c20fSFrederick Mayle }
1123*9712c20fSFrederick Mayle 
TEST_F(Append,L16)1124*9712c20fSFrederick Mayle TEST_F(Append, L16) {
1125*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1126*9712c20fSFrederick Mayle   section.L16(0xca6dU);
1127*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1128*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I3(0x2a, 0x6d, 0xca));
1129*9712c20fSFrederick Mayle }
1130*9712c20fSFrederick Mayle 
TEST_F(Append,L16Label)1131*9712c20fSFrederick Mayle TEST_F(Append, L16Label) {
1132*9712c20fSFrederick Mayle   Label l;
1133*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1134*9712c20fSFrederick Mayle   section.L16(l);
1135*9712c20fSFrederick Mayle   l = 0xd21fU;
1136*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1137*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I3(0x2a, 0x1f, 0xd2));
1138*9712c20fSFrederick Mayle }
1139*9712c20fSFrederick Mayle 
TEST_F(Append,L32)1140*9712c20fSFrederick Mayle TEST_F(Append, L32) {
1141*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1142*9712c20fSFrederick Mayle   section.L32(0x558f6181U);
1143*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1144*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I5(0x2a, 0x81, 0x61, 0x8f, 0x55));
1145*9712c20fSFrederick Mayle }
1146*9712c20fSFrederick Mayle 
TEST_F(Append,L32Label)1147*9712c20fSFrederick Mayle TEST_F(Append, L32Label) {
1148*9712c20fSFrederick Mayle   Label l;
1149*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1150*9712c20fSFrederick Mayle   section.L32(l);
1151*9712c20fSFrederick Mayle   l = 0x4b810f82U;
1152*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1153*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I5(0x2a, 0x82, 0x0f, 0x81, 0x4b));
1154*9712c20fSFrederick Mayle }
1155*9712c20fSFrederick Mayle 
TEST_F(Append,L64)1156*9712c20fSFrederick Mayle TEST_F(Append, L64) {
1157*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1158*9712c20fSFrederick Mayle   section.L64(0x564384f7579515bfULL);
1159*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1160*9712c20fSFrederick Mayle   ASSERT_BYTES(contents,
1161*9712c20fSFrederick Mayle                I9(0x2a, 0xbf, 0x15, 0x95, 0x57, 0xf7, 0x84, 0x43, 0x56));
1162*9712c20fSFrederick Mayle }
1163*9712c20fSFrederick Mayle 
TEST_F(Append,L64Label)1164*9712c20fSFrederick Mayle TEST_F(Append, L64Label) {
1165*9712c20fSFrederick Mayle   Label l;
1166*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1167*9712c20fSFrederick Mayle   section.L64(l);
1168*9712c20fSFrederick Mayle   l = 0x424b1d020667c8dbULL;
1169*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1170*9712c20fSFrederick Mayle   ASSERT_BYTES(contents,
1171*9712c20fSFrederick Mayle                I9(0x2a, 0xdb, 0xc8, 0x67, 0x06, 0x02, 0x1d, 0x4b, 0x42));
1172*9712c20fSFrederick Mayle }
1173*9712c20fSFrederick Mayle 
TEST_F(Append,D8Big)1174*9712c20fSFrederick Mayle TEST_F(Append, D8Big) {
1175*9712c20fSFrederick Mayle   section.set_endianness(kBigEndian);
1176*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1177*9712c20fSFrederick Mayle   section.D8(0xe6U);
1178*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1179*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I2(0x2a, 0xe6));
1180*9712c20fSFrederick Mayle }
1181*9712c20fSFrederick Mayle 
TEST_F(Append,D8BigLabel)1182*9712c20fSFrederick Mayle TEST_F(Append, D8BigLabel) {
1183*9712c20fSFrederick Mayle   Label l;
1184*9712c20fSFrederick Mayle   section.set_endianness(kBigEndian);
1185*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1186*9712c20fSFrederick Mayle   section.D8(l);
1187*9712c20fSFrederick Mayle   l = 0xeeU;
1188*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1189*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I2(0x2a, 0xee));
1190*9712c20fSFrederick Mayle }
1191*9712c20fSFrederick Mayle 
TEST_F(Append,D16Big)1192*9712c20fSFrederick Mayle TEST_F(Append, D16Big) {
1193*9712c20fSFrederick Mayle   section.set_endianness(kBigEndian);
1194*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1195*9712c20fSFrederick Mayle   section.D16(0x83b1U);
1196*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1197*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I3(0x2a, 0x83, 0xb1));
1198*9712c20fSFrederick Mayle }
1199*9712c20fSFrederick Mayle 
TEST_F(Append,D16BigLabel)1200*9712c20fSFrederick Mayle TEST_F(Append, D16BigLabel) {
1201*9712c20fSFrederick Mayle   Label l;
1202*9712c20fSFrederick Mayle   section.set_endianness(kBigEndian);
1203*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1204*9712c20fSFrederick Mayle   section.D16(l);
1205*9712c20fSFrederick Mayle   l = 0x5b55U;
1206*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1207*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I3(0x2a, 0x5b, 0x55));
1208*9712c20fSFrederick Mayle }
1209*9712c20fSFrederick Mayle 
TEST_F(Append,D32Big)1210*9712c20fSFrederick Mayle TEST_F(Append, D32Big) {
1211*9712c20fSFrederick Mayle   section.set_endianness(kBigEndian);
1212*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1213*9712c20fSFrederick Mayle   section.D32(0xd0b0e431U);
1214*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1215*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I5(0x2a, 0xd0, 0xb0, 0xe4, 0x31));
1216*9712c20fSFrederick Mayle }
1217*9712c20fSFrederick Mayle 
TEST_F(Append,D32BigLabel)1218*9712c20fSFrederick Mayle TEST_F(Append, D32BigLabel) {
1219*9712c20fSFrederick Mayle   Label l;
1220*9712c20fSFrederick Mayle   section.set_endianness(kBigEndian);
1221*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1222*9712c20fSFrederick Mayle   section.D32(l);
1223*9712c20fSFrederick Mayle   l = 0x312fb340U;
1224*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1225*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I5(0x2a, 0x31, 0x2f, 0xb3, 0x40));
1226*9712c20fSFrederick Mayle }
1227*9712c20fSFrederick Mayle 
TEST_F(Append,D64Big)1228*9712c20fSFrederick Mayle TEST_F(Append, D64Big) {
1229*9712c20fSFrederick Mayle   section.set_endianness(kBigEndian);
1230*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1231*9712c20fSFrederick Mayle   section.D64(0xb109843500dbcb16ULL);
1232*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1233*9712c20fSFrederick Mayle   ASSERT_BYTES(contents,
1234*9712c20fSFrederick Mayle                I9(0x2a, 0xb1, 0x09, 0x84, 0x35, 0x00, 0xdb, 0xcb, 0x16));
1235*9712c20fSFrederick Mayle }
1236*9712c20fSFrederick Mayle 
TEST_F(Append,D64BigLabel)1237*9712c20fSFrederick Mayle TEST_F(Append, D64BigLabel) {
1238*9712c20fSFrederick Mayle   Label l;
1239*9712c20fSFrederick Mayle   section.set_endianness(kBigEndian);
1240*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1241*9712c20fSFrederick Mayle   section.D64(l);
1242*9712c20fSFrederick Mayle   l = 0x9a0d61b70f671fd7ULL;
1243*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1244*9712c20fSFrederick Mayle   ASSERT_BYTES(contents,
1245*9712c20fSFrederick Mayle                I9(0x2a, 0x9a, 0x0d, 0x61, 0xb7, 0x0f, 0x67, 0x1f, 0xd7));
1246*9712c20fSFrederick Mayle }
1247*9712c20fSFrederick Mayle 
TEST_F(Append,D8Little)1248*9712c20fSFrederick Mayle TEST_F(Append, D8Little) {
1249*9712c20fSFrederick Mayle   section.set_endianness(kLittleEndian);
1250*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1251*9712c20fSFrederick Mayle   section.D8(0x42U);
1252*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1253*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I2(0x2a, 0x42));
1254*9712c20fSFrederick Mayle }
1255*9712c20fSFrederick Mayle 
TEST_F(Append,D8LittleLabel)1256*9712c20fSFrederick Mayle TEST_F(Append, D8LittleLabel) {
1257*9712c20fSFrederick Mayle   Label l;
1258*9712c20fSFrederick Mayle   section.set_endianness(kLittleEndian);
1259*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1260*9712c20fSFrederick Mayle   section.D8(l);
1261*9712c20fSFrederick Mayle   l = 0x05U;
1262*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1263*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I2(0x2a, 0x05));
1264*9712c20fSFrederick Mayle }
1265*9712c20fSFrederick Mayle 
TEST_F(Append,D16Little)1266*9712c20fSFrederick Mayle TEST_F(Append, D16Little) {
1267*9712c20fSFrederick Mayle   section.set_endianness(kLittleEndian);
1268*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1269*9712c20fSFrederick Mayle   section.D16(0xc5c5U);
1270*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1271*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I3(0x2a, 0xc5, 0xc5));
1272*9712c20fSFrederick Mayle }
1273*9712c20fSFrederick Mayle 
TEST_F(Append,D16LittleLabel)1274*9712c20fSFrederick Mayle TEST_F(Append, D16LittleLabel) {
1275*9712c20fSFrederick Mayle   Label l;
1276*9712c20fSFrederick Mayle   section.set_endianness(kLittleEndian);
1277*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1278*9712c20fSFrederick Mayle   section.D16(l);
1279*9712c20fSFrederick Mayle   l = 0xb620U;
1280*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1281*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I3(0x2a, 0x20, 0xb6));
1282*9712c20fSFrederick Mayle }
1283*9712c20fSFrederick Mayle 
TEST_F(Append,D32Little)1284*9712c20fSFrederick Mayle TEST_F(Append, D32Little) {
1285*9712c20fSFrederick Mayle   section.set_endianness(kLittleEndian);
1286*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1287*9712c20fSFrederick Mayle   section.D32(0x1a87d0feU);
1288*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1289*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I5(0x2a, 0xfe, 0xd0, 0x87, 0x1a));
1290*9712c20fSFrederick Mayle }
1291*9712c20fSFrederick Mayle 
TEST_F(Append,D32LittleLabel)1292*9712c20fSFrederick Mayle TEST_F(Append, D32LittleLabel) {
1293*9712c20fSFrederick Mayle   Label l;
1294*9712c20fSFrederick Mayle   section.set_endianness(kLittleEndian);
1295*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1296*9712c20fSFrederick Mayle   section.D32(l);
1297*9712c20fSFrederick Mayle   l = 0xb8012d6bU;
1298*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1299*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I5(0x2a, 0x6b, 0x2d, 0x01, 0xb8));
1300*9712c20fSFrederick Mayle }
1301*9712c20fSFrederick Mayle 
TEST_F(Append,D64Little)1302*9712c20fSFrederick Mayle TEST_F(Append, D64Little) {
1303*9712c20fSFrederick Mayle   section.set_endianness(kLittleEndian);
1304*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1305*9712c20fSFrederick Mayle   section.D64(0x42de75c61375a1deULL);
1306*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1307*9712c20fSFrederick Mayle   ASSERT_BYTES(contents,
1308*9712c20fSFrederick Mayle                I9(0x2a, 0xde, 0xa1, 0x75, 0x13, 0xc6, 0x75, 0xde, 0x42));
1309*9712c20fSFrederick Mayle }
1310*9712c20fSFrederick Mayle 
TEST_F(Append,D64LittleLabel)1311*9712c20fSFrederick Mayle TEST_F(Append, D64LittleLabel) {
1312*9712c20fSFrederick Mayle   Label l;
1313*9712c20fSFrederick Mayle   section.set_endianness(kLittleEndian);
1314*9712c20fSFrederick Mayle   section.Append(1, 0x2a);
1315*9712c20fSFrederick Mayle   section.D64(l);
1316*9712c20fSFrederick Mayle   l = 0x8b3bececf3fb5312ULL;
1317*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1318*9712c20fSFrederick Mayle   ASSERT_BYTES(contents,
1319*9712c20fSFrederick Mayle                I9(0x2a, 0x12, 0x53, 0xfb, 0xf3, 0xec, 0xec, 0x3b, 0x8b));
1320*9712c20fSFrederick Mayle }
1321*9712c20fSFrederick Mayle 
TEST_F(Append,Variety)1322*9712c20fSFrederick Mayle TEST_F(Append, Variety) {
1323*9712c20fSFrederick Mayle   Label a, b, c, d, e, f, g, h;
1324*9712c20fSFrederick Mayle   section.Append(kBigEndian, 1, a)
1325*9712c20fSFrederick Mayle       .Append(kLittleEndian, 8, h)
1326*9712c20fSFrederick Mayle       .Append(kBigEndian, 1, 0x8bULL)
1327*9712c20fSFrederick Mayle       .Append(kLittleEndian, 8, 0x0ea56540448f4439ULL)
1328*9712c20fSFrederick Mayle       .Append(kBigEndian, 2, b)
1329*9712c20fSFrederick Mayle       .Append(kLittleEndian, 7, g)
1330*9712c20fSFrederick Mayle       .Append(kBigEndian, 2, 0xcf15ULL)
1331*9712c20fSFrederick Mayle       .Append(kLittleEndian, 7, 0x29694f04c5724aULL)
1332*9712c20fSFrederick Mayle       .Append(kBigEndian, 3, c)
1333*9712c20fSFrederick Mayle       .Append(kLittleEndian, 6, f)
1334*9712c20fSFrederick Mayle       .Append(kBigEndian, 3, 0x8c3ffdULL)
1335*9712c20fSFrederick Mayle       .Append(kLittleEndian, 6, 0x6f11ba80187aULL)
1336*9712c20fSFrederick Mayle       .Append(kBigEndian, 4, d)
1337*9712c20fSFrederick Mayle       .Append(kLittleEndian, 5, e)
1338*9712c20fSFrederick Mayle       .Append(kBigEndian, 4, 0x2fda2472ULL)
1339*9712c20fSFrederick Mayle       .Append(kLittleEndian, 5, 0x0aa02d423fULL)
1340*9712c20fSFrederick Mayle       .Append(kBigEndian, 5, e)
1341*9712c20fSFrederick Mayle       .Append(kLittleEndian, 4, d)
1342*9712c20fSFrederick Mayle       .Append(kBigEndian, 5, 0x53ba432138ULL)
1343*9712c20fSFrederick Mayle       .Append(kLittleEndian, 4, 0xf139ae60ULL)
1344*9712c20fSFrederick Mayle       .Append(kBigEndian, 6, f)
1345*9712c20fSFrederick Mayle       .Append(kLittleEndian, 3, c)
1346*9712c20fSFrederick Mayle       .Append(kBigEndian, 6, 0x168e436af716ULL)
1347*9712c20fSFrederick Mayle       .Append(kLittleEndian, 3, 0x3ef189ULL)
1348*9712c20fSFrederick Mayle       .Append(kBigEndian, 7, g)
1349*9712c20fSFrederick Mayle       .Append(kLittleEndian, 2, b)
1350*9712c20fSFrederick Mayle       .Append(kBigEndian, 7, 0xacd4ef233e47d9ULL)
1351*9712c20fSFrederick Mayle       .Append(kLittleEndian, 2, 0x5311ULL)
1352*9712c20fSFrederick Mayle       .Append(kBigEndian, 8, h)
1353*9712c20fSFrederick Mayle       .Append(kLittleEndian, 1, a)
1354*9712c20fSFrederick Mayle       .Append(kBigEndian, 8, 0x4668d5f1c93637a1ULL)
1355*9712c20fSFrederick Mayle       .Append(kLittleEndian, 1, 0x65ULL);
1356*9712c20fSFrederick Mayle   a = 0x79ac9bd8aa256b35ULL;
1357*9712c20fSFrederick Mayle   b = 0x22d13097ef86c91cULL;
1358*9712c20fSFrederick Mayle   c = 0xf204968b0a05862fULL;
1359*9712c20fSFrederick Mayle   d = 0x163177f15a0eb4ecULL;
1360*9712c20fSFrederick Mayle   e = 0xbd1b0f1d977f2246ULL;
1361*9712c20fSFrederick Mayle   f = 0x2b0842eee83c6461ULL;
1362*9712c20fSFrederick Mayle   g = 0x92f4b928a4bf875eULL;
1363*9712c20fSFrederick Mayle   h = 0x61a199a8f7286ba6ULL;
1364*9712c20fSFrederick Mayle   ASSERT_EQ(8 * 18U, section.Size());
1365*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1366*9712c20fSFrederick Mayle 
1367*9712c20fSFrederick Mayle   static const uint8_t expected[] = {
1368*9712c20fSFrederick Mayle     0x35,    0xa6, 0x6b, 0x28, 0xf7, 0xa8, 0x99, 0xa1, 0x61,
1369*9712c20fSFrederick Mayle     0x8b,    0x39, 0x44, 0x8f, 0x44, 0x40, 0x65, 0xa5, 0x0e,
1370*9712c20fSFrederick Mayle     0xc9, 0x1c,    0x5e, 0x87, 0xbf, 0xa4, 0x28, 0xb9, 0xf4,
1371*9712c20fSFrederick Mayle     0xcf, 0x15,    0x4a, 0x72, 0xc5, 0x04, 0x4f, 0x69, 0x29,
1372*9712c20fSFrederick Mayle     0x05, 0x86, 0x2f,    0x61, 0x64, 0x3c, 0xe8, 0xee, 0x42,
1373*9712c20fSFrederick Mayle     0x8c, 0x3f, 0xfd,    0x7a, 0x18, 0x80, 0xba, 0x11, 0x6f,
1374*9712c20fSFrederick Mayle     0x5a, 0x0e, 0xb4, 0xec,    0x46, 0x22, 0x7f, 0x97, 0x1d,
1375*9712c20fSFrederick Mayle     0x2f, 0xda, 0x24, 0x72,    0x3f, 0x42, 0x2d, 0xa0, 0x0a,
1376*9712c20fSFrederick Mayle     0x1d, 0x97, 0x7f, 0x22, 0x46,    0xec, 0xb4, 0x0e, 0x5a,
1377*9712c20fSFrederick Mayle     0x53, 0xba, 0x43, 0x21, 0x38,    0x60, 0xae, 0x39, 0xf1,
1378*9712c20fSFrederick Mayle     0x42, 0xee, 0xe8, 0x3c, 0x64, 0x61,    0x2f, 0x86, 0x05,
1379*9712c20fSFrederick Mayle     0x16, 0x8e, 0x43, 0x6a, 0xf7, 0x16,    0x89, 0xf1, 0x3e,
1380*9712c20fSFrederick Mayle     0xf4, 0xb9, 0x28, 0xa4, 0xbf, 0x87, 0x5e,    0x1c, 0xc9,
1381*9712c20fSFrederick Mayle     0xac, 0xd4, 0xef, 0x23, 0x3e, 0x47, 0xd9,    0x11, 0x53,
1382*9712c20fSFrederick Mayle     0x61, 0xa1, 0x99, 0xa8, 0xf7, 0x28, 0x6b, 0xa6,    0x35,
1383*9712c20fSFrederick Mayle     0x46, 0x68, 0xd5, 0xf1, 0xc9, 0x36, 0x37, 0xa1,    0x65,
1384*9712c20fSFrederick Mayle   };
1385*9712c20fSFrederick Mayle 
1386*9712c20fSFrederick Mayle   ASSERT_TRUE(0 == memcmp(contents.data(), expected, sizeof(expected)));
1387*9712c20fSFrederick Mayle }
1388*9712c20fSFrederick Mayle 
TEST_F(Append,Section)1389*9712c20fSFrederick Mayle TEST_F(Append, Section) {
1390*9712c20fSFrederick Mayle   section.Append("murder");
1391*9712c20fSFrederick Mayle   {
1392*9712c20fSFrederick Mayle     Section middle;
1393*9712c20fSFrederick Mayle     middle.Append(" she");
1394*9712c20fSFrederick Mayle     section.Append(middle);
1395*9712c20fSFrederick Mayle   }
1396*9712c20fSFrederick Mayle   section.Append(" wrote");
1397*9712c20fSFrederick Mayle   EXPECT_EQ(16U, section.Size());
1398*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1399*9712c20fSFrederick Mayle   EXPECT_STREQ(contents.c_str(), "murder she wrote");
1400*9712c20fSFrederick Mayle }
1401*9712c20fSFrederick Mayle 
TEST_F(Append,SectionRefs)1402*9712c20fSFrederick Mayle TEST_F(Append, SectionRefs) {
1403*9712c20fSFrederick Mayle   section.Append("sugar ");
1404*9712c20fSFrederick Mayle   Label l;
1405*9712c20fSFrederick Mayle   {
1406*9712c20fSFrederick Mayle     Section middle;
1407*9712c20fSFrederick Mayle     Label m;
1408*9712c20fSFrederick Mayle     middle.B32(m);
1409*9712c20fSFrederick Mayle     section.Append(middle);
1410*9712c20fSFrederick Mayle     m = 0x66726565;
1411*9712c20fSFrederick Mayle   }
1412*9712c20fSFrederick Mayle   section.Append(" jazz");
1413*9712c20fSFrederick Mayle   EXPECT_EQ(15U, section.Size());
1414*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1415*9712c20fSFrederick Mayle   EXPECT_STREQ(contents.c_str(), "sugar free jazz");
1416*9712c20fSFrederick Mayle }
1417*9712c20fSFrederick Mayle 
TEST_F(Append,LEB128_0)1418*9712c20fSFrederick Mayle TEST_F(Append, LEB128_0) {
1419*9712c20fSFrederick Mayle   section.LEB128(0);
1420*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1421*9712c20fSFrederick Mayle   EXPECT_EQ(string("\0", 1), contents);
1422*9712c20fSFrederick Mayle }
1423*9712c20fSFrederick Mayle 
TEST_F(Append,LEB128_0x3f)1424*9712c20fSFrederick Mayle TEST_F(Append, LEB128_0x3f) {
1425*9712c20fSFrederick Mayle   section.LEB128(0x3f);
1426*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1427*9712c20fSFrederick Mayle   EXPECT_EQ(string("\x3f", 1), contents);
1428*9712c20fSFrederick Mayle }
1429*9712c20fSFrederick Mayle 
TEST_F(Append,LEB128_0x40)1430*9712c20fSFrederick Mayle TEST_F(Append, LEB128_0x40) {
1431*9712c20fSFrederick Mayle   section.LEB128(0x40);
1432*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1433*9712c20fSFrederick Mayle   EXPECT_EQ(string("\xc0\x00", 2), contents);
1434*9712c20fSFrederick Mayle }
1435*9712c20fSFrederick Mayle 
TEST_F(Append,LEB128_0x7f)1436*9712c20fSFrederick Mayle TEST_F(Append, LEB128_0x7f) {
1437*9712c20fSFrederick Mayle   section.LEB128(0x7f);
1438*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1439*9712c20fSFrederick Mayle   EXPECT_EQ(string("\xff\x00", 2), contents);
1440*9712c20fSFrederick Mayle }
1441*9712c20fSFrederick Mayle 
TEST_F(Append,LEB128_0x80)1442*9712c20fSFrederick Mayle TEST_F(Append, LEB128_0x80) {
1443*9712c20fSFrederick Mayle   section.LEB128(0x80);
1444*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1445*9712c20fSFrederick Mayle   EXPECT_EQ(string("\x80\x01", 2), contents);
1446*9712c20fSFrederick Mayle }
1447*9712c20fSFrederick Mayle 
TEST_F(Append,LEB128_0xff)1448*9712c20fSFrederick Mayle TEST_F(Append, LEB128_0xff) {
1449*9712c20fSFrederick Mayle   section.LEB128(0xff);
1450*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1451*9712c20fSFrederick Mayle   EXPECT_EQ(string("\xff\x01", 2), contents);
1452*9712c20fSFrederick Mayle }
1453*9712c20fSFrederick Mayle 
TEST_F(Append,LEB128_0x1fff)1454*9712c20fSFrederick Mayle TEST_F(Append, LEB128_0x1fff) {
1455*9712c20fSFrederick Mayle   section.LEB128(0x1fff);
1456*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1457*9712c20fSFrederick Mayle   EXPECT_EQ(string("\xff\x3f", 2), contents);
1458*9712c20fSFrederick Mayle }
1459*9712c20fSFrederick Mayle 
TEST_F(Append,LEB128_0x2000)1460*9712c20fSFrederick Mayle TEST_F(Append, LEB128_0x2000) {
1461*9712c20fSFrederick Mayle   section.LEB128(0x2000);
1462*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1463*9712c20fSFrederick Mayle   EXPECT_EQ(string("\x80\xc0\x00", 3), contents);
1464*9712c20fSFrederick Mayle }
1465*9712c20fSFrederick Mayle 
TEST_F(Append,LEB128_n1)1466*9712c20fSFrederick Mayle TEST_F(Append, LEB128_n1) {
1467*9712c20fSFrederick Mayle   section.LEB128(-1);
1468*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1469*9712c20fSFrederick Mayle   EXPECT_EQ(string("\x7f", 1), contents);
1470*9712c20fSFrederick Mayle }
1471*9712c20fSFrederick Mayle 
TEST_F(Append,LEB128_n0x40)1472*9712c20fSFrederick Mayle TEST_F(Append, LEB128_n0x40) {
1473*9712c20fSFrederick Mayle   section.LEB128(-0x40);
1474*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1475*9712c20fSFrederick Mayle   EXPECT_EQ(string("\x40", 1), contents);
1476*9712c20fSFrederick Mayle }
1477*9712c20fSFrederick Mayle 
TEST_F(Append,LEB128_n0x41)1478*9712c20fSFrederick Mayle TEST_F(Append, LEB128_n0x41) {
1479*9712c20fSFrederick Mayle   section.LEB128(-0x41);
1480*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1481*9712c20fSFrederick Mayle   EXPECT_EQ(string("\xbf\x7f", 2), contents);
1482*9712c20fSFrederick Mayle }
1483*9712c20fSFrederick Mayle 
TEST_F(Append,LEB128_n0x7f)1484*9712c20fSFrederick Mayle TEST_F(Append, LEB128_n0x7f) {
1485*9712c20fSFrederick Mayle   section.LEB128(-0x7f);
1486*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1487*9712c20fSFrederick Mayle   EXPECT_EQ(string("\x81\x7f", 2), contents);
1488*9712c20fSFrederick Mayle }
1489*9712c20fSFrederick Mayle 
TEST_F(Append,LEB128_n0x80)1490*9712c20fSFrederick Mayle TEST_F(Append, LEB128_n0x80) {
1491*9712c20fSFrederick Mayle   section.LEB128(-0x80);
1492*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1493*9712c20fSFrederick Mayle   EXPECT_EQ(string("\x80\x7f", 2), contents);
1494*9712c20fSFrederick Mayle }
1495*9712c20fSFrederick Mayle 
TEST_F(Append,LEB128_n0x2000)1496*9712c20fSFrederick Mayle TEST_F(Append, LEB128_n0x2000) {
1497*9712c20fSFrederick Mayle   section.LEB128(-0x2000);
1498*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1499*9712c20fSFrederick Mayle   EXPECT_EQ(string("\x80\x40", 2), contents);
1500*9712c20fSFrederick Mayle }
1501*9712c20fSFrederick Mayle 
TEST_F(Append,LEB128_n0x2001)1502*9712c20fSFrederick Mayle TEST_F(Append, LEB128_n0x2001) {
1503*9712c20fSFrederick Mayle   section.LEB128(-0x2001);
1504*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1505*9712c20fSFrederick Mayle   EXPECT_EQ(string("\xff\xbf\x7f", 3), contents);
1506*9712c20fSFrederick Mayle }
1507*9712c20fSFrederick Mayle 
TEST_F(Append,ULEB128_0)1508*9712c20fSFrederick Mayle TEST_F(Append,ULEB128_0) {
1509*9712c20fSFrederick Mayle   section.ULEB128(0);
1510*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1511*9712c20fSFrederick Mayle   EXPECT_EQ(string("\0", 1), contents);
1512*9712c20fSFrederick Mayle }
1513*9712c20fSFrederick Mayle 
TEST_F(Append,ULEB128_1)1514*9712c20fSFrederick Mayle TEST_F(Append,ULEB128_1) {
1515*9712c20fSFrederick Mayle   section.ULEB128(1);
1516*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1517*9712c20fSFrederick Mayle   EXPECT_EQ(string("\x01", 1), contents);
1518*9712c20fSFrederick Mayle }
1519*9712c20fSFrederick Mayle 
TEST_F(Append,ULEB128_0x3f)1520*9712c20fSFrederick Mayle TEST_F(Append,ULEB128_0x3f) {
1521*9712c20fSFrederick Mayle   section.ULEB128(0x3f);
1522*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1523*9712c20fSFrederick Mayle   EXPECT_EQ(string("\x3f", 1), contents);
1524*9712c20fSFrederick Mayle }
1525*9712c20fSFrederick Mayle 
TEST_F(Append,ULEB128_0x40)1526*9712c20fSFrederick Mayle TEST_F(Append,ULEB128_0x40) {
1527*9712c20fSFrederick Mayle   section.ULEB128(0x40);
1528*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1529*9712c20fSFrederick Mayle   EXPECT_EQ(string("\x40", 1), contents);
1530*9712c20fSFrederick Mayle }
1531*9712c20fSFrederick Mayle 
TEST_F(Append,ULEB128_0x7f)1532*9712c20fSFrederick Mayle TEST_F(Append,ULEB128_0x7f) {
1533*9712c20fSFrederick Mayle   section.ULEB128(0x7f);
1534*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1535*9712c20fSFrederick Mayle   EXPECT_EQ(string("\x7f", 1), contents);
1536*9712c20fSFrederick Mayle }
1537*9712c20fSFrederick Mayle 
TEST_F(Append,ULEB128_0x80)1538*9712c20fSFrederick Mayle TEST_F(Append,ULEB128_0x80) {
1539*9712c20fSFrederick Mayle   section.ULEB128(0x80);
1540*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1541*9712c20fSFrederick Mayle   EXPECT_EQ(string("\x80\x01", 2), contents);
1542*9712c20fSFrederick Mayle }
1543*9712c20fSFrederick Mayle 
TEST_F(Append,ULEB128_0xff)1544*9712c20fSFrederick Mayle TEST_F(Append,ULEB128_0xff) {
1545*9712c20fSFrederick Mayle   section.ULEB128(0xff);
1546*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1547*9712c20fSFrederick Mayle   EXPECT_EQ(string("\xff\x01", 2), contents);
1548*9712c20fSFrederick Mayle }
1549*9712c20fSFrederick Mayle 
TEST_F(Append,ULEB128_0x100)1550*9712c20fSFrederick Mayle TEST_F(Append,ULEB128_0x100) {
1551*9712c20fSFrederick Mayle   section.ULEB128(0x100);
1552*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1553*9712c20fSFrederick Mayle   EXPECT_EQ(string("\x80\x02", 2), contents);
1554*9712c20fSFrederick Mayle }
1555*9712c20fSFrederick Mayle 
TEST_F(Append,ULEB128_0x1fff)1556*9712c20fSFrederick Mayle TEST_F(Append,ULEB128_0x1fff) {
1557*9712c20fSFrederick Mayle   section.ULEB128(0x1fff);
1558*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1559*9712c20fSFrederick Mayle   EXPECT_EQ(string("\xff\x3f", 2), contents);
1560*9712c20fSFrederick Mayle }
1561*9712c20fSFrederick Mayle 
TEST_F(Append,ULEB128_0x2000)1562*9712c20fSFrederick Mayle TEST_F(Append,ULEB128_0x2000) {
1563*9712c20fSFrederick Mayle   section.ULEB128(0x2000);
1564*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1565*9712c20fSFrederick Mayle   EXPECT_EQ(string("\x80\x40", 2), contents);
1566*9712c20fSFrederick Mayle }
1567*9712c20fSFrederick Mayle 
TEST_F(Append,ULEB128_0x3fff)1568*9712c20fSFrederick Mayle TEST_F(Append,ULEB128_0x3fff) {
1569*9712c20fSFrederick Mayle   section.ULEB128(0x3fff);
1570*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1571*9712c20fSFrederick Mayle   EXPECT_EQ(string("\xff\x7f", 2), contents);
1572*9712c20fSFrederick Mayle }
1573*9712c20fSFrederick Mayle 
TEST_F(Append,ULEB128_0x4000)1574*9712c20fSFrederick Mayle TEST_F(Append,ULEB128_0x4000) {
1575*9712c20fSFrederick Mayle   section.ULEB128(0x4000);
1576*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1577*9712c20fSFrederick Mayle   EXPECT_EQ(string("\x80\x80\x01", 3), contents);
1578*9712c20fSFrederick Mayle }
1579*9712c20fSFrederick Mayle 
TEST_F(Append,ULEB128_12857)1580*9712c20fSFrederick Mayle TEST_F(Append,ULEB128_12857) {
1581*9712c20fSFrederick Mayle   section.ULEB128(12857);
1582*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1583*9712c20fSFrederick Mayle   EXPECT_EQ(string("\xb9\x64", 2), contents);
1584*9712c20fSFrederick Mayle }
1585*9712c20fSFrederick Mayle 
TEST_F(Append,LEBChain)1586*9712c20fSFrederick Mayle TEST_F(Append, LEBChain) {
1587*9712c20fSFrederick Mayle   section.LEB128(-0x80).ULEB128(12857).Append("*");
1588*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1589*9712c20fSFrederick Mayle   EXPECT_EQ(string("\x80\x7f\xb9\x64*", 5), contents);
1590*9712c20fSFrederick Mayle }
1591*9712c20fSFrederick Mayle 
1592*9712c20fSFrederick Mayle 
1593*9712c20fSFrederick Mayle class GetContents: public SectionFixture, public Test { };
1594*9712c20fSFrederick Mayle 
TEST_F(GetContents,Undefined)1595*9712c20fSFrederick Mayle TEST_F(GetContents, Undefined) {
1596*9712c20fSFrederick Mayle   Label l;
1597*9712c20fSFrederick Mayle   section.Append(kLittleEndian, 8, l);
1598*9712c20fSFrederick Mayle   ASSERT_FALSE(section.GetContents(&contents));
1599*9712c20fSFrederick Mayle }
1600*9712c20fSFrederick Mayle 
TEST_F(GetContents,ClearsContents)1601*9712c20fSFrederick Mayle TEST_F(GetContents, ClearsContents) {
1602*9712c20fSFrederick Mayle   section.Append((size_t) 10, '*');
1603*9712c20fSFrederick Mayle   EXPECT_EQ(10U, section.Size());
1604*9712c20fSFrederick Mayle   EXPECT_TRUE(section.GetContents(&contents));
1605*9712c20fSFrederick Mayle   EXPECT_EQ(0U, section.Size());
1606*9712c20fSFrederick Mayle }
1607*9712c20fSFrederick Mayle 
TEST_F(GetContents,ClearsReferences)1608*9712c20fSFrederick Mayle TEST_F(GetContents, ClearsReferences) {
1609*9712c20fSFrederick Mayle   Label l;
1610*9712c20fSFrederick Mayle   section.Append(kBigEndian, 1, l);
1611*9712c20fSFrederick Mayle   l = 42;
1612*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1613*9712c20fSFrederick Mayle   ASSERT_BYTES(contents, I1(42));
1614*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents)); // should not die
1615*9712c20fSFrederick Mayle }
1616*9712c20fSFrederick Mayle 
1617*9712c20fSFrederick Mayle class Miscellanea: public SectionFixture, public Test { };
1618*9712c20fSFrederick Mayle 
TEST_F(Miscellanea,Clear)1619*9712c20fSFrederick Mayle TEST_F(Miscellanea, Clear) {
1620*9712c20fSFrederick Mayle   section.Append("howdy");
1621*9712c20fSFrederick Mayle   Label l;
1622*9712c20fSFrederick Mayle   section.L32(l);
1623*9712c20fSFrederick Mayle   EXPECT_EQ(9U, section.Size());
1624*9712c20fSFrederick Mayle   section.Clear();
1625*9712c20fSFrederick Mayle   EXPECT_EQ(0U, section.Size());
1626*9712c20fSFrederick Mayle   l = 0x8d231bf0U;
1627*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents)); // should not die
1628*9712c20fSFrederick Mayle }
1629*9712c20fSFrederick Mayle 
TEST_F(Miscellanea,Align)1630*9712c20fSFrederick Mayle TEST_F(Miscellanea, Align) {
1631*9712c20fSFrederick Mayle   section.Append("*");
1632*9712c20fSFrederick Mayle   EXPECT_EQ(1U, section.Size());
1633*9712c20fSFrederick Mayle   section.Align(4).Append("*");
1634*9712c20fSFrederick Mayle   EXPECT_EQ(5U, section.Size());
1635*9712c20fSFrederick Mayle   section.Append("*").Align(2);
1636*9712c20fSFrederick Mayle   EXPECT_EQ(6U, section.Size());
1637*9712c20fSFrederick Mayle }
1638*9712c20fSFrederick Mayle 
TEST_F(Miscellanea,AlignPad)1639*9712c20fSFrederick Mayle TEST_F(Miscellanea, AlignPad) {
1640*9712c20fSFrederick Mayle   section.Append("*");
1641*9712c20fSFrederick Mayle   EXPECT_EQ(1U, section.Size());
1642*9712c20fSFrederick Mayle   section.Align(4, ' ').Append("*");
1643*9712c20fSFrederick Mayle   EXPECT_EQ(5U, section.Size());
1644*9712c20fSFrederick Mayle   section.Append("*").Align(2, ' ');
1645*9712c20fSFrederick Mayle   EXPECT_EQ(6U, section.Size());
1646*9712c20fSFrederick Mayle   ASSERT_TRUE(section.GetContents(&contents));
1647*9712c20fSFrederick Mayle   ASSERT_EQ(string("*   **"), contents);
1648*9712c20fSFrederick Mayle }
1649*9712c20fSFrederick Mayle 
TEST_F(Miscellanea,StartHereMark)1650*9712c20fSFrederick Mayle TEST_F(Miscellanea, StartHereMark) {
1651*9712c20fSFrederick Mayle   Label m;
1652*9712c20fSFrederick Mayle   section.Append(42, ' ').Mark(&m).Append(13, '+');
1653*9712c20fSFrederick Mayle   EXPECT_EQ(42U, m - section.start());
1654*9712c20fSFrederick Mayle   EXPECT_EQ(42U + 13U, section.Here() - section.start());
1655*9712c20fSFrederick Mayle   EXPECT_FALSE(section.start().IsKnownConstant());
1656*9712c20fSFrederick Mayle   EXPECT_FALSE(m.IsKnownConstant());
1657*9712c20fSFrederick Mayle   EXPECT_FALSE(section.Here().IsKnownConstant());
1658*9712c20fSFrederick Mayle }
1659*9712c20fSFrederick Mayle 
TEST_F(Miscellanea,Endianness)1660*9712c20fSFrederick Mayle TEST_F(Miscellanea, Endianness) {
1661*9712c20fSFrederick Mayle   section.set_endianness(kBigEndian);
1662*9712c20fSFrederick Mayle   EXPECT_EQ(kBigEndian, section.endianness());
1663*9712c20fSFrederick Mayle   section.set_endianness(kLittleEndian);
1664*9712c20fSFrederick Mayle   EXPECT_EQ(kLittleEndian, section.endianness());
1665*9712c20fSFrederick Mayle }
1666