pdf_oxide 0.3.22

The fastest Rust PDF library with text extraction: 0.8ms mean, 100% pass rate on 3,830 PDFs. 5× faster than pdf_extract, 17× faster than oxidize_pdf. Extract, create, and edit PDFs.
Documentation
//! Phase 9.2.C: Primary Word Boundary Detection Mode Implementation Tests
//!
//! Tests for the primary detection mode implementation that replaces
//! the stub process_tj_array_primary() method with actual functionality.
//!
//! This test suite verifies:
//! 1. BoundaryContext creation from graphics state
//! 2. Character partitioning at boundary positions
//! 3. Cluster to TextSpan conversion
//! 4. primary_detected flag is set correctly
//! 5. Backward compatibility with tiebreaker mode

use pdf_oxide::pipeline::config::{TextPipelineConfig, WordBoundaryMode};

#[test]
fn test_primary_mode_config_creation() {
    // Verify that primary mode can be configured without panic
    let config = TextPipelineConfig::default().with_word_boundary_mode(WordBoundaryMode::Primary);

    // Should initialize without panic
    assert_eq!(config.word_boundary_mode, WordBoundaryMode::Primary);
}

#[test]
fn test_tiebreaker_mode_config_creation() {
    // Verify that tiebreaker mode is still the default
    let config = TextPipelineConfig::default();

    // Default should be tiebreaker for backward compatibility
    assert_eq!(config.word_boundary_mode, WordBoundaryMode::Tiebreaker);
}

#[test]
fn test_primary_mode_with_empty_character_array() {
    // Phase 9.2.C: If no characters collected, should not crash
    // This will be tested via actual PDF extraction once implementation is complete

    // For now, verify configuration doesn't panic
    let _config = TextPipelineConfig::default().with_word_boundary_mode(WordBoundaryMode::Primary);
}

#[test]
fn test_primary_mode_fallback_to_tiebreaker() {
    // Phase 9.2.C: When character array is empty, should fall back to tiebreaker
    // This ensures no regression in existing behavior

    // Will be validated via integration tests once implementation is complete
}

#[test]
fn test_backward_compat_with_tiebreaker_mode() {
    // Phase 9.2.C: Tiebreaker mode should work identically to before
    // All 1,308 existing tests should pass

    let config =
        TextPipelineConfig::default().with_word_boundary_mode(WordBoundaryMode::Tiebreaker);

    assert_eq!(config.word_boundary_mode, WordBoundaryMode::Tiebreaker);
}

// Additional tests will be added as implementation progresses:
// - test_primary_mode_detects_simple_boundary() - Requires PDF extraction
// - test_primary_mode_creates_correct_span_count() - Requires PDF extraction
// - test_primary_mode_preserves_character_positions() - Requires PDF extraction
// - test_primary_mode_handles_single_character() - Requires PDF extraction
// - test_primary_mode_handles_no_boundaries() - Requires PDF extraction
// - test_primary_detected_flag_set_correctly() - Requires PDF extraction

#[test]
fn test_primary_mode_initialization() {
    // Verify primary mode can be set up correctly
    let config = TextPipelineConfig::default().with_word_boundary_mode(WordBoundaryMode::Primary);

    // Configuration should be valid
    assert_eq!(config.word_boundary_mode, WordBoundaryMode::Primary);
}