1 // Copyright 2017 PDFium Authors. All rights reserved.
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 "xfa/fde/css/cfde_cssvaluelistparser.h"
8
9 #include "testing/gtest/include/gtest/gtest.h"
10 #include "third_party/base/ptr_util.h"
11
TEST(CFDE_CSSValueListParser,rgb_short)12 TEST(CFDE_CSSValueListParser, rgb_short) {
13 FDE_CSSPrimitiveType type;
14 const FX_WCHAR* start;
15 int32_t len;
16
17 auto parser = pdfium::MakeUnique<CFDE_CSSValueListParser>(L"#abc", 4, L' ');
18 EXPECT_TRUE(parser->NextValue(type, start, len));
19 EXPECT_EQ(FDE_CSSPrimitiveType::RGB, type);
20 EXPECT_EQ(L"#abc", CFX_WideString(start, len));
21 EXPECT_FALSE(parser->NextValue(type, start, len));
22
23 parser = pdfium::MakeUnique<CFDE_CSSValueListParser>(L"#abcdef", 7, L' ');
24 EXPECT_TRUE(parser->NextValue(type, start, len));
25 EXPECT_EQ(FDE_CSSPrimitiveType::RGB, type);
26 EXPECT_EQ(L"#abcdef", CFX_WideString(start, len));
27 EXPECT_FALSE(parser->NextValue(type, start, len));
28
29 parser =
30 pdfium::MakeUnique<CFDE_CSSValueListParser>(L"rgb(1, 255, 4)", 14, L' ');
31 EXPECT_TRUE(parser->NextValue(type, start, len));
32 EXPECT_EQ(FDE_CSSPrimitiveType::RGB, type);
33 EXPECT_EQ(L"rgb(1, 255, 4)", CFX_WideString(start, len));
34
35 parser =
36 pdfium::MakeUnique<CFDE_CSSValueListParser>(L"#abcdefghij", 11, L' ');
37 EXPECT_TRUE(parser->NextValue(type, start, len));
38 EXPECT_EQ(FDE_CSSPrimitiveType::Unknown, type);
39 EXPECT_EQ(L"#abcdefghij", CFX_WideString(start, len));
40 EXPECT_FALSE(parser->NextValue(type, start, len));
41 }
42
TEST(CFDE_CSSValueListParser,number_parsing)43 TEST(CFDE_CSSValueListParser, number_parsing) {
44 FDE_CSSPrimitiveType type;
45 const FX_WCHAR* start;
46 int32_t len;
47
48 auto parser = pdfium::MakeUnique<CFDE_CSSValueListParser>(L"1234", 4, L' ');
49 EXPECT_TRUE(parser->NextValue(type, start, len));
50 EXPECT_EQ(FDE_CSSPrimitiveType::Number, type);
51 EXPECT_EQ(L"1234", CFX_WideString(start, len));
52
53 parser = pdfium::MakeUnique<CFDE_CSSValueListParser>(L"-1234", 5, L' ');
54 EXPECT_TRUE(parser->NextValue(type, start, len));
55 EXPECT_EQ(FDE_CSSPrimitiveType::Number, type);
56 EXPECT_EQ(L"-1234", CFX_WideString(start, len));
57
58 parser = pdfium::MakeUnique<CFDE_CSSValueListParser>(L"+1234", 5, L' ');
59 EXPECT_TRUE(parser->NextValue(type, start, len));
60 EXPECT_EQ(FDE_CSSPrimitiveType::Number, type);
61 EXPECT_EQ(L"+1234", CFX_WideString(start, len));
62
63 parser = pdfium::MakeUnique<CFDE_CSSValueListParser>(L".1234", 5, L' ');
64 EXPECT_TRUE(parser->NextValue(type, start, len));
65 EXPECT_EQ(FDE_CSSPrimitiveType::Number, type);
66 EXPECT_EQ(L".1234", CFX_WideString(start, len));
67
68 parser = pdfium::MakeUnique<CFDE_CSSValueListParser>(L"4321.1234", 9, L' ');
69 EXPECT_TRUE(parser->NextValue(type, start, len));
70 EXPECT_EQ(FDE_CSSPrimitiveType::Number, type);
71 EXPECT_EQ(L"4321.1234", CFX_WideString(start, len));
72
73 // TODO(dsinclair): These should probably fail but currently don't.
74 parser = pdfium::MakeUnique<CFDE_CSSValueListParser>(L"4321.12.34", 10, L' ');
75 EXPECT_TRUE(parser->NextValue(type, start, len));
76 EXPECT_EQ(FDE_CSSPrimitiveType::Number, type);
77 EXPECT_EQ(L"4321.12.34", CFX_WideString(start, len));
78
79 parser = pdfium::MakeUnique<CFDE_CSSValueListParser>(L"43a1.12.34", 10, L' ');
80 EXPECT_TRUE(parser->NextValue(type, start, len));
81 EXPECT_EQ(FDE_CSSPrimitiveType::Number, type);
82 EXPECT_EQ(L"43a1.12.34", CFX_WideString(start, len));
83 }
84
TEST(CFDE_CSSValueListParser,string_parsing)85 TEST(CFDE_CSSValueListParser, string_parsing) {
86 FDE_CSSPrimitiveType type;
87 const FX_WCHAR* start;
88 int32_t len;
89
90 auto parser =
91 pdfium::MakeUnique<CFDE_CSSValueListParser>(L"'string'", 8, L' ');
92 EXPECT_TRUE(parser->NextValue(type, start, len));
93 EXPECT_EQ(FDE_CSSPrimitiveType::String, type);
94 EXPECT_EQ(L"string", CFX_WideString(start, len));
95
96 parser = pdfium::MakeUnique<CFDE_CSSValueListParser>(L"\"another string\"",
97 16, L' ');
98 EXPECT_TRUE(parser->NextValue(type, start, len));
99 EXPECT_EQ(FDE_CSSPrimitiveType::String, type);
100 EXPECT_EQ(L"another string", CFX_WideString(start, len));
101
102 parser = pdfium::MakeUnique<CFDE_CSSValueListParser>(L"standalone", 10, L' ');
103 EXPECT_TRUE(parser->NextValue(type, start, len));
104 EXPECT_EQ(FDE_CSSPrimitiveType::String, type);
105 EXPECT_EQ(L"standalone", CFX_WideString(start, len));
106 }
107
TEST(CFDE_CSSValueListParser,multiparsing)108 TEST(CFDE_CSSValueListParser, multiparsing) {
109 FDE_CSSPrimitiveType type;
110 const FX_WCHAR* start;
111 int32_t len;
112
113 auto parser =
114 pdfium::MakeUnique<CFDE_CSSValueListParser>(L"1, 2, 3", 7, L',');
115 EXPECT_TRUE(parser->NextValue(type, start, len));
116 EXPECT_EQ(FDE_CSSPrimitiveType::Number, type);
117 EXPECT_EQ(L"1", CFX_WideString(start, len));
118
119 EXPECT_TRUE(parser->NextValue(type, start, len));
120 EXPECT_EQ(FDE_CSSPrimitiveType::Number, type);
121 EXPECT_EQ(L"2", CFX_WideString(start, len));
122
123 EXPECT_TRUE(parser->NextValue(type, start, len));
124 EXPECT_EQ(FDE_CSSPrimitiveType::Number, type);
125 EXPECT_EQ(L"3", CFX_WideString(start, len));
126
127 EXPECT_FALSE(parser->NextValue(type, start, len));
128
129 parser = pdfium::MakeUnique<CFDE_CSSValueListParser>(
130 L"'str', rgb(1, 2, 3), 4", 22, L',');
131 EXPECT_TRUE(parser->NextValue(type, start, len));
132 EXPECT_EQ(FDE_CSSPrimitiveType::String, type);
133 EXPECT_EQ(L"str", CFX_WideString(start, len));
134
135 EXPECT_TRUE(parser->NextValue(type, start, len));
136 EXPECT_EQ(FDE_CSSPrimitiveType::RGB, type);
137 EXPECT_EQ(L"rgb(1, 2, 3)", CFX_WideString(start, len));
138
139 EXPECT_TRUE(parser->NextValue(type, start, len));
140 EXPECT_EQ(FDE_CSSPrimitiveType::Number, type);
141 EXPECT_EQ(L"4", CFX_WideString(start, len));
142 }
143