// Copyright 2017 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#include "xfa/fde/css/cfde_cssvaluelistparser.h"

#include "testing/gtest/include/gtest/gtest.h"
#include "testing/test_support.h"
#include "third_party/base/ptr_util.h"

class CFDE_CSSValueListParserTest : public pdfium::FPDF_Test {};

TEST_F(CFDE_CSSValueListParserTest, rgb_short) {
  FDE_CSSPrimitiveType type;
  const wchar_t* start;
  int32_t len;

  auto parser = pdfium::MakeUnique<CFDE_CSSValueListParser>(L"#abc", 4, L' ');
  EXPECT_TRUE(parser->NextValue(type, start, len));
  EXPECT_EQ(FDE_CSSPrimitiveType::RGB, type);
  EXPECT_EQ(L"#abc", CFX_WideString(start, len));
  EXPECT_FALSE(parser->NextValue(type, start, len));

  parser = pdfium::MakeUnique<CFDE_CSSValueListParser>(L"#abcdef", 7, L' ');
  EXPECT_TRUE(parser->NextValue(type, start, len));
  EXPECT_EQ(FDE_CSSPrimitiveType::RGB, type);
  EXPECT_EQ(L"#abcdef", CFX_WideString(start, len));
  EXPECT_FALSE(parser->NextValue(type, start, len));

  parser =
      pdfium::MakeUnique<CFDE_CSSValueListParser>(L"rgb(1, 255, 4)", 14, L' ');
  EXPECT_TRUE(parser->NextValue(type, start, len));
  EXPECT_EQ(FDE_CSSPrimitiveType::RGB, type);
  EXPECT_EQ(L"rgb(1, 255, 4)", CFX_WideString(start, len));

  parser =
      pdfium::MakeUnique<CFDE_CSSValueListParser>(L"#abcdefghij", 11, L' ');
  EXPECT_TRUE(parser->NextValue(type, start, len));
  EXPECT_EQ(FDE_CSSPrimitiveType::Unknown, type);
  EXPECT_EQ(L"#abcdefghij", CFX_WideString(start, len));
  EXPECT_FALSE(parser->NextValue(type, start, len));
}

TEST_F(CFDE_CSSValueListParserTest, number_parsing) {
  FDE_CSSPrimitiveType type;
  const wchar_t* start;
  int32_t len;

  auto parser = pdfium::MakeUnique<CFDE_CSSValueListParser>(L"1234", 4, L' ');
  EXPECT_TRUE(parser->NextValue(type, start, len));
  EXPECT_EQ(FDE_CSSPrimitiveType::Number, type);
  EXPECT_EQ(L"1234", CFX_WideString(start, len));

  parser = pdfium::MakeUnique<CFDE_CSSValueListParser>(L"-1234", 5, L' ');
  EXPECT_TRUE(parser->NextValue(type, start, len));
  EXPECT_EQ(FDE_CSSPrimitiveType::Number, type);
  EXPECT_EQ(L"-1234", CFX_WideString(start, len));

  parser = pdfium::MakeUnique<CFDE_CSSValueListParser>(L"+1234", 5, L' ');
  EXPECT_TRUE(parser->NextValue(type, start, len));
  EXPECT_EQ(FDE_CSSPrimitiveType::Number, type);
  EXPECT_EQ(L"+1234", CFX_WideString(start, len));

  parser = pdfium::MakeUnique<CFDE_CSSValueListParser>(L".1234", 5, L' ');
  EXPECT_TRUE(parser->NextValue(type, start, len));
  EXPECT_EQ(FDE_CSSPrimitiveType::Number, type);
  EXPECT_EQ(L".1234", CFX_WideString(start, len));

  parser = pdfium::MakeUnique<CFDE_CSSValueListParser>(L"4321.1234", 9, L' ');
  EXPECT_TRUE(parser->NextValue(type, start, len));
  EXPECT_EQ(FDE_CSSPrimitiveType::Number, type);
  EXPECT_EQ(L"4321.1234", CFX_WideString(start, len));

  // TODO(dsinclair): These should probably fail but currently don't.
  parser = pdfium::MakeUnique<CFDE_CSSValueListParser>(L"4321.12.34", 10, L' ');
  EXPECT_TRUE(parser->NextValue(type, start, len));
  EXPECT_EQ(FDE_CSSPrimitiveType::Number, type);
  EXPECT_EQ(L"4321.12.34", CFX_WideString(start, len));

  parser = pdfium::MakeUnique<CFDE_CSSValueListParser>(L"43a1.12.34", 10, L' ');
  EXPECT_TRUE(parser->NextValue(type, start, len));
  EXPECT_EQ(FDE_CSSPrimitiveType::Number, type);
  EXPECT_EQ(L"43a1.12.34", CFX_WideString(start, len));
}

