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 | |
32 | using namespace WebCore; |
33 | |
34 | namespace TestWebKitAPI { |
35 | |
36 | static int testParseHTMLInteger(const String& input) |
37 | { |
38 | auto optionalResult = parseHTMLInteger(input); |
39 | EXPECT_TRUE(!!optionalResult); |
40 | return optionalResult.value_or(0); |
41 | } |
42 | |
43 | static bool parseHTMLIntegerFails(const String& input) |
44 | { |
45 | return !parseHTMLInteger(input); |
46 | } |
47 | |
48 | TEST(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 | |
100 | static unsigned testParseHTMLNonNegativeInteger(const String& input) |
101 | { |
102 | auto optionalResult = parseHTMLNonNegativeInteger(input); |
103 | EXPECT_TRUE(!!optionalResult); |
104 | return optionalResult.value_or(0); |
105 | } |
106 | |
107 | static bool parseHTMLNonNegativeIntegerFails(const String& input) |
108 | { |
109 | return !parseHTMLNonNegativeInteger(input); |
110 | } |
111 | |
112 | TEST(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 | |