1 // Copyright 2017 The PDFium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #include "core/fxcrt/css/cfx_cssvaluelistparser.h"
8
9 #include <memory>
10
11 #include "core/fxcrt/widestring.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13
TEST(CFX_CSSValueListParserTest,rgb_short)14 TEST(CFX_CSSValueListParserTest, rgb_short) {
15 CFX_CSSValue::PrimitiveType type;
16 const wchar_t* start;
17 size_t len;
18
19 auto parser = std::make_unique<CFX_CSSValueListParser>(L"#abc", 4, L' ');
20 EXPECT_TRUE(parser->NextValue(&type, &start, &len));
21 EXPECT_EQ(CFX_CSSValue::PrimitiveType::kRGB, type);
22 EXPECT_EQ(L"#abc", WideString(start, len));
23 EXPECT_FALSE(parser->NextValue(&type, &start, &len));
24
25 parser = std::make_unique<CFX_CSSValueListParser>(L"#abcdef", 7, L' ');
26 EXPECT_TRUE(parser->NextValue(&type, &start, &len));
27 EXPECT_EQ(CFX_CSSValue::PrimitiveType::kRGB, type);
28 EXPECT_EQ(L"#abcdef", WideString(start, len));
29 EXPECT_FALSE(parser->NextValue(&type, &start, &len));
30
31 parser =
32 std::make_unique<CFX_CSSValueListParser>(L"rgb(1, 255, 4)", 14, L' ');
33 EXPECT_TRUE(parser->NextValue(&type, &start, &len));
34 EXPECT_EQ(CFX_CSSValue::PrimitiveType::kRGB, type);
35 EXPECT_EQ(L"rgb(1, 255, 4)", WideString(start, len));
36
37 parser = std::make_unique<CFX_CSSValueListParser>(L"#abcdefghij", 11, L' ');
38 EXPECT_TRUE(parser->NextValue(&type, &start, &len));
39 EXPECT_EQ(CFX_CSSValue::PrimitiveType::kUnknown, type);
40 EXPECT_EQ(L"#abcdefghij", WideString(start, len));
41 EXPECT_FALSE(parser->NextValue(&type, &start, &len));
42 }
43
TEST(CFX_CSSValueListParserTest,number_parsing)44 TEST(CFX_CSSValueListParserTest, number_parsing) {
45 CFX_CSSValue::PrimitiveType type;
46 const wchar_t* start;
47 size_t len;
48
49 auto parser = std::make_unique<CFX_CSSValueListParser>(L"1234", 4, L' ');
50 EXPECT_TRUE(parser->NextValue(&type, &start, &len));
51 EXPECT_EQ(CFX_CSSValue::PrimitiveType::kNumber, type);
52 EXPECT_EQ(L"1234", WideString(start, len));
53
54 parser = std::make_unique<CFX_CSSValueListParser>(L"-1234", 5, L' ');
55 EXPECT_TRUE(parser->NextValue(&type, &start, &len));
56 EXPECT_EQ(CFX_CSSValue::PrimitiveType::kNumber, type);
57 EXPECT_EQ(L"-1234", WideString(start, len));
58
59 parser = std::make_unique<CFX_CSSValueListParser>(L"+1234", 5, L' ');
60 EXPECT_TRUE(parser->NextValue(&type, &start, &len));
61 EXPECT_EQ(CFX_CSSValue::PrimitiveType::kNumber, type);
62 EXPECT_EQ(L"+1234", WideString(start, len));
63
64 parser = std::make_unique<CFX_CSSValueListParser>(L".1234", 5, L' ');
65 EXPECT_TRUE(parser->NextValue(&type, &start, &len));
66 EXPECT_EQ(CFX_CSSValue::PrimitiveType::kNumber, type);
67 EXPECT_EQ(L".1234", WideString(start, len));
68
69 parser = std::make_unique<CFX_CSSValueListParser>(L"4321.1234", 9, L' ');
70 EXPECT_TRUE(parser->NextValue(&type, &start, &len));
71 EXPECT_EQ(CFX_CSSValue::PrimitiveType::kNumber, type);
72 EXPECT_EQ(L"4321.1234", WideString(start, len));
73
74 // TODO(dsinclair): These should probably fail but currently don't.
75 parser = std::make_unique<CFX_CSSValueListParser>(L"4321.12.34", 10, L' ');
76 EXPECT_TRUE(parser->NextValue(&type, &start, &len));
77 EXPECT_EQ(CFX_CSSValue::PrimitiveType::kNumber, type);
78 EXPECT_EQ(L"4321.12.34", WideString(start, len));
79
80 parser = std::make_unique<CFX_CSSValueListParser>(L"43a1.12.34", 10, L' ');
81 EXPECT_TRUE(parser->NextValue(&type, &start, &len));
82 EXPECT_EQ(CFX_CSSValue::PrimitiveType::kNumber, type);
83 EXPECT_EQ(L"43a1.12.34", WideString(start, len));
84 }
85
TEST(CFX_CSSValueListParserTest,string_parsing)86 TEST(CFX_CSSValueListParserTest, string_parsing) {
87 CFX_CSSValue::PrimitiveType type;
88 const wchar_t* start;
89 size_t len;
90
91 auto parser = std::make_unique<CFX_CSSValueListParser>(L"'string'", 8, L' ');
92 EXPECT_TRUE(parser->NextValue(&type, &start, &len));
93 EXPECT_EQ(CFX_CSSValue::PrimitiveType::kString, type);
94 EXPECT_EQ(L"string", WideString(start, len));
95
96 parser =
97 std::make_unique<CFX_CSSValueListParser>(L"\"another string\"", 16, L' ');
98 EXPECT_TRUE(parser->NextValue(&type, &start, &len));
99 EXPECT_EQ(CFX_CSSValue::PrimitiveType::kString, type);
100 EXPECT_EQ(L"another string", WideString(start, len));
101
102 parser = std::make_unique<CFX_CSSValueListParser>(L"standalone", 10, L' ');
103 EXPECT_TRUE(parser->NextValue(&type, &start, &len));
104 EXPECT_EQ(CFX_CSSValue::PrimitiveType::kString, type);
105 EXPECT_EQ(L"standalone", WideString(start, len));
106 }
107
TEST(CFX_CSSValueListParserTest,multiparsing)108 TEST(CFX_CSSValueListParserTest, multiparsing) {
109 CFX_CSSValue::PrimitiveType type;
110 const wchar_t* start;
111 size_t len;
112
113 auto parser = std::make_unique<CFX_CSSValueListParser>(L"1, 2, 3", 7, L',');
114 EXPECT_TRUE(parser->NextValue(&type, &start, &len));
115 EXPECT_EQ(CFX_CSSValue::PrimitiveType::kNumber, type);
116 EXPECT_EQ(L"1", WideString(start, len));
117
118 EXPECT_TRUE(parser->NextValue(&type, &start, &len));
119 EXPECT_EQ(CFX_CSSValue::PrimitiveType::kNumber, type);
120 EXPECT_EQ(L"2", WideString(start, len));
121
122 EXPECT_TRUE(parser->NextValue(&type, &start, &len));
123 EXPECT_EQ(CFX_CSSValue::PrimitiveType::kNumber, type);
124 EXPECT_EQ(L"3", WideString(start, len));
125
126 EXPECT_FALSE(parser->NextValue(&type, &start, &len));
127
128 parser = std::make_unique<CFX_CSSValueListParser>(L"'str', rgb(1, 2, 3), 4",
129 22, L',');
130 EXPECT_TRUE(parser->NextValue(&type, &start, &len));
131 EXPECT_EQ(CFX_CSSValue::PrimitiveType::kString, type);
132 EXPECT_EQ(L"str", WideString(start, len));
133
134 EXPECT_TRUE(parser->NextValue(&type, &start, &len));
135 EXPECT_EQ(CFX_CSSValue::PrimitiveType::kRGB, type);
136 EXPECT_EQ(L"rgb(1, 2, 3)", WideString(start, len));
137
138 EXPECT_TRUE(parser->NextValue(&type, &start, &len));
139 EXPECT_EQ(CFX_CSSValue::PrimitiveType::kNumber, type);
140 EXPECT_EQ(L"4", WideString(start, len));
141 }
142