1/*
2 * Copyright (C) 2013 Google 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 are
6 * met:
7 *
8 *     * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *     * Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the
13 * distribution.
14 *     * Neither the name of Google Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31#include "config.h"
32#include "core/html/HTMLDimension.h"
33
34#include "wtf/text/WTFString.h"
35#include <gtest/gtest.h>
36
37namespace blink {
38
39// This assertion-prettify function needs to be in the WebCore namespace.
40void PrintTo(const HTMLDimension& dimension, ::std::ostream* os)
41{
42    *os << "HTMLDimension => type: " << dimension.type() << ", value=" << dimension.value();
43}
44
45}
46
47using namespace blink;
48
49namespace {
50
51TEST(WebCoreHTMLDimension, parseListOfDimensionsEmptyString)
52{
53    Vector<HTMLDimension> result = parseListOfDimensions(String(""));
54    ASSERT_EQ(Vector<HTMLDimension>(), result);
55}
56
57TEST(WebCoreHTMLDimension, parseListOfDimensionsNoNumberAbsolute)
58{
59    Vector<HTMLDimension> result = parseListOfDimensions(String(" \t"));
60    ASSERT_EQ(1U, result.size());
61    ASSERT_EQ(HTMLDimension(0, HTMLDimension::Relative), result[0]);
62}
63
64TEST(WebCoreHTMLDimension, parseListOfDimensionsNoNumberPercent)
65{
66    Vector<HTMLDimension> result = parseListOfDimensions(String(" \t%"));
67    ASSERT_EQ(1U, result.size());
68    ASSERT_EQ(HTMLDimension(0, HTMLDimension::Percentage), result[0]);
69}
70
71TEST(WebCoreHTMLDimension, parseListOfDimensionsNoNumberRelative)
72{
73    Vector<HTMLDimension> result = parseListOfDimensions(String("\t *"));
74    ASSERT_EQ(1U, result.size());
75    ASSERT_EQ(HTMLDimension(0, HTMLDimension::Relative), result[0]);
76}
77
78TEST(WebCoreHTMLDimension, parseListOfDimensionsSingleAbsolute)
79{
80    Vector<HTMLDimension> result = parseListOfDimensions(String("10"));
81
82    ASSERT_EQ(1U, result.size());
83    ASSERT_EQ(HTMLDimension(10, HTMLDimension::Absolute), result[0]);
84}
85
86TEST(WebCoreHTMLDimension, parseListOfDimensionsSinglePercentageWithSpaces)
87{
88    Vector<HTMLDimension> result = parseListOfDimensions(String("50  %"));
89
90    ASSERT_EQ(1U, result.size());
91    ASSERT_EQ(HTMLDimension(50, HTMLDimension::Percentage), result[0]);
92}
93
94TEST(WebCoreHTMLDimension, parseListOfDimensionsSingleRelative)
95{
96    Vector<HTMLDimension> result = parseListOfDimensions(String("25*"));
97
98    ASSERT_EQ(1U, result.size());
99    ASSERT_EQ(HTMLDimension(25, HTMLDimension::Relative), result[0]);
100}
101
102TEST(WebCoreHTMLDimension, parseListOfDimensionsDoubleAbsolute)
103{
104    Vector<HTMLDimension> result = parseListOfDimensions(String("10.054"));
105
106    ASSERT_EQ(1U, result.size());
107    ASSERT_EQ(HTMLDimension(10.054, HTMLDimension::Absolute), result[0]);
108}
109
110TEST(WebCoreHTMLDimension, parseListOfDimensionsLeadingSpaceAbsolute)
111{
112    Vector<HTMLDimension> result = parseListOfDimensions(String("\t \t 10"));
113
114    ASSERT_EQ(1U, result.size());
115    ASSERT_EQ(HTMLDimension(10, HTMLDimension::Absolute), result[0]);
116}
117
118TEST(WebCoreHTMLDimension, parseListOfDimensionsLeadingSpaceRelative)
119{
120    Vector<HTMLDimension> result = parseListOfDimensions(String(" \r25*"));
121
122    ASSERT_EQ(1U, result.size());
123    ASSERT_EQ(HTMLDimension(25, HTMLDimension::Relative), result[0]);
124}
125
126TEST(WebCoreHTMLDimension, parseListOfDimensionsLeadingSpacePercentage)
127{
128    Vector<HTMLDimension> result = parseListOfDimensions(String("\n 25%"));
129
130    ASSERT_EQ(1U, result.size());
131    ASSERT_EQ(HTMLDimension(25, HTMLDimension::Percentage), result[0]);
132}
133
134TEST(WebCoreHTMLDimension, parseListOfDimensionsDoublePercentage)
135{
136    Vector<HTMLDimension> result = parseListOfDimensions(String("10.054%"));
137
138    ASSERT_EQ(1U, result.size());
139    ASSERT_EQ(HTMLDimension(10.054, HTMLDimension::Percentage), result[0]);
140}
141
142TEST(WebCoreHTMLDimension, parseListOfDimensionsDoubleRelative)
143{
144    Vector<HTMLDimension> result = parseListOfDimensions(String("10.054*"));
145
146    ASSERT_EQ(1U, result.size());
147    ASSERT_EQ(HTMLDimension(10.054, HTMLDimension::Relative), result[0]);
148}
149
150TEST(WebCoreHTMLDimension, parseListOfDimensionsSpacesInIntegerDoubleAbsolute)
151{
152    Vector<HTMLDimension> result = parseListOfDimensions(String("1\n0 .025%"));
153
154    ASSERT_EQ(1U, result.size());
155    ASSERT_EQ(HTMLDimension(1, HTMLDimension::Absolute), result[0]);
156}
157
158TEST(WebCoreHTMLDimension, parseListOfDimensionsSpacesInIntegerDoublePercent)
159{
160    Vector<HTMLDimension> result = parseListOfDimensions(String("1\n0 .025%"));
161
162    ASSERT_EQ(1U, result.size());
163    ASSERT_EQ(HTMLDimension(1, HTMLDimension::Absolute), result[0]);
164}
165
166TEST(WebCoreHTMLDimension, parseListOfDimensionsSpacesInIntegerDoubleRelative)
167{
168    Vector<HTMLDimension> result = parseListOfDimensions(String("1\n0 .025*"));
169
170    ASSERT_EQ(1U, result.size());
171    ASSERT_EQ(HTMLDimension(1, HTMLDimension::Absolute), result[0]);
172}
173
174TEST(WebCoreHTMLDimension, parseListOfDimensionsSpacesInFractionAfterDotDoublePercent)
175{
176    Vector<HTMLDimension> result = parseListOfDimensions(String("10.  0 25%"));
177
178    ASSERT_EQ(1U, result.size());
179    ASSERT_EQ(HTMLDimension(10.025, HTMLDimension::Percentage), result[0]);
180}
181
182TEST(WebCoreHTMLDimension, parseListOfDimensionsSpacesInFractionAfterDigitDoublePercent)
183{
184    Vector<HTMLDimension> result = parseListOfDimensions(String("10.05\r25%"));
185
186    ASSERT_EQ(1U, result.size());
187    ASSERT_EQ(HTMLDimension(10.0525, HTMLDimension::Percentage), result[0]);
188}
189
190TEST(WebCoreHTMLDimension, parseListOfDimensionsTrailingComma)
191{
192    Vector<HTMLDimension> result = parseListOfDimensions(String("10,"));
193
194    ASSERT_EQ(1U, result.size());
195    ASSERT_EQ(HTMLDimension(10, HTMLDimension::Absolute), result[0]);
196}
197
198TEST(WebCoreHTMLDimension, parseListOfDimensionsTwoDimensions)
199{
200    Vector<HTMLDimension> result = parseListOfDimensions(String("10*,25 %"));
201
202    ASSERT_EQ(2U, result.size());
203    ASSERT_EQ(HTMLDimension(10, HTMLDimension::Relative), result[0]);
204    ASSERT_EQ(HTMLDimension(25, HTMLDimension::Percentage), result[1]);
205}
206
207TEST(WebCoreHTMLDimension, parseListOfDimensionsMultipleDimensionsWithSpaces)
208{
209    Vector<HTMLDimension> result = parseListOfDimensions(String("10   *   ,\t25 , 10.05\n5%"));
210
211    ASSERT_EQ(3U, result.size());
212    ASSERT_EQ(HTMLDimension(10, HTMLDimension::Relative), result[0]);
213    ASSERT_EQ(HTMLDimension(25, HTMLDimension::Absolute), result[1]);
214    ASSERT_EQ(HTMLDimension(10.055, HTMLDimension::Percentage), result[2]);
215}
216
217TEST(WebCoreHTMLDimension, parseListOfDimensionsMultipleDimensionsWithOneEmpty)
218{
219    Vector<HTMLDimension> result = parseListOfDimensions(String("2*,,8.%"));
220
221    ASSERT_EQ(3U, result.size());
222    ASSERT_EQ(HTMLDimension(2, HTMLDimension::Relative), result[0]);
223    ASSERT_EQ(HTMLDimension(0, HTMLDimension::Relative), result[1]);
224    ASSERT_EQ(HTMLDimension(8., HTMLDimension::Percentage), result[2]);
225}
226
227}
228