TEST_F(CFDE_CSSValueListParserTest, string_parsing) {
  FDE_CSSPrimitiveType type;
  const wchar_t* start;
  int32_t len;

  auto parser =
      pdfium::MakeUnique<CFDE_CSSValueListParser>(L"'string'", 8, L' ');
  EXPECT_TRUE(parser->NextValue(type, start, len));
  EXPECT_EQ(FDE_CSSPrimitiveType::String, type);
  EXPECT_EQ(L"string", CFX_WideString(start, len));

  parser = pdfium::MakeUnique<CFDE_CSSValueListParser>(L"\"another string\"",
                                                       16, L' ');
  EXPECT_TRUE(parser->NextValue(type, start, len));
  EXPECT_EQ(FDE_CSSPrimitiveType::String, type);
  EXPECT_EQ(L"another string", CFX_WideString(start, len));

  parser = pdfium::MakeUnique<CFDE_CSSValueListParser>(L"standalone", 10, L' ');
  EXPECT_TRUE(parser->NextValue(type, start, len));
  EXPECT_EQ(FDE_CSSPrimitiveType::String, type);
  EXPECT_EQ(L"standalone", CFX_WideString(start, len));
}

TEST_F(CFDE_CSSValueListParserTest, multiparsing) {
  FDE_CSSPrimitiveType type;
  const wchar_t* start;
  int32_t len;

  auto parser =
      pdfium::MakeUnique<CFDE_CSSValueListParser>(L"1, 2, 3", 7, L',');
  EXPECT_TRUE(parser->NextValue(type, start, len));
  EXPECT_EQ(FDE_CSSPrimitiveType::Number, type);
  EXPECT_EQ(L"1", CFX_WideString(start, len));

  EXPECT_TRUE(parser->NextValue(type, start, len));
  EXPECT_EQ(FDE_CSSPrimitiveType::Number, type);
  EXPECT_EQ(L"2", CFX_WideString(start, len));

  EXPECT_TRUE(parser->NextValue(type, start, len));
  EXPECT_EQ(FDE_CSSPrimitiveType::Number, type);
  EXPECT_EQ(L"3", CFX_WideString(start, len));

  EXPECT_FALSE(parser->NextValue(type, start, len));

  parser = pdfium::MakeUnique<CFDE_CSSValueListParser>(
      L"'str', rgb(1, 2, 3), 4", 22, L',');
  EXPECT_TRUE(parser->NextValue(type, start, len));
  EXPECT_EQ(FDE_CSSPrimitiveType::String, type);
  EXPECT_EQ(L"str", CFX_WideString(start, len));

  EXPECT_TRUE(parser->NextValue(type, start, len));
  EXPECT_EQ(FDE_CSSPrimitiveType::RGB, type);
  EXPECT_EQ(L"rgb(1, 2, 3)", CFX_WideString(start, len));

  EXPECT_TRUE(parser->NextValue(type, start, len));
  EXPECT_EQ(FDE_CSSPrimitiveType::Number, type);
  EXPECT_EQ(L"4", CFX_WideString(start, len));
}
