blob: b8eda09f5905160168af7766ec92987fcab09c9c [file] [log] [blame]
Adam Lesinski21efb682016-09-14 17:35:43 -07001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "compile/Image.h"
18#include "test/Test.h"
19
20namespace aapt {
21
22// Pixels are in RGBA_8888 packing.
23
Adam Lesinskicacb28f2016-10-19 12:18:14 -070024#define RED "\xff\x00\x00\xff"
25#define BLUE "\x00\x00\xff\xff"
Adam Lesinski21efb682016-09-14 17:35:43 -070026#define GREEN "\xff\x00\x00\xff"
27#define GR_70 "\xff\x00\x00\xb3"
28#define GR_50 "\xff\x00\x00\x80"
29#define GR_20 "\xff\x00\x00\x33"
30#define BLACK "\x00\x00\x00\xff"
31#define WHITE "\xff\xff\xff\xff"
32#define TRANS "\x00\x00\x00\x00"
33
34static uint8_t* k2x2[] = {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070035 (uint8_t*)WHITE WHITE, (uint8_t*)WHITE WHITE,
Adam Lesinski21efb682016-09-14 17:35:43 -070036};
37
38static uint8_t* kMixedNeutralColor3x3[] = {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070039 (uint8_t*)WHITE BLACK TRANS, (uint8_t*)TRANS RED TRANS,
40 (uint8_t*)WHITE WHITE WHITE,
Adam Lesinski21efb682016-09-14 17:35:43 -070041};
42
43static uint8_t* kTransparentNeutralColor3x3[] = {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070044 (uint8_t*)TRANS BLACK TRANS, (uint8_t*)BLACK RED BLACK,
45 (uint8_t*)TRANS BLACK TRANS,
Adam Lesinski21efb682016-09-14 17:35:43 -070046};
47
48static uint8_t* kSingleStretch7x6[] = {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070049 (uint8_t*)WHITE WHITE BLACK BLACK BLACK WHITE WHITE,
50 (uint8_t*)WHITE RED RED RED RED RED WHITE,
51 (uint8_t*)BLACK RED RED RED RED RED WHITE,
52 (uint8_t*)BLACK RED RED RED RED RED WHITE,
53 (uint8_t*)WHITE RED RED RED RED RED WHITE,
54 (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE WHITE,
Adam Lesinski21efb682016-09-14 17:35:43 -070055};
56
57static uint8_t* kMultipleStretch10x7[] = {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070058 (uint8_t*)WHITE WHITE BLACK WHITE BLACK BLACK WHITE BLACK WHITE WHITE,
59 (uint8_t*)BLACK RED BLUE RED BLUE BLUE RED BLUE RED WHITE,
60 (uint8_t*)BLACK RED BLUE RED BLUE BLUE RED BLUE RED WHITE,
61 (uint8_t*)WHITE RED BLUE RED BLUE BLUE RED BLUE RED WHITE,
62 (uint8_t*)BLACK RED BLUE RED BLUE BLUE RED BLUE RED WHITE,
63 (uint8_t*)BLACK RED BLUE RED BLUE BLUE RED BLUE RED WHITE,
64 (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE,
Adam Lesinski21efb682016-09-14 17:35:43 -070065};
66
67static uint8_t* kPadding6x5[] = {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070068 (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE,
69 (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE,
70 (uint8_t*)WHITE WHITE WHITE WHITE WHITE BLACK,
71 (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE,
72 (uint8_t*)WHITE WHITE BLACK BLACK WHITE WHITE,
Adam Lesinski21efb682016-09-14 17:35:43 -070073};
74
75static uint8_t* kLayoutBoundsWrongEdge3x3[] = {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070076 (uint8_t*)WHITE RED WHITE, (uint8_t*)RED WHITE WHITE,
77 (uint8_t*)WHITE WHITE WHITE,
Adam Lesinski21efb682016-09-14 17:35:43 -070078};
79
80static uint8_t* kLayoutBoundsNotEdgeAligned5x5[] = {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070081 (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
82 (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
83 (uint8_t*)WHITE WHITE WHITE WHITE RED,
84 (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
85 (uint8_t*)WHITE WHITE RED WHITE WHITE,
Adam Lesinski21efb682016-09-14 17:35:43 -070086};
87
88static uint8_t* kLayoutBounds5x5[] = {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070089 (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
90 (uint8_t*)WHITE WHITE WHITE WHITE RED,
91 (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
92 (uint8_t*)WHITE WHITE WHITE WHITE RED,
93 (uint8_t*)WHITE RED WHITE RED WHITE,
Adam Lesinski21efb682016-09-14 17:35:43 -070094};
95
96static uint8_t* kAsymmetricLayoutBounds5x5[] = {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070097 (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
98 (uint8_t*)WHITE WHITE WHITE WHITE RED,
99 (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
100 (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
101 (uint8_t*)WHITE RED WHITE WHITE WHITE,
Adam Lesinski21efb682016-09-14 17:35:43 -0700102};
103
104static uint8_t* kPaddingAndLayoutBounds5x5[] = {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700105 (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
106 (uint8_t*)WHITE WHITE WHITE WHITE RED,
107 (uint8_t*)WHITE WHITE WHITE WHITE BLACK,
108 (uint8_t*)WHITE WHITE WHITE WHITE RED,
109 (uint8_t*)WHITE RED BLACK RED WHITE,
Adam Lesinski21efb682016-09-14 17:35:43 -0700110};
111
112static uint8_t* kColorfulImage5x5[] = {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700113 (uint8_t*)WHITE BLACK WHITE BLACK WHITE,
114 (uint8_t*)BLACK RED BLUE GREEN WHITE,
115 (uint8_t*)BLACK RED GREEN GREEN WHITE,
116 (uint8_t*)WHITE TRANS BLUE GREEN WHITE,
117 (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
Adam Lesinski21efb682016-09-14 17:35:43 -0700118};
119
120static uint8_t* kOutlineOpaque10x10[] = {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700121 (uint8_t*)WHITE BLACK BLACK BLACK BLACK BLACK BLACK BLACK BLACK WHITE,
122 (uint8_t*)WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
123 (uint8_t*)WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
124 (uint8_t*)WHITE TRANS TRANS GREEN GREEN GREEN GREEN TRANS TRANS WHITE,
125 (uint8_t*)WHITE TRANS TRANS GREEN GREEN GREEN GREEN TRANS TRANS WHITE,
126 (uint8_t*)WHITE TRANS TRANS GREEN GREEN GREEN GREEN TRANS TRANS WHITE,
127 (uint8_t*)WHITE TRANS TRANS GREEN GREEN GREEN GREEN TRANS TRANS WHITE,
128 (uint8_t*)WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
129 (uint8_t*)WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
130 (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE,
Adam Lesinski21efb682016-09-14 17:35:43 -0700131};
132
133static uint8_t* kOutlineTranslucent10x10[] = {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700134 (uint8_t*)WHITE BLACK BLACK BLACK BLACK BLACK BLACK BLACK BLACK WHITE,
135 (uint8_t*)WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
136 (uint8_t*)WHITE TRANS TRANS GR_20 GR_20 GR_20 GR_20 TRANS TRANS WHITE,
137 (uint8_t*)WHITE TRANS TRANS GR_50 GR_50 GR_50 GR_50 TRANS TRANS WHITE,
138 (uint8_t*)WHITE TRANS GR_20 GR_50 GR_70 GR_70 GR_50 GR_20 TRANS WHITE,
139 (uint8_t*)WHITE TRANS GR_20 GR_50 GR_70 GR_70 GR_50 GR_20 TRANS WHITE,
140 (uint8_t*)WHITE TRANS TRANS GR_50 GR_50 GR_50 GR_50 TRANS TRANS WHITE,
141 (uint8_t*)WHITE TRANS TRANS GR_20 GR_20 GR_20 GR_20 TRANS TRANS WHITE,
142 (uint8_t*)WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
143 (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE,
Adam Lesinski21efb682016-09-14 17:35:43 -0700144};
145
146static uint8_t* kOutlineOffsetTranslucent12x10[] = {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700147 (uint8_t*)
148 WHITE WHITE WHITE BLACK BLACK BLACK BLACK BLACK BLACK BLACK BLACK WHITE,
149 (uint8_t*)
150 WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
151 (uint8_t*)
152 WHITE TRANS TRANS TRANS TRANS GR_20 GR_20 GR_20 GR_20 TRANS TRANS WHITE,
153 (uint8_t*)
154 WHITE TRANS TRANS TRANS TRANS GR_50 GR_50 GR_50 GR_50 TRANS TRANS WHITE,
155 (uint8_t*)
156 WHITE TRANS TRANS TRANS GR_20 GR_50 GR_70 GR_70 GR_50 GR_20 TRANS WHITE,
157 (uint8_t*)
158 WHITE TRANS TRANS TRANS GR_20 GR_50 GR_70 GR_70 GR_50 GR_20 TRANS WHITE,
159 (uint8_t*)
160 WHITE TRANS TRANS TRANS TRANS GR_50 GR_50 GR_50 GR_50 TRANS TRANS WHITE,
161 (uint8_t*)
162 WHITE TRANS TRANS TRANS TRANS GR_20 GR_20 GR_20 GR_20 TRANS TRANS WHITE,
163 (uint8_t*)
164 WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
165 (uint8_t*)
166 WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE,
Adam Lesinski21efb682016-09-14 17:35:43 -0700167};
168
169static uint8_t* kOutlineRadius5x5[] = {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700170 (uint8_t*)WHITE BLACK BLACK BLACK WHITE,
171 (uint8_t*)BLACK TRANS GREEN TRANS WHITE,
172 (uint8_t*)BLACK GREEN GREEN GREEN WHITE,
173 (uint8_t*)BLACK TRANS GREEN TRANS WHITE,
174 (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
Adam Lesinski21efb682016-09-14 17:35:43 -0700175};
176
Adam Lesinskiedba9412016-10-04 17:33:04 -0700177static uint8_t* kStretchAndPadding5x5[] = {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700178 (uint8_t*)WHITE WHITE BLACK WHITE WHITE, (uint8_t*)WHITE RED RED RED WHITE,
179 (uint8_t*)BLACK RED RED RED BLACK, (uint8_t*)WHITE RED RED RED WHITE,
180 (uint8_t*)WHITE WHITE BLACK WHITE WHITE,
Adam Lesinskiedba9412016-10-04 17:33:04 -0700181};
182
Adam Lesinski21efb682016-09-14 17:35:43 -0700183TEST(NinePatchTest, Minimum3x3) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700184 std::string err;
185 EXPECT_EQ(nullptr, NinePatch::create(k2x2, 2, 2, &err));
186 EXPECT_FALSE(err.empty());
Adam Lesinski21efb682016-09-14 17:35:43 -0700187}
188
189TEST(NinePatchTest, MixedNeutralColors) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700190 std::string err;
191 EXPECT_EQ(nullptr, NinePatch::create(kMixedNeutralColor3x3, 3, 3, &err));
192 EXPECT_FALSE(err.empty());
Adam Lesinski21efb682016-09-14 17:35:43 -0700193}
194
195TEST(NinePatchTest, TransparentNeutralColor) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700196 std::string err;
197 EXPECT_NE(nullptr,
198 NinePatch::create(kTransparentNeutralColor3x3, 3, 3, &err));
Adam Lesinski21efb682016-09-14 17:35:43 -0700199}
200
201TEST(NinePatchTest, SingleStretchRegion) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700202 std::string err;
203 std::unique_ptr<NinePatch> ninePatch =
204 NinePatch::create(kSingleStretch7x6, 7, 6, &err);
205 ASSERT_NE(nullptr, ninePatch);
Adam Lesinski21efb682016-09-14 17:35:43 -0700206
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700207 ASSERT_EQ(1u, ninePatch->horizontalStretchRegions.size());
208 ASSERT_EQ(1u, ninePatch->verticalStretchRegions.size());
Adam Lesinski21efb682016-09-14 17:35:43 -0700209
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700210 EXPECT_EQ(Range(1, 4), ninePatch->horizontalStretchRegions.front());
211 EXPECT_EQ(Range(1, 3), ninePatch->verticalStretchRegions.front());
Adam Lesinski21efb682016-09-14 17:35:43 -0700212}
213
214TEST(NinePatchTest, MultipleStretchRegions) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700215 std::string err;
216 std::unique_ptr<NinePatch> ninePatch =
217 NinePatch::create(kMultipleStretch10x7, 10, 7, &err);
218 ASSERT_NE(nullptr, ninePatch);
Adam Lesinski21efb682016-09-14 17:35:43 -0700219
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700220 ASSERT_EQ(3u, ninePatch->horizontalStretchRegions.size());
221 ASSERT_EQ(2u, ninePatch->verticalStretchRegions.size());
Adam Lesinski21efb682016-09-14 17:35:43 -0700222
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700223 EXPECT_EQ(Range(1, 2), ninePatch->horizontalStretchRegions[0]);
224 EXPECT_EQ(Range(3, 5), ninePatch->horizontalStretchRegions[1]);
225 EXPECT_EQ(Range(6, 7), ninePatch->horizontalStretchRegions[2]);
Adam Lesinski21efb682016-09-14 17:35:43 -0700226
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700227 EXPECT_EQ(Range(0, 2), ninePatch->verticalStretchRegions[0]);
228 EXPECT_EQ(Range(3, 5), ninePatch->verticalStretchRegions[1]);
Adam Lesinski21efb682016-09-14 17:35:43 -0700229}
230
231TEST(NinePatchTest, InferPaddingFromStretchRegions) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700232 std::string err;
233 std::unique_ptr<NinePatch> ninePatch =
234 NinePatch::create(kMultipleStretch10x7, 10, 7, &err);
235 ASSERT_NE(nullptr, ninePatch);
236 EXPECT_EQ(Bounds(1, 0, 1, 0), ninePatch->padding);
Adam Lesinski21efb682016-09-14 17:35:43 -0700237}
238
239TEST(NinePatchTest, Padding) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700240 std::string err;
241 std::unique_ptr<NinePatch> ninePatch =
242 NinePatch::create(kPadding6x5, 6, 5, &err);
243 ASSERT_NE(nullptr, ninePatch);
244 EXPECT_EQ(Bounds(1, 1, 1, 1), ninePatch->padding);
Adam Lesinski21efb682016-09-14 17:35:43 -0700245}
246
247TEST(NinePatchTest, LayoutBoundsAreOnWrongEdge) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700248 std::string err;
249 EXPECT_EQ(nullptr, NinePatch::create(kLayoutBoundsWrongEdge3x3, 3, 3, &err));
250 EXPECT_FALSE(err.empty());
Adam Lesinski21efb682016-09-14 17:35:43 -0700251}
252
253TEST(NinePatchTest, LayoutBoundsMustTouchEdges) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700254 std::string err;
255 EXPECT_EQ(nullptr,
256 NinePatch::create(kLayoutBoundsNotEdgeAligned5x5, 5, 5, &err));
257 EXPECT_FALSE(err.empty());
Adam Lesinski21efb682016-09-14 17:35:43 -0700258}
259
260TEST(NinePatchTest, LayoutBounds) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700261 std::string err;
262 std::unique_ptr<NinePatch> ninePatch =
263 NinePatch::create(kLayoutBounds5x5, 5, 5, &err);
264 ASSERT_NE(nullptr, ninePatch);
265 EXPECT_EQ(Bounds(1, 1, 1, 1), ninePatch->layoutBounds);
Adam Lesinski21efb682016-09-14 17:35:43 -0700266
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700267 ninePatch = NinePatch::create(kAsymmetricLayoutBounds5x5, 5, 5, &err);
268 ASSERT_NE(nullptr, ninePatch);
269 EXPECT_EQ(Bounds(1, 1, 0, 0), ninePatch->layoutBounds);
Adam Lesinski21efb682016-09-14 17:35:43 -0700270}
271
272TEST(NinePatchTest, PaddingAndLayoutBounds) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700273 std::string err;
274 std::unique_ptr<NinePatch> ninePatch =
275 NinePatch::create(kPaddingAndLayoutBounds5x5, 5, 5, &err);
276 ASSERT_NE(nullptr, ninePatch);
277 EXPECT_EQ(Bounds(1, 1, 1, 1), ninePatch->padding);
278 EXPECT_EQ(Bounds(1, 1, 1, 1), ninePatch->layoutBounds);
Adam Lesinski21efb682016-09-14 17:35:43 -0700279}
280
281TEST(NinePatchTest, RegionColorsAreCorrect) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700282 std::string err;
283 std::unique_ptr<NinePatch> ninePatch =
284 NinePatch::create(kColorfulImage5x5, 5, 5, &err);
285 ASSERT_NE(nullptr, ninePatch);
Adam Lesinski21efb682016-09-14 17:35:43 -0700286
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700287 std::vector<uint32_t> expectedColors = {
288 NinePatch::packRGBA((uint8_t*)RED),
289 (uint32_t)android::Res_png_9patch::NO_COLOR,
290 NinePatch::packRGBA((uint8_t*)GREEN),
291 (uint32_t)android::Res_png_9patch::TRANSPARENT_COLOR,
292 NinePatch::packRGBA((uint8_t*)BLUE),
293 NinePatch::packRGBA((uint8_t*)GREEN),
294 };
295 EXPECT_EQ(expectedColors, ninePatch->regionColors);
Adam Lesinski21efb682016-09-14 17:35:43 -0700296}
297
298TEST(NinePatchTest, OutlineFromOpaqueImage) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700299 std::string err;
300 std::unique_ptr<NinePatch> ninePatch =
301 NinePatch::create(kOutlineOpaque10x10, 10, 10, &err);
302 ASSERT_NE(nullptr, ninePatch);
303 EXPECT_EQ(Bounds(2, 2, 2, 2), ninePatch->outline);
304 EXPECT_EQ(0x000000ffu, ninePatch->outlineAlpha);
305 EXPECT_EQ(0.0f, ninePatch->outlineRadius);
Adam Lesinski21efb682016-09-14 17:35:43 -0700306}
307
308TEST(NinePatchTest, OutlineFromTranslucentImage) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700309 std::string err;
310 std::unique_ptr<NinePatch> ninePatch =
311 NinePatch::create(kOutlineTranslucent10x10, 10, 10, &err);
312 ASSERT_NE(nullptr, ninePatch);
313 EXPECT_EQ(Bounds(3, 3, 3, 3), ninePatch->outline);
314 EXPECT_EQ(0x000000b3u, ninePatch->outlineAlpha);
315 EXPECT_EQ(0.0f, ninePatch->outlineRadius);
Adam Lesinski21efb682016-09-14 17:35:43 -0700316}
317
318TEST(NinePatchTest, OutlineFromOffCenterImage) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700319 std::string err;
320 std::unique_ptr<NinePatch> ninePatch =
321 NinePatch::create(kOutlineOffsetTranslucent12x10, 12, 10, &err);
322 ASSERT_NE(nullptr, ninePatch);
Adam Lesinski21efb682016-09-14 17:35:43 -0700323
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700324 // TODO(adamlesinski): The old AAPT algorithm searches from the outside to the
325 // middle
326 // for each inset. If the outline is shifted, the search may not find a closer
327 // bounds.
328 // This check should be:
329 // EXPECT_EQ(Bounds(5, 3, 3, 3), ninePatch->outline);
330 // but until I know what behaviour I'm breaking, I will leave it at the
331 // incorrect:
332 EXPECT_EQ(Bounds(4, 3, 3, 3), ninePatch->outline);
Adam Lesinski21efb682016-09-14 17:35:43 -0700333
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700334 EXPECT_EQ(0x000000b3u, ninePatch->outlineAlpha);
335 EXPECT_EQ(0.0f, ninePatch->outlineRadius);
Adam Lesinski21efb682016-09-14 17:35:43 -0700336}
337
338TEST(NinePatchTest, OutlineRadius) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700339 std::string err;
340 std::unique_ptr<NinePatch> ninePatch =
341 NinePatch::create(kOutlineRadius5x5, 5, 5, &err);
342 ASSERT_NE(nullptr, ninePatch);
343 EXPECT_EQ(Bounds(0, 0, 0, 0), ninePatch->outline);
344 EXPECT_EQ(3.4142f, ninePatch->outlineRadius);
Adam Lesinski21efb682016-09-14 17:35:43 -0700345}
346
Adam Lesinskiedba9412016-10-04 17:33:04 -0700347::testing::AssertionResult bigEndianOne(uint8_t* cursor) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700348 if (cursor[0] == 0 && cursor[1] == 0 && cursor[2] == 0 && cursor[3] == 1) {
349 return ::testing::AssertionSuccess();
350 }
351 return ::testing::AssertionFailure() << "Not BigEndian 1";
Adam Lesinskiedba9412016-10-04 17:33:04 -0700352}
353
354TEST(NinePatchTest, SerializePngEndianness) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700355 std::string err;
356 std::unique_ptr<NinePatch> ninePatch =
357 NinePatch::create(kStretchAndPadding5x5, 5, 5, &err);
358 ASSERT_NE(nullptr, ninePatch);
Adam Lesinskiedba9412016-10-04 17:33:04 -0700359
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700360 size_t len;
361 std::unique_ptr<uint8_t[]> data = ninePatch->serializeBase(&len);
362 ASSERT_NE(nullptr, data);
363 ASSERT_NE(0u, len);
Adam Lesinskiedba9412016-10-04 17:33:04 -0700364
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700365 // Skip past wasDeserialized + numXDivs + numYDivs + numColors + xDivsOffset +
366 // yDivsOffset
367 // (12 bytes)
368 uint8_t* cursor = data.get() + 12;
Adam Lesinskiedba9412016-10-04 17:33:04 -0700369
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700370 // Check that padding is big-endian. Expecting value 1.
371 EXPECT_TRUE(bigEndianOne(cursor));
372 EXPECT_TRUE(bigEndianOne(cursor + 4));
373 EXPECT_TRUE(bigEndianOne(cursor + 8));
374 EXPECT_TRUE(bigEndianOne(cursor + 12));
Adam Lesinskiedba9412016-10-04 17:33:04 -0700375}
376
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700377} // namespace aapt