1 // Copyright 2019 Google LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 // Tests that generated code properly preserves and propagates alignment
16 // information.
17 #include <stdint.h>
18
19 #include <vector>
20
21 #include "gtest/gtest.h"
22 #include "runtime/cpp/emboss_cpp_util.h"
23 #include "testdata/alignments.emb.h"
24
25 namespace emboss {
26 namespace test {
27 namespace {
28
29 using ::emboss::support::ContiguousBuffer;
30
TEST(AlignmentsTest,DirectFieldAlignments)31 TEST(AlignmentsTest, DirectFieldAlignments) {
32 auto unaligned_view = MakeAlignmentsView<char>(nullptr, 0);
33 EXPECT_TRUE(
34 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 1, 0>>,
35 decltype(unaligned_view.zero_offset())>::value));
36 EXPECT_TRUE(
37 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 1, 0>>,
38 decltype(unaligned_view.four_offset())>::value));
39 EXPECT_TRUE(
40 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 1, 0>>,
41 decltype(unaligned_view.twelve_offset())>::value));
42 EXPECT_TRUE(
43 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 1, 0>>,
44 decltype(unaligned_view.three_offset())>::value));
45 EXPECT_TRUE(
46 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 1, 0>>,
47 decltype(unaligned_view.eleven_offset())>::value));
48
49 auto four_aligned_view = MakeAlignedAlignmentsView<char, 4>(nullptr, 0);
50 EXPECT_TRUE(
51 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 4, 0>>,
52 decltype(four_aligned_view.zero_offset())>::value));
53 EXPECT_TRUE(
54 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 4, 0>>,
55 decltype(four_aligned_view.four_offset())>::value));
56 EXPECT_TRUE(
57 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 4, 0>>,
58 decltype(four_aligned_view.twelve_offset())>::value));
59 EXPECT_TRUE(
60 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 4, 3>>,
61 decltype(four_aligned_view.three_offset())>::value));
62 EXPECT_TRUE(
63 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 4, 3>>,
64 decltype(four_aligned_view.eleven_offset())>::value));
65
66 auto eight_aligned_view = MakeAlignedAlignmentsView<char, 8>(nullptr, 0);
67 EXPECT_TRUE(
68 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 8, 0>>,
69 decltype(eight_aligned_view.zero_offset())>::value));
70 EXPECT_TRUE(
71 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 8, 4>>,
72 decltype(eight_aligned_view.four_offset())>::value));
73 EXPECT_TRUE(
74 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 8, 4>>,
75 decltype(eight_aligned_view.twelve_offset())>::value));
76 EXPECT_TRUE(
77 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 8, 3>>,
78 decltype(eight_aligned_view.three_offset())>::value));
79 EXPECT_TRUE(
80 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 8, 3>>,
81 decltype(eight_aligned_view.eleven_offset())>::value));
82 }
83
TEST(AlignmentsTest,AlignmentReductionAssignment)84 TEST(AlignmentsTest, AlignmentReductionAssignment) {
85 alignas(4) unsigned char data[4];
86 auto four_aligned_view = MakeAlignedAlignmentsView<unsigned char, 4>(data, 4);
87 {
88 // Implicit construction.
89 AlignmentsView unaligned_view{four_aligned_view};
90 EXPECT_EQ(data, unaligned_view.BackingStorage().data());
91 }
92 {
93 // Implicit conversion during assignment.
94 AlignmentsView unaligned_view;
95 unaligned_view = four_aligned_view;
96 EXPECT_EQ(data, unaligned_view.BackingStorage().data());
97 }
98 }
99
TEST(AlignmentsTest,ArrayFieldAlignments)100 TEST(AlignmentsTest, ArrayFieldAlignments) {
101 auto unaligned_view = MakeAlignmentsView<char>(nullptr, 0);
102 EXPECT_TRUE(
103 (::std::is_same<
104 GenericPlaceholder4View<ContiguousBuffer<char, 1, 0>>,
105 decltype(unaligned_view.zero_offset_four_stride_array()[0])>::value));
106 EXPECT_TRUE(
107 (::std::is_same<
108 GenericPlaceholder6View<ContiguousBuffer<char, 1, 0>>,
109 decltype(unaligned_view.zero_offset_six_stride_array()[0])>::value));
110 EXPECT_TRUE(
111 (::std::is_same<
112 GenericPlaceholder4View<ContiguousBuffer<char, 1, 0>>,
113 decltype(
114 unaligned_view.three_offset_four_stride_array()[0])>::value));
115 EXPECT_TRUE(
116 (::std::is_same<
117 GenericPlaceholder6View<ContiguousBuffer<char, 1, 0>>,
118 decltype(unaligned_view.four_offset_six_stride_array()[0])>::value));
119
120 auto four_aligned_view = MakeAlignedAlignmentsView<char, 4>(nullptr, 0);
121 EXPECT_TRUE(
122 (::std::is_same<
123 GenericPlaceholder4View<ContiguousBuffer<char, 4, 0>>,
124 decltype(
125 four_aligned_view.zero_offset_four_stride_array()[0])>::value));
126 EXPECT_TRUE((
127 ::std::is_same<GenericPlaceholder6View<ContiguousBuffer<char, 2, 0>>,
128 decltype(four_aligned_view
129 .zero_offset_six_stride_array()[0])>::value));
130 EXPECT_TRUE(
131 (::std::is_same<
132 GenericPlaceholder4View<ContiguousBuffer<char, 4, 3>>,
133 decltype(
134 four_aligned_view.three_offset_four_stride_array()[0])>::value));
135 EXPECT_TRUE((
136 ::std::is_same<GenericPlaceholder6View<ContiguousBuffer<char, 2, 0>>,
137 decltype(four_aligned_view
138 .four_offset_six_stride_array()[0])>::value));
139
140 auto eight_aligned_view = MakeAlignedAlignmentsView<char, 8>(nullptr, 0);
141 EXPECT_TRUE(
142 (::std::is_same<
143 GenericPlaceholder4View<ContiguousBuffer<char, 4, 0>>,
144 decltype(
145 eight_aligned_view.zero_offset_four_stride_array()[0])>::value));
146 EXPECT_TRUE((
147 ::std::is_same<GenericPlaceholder6View<ContiguousBuffer<char, 2, 0>>,
148 decltype(eight_aligned_view
149 .zero_offset_six_stride_array()[0])>::value));
150 EXPECT_TRUE(
151 (::std::is_same<
152 GenericPlaceholder4View<ContiguousBuffer<char, 4, 3>>,
153 decltype(
154 eight_aligned_view.three_offset_four_stride_array()[0])>::value));
155 EXPECT_TRUE((
156 ::std::is_same<GenericPlaceholder6View<ContiguousBuffer<char, 2, 0>>,
157 decltype(eight_aligned_view
158 .four_offset_six_stride_array()[0])>::value));
159 }
160
TEST(AlignmentsTest,SubFieldAlignments)161 TEST(AlignmentsTest, SubFieldAlignments) {
162 auto unaligned_view = MakeAlignmentsView<char>(nullptr, 0);
163 EXPECT_TRUE(
164 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 1, 0>>,
165 decltype(unaligned_view.zero_offset_substructure()
166 .zero_offset())>::value));
167 EXPECT_TRUE(
168 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 1, 0>>,
169 decltype(unaligned_view.zero_offset_substructure()
170 .two_offset())>::value));
171 EXPECT_TRUE(
172 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 1, 0>>,
173 decltype(unaligned_view.two_offset_substructure()
174 .zero_offset())>::value));
175 EXPECT_TRUE(
176 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 1, 0>>,
177 decltype(unaligned_view.two_offset_substructure()
178 .two_offset())>::value));
179
180 auto four_aligned_view = MakeAlignedAlignmentsView<char, 4>(nullptr, 0);
181 EXPECT_TRUE(
182 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 4, 0>>,
183 decltype(four_aligned_view.zero_offset_substructure()
184 .zero_offset())>::value));
185 EXPECT_TRUE(
186 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 4, 2>>,
187 decltype(four_aligned_view.zero_offset_substructure()
188 .two_offset())>::value));
189 EXPECT_TRUE(
190 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 4, 2>>,
191 decltype(four_aligned_view.two_offset_substructure()
192 .zero_offset())>::value));
193 EXPECT_TRUE(
194 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 4, 0>>,
195 decltype(four_aligned_view.two_offset_substructure()
196 .two_offset())>::value));
197
198 auto eight_aligned_view = MakeAlignedAlignmentsView<char, 8>(nullptr, 0);
199 EXPECT_TRUE(
200 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 8, 0>>,
201 decltype(eight_aligned_view.zero_offset_substructure()
202 .zero_offset())>::value));
203 EXPECT_TRUE(
204 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 8, 2>>,
205 decltype(eight_aligned_view.zero_offset_substructure()
206 .two_offset())>::value));
207 EXPECT_TRUE(
208 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 8, 2>>,
209 decltype(eight_aligned_view.two_offset_substructure()
210 .zero_offset())>::value));
211 EXPECT_TRUE(
212 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 8, 4>>,
213 decltype(eight_aligned_view.two_offset_substructure()
214 .two_offset())>::value));
215 }
216
TEST(AlignmentsTest,ArraySubFieldAlignments)217 TEST(AlignmentsTest, ArraySubFieldAlignments) {
218 auto unaligned_view = MakeAlignmentsView<char>(nullptr, 0);
219 EXPECT_TRUE(
220 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 1, 0>>,
221 decltype(unaligned_view.zero_offset_six_stride_array()[0]
222 .zero_offset())>::value));
223 EXPECT_TRUE(
224 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 1, 0>>,
225 decltype(unaligned_view.zero_offset_six_stride_array()[0]
226 .two_offset())>::value));
227 EXPECT_TRUE(
228 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 1, 0>>,
229 decltype(unaligned_view.four_offset_six_stride_array()[0]
230 .zero_offset())>::value));
231 EXPECT_TRUE(
232 (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 1, 0>>,
233 decltype(unaligned_view.four_offset_six_stride_array()[0]
234 .two_offset())>::value));
235
236 auto four_aligned_view = MakeAlignedAlignmentsView<char, 4>(nullptr, 0);
237 EXPECT_TRUE((::std::is_same<
238 GenericPlaceholder4View<ContiguousBuffer<char, 2, 0>>,
239 decltype(four_aligned_view.zero_offset_six_stride_array()[0]
240 .zero_offset())>::value));
241 EXPECT_TRUE((::std::is_same<
242 GenericPlaceholder4View<ContiguousBuffer<char, 2, 0>>,
243 decltype(four_aligned_view.zero_offset_six_stride_array()[0]
244 .two_offset())>::value));
245 EXPECT_TRUE((::std::is_same<
246 GenericPlaceholder4View<ContiguousBuffer<char, 2, 0>>,
247 decltype(four_aligned_view.four_offset_six_stride_array()[0]
248 .zero_offset())>::value));
249 EXPECT_TRUE((::std::is_same<
250 GenericPlaceholder4View<ContiguousBuffer<char, 2, 0>>,
251 decltype(four_aligned_view.four_offset_six_stride_array()[0]
252 .two_offset())>::value));
253
254 auto eight_aligned_view = MakeAlignedAlignmentsView<char, 8>(nullptr, 0);
255 EXPECT_TRUE((::std::is_same<
256 GenericPlaceholder4View<ContiguousBuffer<char, 2, 0>>,
257 decltype(eight_aligned_view.zero_offset_six_stride_array()[0]
258 .zero_offset())>::value));
259 EXPECT_TRUE((::std::is_same<
260 GenericPlaceholder4View<ContiguousBuffer<char, 2, 0>>,
261 decltype(eight_aligned_view.zero_offset_six_stride_array()[0]
262 .two_offset())>::value));
263 EXPECT_TRUE((::std::is_same<
264 GenericPlaceholder4View<ContiguousBuffer<char, 2, 0>>,
265 decltype(eight_aligned_view.four_offset_six_stride_array()[0]
266 .zero_offset())>::value));
267 EXPECT_TRUE((::std::is_same<
268 GenericPlaceholder4View<ContiguousBuffer<char, 2, 0>>,
269 decltype(eight_aligned_view.four_offset_six_stride_array()[0]
270 .two_offset())>::value));
271 }
272
273 } // namespace
274 } // namespace test
275 } // namespace emboss
276