1/*
2 * Copyright (C) 2016-2017 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 "Test.h"
29#include <WebCore/HTMLParserIdioms.h>
30#include <wtf/text/WTFString.h>
31
32using namespace WebCore;
33
34namespace TestWebKitAPI {
35
36static int testParseHTMLInteger(const String& input)
37{
38 auto optionalResult = parseHTMLInteger(input);
39 EXPECT_TRUE(!!optionalResult);
40 return optionalResult.value_or(0);
41}
42
43static bool parseHTMLIntegerFails(const String& input)
44{
45 return !parseHTMLInteger(input);
46}
47
48TEST(WebCoreHTMLParserIdioms, parseHTMLInteger)
49{
50 EXPECT_EQ(0, testParseHTMLInteger("0"));
51 EXPECT_EQ(0, testParseHTMLInteger("-0"));
52 EXPECT_EQ(0, testParseHTMLInteger("+0"));
53 EXPECT_EQ(123, testParseHTMLInteger("123"));
54 EXPECT_EQ(123, testParseHTMLInteger("+123"));
55 EXPECT_EQ(-123, testParseHTMLInteger("-123"));
56 EXPECT_EQ(123, testParseHTMLInteger(" 123"));
57 EXPECT_EQ(123, testParseHTMLInteger("123 "));
58 EXPECT_EQ(123, testParseHTMLInteger(" 123 "));
59 EXPECT_EQ(123, testParseHTMLInteger("123abc"));
60 EXPECT_EQ(-123, testParseHTMLInteger("-123abc"));
61 EXPECT_EQ(123, testParseHTMLInteger(" +123"));
62 EXPECT_EQ(-123, testParseHTMLInteger(" -123"));
63 EXPECT_EQ(12, testParseHTMLInteger(" 12 3"));
64 EXPECT_EQ(1, testParseHTMLInteger("1.0"));
65 EXPECT_EQ(1, testParseHTMLInteger("1."));
66 EXPECT_EQ(1, testParseHTMLInteger("1e1"));
67
68 // All HTML whitespaces.
69 EXPECT_EQ(123, testParseHTMLInteger(" \t\r\n\f123"));
70
71 // Boundaries.
72 EXPECT_EQ(-2147483648, testParseHTMLInteger("-2147483648"));
73 EXPECT_EQ(2147483647, testParseHTMLInteger("2147483647"));
74
75 // Failure cases.
76 EXPECT_TRUE(parseHTMLIntegerFails("-2147483649"));
77 EXPECT_TRUE(parseHTMLIntegerFails("2147483648"));
78 EXPECT_TRUE(parseHTMLIntegerFails("111111111111111111"));
79 EXPECT_TRUE(parseHTMLIntegerFails(""));
80 EXPECT_TRUE(parseHTMLIntegerFails(" "));
81 EXPECT_TRUE(parseHTMLIntegerFails(" "));
82 EXPECT_TRUE(parseHTMLIntegerFails("+"));
83 EXPECT_TRUE(parseHTMLIntegerFails("+ 123"));
84 EXPECT_TRUE(parseHTMLIntegerFails("-"));
85 EXPECT_TRUE(parseHTMLIntegerFails("- 123"));
86 EXPECT_TRUE(parseHTMLIntegerFails("a"));
87 EXPECT_TRUE(parseHTMLIntegerFails("-a"));
88 EXPECT_TRUE(parseHTMLIntegerFails("+-123"));
89 EXPECT_TRUE(parseHTMLIntegerFails("-+123"));
90 EXPECT_TRUE(parseHTMLIntegerFails("++123"));
91 EXPECT_TRUE(parseHTMLIntegerFails("--123"));
92 EXPECT_TRUE(parseHTMLIntegerFails("\v123")); // '\v' is an ASCII space but not an HTML whitespace.
93 EXPECT_TRUE(parseHTMLIntegerFails("a123"));
94 EXPECT_TRUE(parseHTMLIntegerFails("+a123"));
95 EXPECT_TRUE(parseHTMLIntegerFails("-a123"));
96 EXPECT_TRUE(parseHTMLIntegerFails(".1"));
97 EXPECT_TRUE(parseHTMLIntegerFails("infinity"));
98}
99
100static unsigned testParseHTMLNonNegativeInteger(const String& input)
101{
102 auto optionalResult = parseHTMLNonNegativeInteger(input);
103 EXPECT_TRUE(!!optionalResult);
104 return optionalResult.value_or(0);
105}
106
107static bool parseHTMLNonNegativeIntegerFails(const String& input)
108{
109 return !parseHTMLNonNegativeInteger(input);
110}
111
112TEST(WebCoreHTMLParserIdioms, parseHTMLNonNegativeInteger)
113{
114 EXPECT_EQ(123u, testParseHTMLNonNegativeInteger("123"));
115 EXPECT_EQ(123u, testParseHTMLNonNegativeInteger("+123"));
116 EXPECT_EQ(123u, testParseHTMLNonNegativeInteger(" 123"));
117 EXPECT_EQ(123u, testParseHTMLNonNegativeInteger("123 "));
118 EXPECT_EQ(123u, testParseHTMLNonNegativeInteger(" 123 "));
119 EXPECT_EQ(123u, testParseHTMLNonNegativeInteger("123abc"));
120 EXPECT_EQ(123u, testParseHTMLNonNegativeInteger(" +123"));
121 EXPECT_EQ(12u, testParseHTMLNonNegativeInteger(" 12 3"));
122 EXPECT_EQ(1u, testParseHTMLNonNegativeInteger("1.0"));
123 EXPECT_EQ(1u, testParseHTMLNonNegativeInteger("1."));
124 EXPECT_EQ(1u, testParseHTMLNonNegativeInteger("1e1"));
125
126 // All HTML whitespaces.
127 EXPECT_EQ(123u, testParseHTMLNonNegativeInteger(" \t\r\n\f123"));
128
129 // Boundaries.
130 EXPECT_EQ(0u, testParseHTMLNonNegativeInteger("+0"));
131 EXPECT_EQ(0u, testParseHTMLNonNegativeInteger("0"));
132 EXPECT_EQ(0u, testParseHTMLNonNegativeInteger("-0"));
133 EXPECT_EQ(2147483647u, testParseHTMLNonNegativeInteger("2147483647"));
134
135 // Failure cases.
136 EXPECT_TRUE(parseHTMLNonNegativeIntegerFails("-1"));
137 EXPECT_TRUE(parseHTMLNonNegativeIntegerFails("2147483648"));
138 EXPECT_TRUE(parseHTMLNonNegativeIntegerFails("2147483649"));
139 EXPECT_TRUE(parseHTMLNonNegativeIntegerFails("111111111111111111"));
140 EXPECT_TRUE(parseHTMLNonNegativeIntegerFails(" -123"));
141 EXPECT_TRUE(parseHTMLNonNegativeIntegerFails("-123"));
142 EXPECT_TRUE(parseHTMLNonNegativeIntegerFails("-123abc"));
143 EXPECT_TRUE(parseHTMLNonNegativeIntegerFails(""));
144 EXPECT_TRUE(parseHTMLNonNegativeIntegerFails(" "));
145 EXPECT_TRUE(parseHTMLNonNegativeIntegerFails(" "));
146 EXPECT_TRUE(parseHTMLNonNegativeIntegerFails("+"));
147 EXPECT_TRUE(parseHTMLNonNegativeIntegerFails("+ 123"));
148 EXPECT_TRUE(parseHTMLNonNegativeIntegerFails("-"));
149 EXPECT_TRUE(parseHTMLNonNegativeIntegerFails("- 123"));
150 EXPECT_TRUE(parseHTMLNonNegativeIntegerFails("a"));
151 EXPECT_TRUE(parseHTMLNonNegativeIntegerFails("-a"));
152 EXPECT_TRUE(parseHTMLNonNegativeIntegerFails("+-123"));
153 EXPECT_TRUE(parseHTMLNonNegativeIntegerFails("-+123"));
154 EXPECT_TRUE(parseHTMLNonNegativeIntegerFails("++123"));
155 EXPECT_TRUE(parseHTMLNonNegativeIntegerFails("--123"));
156 EXPECT_TRUE(parseHTMLNonNegativeIntegerFails("\v123")); // '\v' is an ASCII space but not an HTML whitespace.
157 EXPECT_TRUE(parseHTMLNonNegativeIntegerFails("a123"));
158 EXPECT_TRUE(parseHTMLNonNegativeIntegerFails("+a123"));
159 EXPECT_TRUE(parseHTMLNonNegativeIntegerFails("-a123"));
160 EXPECT_TRUE(parseHTMLNonNegativeIntegerFails(".1"));
161 EXPECT_TRUE(parseHTMLNonNegativeIntegerFails("infinity"));
162}
163
164} // namespace TestWebKitAPI
165