1/*
2 * Copyright (C) 2016 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#include "config.h"
27
28#include <WebCore/FloatSize.h>
29#include <WebCore/IntPoint.h>
30#include <WebCore/IntSize.h>
31
32#if USE(CG)
33#include <CoreGraphics/CoreGraphics.h>
34#endif
35
36#if PLATFORM(WIN)
37#include <d2d1.h>
38#endif
39
40namespace TestWebKitAPI {
41
42static void testGetAndSet(WebCore::FloatSize size)
43{
44 size.setWidth(101.1f);
45 EXPECT_FLOAT_EQ(101.1f, size.width());
46 size.setHeight(218.2f);
47 EXPECT_FLOAT_EQ(218.2f, size.height());
48}
49
50TEST(FloatSize, DefaultConstruction)
51{
52 WebCore::FloatSize test;
53
54 EXPECT_FLOAT_EQ(0, test.width());
55 EXPECT_FLOAT_EQ(0, test.height());
56
57 ASSERT_TRUE(test.isEmpty());
58 ASSERT_TRUE(test.isZero());
59
60 testGetAndSet(test);
61}
62
63TEST(FloatSize, ValueConstruction)
64{
65 WebCore::FloatSize test(1024.0f, 768.0f);
66
67 EXPECT_FLOAT_EQ(1024.0f, test.width());
68 EXPECT_FLOAT_EQ(768.0f, test.height());
69
70 ASSERT_FALSE(test.isEmpty());
71 ASSERT_FALSE(test.isZero());
72
73 static const float epsilon = 0.0001f;
74 EXPECT_NEAR(1.3333f, test.aspectRatio(), epsilon);
75
76 testGetAndSet(test);
77}
78
79TEST(FloatSize, IntSizeConstruction)
80{
81 WebCore::IntSize size(1024, 768);
82 WebCore::FloatSize test(size);
83
84 EXPECT_FLOAT_EQ(1024.0f, test.width());
85 EXPECT_FLOAT_EQ(768.0f, test.height());
86
87 ASSERT_FALSE(test.isEmpty());
88 ASSERT_FALSE(test.isZero());
89
90 static const double epsilon = 0.0001;
91 EXPECT_NEAR(1.3333f, test.aspectRatio(), epsilon);
92
93 testGetAndSet(test);
94}
95
96TEST(FloatSize, Scale)
97{
98 WebCore::FloatSize test(1024.0f, 768.0f);
99
100 test.scale(2.0f);
101
102 EXPECT_FLOAT_EQ(2048.0f, test.width());
103 EXPECT_FLOAT_EQ(1536.0f, test.height());
104
105 test.scale(0.5f);
106
107 EXPECT_FLOAT_EQ(1024.0f, test.width());
108 EXPECT_FLOAT_EQ(768.0f, test.height());
109
110 test.scale(2.0f, 0.5f);
111
112 EXPECT_FLOAT_EQ(2048.0f, test.width());
113 EXPECT_FLOAT_EQ(384.0f, test.height());
114}
115
116TEST(FloatSize, Expand)
117{
118 WebCore::FloatSize test(1024.0f, 768.0f);
119
120 EXPECT_FLOAT_EQ(1024.0f, test.width());
121 EXPECT_FLOAT_EQ(768.0f, test.height());
122
123 test.expand(100.0f, 50.0f);
124
125 EXPECT_FLOAT_EQ(1124.0f, test.width());
126 EXPECT_FLOAT_EQ(818.0f, test.height());
127
128 WebCore::FloatSize other(2048.0f, 700.0f);
129
130 auto expanded = test.expandedTo(other);
131
132 EXPECT_FLOAT_EQ(2048.0f, expanded.width());
133 EXPECT_FLOAT_EQ(818.0f, expanded.height());
134}
135
136TEST(FloatSize, Shrink)
137{
138 WebCore::FloatSize test(1024.0f, 768.0f);
139 WebCore::FloatSize other(1000.0f, 700.0f);
140
141 auto shrunken = test.shrunkTo(other);
142
143 EXPECT_FLOAT_EQ(1000.0f, shrunken.width());
144 EXPECT_FLOAT_EQ(700.0f, shrunken.height());
145
146 WebCore::FloatSize other2(2000.0f, 700.0f);
147
148 auto shrunken2 = test.shrunkTo(other2);
149
150 EXPECT_FLOAT_EQ(1024.0f, shrunken2.width());
151 EXPECT_FLOAT_EQ(700.0f, shrunken2.height());
152}
153
154TEST(FloatSize, DiagonalLengthAndArea)
155{
156 WebCore::FloatSize test(1024.0f, 768.0f);
157
158 EXPECT_FLOAT_EQ(1280.0f, test.diagonalLength());
159 EXPECT_FLOAT_EQ(1638400.0f, test.diagonalLengthSquared());
160 EXPECT_FLOAT_EQ(786432.0f, test.area());
161}
162
163TEST(FloatSize, TransposedSize)
164{
165 WebCore::FloatSize test(1024.0f, 768.0f);
166
167 auto transposedSize = test.transposedSize();
168
169 EXPECT_FLOAT_EQ(768.0f, transposedSize.width());
170 EXPECT_FLOAT_EQ(1024.0f, transposedSize.height());
171}
172
173TEST(FloatSize, Casting)
174{
175 WebCore::FloatSize test(1024.0f, 768.0f);
176
177#if USE(CG)
178 CGSize cgSize = test;
179
180 EXPECT_FLOAT_EQ(1024.0f, cgSize.width);
181 EXPECT_FLOAT_EQ(768.0f, cgSize.height);
182
183 CGSize cgSize2 = CGSizeMake(-22.3f, 14.2f);
184
185 WebCore::FloatSize testCG(cgSize2);
186
187 EXPECT_FLOAT_EQ(-22.3f, testCG.width());
188 EXPECT_FLOAT_EQ(14.2f, testCG.height());
189#endif
190
191#if PLATFORM(WIN)
192 D2D1_SIZE_F d2dSize = test;
193
194 EXPECT_FLOAT_EQ(1024.0f, d2dSize.width);
195 EXPECT_FLOAT_EQ(768.0f, d2dSize.height);
196
197 D2D1_SIZE_F d2dSize2 = D2D1::SizeF(-22.3f, 14.2f);
198
199 WebCore::FloatSize testD2D(d2dSize2);
200
201 EXPECT_FLOAT_EQ(-22.3f, testD2D.width());
202 EXPECT_FLOAT_EQ(14.2f, testD2D.height());
203#endif
204}
205
206TEST(FloatSize, AddSubtract)
207{
208 WebCore::FloatSize a(512.0f, 384.0f);
209 WebCore::FloatSize b(100.0f, 100.0f);
210
211 WebCore::FloatSize c = a + b;
212
213 EXPECT_FLOAT_EQ(612.0f, c.width());
214 EXPECT_FLOAT_EQ(484.0f, c.height());
215
216 a += b;
217
218 EXPECT_FLOAT_EQ(612.0f, a.width());
219 EXPECT_FLOAT_EQ(484.0f, a.height());
220
221 WebCore::FloatSize a2(512.0f, 384.0f);
222
223 WebCore::FloatSize d = a2 - b;
224
225 EXPECT_FLOAT_EQ(412.0f, d.width());
226 EXPECT_FLOAT_EQ(284.0f, d.height());
227
228 a2 -= b;
229
230 EXPECT_FLOAT_EQ(412.0f, a2.width());
231 EXPECT_FLOAT_EQ(284.0f, a2.height());
232}
233
234TEST(FloatSize, Negation)
235{
236 WebCore::FloatSize a(512.0f, 384.0f);
237
238 WebCore::FloatSize negated = -a;
239
240 EXPECT_FLOAT_EQ(-512.0f, negated.width());
241 EXPECT_FLOAT_EQ(-384.0f, negated.height());
242}
243
244TEST(FloatSize, Multiply)
245{
246 WebCore::FloatSize a(512.0f, 384.0f);
247
248 WebCore::FloatSize multiplied = a * 2.0f;
249
250 EXPECT_FLOAT_EQ(1024.0f, multiplied.width());
251 EXPECT_FLOAT_EQ(768.0f, multiplied.height());
252
253 WebCore::FloatSize multiplied2 = 3.0f * a;
254
255 EXPECT_FLOAT_EQ(1536.0f, multiplied2.width());
256 EXPECT_FLOAT_EQ(1152.0f, multiplied2.height());
257
258 WebCore::FloatSize b(1024.0f, 768.0f);
259
260 WebCore::FloatSize multiplied3 = a * b;
261
262 EXPECT_FLOAT_EQ(524288.0f, multiplied3.width());
263 EXPECT_FLOAT_EQ(294912.0f, multiplied3.height());
264}
265
266TEST(FloatSize, Divide)
267{
268 WebCore::FloatSize a(1024.0f, 768.0f);
269
270 WebCore::FloatSize divided = a / 2.0f;
271
272 EXPECT_FLOAT_EQ(512.0f, divided.width());
273 EXPECT_FLOAT_EQ(384.0f, divided.height());
274
275 WebCore::FloatSize b(512.0f, 256.0f);
276
277 WebCore::FloatSize divided2 = 1024.0f / b;
278
279 EXPECT_FLOAT_EQ(2.0f, divided2.width());
280 EXPECT_FLOAT_EQ(4.0f, divided2.height());
281}
282
283TEST(FloatSize, Equality)
284{
285 WebCore::FloatSize a(1024.0f, 768.0f);
286 WebCore::FloatSize b(1024.0f, 768.0f);
287 WebCore::FloatSize c(768.0f, 534.0F);
288
289 ASSERT_TRUE(a == b);
290 ASSERT_FALSE(a != b);
291 ASSERT_FALSE(a == c);
292 ASSERT_TRUE(a != c);
293
294 ASSERT_TRUE(WebCore::areEssentiallyEqual(a, b));
295 ASSERT_FALSE(WebCore::areEssentiallyEqual(a, c));
296}
297
298TEST(FloatSize, Floors)
299{
300 WebCore::FloatSize a(1024.4f, 768.8f);
301
302 WebCore::IntSize floorSize = WebCore::flooredIntSize(a);
303
304 EXPECT_EQ(1024, floorSize.width());
305 EXPECT_EQ(768, floorSize.height());
306
307 WebCore::IntPoint floorPoint = WebCore::flooredIntPoint(a);
308
309 EXPECT_EQ(1024, floorPoint.x());
310 EXPECT_EQ(768, floorPoint.y());
311}
312
313TEST(FloatSize, Rounded)
314{
315 WebCore::FloatSize a(1024.4f, 768.8f);
316
317 WebCore::IntSize roundedSize = WebCore::roundedIntSize(a);
318
319 EXPECT_EQ(1024, roundedSize.width());
320 EXPECT_EQ(769, roundedSize.height());
321
322 WebCore::IntSize expandedSize = WebCore::expandedIntSize(a);
323
324 EXPECT_EQ(1025, expandedSize.width());
325 EXPECT_EQ(769, expandedSize.height());
326}
327
328}
329