# -*- encoding: utf-8; frozen_string_literal: true -*- # #-- # This file is part of HexaPDF. # # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby # Copyright (C) 2014-2023 Thomas Leitner # # HexaPDF is free software: you can redistribute it and/or modify it # under the terms of the GNU Affero General Public License version 3 as # published by the Free Software Foundation with the addition of the # following permission added to Section 15 as permitted in Section 7(a): # FOR ANY PART OF THE COVERED WORK IN WHICH THE COPYRIGHT IS OWNED BY # THOMAS LEITNER, THOMAS LEITNER DISCLAIMS THE WARRANTY OF NON # INFRINGEMENT OF THIRD PARTY RIGHTS. # # HexaPDF is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public # License for more details. # # You should have received a copy of the GNU Affero General Public License # along with HexaPDF. If not, see . # # The interactive user interfaces in modified source and object code # versions of HexaPDF must display Appropriate Legal Notices, as required # under Section 5 of the GNU Affero General Public License version 3. # # In accordance with Section 7(b) of the GNU Affero General Public # License, a covered work must retain the producer line in every PDF that # is created or manipulated using HexaPDF. # # If the GNU Affero General Public License doesn't fit your need, # commercial licenses are available at . #++ require 'hexapdf/content/processor' module HexaPDF # Contains various helper methods for testing HexaPDF module TestUtils # Can be used to to record operators parsed from content streams. class OperatorRecorder < HexaPDF::Content::Processor undef :paint_xobject attr_reader :recorded_ops def initialize super operators.clear @recorded_ops = [] end def respond_to_missing?(*) true end def method_missing(msg, *params) @recorded_ops << (params.empty? ? [msg] : [msg, params]) end end # Asserts that the content string contains the operators. def assert_operators(content, operators, only_names: false, range: 0..-1) processor = OperatorRecorder.new HexaPDF::Content::Parser.new.parse(content, processor) result = processor.recorded_ops[range] result.map!(&:first) if only_names assert_equal(operators, result) end # Asserts that the method +name+ of +object+ gets invoked with the +expected_values+ when # executing the block. +expected_values+ should contain arrays of arguments, one array for each # invocation of the method. def assert_method_invoked(object, name, *expected_values, check_block: false) args = [] block = [] object.define_singleton_method(name) {|*la, &lb| args << la; block << lb } yield assert_equal(expected_values, args, "Incorrect arguments for #{object.class}##{name}") block.each do |block_arg| assert_kind_of(Proc, block_arg, "Missing block for #{object.class}##{name}") if check_block end ensure object.singleton_class.send(:remove_method, name) end # Creates a fiber that yields the given string in +len+ length parts. def feeder(string, len = string.length) Fiber.new do until string.empty? Fiber.yield(string.slice!(0, len).force_encoding('BINARY')) end end end # Collects the result from the HexaPDF::Filter source into a binary string. def collector(source) str = ''.b while source.alive? && (data = source.resume) str << data end str end end end Minitest::Spec.include(HexaPDF::TestUtils)