Commit 0583a50769b1d4e0f27dafe1d13af7af76cb40cb
1 parent
ca24c235
Refactor integer handling and type conversions
Simplify integer value retrieval by introducing a templated `value` method in the `Integer` class. Replace redundant exception handling logic across multiple functions with this unified approach. Streamline type conversions and improve readability.
Showing
12 changed files
with
325 additions
and
61 deletions
libqpdf/QPDF.cc
| @@ -636,8 +636,7 @@ int | @@ -636,8 +636,7 @@ int | ||
| 636 | QPDF::getExtensionLevel() | 636 | QPDF::getExtensionLevel() |
| 637 | { | 637 | { |
| 638 | if (Integer ExtensionLevel = getRoot()["/Extensions"]["/ADBE"]["/ExtensionLevel"]) { | 638 | if (Integer ExtensionLevel = getRoot()["/Extensions"]["/ADBE"]["/ExtensionLevel"]) { |
| 639 | - int result = ExtensionLevel; | ||
| 640 | - return result; | 639 | + return ExtensionLevel.value<int>(); |
| 641 | } | 640 | } |
| 642 | return 0; | 641 | return 0; |
| 643 | } | 642 | } |
libqpdf/QPDFEFStreamObjectHelper.cc
| @@ -59,8 +59,7 @@ size_t | @@ -59,8 +59,7 @@ size_t | ||
| 59 | QPDFEFStreamObjectHelper::getSize() | 59 | QPDFEFStreamObjectHelper::getSize() |
| 60 | { | 60 | { |
| 61 | if (Integer Size = getParam("/Size")) { | 61 | if (Integer Size = getParam("/Size")) { |
| 62 | - size_t result = Size; | ||
| 63 | - return result; | 62 | + return Size.value<size_t>(); |
| 64 | } | 63 | } |
| 65 | return 0; | 64 | return 0; |
| 66 | } | 65 | } |
libqpdf/QPDFObjectHandle.cc
| @@ -852,13 +852,7 @@ int | @@ -852,13 +852,7 @@ int | ||
| 852 | QPDFObjectHandle::getIntValueAsInt() const | 852 | QPDFObjectHandle::getIntValueAsInt() const |
| 853 | { | 853 | { |
| 854 | try { | 854 | try { |
| 855 | - return Integer(*this); | ||
| 856 | - } catch (std::underflow_error&) { | ||
| 857 | - warn("requested value of integer is too small; returning INT_MIN"); | ||
| 858 | - return INT_MIN; | ||
| 859 | - } catch (std::overflow_error&) { | ||
| 860 | - warn("requested value of integer is too big; returning INT_MAX"); | ||
| 861 | - return INT_MAX; | 855 | + return Integer(*this).value<int>(); |
| 862 | } catch (std::invalid_argument&) { | 856 | } catch (std::invalid_argument&) { |
| 863 | typeWarning("integer", "returning 0"); | 857 | typeWarning("integer", "returning 0"); |
| 864 | return 0; | 858 | return 0; |
| @@ -879,10 +873,7 @@ unsigned long long | @@ -879,10 +873,7 @@ unsigned long long | ||
| 879 | QPDFObjectHandle::getUIntValue() const | 873 | QPDFObjectHandle::getUIntValue() const |
| 880 | { | 874 | { |
| 881 | try { | 875 | try { |
| 882 | - return Integer(*this); | ||
| 883 | - } catch (std::underflow_error&) { | ||
| 884 | - warn("unsigned value request for negative number; returning 0"); | ||
| 885 | - return 0; | 876 | + return Integer(*this).value<unsigned long long>(); |
| 886 | } catch (std::invalid_argument&) { | 877 | } catch (std::invalid_argument&) { |
| 887 | typeWarning("integer", "returning 0"); | 878 | typeWarning("integer", "returning 0"); |
| 888 | return 0; | 879 | return 0; |
| @@ -903,13 +894,7 @@ unsigned int | @@ -903,13 +894,7 @@ unsigned int | ||
| 903 | QPDFObjectHandle::getUIntValueAsUInt() const | 894 | QPDFObjectHandle::getUIntValueAsUInt() const |
| 904 | { | 895 | { |
| 905 | try { | 896 | try { |
| 906 | - return Integer(*this); | ||
| 907 | - } catch (std::underflow_error&) { | ||
| 908 | - warn("unsigned integer value request for negative number; returning 0"); | ||
| 909 | - return 0; | ||
| 910 | - } catch (std::overflow_error&) { | ||
| 911 | - warn("requested value of unsigned integer is too big; returning UINT_MAX"); | ||
| 912 | - return UINT_MAX; | 897 | + return Integer(*this).value<unsigned int>(); |
| 913 | } catch (std::invalid_argument&) { | 898 | } catch (std::invalid_argument&) { |
| 914 | typeWarning("integer", "returning 0"); | 899 | typeWarning("integer", "returning 0"); |
| 915 | return 0; | 900 | return 0; |
libqpdf/QPDF_linearization.cc
| @@ -487,20 +487,20 @@ Lin::readLinearizationData() | @@ -487,20 +487,20 @@ Lin::readLinearizationData() | ||
| 487 | ); | 487 | ); |
| 488 | 488 | ||
| 489 | // file_size initialized by isLinearized() | 489 | // file_size initialized by isLinearized() |
| 490 | - linp_.first_page_object = O; | 490 | + linp_.first_page_object = O.value<int>(); |
| 491 | linp_.first_page_end = E; | 491 | linp_.first_page_end = E; |
| 492 | - linp_.npages = N; | 492 | + linp_.npages = N.value<size_t>(); |
| 493 | linp_.xref_zero_offset = T; | 493 | linp_.xref_zero_offset = T; |
| 494 | - linp_.first_page = P ? P : 0; | 494 | + linp_.first_page = P ? P.value<int>() : 0; |
| 495 | linp_.H_offset = H_0; | 495 | linp_.H_offset = H_0; |
| 496 | linp_.H_length = H_1; | 496 | linp_.H_length = H_1; |
| 497 | 497 | ||
| 498 | // Read hint streams | 498 | // Read hint streams |
| 499 | 499 | ||
| 500 | Pl_Buffer pb("hint buffer"); | 500 | Pl_Buffer pb("hint buffer"); |
| 501 | - auto H0 = readHintStream(pb, H_0, H_1); | 501 | + auto H0 = readHintStream(pb, H_0, H_1.value<size_t>()); |
| 502 | if (H_2) { | 502 | if (H_2) { |
| 503 | - (void)readHintStream(pb, H_2, H_3); | 503 | + (void)readHintStream(pb, H_2, H_3.value<size_t>()); |
| 504 | } | 504 | } |
| 505 | 505 | ||
| 506 | // PDF 1.4 hint tables that we ignore: | 506 | // PDF 1.4 hint tables that we ignore: |
| @@ -524,7 +524,7 @@ Lin::readLinearizationData() | @@ -524,7 +524,7 @@ Lin::readLinearizationData() | ||
| 524 | 524 | ||
| 525 | readHPageOffset(BitStream(h_buf, h_size)); | 525 | readHPageOffset(BitStream(h_buf, h_size)); |
| 526 | 526 | ||
| 527 | - size_t HSi = HS; | 527 | + size_t HSi = HS.value<size_t>(); |
| 528 | if (HSi < 0 || HSi >= h_size) { | 528 | if (HSi < 0 || HSi >= h_size) { |
| 529 | throw damagedPDF("linearization hint table", "/S (shared object) offset is out of bounds"); | 529 | throw damagedPDF("linearization hint table", "/S (shared object) offset is out of bounds"); |
| 530 | } | 530 | } |
| @@ -536,7 +536,7 @@ Lin::readLinearizationData() | @@ -536,7 +536,7 @@ Lin::readLinearizationData() | ||
| 536 | "/O (outline) offset is out of bounds", | 536 | "/O (outline) offset is out of bounds", |
| 537 | "linearization dictionary" // | 537 | "linearization dictionary" // |
| 538 | ); | 538 | ); |
| 539 | - size_t HOi = HO; | 539 | + size_t HOi = HO.value<size_t>(); |
| 540 | readHGeneric(BitStream(h_buf + HO, h_size - HOi), outline_hints_); | 540 | readHGeneric(BitStream(h_buf + HO, h_size - HOi), outline_hints_); |
| 541 | } | 541 | } |
| 542 | } | 542 | } |
libqpdf/qpdf/QPDFObjectHandle_private.hh
| @@ -345,6 +345,42 @@ namespace qpdf | @@ -345,6 +345,42 @@ namespace qpdf | ||
| 345 | // std::invalid_argument exception. | 345 | // std::invalid_argument exception. |
| 346 | int64_t value() const; | 346 | int64_t value() const; |
| 347 | 347 | ||
| 348 | + // Return the integer value. If the object is not a valid integer, throw a | ||
| 349 | + // std::invalid_argument exception. If the object is out of range for the target type, | ||
| 350 | + // replicate the existing QPDFObjectHandle behavior. | ||
| 351 | + template <std::integral T> | ||
| 352 | + T | ||
| 353 | + value() const | ||
| 354 | + { | ||
| 355 | + try { | ||
| 356 | + return static_cast<T>(*this); | ||
| 357 | + } catch (std::underflow_error&) { | ||
| 358 | + if constexpr (std::is_same_v<T, int>) { | ||
| 359 | + warn("requested value of integer is too small; returning INT_MIN"); | ||
| 360 | + } else if constexpr (std::is_same_v<T, unsigned int>) { | ||
| 361 | + warn("unsigned integer value request for negative number; returning 0"); | ||
| 362 | + } else if constexpr (std::is_same_v<T, unsigned long long>) { | ||
| 363 | + warn("unsigned value request for negative number; returning 0"); | ||
| 364 | + } else { | ||
| 365 | + warn( | ||
| 366 | + "underflow while converting integer object; returning smallest possible " | ||
| 367 | + "value"); | ||
| 368 | + } | ||
| 369 | + return std::numeric_limits<T>::min(); | ||
| 370 | + } catch (std::overflow_error&) { | ||
| 371 | + if constexpr (std::is_same_v<T, int>) { | ||
| 372 | + warn("requested value of integer is too big; returning INT_MAX"); | ||
| 373 | + } else if constexpr (std::is_same_v<T, unsigned int>) { | ||
| 374 | + warn("requested value of unsigned integer is too big; returning UINT_MAX"); | ||
| 375 | + } else { | ||
| 376 | + warn( | ||
| 377 | + "overflow while converting integer object; returning largest possible " | ||
| 378 | + "value"); | ||
| 379 | + } | ||
| 380 | + return std::numeric_limits<T>::max(); | ||
| 381 | + } | ||
| 382 | + } | ||
| 383 | + | ||
| 348 | // Return true if object value is equal to the 'rhs' value. Return false if the object is | 384 | // Return true if object value is equal to the 'rhs' value. Return false if the object is |
| 349 | // not a valid Integer. | 385 | // not a valid Integer. |
| 350 | friend bool | 386 | friend bool |
| @@ -367,7 +403,7 @@ namespace qpdf | @@ -367,7 +403,7 @@ namespace qpdf | ||
| 367 | return std::cmp_greater(lhs.value(), rhs) ? std::strong_ordering::greater | 403 | return std::cmp_greater(lhs.value(), rhs) ? std::strong_ordering::greater |
| 368 | : std::strong_ordering::equal; | 404 | : std::strong_ordering::equal; |
| 369 | } | 405 | } |
| 370 | - }; | 406 | + }; // class Integer |
| 371 | 407 | ||
| 372 | bool | 408 | bool |
| 373 | operator==(std::integral auto lhs, Integer const& rhs) | 409 | operator==(std::integral auto lhs, Integer const& rhs) |
libtests/CMakeLists.txt
libtests/objects.cc
0 โ 100644
| 1 | +#include <qpdf/assert_test.h> | ||
| 2 | + | ||
| 3 | +// This program tests miscellaneous object handle functionality | ||
| 4 | + | ||
| 5 | +#include <qpdf/QPDF.hh> | ||
| 6 | + | ||
| 7 | +#include <qpdf/QIntC.hh> | ||
| 8 | +#include <qpdf/QPDFObjectHandle_private.hh> | ||
| 9 | +#include <qpdf/QUtil.hh> | ||
| 10 | + | ||
| 11 | +#include <climits> | ||
| 12 | +#include <cstdio> | ||
| 13 | +#include <cstdlib> | ||
| 14 | +#include <cstring> | ||
| 15 | +#include <iostream> | ||
| 16 | +#include <map> | ||
| 17 | + | ||
| 18 | +static char const* whoami = nullptr; | ||
| 19 | + | ||
| 20 | +void | ||
| 21 | +usage() | ||
| 22 | +{ | ||
| 23 | + std::cerr << "Usage: " << whoami << " n filename1 [arg2]" << '\n'; | ||
| 24 | + exit(2); | ||
| 25 | +} | ||
| 26 | + | ||
| 27 | +#define assert_compare_numbers(expected, expr) compare_numbers(#expr, expected, expr) | ||
| 28 | + | ||
| 29 | +template <typename T1, typename T2> | ||
| 30 | +static void | ||
| 31 | +compare_numbers(char const* description, T1 const& expected, T2 const& actual) | ||
| 32 | +{ | ||
| 33 | + if (expected != actual) { | ||
| 34 | + std::cerr << description << ": expected = " << expected << "; actual = " << actual << '\n'; | ||
| 35 | + } | ||
| 36 | +} | ||
| 37 | + | ||
| 38 | +static void | ||
| 39 | +test_0(QPDF& pdf, char const* arg2) | ||
| 40 | +{ | ||
| 41 | + // Test int size checks. This test will fail if int and long long are the same size. | ||
| 42 | + QPDFObjectHandle t = pdf.getTrailer(); | ||
| 43 | + unsigned long long q1_l = 3ULL * QIntC::to_ulonglong(INT_MAX); | ||
| 44 | + long long q1 = QIntC::to_longlong(q1_l); | ||
| 45 | + long long q2_l = 3LL * QIntC::to_longlong(INT_MIN); | ||
| 46 | + long long q2 = QIntC::to_longlong(q2_l); | ||
| 47 | + unsigned int q3_i = UINT_MAX; | ||
| 48 | + long long q3 = QIntC::to_longlong(q3_i); | ||
| 49 | + t.replaceKey("/Q1", QPDFObjectHandle::newInteger(q1)); | ||
| 50 | + t.replaceKey("/Q2", QPDFObjectHandle::newInteger(q2)); | ||
| 51 | + t.replaceKey("/Q3", QPDFObjectHandle::newInteger(q3)); | ||
| 52 | + assert_compare_numbers(q1, t.getKey("/Q1").getIntValue()); | ||
| 53 | + assert_compare_numbers(q1_l, t.getKey("/Q1").getUIntValue()); | ||
| 54 | + assert_compare_numbers(INT_MAX, t.getKey("/Q1").getIntValueAsInt()); | ||
| 55 | + try { | ||
| 56 | + assert_compare_numbers(0u, QPDFObjectHandle::newNull().getUIntValueAsUInt()); | ||
| 57 | + std::cerr << "convert null to uint did not throw\n"; | ||
| 58 | + } catch (QPDFExc const&) { | ||
| 59 | + std::cerr << "caught expected type error\n"; | ||
| 60 | + } | ||
| 61 | + assert_compare_numbers(std::numeric_limits<int8_t>::max(), Integer(q1).value<int8_t>()); | ||
| 62 | + assert_compare_numbers(std::numeric_limits<int8_t>::min(), Integer(-q1).value<int8_t>()); | ||
| 63 | + try { | ||
| 64 | + int8_t q1_8 = Integer(q1); | ||
| 65 | + std::cerr << "q1_8: " << std::to_string(q1_8) << '\n'; | ||
| 66 | + } catch (std::overflow_error const&) { | ||
| 67 | + std::cerr << "caught expected int8_t overflow error\n"; | ||
| 68 | + } | ||
| 69 | + try { | ||
| 70 | + int8_t q1_8 = Integer(-q1); | ||
| 71 | + std::cerr << "q1_8: " << std::to_string(q1_8) << '\n'; | ||
| 72 | + } catch (std::underflow_error const&) { | ||
| 73 | + std::cerr << "caught expected int8_t underflow error\n"; | ||
| 74 | + } | ||
| 75 | + assert_compare_numbers(std::numeric_limits<uint8_t>::max(), Integer(q1).value<uint8_t>()); | ||
| 76 | + assert_compare_numbers(0, Integer(-q1).value<uint8_t>()); | ||
| 77 | + try { | ||
| 78 | + uint8_t q1_u8 = Integer(q1); | ||
| 79 | + std::cerr << "q1_u8: " << std::to_string(q1_u8) << '\n'; | ||
| 80 | + } catch (std::overflow_error const&) { | ||
| 81 | + std::cerr << "caught expected uint8_t overflow error\n"; | ||
| 82 | + } | ||
| 83 | + try { | ||
| 84 | + uint8_t q1_u8 = Integer(-q1); | ||
| 85 | + std::cerr << "q1_u8: " << std::to_string(q1_u8) << '\n'; | ||
| 86 | + } catch (std::underflow_error const&) { | ||
| 87 | + std::cerr << "caught expected uint8_t underflow error\n"; | ||
| 88 | + } | ||
| 89 | + assert_compare_numbers(UINT_MAX, t.getKey("/Q1").getUIntValueAsUInt()); | ||
| 90 | + assert_compare_numbers(q2_l, t.getKey("/Q2").getIntValue()); | ||
| 91 | + assert_compare_numbers(0U, t.getKey("/Q2").getUIntValue()); | ||
| 92 | + assert_compare_numbers(INT_MIN, t.getKey("/Q2").getIntValueAsInt()); | ||
| 93 | + assert_compare_numbers(0U, t.getKey("/Q2").getUIntValueAsUInt()); | ||
| 94 | + assert_compare_numbers(INT_MAX, t.getKey("/Q3").getIntValueAsInt()); | ||
| 95 | + assert_compare_numbers(UINT_MAX, t.getKey("/Q3").getUIntValueAsUInt()); | ||
| 96 | +} | ||
| 97 | + | ||
| 98 | +void | ||
| 99 | +runtest(int n, char const* filename1, char const* arg2) | ||
| 100 | +{ | ||
| 101 | + // Most tests here are crafted to work on specific files. Look at | ||
| 102 | + // the test suite to see how the test is invoked to find the file | ||
| 103 | + // that the test is supposed to operate on. | ||
| 104 | + | ||
| 105 | + std::set<int> ignore_filename = {}; | ||
| 106 | + | ||
| 107 | + QPDF pdf; | ||
| 108 | + std::shared_ptr<char> file_buf; | ||
| 109 | + FILE* filep = nullptr; | ||
| 110 | + if (ignore_filename.contains(n)) { | ||
| 111 | + // Ignore filename argument entirely | ||
| 112 | + } else { | ||
| 113 | + size_t size = 0; | ||
| 114 | + QUtil::read_file_into_memory(filename1, file_buf, size); | ||
| 115 | + pdf.processMemoryFile(filename1, file_buf.get(), size); | ||
| 116 | + } | ||
| 117 | + | ||
| 118 | + std::map<int, void (*)(QPDF&, char const*)> test_functions = { | ||
| 119 | + {0, test_0}, | ||
| 120 | + }; | ||
| 121 | + | ||
| 122 | + auto fn = test_functions.find(n); | ||
| 123 | + if (fn == test_functions.end()) { | ||
| 124 | + throw std::runtime_error(std::string("invalid test ") + QUtil::int_to_string(n)); | ||
| 125 | + } | ||
| 126 | + (fn->second)(pdf, arg2); | ||
| 127 | + | ||
| 128 | + if (filep) { | ||
| 129 | + fclose(filep); | ||
| 130 | + } | ||
| 131 | + std::cout << "test " << n << " done" << '\n'; | ||
| 132 | +} | ||
| 133 | + | ||
| 134 | +int | ||
| 135 | +main(int argc, char* argv[]) | ||
| 136 | +{ | ||
| 137 | + QUtil::setLineBuf(stdout); | ||
| 138 | + if ((whoami = strrchr(argv[0], '/')) == nullptr) { | ||
| 139 | + whoami = argv[0]; | ||
| 140 | + } else { | ||
| 141 | + ++whoami; | ||
| 142 | + } | ||
| 143 | + | ||
| 144 | + if ((argc < 3) || (argc > 4)) { | ||
| 145 | + usage(); | ||
| 146 | + } | ||
| 147 | + | ||
| 148 | + try { | ||
| 149 | + int n = QUtil::string_to_int(argv[1]); | ||
| 150 | + char const* filename1 = argv[2]; | ||
| 151 | + char const* arg2 = argv[3]; | ||
| 152 | + runtest(n, filename1, arg2); | ||
| 153 | + } catch (std::exception& e) { | ||
| 154 | + std::cerr << e.what() << '\n'; | ||
| 155 | + exit(2); | ||
| 156 | + } | ||
| 157 | + | ||
| 158 | + return 0; | ||
| 159 | +} |
libtests/qtest/objects.test
0 โ 100644
| 1 | +#!/usr/bin/env perl | ||
| 2 | +require 5.008; | ||
| 3 | +use warnings; | ||
| 4 | +use strict; | ||
| 5 | + | ||
| 6 | + | ||
| 7 | +chdir("objects") or die "chdir testdir failed: $!\n"; | ||
| 8 | + | ||
| 9 | +require TestDriver; | ||
| 10 | + | ||
| 11 | + | ||
| 12 | +my $td = new TestDriver('objects'); | ||
| 13 | + | ||
| 14 | +my $n_tests = 1; | ||
| 15 | + | ||
| 16 | + | ||
| 17 | +$td->runtest("integer type checks", | ||
| 18 | + {$td->COMMAND => "objects 0 minimal.pdf"}, | ||
| 19 | + {$td->FILE => "test0.out", $td->EXIT_STATUS => 0}, | ||
| 20 | + $td->NORMALIZE_NEWLINES); | ||
| 21 | + | ||
| 22 | +$td->report($n_tests); |
libtests/qtest/objects/minimal.pdf
0 โ 100644
| 1 | +%PDF-1.3 | ||
| 2 | +1 0 obj | ||
| 3 | +<< | ||
| 4 | + /Type /Catalog | ||
| 5 | + /Pages 2 0 R | ||
| 6 | +>> | ||
| 7 | +endobj | ||
| 8 | + | ||
| 9 | +2 0 obj | ||
| 10 | +<< | ||
| 11 | + /Type /Pages | ||
| 12 | + /Kids [ | ||
| 13 | + 3 0 R | ||
| 14 | + ] | ||
| 15 | + /Count 1 | ||
| 16 | +>> | ||
| 17 | +endobj | ||
| 18 | + | ||
| 19 | +3 0 obj | ||
| 20 | +<< | ||
| 21 | + /Type /Page | ||
| 22 | + /Parent 2 0 R | ||
| 23 | + /MediaBox [0 0 612 792] | ||
| 24 | + /Contents 4 0 R | ||
| 25 | + /Resources << | ||
| 26 | + /ProcSet 5 0 R | ||
| 27 | + /Font << | ||
| 28 | + /F1 6 0 R | ||
| 29 | + >> | ||
| 30 | + >> | ||
| 31 | +>> | ||
| 32 | +endobj | ||
| 33 | + | ||
| 34 | +4 0 obj | ||
| 35 | +<< | ||
| 36 | + /Length 44 | ||
| 37 | +>> | ||
| 38 | +stream | ||
| 39 | +BT | ||
| 40 | + /F1 24 Tf | ||
| 41 | + 72 720 Td | ||
| 42 | + (Potato) Tj | ||
| 43 | +ET | ||
| 44 | +endstream | ||
| 45 | +endobj | ||
| 46 | + | ||
| 47 | +5 0 obj | ||
| 48 | +[ | ||
| 49 | |||
| 50 | + /Text | ||
| 51 | +] | ||
| 52 | +endobj | ||
| 53 | + | ||
| 54 | +6 0 obj | ||
| 55 | +<< | ||
| 56 | + /Type /Font | ||
| 57 | + /Subtype /Type1 | ||
| 58 | + /Name /F1 | ||
| 59 | + /BaseFont /Helvetica | ||
| 60 | + /Encoding /WinAnsiEncoding | ||
| 61 | +>> | ||
| 62 | +endobj | ||
| 63 | + | ||
| 64 | +xref | ||
| 65 | +0 7 | ||
| 66 | +0000000000 65535 f | ||
| 67 | +0000000009 00000 n | ||
| 68 | +0000000063 00000 n | ||
| 69 | +0000000135 00000 n | ||
| 70 | +0000000307 00000 n | ||
| 71 | +0000000403 00000 n | ||
| 72 | +0000000438 00000 n | ||
| 73 | +trailer << | ||
| 74 | + /Size 7 | ||
| 75 | + /Root 1 0 R | ||
| 76 | +>> | ||
| 77 | +startxref | ||
| 78 | +556 | ||
| 79 | +%%EOF |
qpdf/qtest/qpdf/test62.out renamed to libtests/qtest/objects/test0.out
| 1 | requested value of integer is too big; returning INT_MAX | 1 | requested value of integer is too big; returning INT_MAX |
| 2 | +caught expected type error | ||
| 3 | +overflow while converting integer object; returning largest possible value | ||
| 4 | +underflow while converting integer object; returning smallest possible value | ||
| 5 | +caught expected int8_t overflow error | ||
| 6 | +caught expected int8_t underflow error | ||
| 7 | +overflow while converting integer object; returning largest possible value | ||
| 8 | +underflow while converting integer object; returning smallest possible value | ||
| 9 | +caught expected uint8_t overflow error | ||
| 10 | +caught expected uint8_t underflow error | ||
| 2 | requested value of unsigned integer is too big; returning UINT_MAX | 11 | requested value of unsigned integer is too big; returning UINT_MAX |
| 3 | unsigned value request for negative number; returning 0 | 12 | unsigned value request for negative number; returning 0 |
| 4 | requested value of integer is too small; returning INT_MIN | 13 | requested value of integer is too small; returning INT_MIN |
| 5 | unsigned integer value request for negative number; returning 0 | 14 | unsigned integer value request for negative number; returning 0 |
| 6 | requested value of integer is too big; returning INT_MAX | 15 | requested value of integer is too big; returning INT_MAX |
| 7 | -test 62 done | 16 | +test 0 done |
qpdf/qtest/error-condition.test
| @@ -109,17 +109,12 @@ $td->runtest("C API: no recovery", | @@ -109,17 +109,12 @@ $td->runtest("C API: no recovery", | ||
| 109 | {$td->FILE => "c-no-recovery.out", | 109 | {$td->FILE => "c-no-recovery.out", |
| 110 | $td->EXIT_STATUS => 0}, | 110 | $td->EXIT_STATUS => 0}, |
| 111 | $td->NORMALIZE_NEWLINES); | 111 | $td->NORMALIZE_NEWLINES); |
| 112 | - | ||
| 113 | -$td->runtest("integer type checks", | ||
| 114 | - {$td->COMMAND => "test_driver 62 minimal.pdf"}, | ||
| 115 | - {$td->FILE => "test62.out", $td->EXIT_STATUS => 0}, | ||
| 116 | - $td->NORMALIZE_NEWLINES); | ||
| 117 | $td->runtest("getValueAs... accessor checks", | 112 | $td->runtest("getValueAs... accessor checks", |
| 118 | {$td->COMMAND => "test_driver 85 -"}, | 113 | {$td->COMMAND => "test_driver 85 -"}, |
| 119 | {$td->FILE => "test85.out", $td->EXIT_STATUS => 0}, | 114 | {$td->FILE => "test85.out", $td->EXIT_STATUS => 0}, |
| 120 | $td->NORMALIZE_NEWLINES); | 115 | $td->NORMALIZE_NEWLINES); |
| 121 | 116 | ||
| 122 | -$n_tests += @badfiles + 11; | 117 | +$n_tests += @badfiles + 10; |
| 123 | 118 | ||
| 124 | # Recovery tests. These are mostly after-the-fact -- when recovery | 119 | # Recovery tests. These are mostly after-the-fact -- when recovery |
| 125 | # was implemented, some degree of recovery was possible on many of the | 120 | # was implemented, some degree of recovery was possible on many of the |
qpdf/test_driver.cc
| @@ -17,6 +17,7 @@ | @@ -17,6 +17,7 @@ | ||
| 17 | #include <qpdf/QPDFJob.hh> | 17 | #include <qpdf/QPDFJob.hh> |
| 18 | #include <qpdf/QPDFNameTreeObjectHelper.hh> | 18 | #include <qpdf/QPDFNameTreeObjectHelper.hh> |
| 19 | #include <qpdf/QPDFNumberTreeObjectHelper.hh> | 19 | #include <qpdf/QPDFNumberTreeObjectHelper.hh> |
| 20 | +#include <qpdf/QPDFObjectHandle_private.hh> | ||
| 20 | #include <qpdf/QPDFOutlineDocumentHelper.hh> | 21 | #include <qpdf/QPDFOutlineDocumentHelper.hh> |
| 21 | #include <qpdf/QPDFPageDocumentHelper.hh> | 22 | #include <qpdf/QPDFPageDocumentHelper.hh> |
| 22 | #include <qpdf/QPDFPageLabelDocumentHelper.hh> | 23 | #include <qpdf/QPDFPageLabelDocumentHelper.hh> |
| @@ -189,8 +190,7 @@ static void | @@ -189,8 +190,7 @@ static void | ||
| 189 | compare_numbers(char const* description, T1 const& expected, T2 const& actual) | 190 | compare_numbers(char const* description, T1 const& expected, T2 const& actual) |
| 190 | { | 191 | { |
| 191 | if (expected != actual) { | 192 | if (expected != actual) { |
| 192 | - std::cerr << description << ": expected = " << expected << "; actual = " << actual | ||
| 193 | - << std::endl; | 193 | + std::cerr << description << ": expected = " << expected << "; actual = " << actual << '\n'; |
| 194 | } | 194 | } |
| 195 | } | 195 | } |
| 196 | 196 | ||
| @@ -2279,28 +2279,8 @@ test_61(QPDF& pdf, char const* arg2) | @@ -2279,28 +2279,8 @@ test_61(QPDF& pdf, char const* arg2) | ||
| 2279 | static void | 2279 | static void |
| 2280 | test_62(QPDF& pdf, char const* arg2) | 2280 | test_62(QPDF& pdf, char const* arg2) |
| 2281 | { | 2281 | { |
| 2282 | - // Test int size checks. This test will fail if int and long | ||
| 2283 | - // long are the same size. | ||
| 2284 | - QPDFObjectHandle t = pdf.getTrailer(); | ||
| 2285 | - unsigned long long q1_l = 3ULL * QIntC::to_ulonglong(INT_MAX); | ||
| 2286 | - long long q1 = QIntC::to_longlong(q1_l); | ||
| 2287 | - long long q2_l = 3LL * QIntC::to_longlong(INT_MIN); | ||
| 2288 | - long long q2 = QIntC::to_longlong(q2_l); | ||
| 2289 | - unsigned int q3_i = UINT_MAX; | ||
| 2290 | - long long q3 = QIntC::to_longlong(q3_i); | ||
| 2291 | - t.replaceKey("/Q1", QPDFObjectHandle::newInteger(q1)); | ||
| 2292 | - t.replaceKey("/Q2", QPDFObjectHandle::newInteger(q2)); | ||
| 2293 | - t.replaceKey("/Q3", QPDFObjectHandle::newInteger(q3)); | ||
| 2294 | - assert_compare_numbers(q1, t.getKey("/Q1").getIntValue()); | ||
| 2295 | - assert_compare_numbers(q1_l, t.getKey("/Q1").getUIntValue()); | ||
| 2296 | - assert_compare_numbers(INT_MAX, t.getKey("/Q1").getIntValueAsInt()); | ||
| 2297 | - assert_compare_numbers(UINT_MAX, t.getKey("/Q1").getUIntValueAsUInt()); | ||
| 2298 | - assert_compare_numbers(q2_l, t.getKey("/Q2").getIntValue()); | ||
| 2299 | - assert_compare_numbers(0U, t.getKey("/Q2").getUIntValue()); | ||
| 2300 | - assert_compare_numbers(INT_MIN, t.getKey("/Q2").getIntValueAsInt()); | ||
| 2301 | - assert_compare_numbers(0U, t.getKey("/Q2").getUIntValueAsUInt()); | ||
| 2302 | - assert_compare_numbers(INT_MAX, t.getKey("/Q3").getIntValueAsInt()); | ||
| 2303 | - assert_compare_numbers(UINT_MAX, t.getKey("/Q3").getUIntValueAsUInt()); | 2282 | + // Test int size checks. This test will fail if int and long long are the same size. |
| 2283 | + // Moved to libtests/objects | ||
| 2304 | } | 2284 | } |
| 2305 | 2285 | ||
| 2306 | static void | 2286 | static void |