Home | History | Annotate | Download | only in css
      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