| // Copyright 2024 The PDFium Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "core/fpdfapi/parser/cpdf_number.h" | |
| #include <limits> | |
| #include "core/fxcrt/bytestring.h" | |
| #include "core/fxcrt/fx_stream.h" | |
| #include "core/fxcrt/notreached.h" | |
| #include "core/fxcrt/retain_ptr.h" | |
| #include "testing/gtest/include/gtest/gtest.h" | |
| namespace { | |
| class ByteStringArchiveStream : public IFX_ArchiveStream { | |
| public: | |
| ByteStringArchiveStream() = default; | |
| ~ByteStringArchiveStream() override = default; | |
| // IFX_ArchiveStream: | |
| bool WriteBlock(pdfium::span<const uint8_t> buffer) override { | |
| str_ += ByteStringView(buffer); | |
| return true; | |
| } | |
| FX_FILESIZE CurrentOffset() const override { NOTREACHED(); } | |
| const ByteString& str() const { return str_; } | |
| private: | |
| ByteString str_; | |
| }; | |
| } // namespace | |
| TEST(CPDFNumber, WriteToFloat) { | |
| { | |
| ByteStringArchiveStream output_stream; | |
| auto number = pdfium::MakeRetain<CPDF_Number>(0.0f); | |
| ASSERT_TRUE(number->WriteTo(&output_stream, /*encryptor=*/nullptr)); | |
| EXPECT_EQ(" 0", output_stream.str()); | |
| } | |
| { | |
| ByteStringArchiveStream output_stream; | |
| auto number = pdfium::MakeRetain<CPDF_Number>(1.0f); | |
| ASSERT_TRUE(number->WriteTo(&output_stream, /*encryptor=*/nullptr)); | |
| EXPECT_EQ(" 1", output_stream.str()); | |
| } | |
| { | |
| ByteStringArchiveStream output_stream; | |
| auto number = pdfium::MakeRetain<CPDF_Number>(-7.5f); | |
| ASSERT_TRUE(number->WriteTo(&output_stream, /*encryptor=*/nullptr)); | |
| EXPECT_EQ(" -7.5", output_stream.str()); | |
| } | |
| { | |
| ByteStringArchiveStream output_stream; | |
| // `number` cannot be represented as a float without losing precision. | |
| auto number = pdfium::MakeRetain<CPDF_Number>(38.895285f); | |
| ASSERT_TRUE(number->WriteTo(&output_stream, /*encryptor=*/nullptr)); | |
| EXPECT_EQ(" 38.895287", output_stream.str()); | |
| } | |
| { | |
| ByteStringArchiveStream output_stream; | |
| // `number` cannot be represented as a float without losing precision. | |
| auto number = pdfium::MakeRetain<CPDF_Number>(-77.037232f); | |
| ASSERT_TRUE(number->WriteTo(&output_stream, /*encryptor=*/nullptr)); | |
| EXPECT_EQ(" -77.037231", output_stream.str()); | |
| } | |
| { | |
| ByteStringArchiveStream output_stream; | |
| auto number = | |
| pdfium::MakeRetain<CPDF_Number>(std::numeric_limits<float>::max()); | |
| ASSERT_TRUE(number->WriteTo(&output_stream, /*encryptor=*/nullptr)); | |
| EXPECT_EQ(" 340282350000000000000000000000000000000", output_stream.str()); | |
| } | |
| { | |
| ByteStringArchiveStream output_stream; | |
| auto number = | |
| pdfium::MakeRetain<CPDF_Number>(std::numeric_limits<float>::min()); | |
| ASSERT_TRUE(number->WriteTo(&output_stream, /*encryptor=*/nullptr)); | |
| EXPECT_EQ(" .0000000000000000000000000000000000000117549435", | |
| output_stream.str()); | |
| } | |
| } | |
| TEST(CPDFNumber, WriteToInt) { | |
| { | |
| ByteStringArchiveStream output_stream; | |
| auto number = pdfium::MakeRetain<CPDF_Number>(0); | |
| ASSERT_TRUE(number->WriteTo(&output_stream, /*encryptor=*/nullptr)); | |
| EXPECT_EQ(" 0", output_stream.str()); | |
| } | |
| { | |
| ByteStringArchiveStream output_stream; | |
| auto number = pdfium::MakeRetain<CPDF_Number>(1); | |
| ASSERT_TRUE(number->WriteTo(&output_stream, /*encryptor=*/nullptr)); | |
| EXPECT_EQ(" 1", output_stream.str()); | |
| } | |
| { | |
| ByteStringArchiveStream output_stream; | |
| auto number = pdfium::MakeRetain<CPDF_Number>(-99); | |
| ASSERT_TRUE(number->WriteTo(&output_stream, /*encryptor=*/nullptr)); | |
| EXPECT_EQ(" -99", output_stream.str()); | |
| } | |
| { | |
| ByteStringArchiveStream output_stream; | |
| auto number = pdfium::MakeRetain<CPDF_Number>(1234); | |
| ASSERT_TRUE(number->WriteTo(&output_stream, /*encryptor=*/nullptr)); | |
| EXPECT_EQ(" 1234", output_stream.str()); | |
| } | |
| { | |
| ByteStringArchiveStream output_stream; | |
| auto number = pdfium::MakeRetain<CPDF_Number>(-54321); | |
| ASSERT_TRUE(number->WriteTo(&output_stream, /*encryptor=*/nullptr)); | |
| EXPECT_EQ(" -54321", output_stream.str()); | |
| } | |
| { | |
| ByteStringArchiveStream output_stream; | |
| auto number = | |
| pdfium::MakeRetain<CPDF_Number>(std::numeric_limits<int>::max()); | |
| ASSERT_TRUE(number->WriteTo(&output_stream, /*encryptor=*/nullptr)); | |
| EXPECT_EQ(" 2147483647", output_stream.str()); | |
| } | |
| { | |
| ByteStringArchiveStream output_stream; | |
| auto number = | |
| pdfium::MakeRetain<CPDF_Number>(std::numeric_limits<int>::min()); | |
| ASSERT_TRUE(number->WriteTo(&output_stream, /*encryptor=*/nullptr)); | |
| EXPECT_EQ(" -2147483648", output_stream.str()); | |
| } | |
| } |