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