blob: 8e7c78dbd860d44fc0712dff97a7a74240e13423 [file] [log] [blame]
// 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());
}
}