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

#include "xfa/fxfa/parser/cxfa_measurement.h"

#include "testing/gtest/include/gtest/gtest.h"

TEST(CXFAMeasurementTest, ToString) {
  CXFA_Measurement measurement;

  measurement.Set(0.1f, XFA_Unit::Percent);
  EXPECT_STREQ(L"0.1%", measurement.ToString().c_str());
  measurement.Set(1.0f, XFA_Unit::Em);
  EXPECT_STREQ(L"1em", measurement.ToString().c_str());
  measurement.Set(1.1f, XFA_Unit::Pt);
  EXPECT_STREQ(L"1.1pt", measurement.ToString().c_str());
  measurement.Set(1.0000001f, XFA_Unit::In);
  EXPECT_STREQ(L"1.0000001in", measurement.ToString().c_str());
  measurement.Set(1234.0f, XFA_Unit::Pc);
  EXPECT_STREQ(L"1234pc", measurement.ToString().c_str());
  measurement.Set(987654321.0123456789f, XFA_Unit::Cm);
  EXPECT_STREQ(L"9.8765434e+08cm", measurement.ToString().c_str());
  measurement.Set(0.0f, XFA_Unit::Mm);
  EXPECT_STREQ(L"0mm", measurement.ToString().c_str());
  measurement.Set(-2.0f, XFA_Unit::Mp);
  EXPECT_STREQ(L"-2mp", measurement.ToString().c_str());
}

TEST(CXFAMeasurementTest, GetUnitFromString) {
  EXPECT_EQ(XFA_Unit::Percent, CXFA_Measurement::GetUnitFromString(L"%"));
  EXPECT_EQ(XFA_Unit::Em, CXFA_Measurement::GetUnitFromString(L"em"));
  EXPECT_EQ(XFA_Unit::Pt, CXFA_Measurement::GetUnitFromString(L"pt"));
  EXPECT_EQ(XFA_Unit::In, CXFA_Measurement::GetUnitFromString(L"in"));
  EXPECT_EQ(XFA_Unit::Pc, CXFA_Measurement::GetUnitFromString(L"pc"));
  EXPECT_EQ(XFA_Unit::Cm, CXFA_Measurement::GetUnitFromString(L"cm"));
  EXPECT_EQ(XFA_Unit::Mm, CXFA_Measurement::GetUnitFromString(L"mm"));
  EXPECT_EQ(XFA_Unit::Mp, CXFA_Measurement::GetUnitFromString(L"mp"));

  EXPECT_EQ(XFA_Unit::Unknown, CXFA_Measurement::GetUnitFromString(L""));
  EXPECT_EQ(XFA_Unit::Unknown, CXFA_Measurement::GetUnitFromString(L"foo"));
  EXPECT_EQ(XFA_Unit::Unknown, CXFA_Measurement::GetUnitFromString(L"!"));
  EXPECT_EQ(XFA_Unit::Unknown, CXFA_Measurement::GetUnitFromString(L"CM"));
  EXPECT_EQ(XFA_Unit::Unknown, CXFA_Measurement::GetUnitFromString(L"Cm"));
  EXPECT_EQ(XFA_Unit::Unknown, CXFA_Measurement::GetUnitFromString(L"cM"));
}

TEST(CXFAMeasurementTest, EqualsPrefix) {
  CXFA_Measurement no_unit(L"=5");
  EXPECT_EQ(XFA_Unit::Unknown, no_unit.GetUnit());
  EXPECT_FLOAT_EQ(5.0f, no_unit.GetValue());

  CXFA_Measurement mm_unit(L"=5mm");
  EXPECT_EQ(XFA_Unit::Mm, mm_unit.GetUnit());
  EXPECT_FLOAT_EQ(5.0f, mm_unit.GetValue());
}

TEST(CXFAMeasurementTest, NoPrefix) {
  CXFA_Measurement no_unit(L"5");
  EXPECT_EQ(XFA_Unit::Unknown, no_unit.GetUnit());
  EXPECT_FLOAT_EQ(5.0f, no_unit.GetValue());

  CXFA_Measurement mm_unit(L"5mm");
  EXPECT_EQ(XFA_Unit::Mm, mm_unit.GetUnit());
  EXPECT_FLOAT_EQ(5.0f, mm_unit.GetValue());
}

TEST(CXFAMeasurementTest, InvalidValues) {
  CXFA_Measurement empty(L"");
  EXPECT_EQ(XFA_Unit::Unknown, empty.GetUnit());
  EXPECT_FLOAT_EQ(0.0f, empty.GetValue());

  CXFA_Measurement equals(L"=");
  EXPECT_EQ(XFA_Unit::Unknown, equals.GetUnit());
  EXPECT_FLOAT_EQ(0.0f, equals.GetValue());
}
