Back to Repositories

Testing PDF Page Rearrangement Implementation in Stirling-PDF

This test suite validates the RearrangePagesPDFController class functionality, specifically focusing on the oddEvenMerge method’s page reordering capabilities. The tests ensure proper handling of PDF page rearrangement for documents with varying page counts.

Test Coverage Overview

The test suite provides comprehensive coverage of the oddEvenMerge functionality, examining various scenarios:
  • Empty document (0 pages)
  • Documents with odd number of pages
  • Documents with even number of pages
  • Parameterized tests for multiple page counts (1-50 pages)
Edge cases include empty documents and single-page PDFs, with integration points to the CustomPDDocumentFactory.

Implementation Analysis

The testing approach utilizes JUnit 5 with Mockito for dependency isolation. The implementation employs both standard @Test methods and @ParameterizedTest with @CsvSource for data-driven testing, demonstrating modern testing patterns. Framework-specific features include MockitoAnnotations, BeforeEach setup, and parameterized test data sources.

Technical Details

Testing tools and configuration:
  • JUnit Jupiter (JUnit 5)
  • Mockito mocking framework
  • Custom assertions for null checks and list equality
  • MockitoAnnotations for automatic mock initialization
  • BeforeEach setup for test isolation

Best Practices Demonstrated

The test suite exemplifies several testing best practices:
  • Clear test method naming convention
  • Comprehensive documentation with method-level JavaDoc
  • Test isolation through proper mock setup
  • Data-driven testing for multiple scenarios
  • Explicit assertion messages for better debugging
  • Systematic coverage of edge cases and normal scenarios

stirling-tools/stirling-pdf

src/test/java/stirling/software/SPDF/controller/api/RearrangePagesPDFControllerTest.java

            
package stirling.software.SPDF.controller.api;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

import java.util.Arrays;
import java.util.List;

import static org.junit.jupiter.api.Assertions.*;

import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import stirling.software.SPDF.service.CustomPDDocumentFactory;

import java.util.Arrays;
import java.util.List;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;

import org.junit.jupiter.api.BeforeEach;

class RearrangePagesPDFControllerTest {

    @Mock
    private CustomPDDocumentFactory mockPdfDocumentFactory;

    private RearrangePagesPDFController sut;

    @BeforeEach
    void setUp() {
        MockitoAnnotations.openMocks(this);
        sut = new RearrangePagesPDFController(mockPdfDocumentFactory);
    }

    /**
     * Tests the behavior of the oddEvenMerge method when there are no pages in the document.
     */
    @Test
    void oddEvenMerge_noPages() {
        int totalNumberOfPages = 0;

        List<Integer> newPageOrder = sut.oddEvenMerge(totalNumberOfPages);

        assertNotNull(newPageOrder, "Returning null instead of page order list");
        assertEquals(List.of(), newPageOrder, "Page order doesn't match");
    }

    /**
     * Tests the behavior of the oddEvenMerge method when there are odd total pages in the document.
     */
    @Test
    void oddEvenMerge_oddTotalPageNumber() {
        int totalNumberOfPages = 5;

        List<Integer> newPageOrder = sut.oddEvenMerge(totalNumberOfPages);

        assertNotNull(newPageOrder, "Returning null instead of page order list");
        assertEquals(Arrays.asList(0, 3, 1, 4, 2), newPageOrder, "Page order doesn't match");
    }

    /**
     * Tests the behavior of the oddEvenMerge method when there are even total pages in the document.
     */
    @Test
    void oddEvenMerge_evenTotalPageNumber() {
        int totalNumberOfPages = 6;

        List<Integer> newPageOrder = sut.oddEvenMerge(totalNumberOfPages);

        assertNotNull(newPageOrder, "Returning null instead of page order list");
        assertEquals(Arrays.asList(0, 3, 1, 4, 2, 5), newPageOrder, "Page order doesn't match");
    }

    /**
     * Tests the behavior of the oddEvenMerge method with multiple test cases of multiple pages.
     *
     * @param totalNumberOfPages The total number of pages in the document.
     * @param expectedPageOrder  The expected order of the pages after rearranging.
     */
    @ParameterizedTest
    @CsvSource({
            "1, '0'",
            "2, '0,1'",
            "3, '0,2,1'",
            "4, '0,2,1,3'",
            "5, '0,3,1,4,2'",
            "6, '0,3,1,4,2,5'",
            "10, '0,5,1,6,2,7,3,8,4,9'",
            "50, '0,25,1,26,2,27,3,28,4,29,5,30,6,31,7,32,8,33,9,34,10,35," +
                    "11,36,12,37,13,38,14,39,15,40,16,41,17,42,18,43,19,44,20,45,21,46," +
                    "22,47,23,48,24,49'"
    })
    void oddEvenMerge_multi_test(int totalNumberOfPages, String expectedPageOrder) {
        List<Integer> newPageOrder = sut.oddEvenMerge(totalNumberOfPages);

        assertNotNull(newPageOrder, "Returning null instead of page order list");
        assertEquals(Arrays.stream(expectedPageOrder.split(",")).map(Integer::parseInt).toList(), newPageOrder, "Page order doesn't match");
    }
}