Add CPDFAnnotTests for quad point static methods. Change-Id: I84fd84f0901fe2cdb0ed6df68d8ddbedcffb73a9 Reviewed-on: https://pdfium-review.googlesource.com/c/46410 Commit-Queue: Lei Zhang <thestig@chromium.org> Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfdoc/BUILD.gn b/core/fpdfdoc/BUILD.gn index b977d35..d586e11 100644 --- a/core/fpdfdoc/BUILD.gn +++ b/core/fpdfdoc/BUILD.gn
@@ -104,6 +104,7 @@ pdfium_unittest_source_set("unittests") { sources = [ + "cpdf_annot_unittest.cpp", "cpdf_defaultappearance_unittest.cpp", "cpdf_dest_unittest.cpp", "cpdf_filespec_unittest.cpp",
diff --git a/core/fpdfdoc/cpdf_annot_unittest.cpp b/core/fpdfdoc/cpdf_annot_unittest.cpp new file mode 100644 index 0000000..287f034 --- /dev/null +++ b/core/fpdfdoc/cpdf_annot_unittest.cpp
@@ -0,0 +1,125 @@ +// Copyright 2018 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. + +#include "core/fpdfdoc/cpdf_annot.h" + +#include <memory> +#include <vector> + +#include "core/fpdfapi/parser/cpdf_array.h" +#include "core/fpdfapi/parser/cpdf_dictionary.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +std::unique_ptr<CPDF_Array> CreateQuadPointArrayFromVector( + const std::vector<int>& points) { + auto array = pdfium::MakeUnique<CPDF_Array>(); + for (float point : points) + array->AddNew<CPDF_Number>(point); + return array; +} + +} // namespace + +TEST(CPDFAnnotTest, RectFromQuadPointsArray) { + std::unique_ptr<CPDF_Array> array = CreateQuadPointArrayFromVector( + {0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1}); + CFX_FloatRect rect = CPDF_Annot::RectFromQuadPointsArray(array.get(), 0); + EXPECT_EQ(4.0f, rect.left); + EXPECT_EQ(5.0f, rect.bottom); + EXPECT_EQ(2.0f, rect.right); + EXPECT_EQ(3.0f, rect.top); + + rect = CPDF_Annot::RectFromQuadPointsArray(array.get(), 1); + EXPECT_EQ(4.0f, rect.left); + EXPECT_EQ(3.0f, rect.bottom); + EXPECT_EQ(6.0f, rect.right); + EXPECT_EQ(5.0f, rect.top); +} + +TEST(CPDFAnnotTest, BoundingRectFromQuadPoints) { + CPDF_Dictionary dict; + CFX_FloatRect rect = CPDF_Annot::BoundingRectFromQuadPoints(&dict); + EXPECT_EQ(0.0f, rect.left); + EXPECT_EQ(0.0f, rect.bottom); + EXPECT_EQ(0.0f, rect.right); + EXPECT_EQ(0.0f, rect.top); + + dict.SetFor("QuadPoints", + CreateQuadPointArrayFromVector({0, 1, 2, 3, 4, 5, 6, 7})); + rect = CPDF_Annot::BoundingRectFromQuadPoints(&dict); + EXPECT_EQ(4.0f, rect.left); + EXPECT_EQ(5.0f, rect.bottom); + EXPECT_EQ(2.0f, rect.right); + EXPECT_EQ(3.0f, rect.top); + + dict.SetFor("QuadPoints", CreateQuadPointArrayFromVector( + {0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, + 4, 3, 2, 1, 9, 2, 5, 7, 3, 6, 4, 1})); + rect = CPDF_Annot::BoundingRectFromQuadPoints(&dict); + EXPECT_EQ(2.0f, rect.left); + EXPECT_EQ(3.0f, rect.bottom); + EXPECT_EQ(6.0f, rect.right); + EXPECT_EQ(7.0f, rect.top); +} + +TEST(CPDFAnnotTest, RectFromQuadPoints) { + CPDF_Dictionary dict; + CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(&dict, 0); + EXPECT_EQ(0.0f, rect.left); + EXPECT_EQ(0.0f, rect.bottom); + EXPECT_EQ(0.0f, rect.right); + EXPECT_EQ(0.0f, rect.top); + rect = CPDF_Annot::RectFromQuadPoints(&dict, 5); + EXPECT_EQ(0.0f, rect.left); + EXPECT_EQ(0.0f, rect.bottom); + EXPECT_EQ(0.0f, rect.right); + EXPECT_EQ(0.0f, rect.top); + + dict.SetFor("QuadPoints", + CreateQuadPointArrayFromVector({0, 1, 2, 3, 4, 5, 6, 7})); + rect = CPDF_Annot::RectFromQuadPoints(&dict, 0); + EXPECT_EQ(4.0f, rect.left); + EXPECT_EQ(5.0f, rect.bottom); + EXPECT_EQ(2.0f, rect.right); + EXPECT_EQ(3.0f, rect.top); + + dict.SetFor("QuadPoints", CreateQuadPointArrayFromVector( + {0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, + 4, 3, 2, 1, 9, 2, 5, 7, 3, 6, 4, 1})); + rect = CPDF_Annot::RectFromQuadPoints(&dict, 0); + EXPECT_EQ(4.0f, rect.left); + EXPECT_EQ(5.0f, rect.bottom); + EXPECT_EQ(2.0f, rect.right); + EXPECT_EQ(3.0f, rect.top); + rect = CPDF_Annot::RectFromQuadPoints(&dict, 1); + EXPECT_EQ(4.0f, rect.left); + EXPECT_EQ(3.0f, rect.bottom); + EXPECT_EQ(6.0f, rect.right); + EXPECT_EQ(5.0f, rect.top); + rect = CPDF_Annot::RectFromQuadPoints(&dict, 2); + EXPECT_EQ(3.0f, rect.left); + EXPECT_EQ(6.0f, rect.bottom); + EXPECT_EQ(5.0f, rect.right); + EXPECT_EQ(7.0f, rect.top); +} + +TEST(CPDFAnnotTest, QuadPointCount) { + std::unique_ptr<CPDF_Array> array = CreateQuadPointArrayFromVector({}); + EXPECT_EQ(0u, CPDF_Annot::QuadPointCount(array.get())); + + for (int i = 0; i < 7; ++i) { + array->AddNew<CPDF_Number>(0); + EXPECT_EQ(0u, CPDF_Annot::QuadPointCount(array.get())); + } + for (int i = 0; i < 8; ++i) { + array->AddNew<CPDF_Number>(0); + EXPECT_EQ(1u, CPDF_Annot::QuadPointCount(array.get())); + } + for (int i = 0; i < 50; ++i) + array->AddNew<CPDF_Number>(0); + EXPECT_EQ(8u, CPDF_Annot::QuadPointCount(array.get())); +}