PDF-Make

 view release on metacpan or  search on metacpan

t/73-watermarks.t  view on Meta::CPAN

        digits => 6,
        suffix => '-2026',
    );
    ok($bates, 'Bates stamp created');
    is($bates->type, 'bates', 'Type is bates');
    is($bates->prefix, 'DOC', 'Prefix');
    is($bates->start, 1, 'Start number');
    is($bates->digits, 6, 'Digits');
    is($bates->suffix, '-2026', 'Suffix');
}

# Test 10: Format string expansion
{
    my $stamp = PDF::Make::Stamp->text('Page %p of %P - %d');
    my $text = $stamp->expand(3, 10);
    like($text, qr/Page 3 of 10/, 'Page numbers expanded');
    like($text, qr/\d{4}-\d{2}-\d{2}/, 'Date expanded');
}

# Test 11: Bates number expansion
{
    my $bates = PDF::Make::Stamp->bates(
        prefix => 'ACME',
        start  => 42,
        digits => 8,
        suffix => '-X',
    );
    
    is($bates->next_bates, 'ACME00000042-X', 'First Bates number');
    is($bates->next_bates, 'ACME00000043-X', 'Second Bates number');
    is($bates->next_bates, 'ACME00000044-X', 'Third Bates number');
    
    $bates->reset;
    is($bates->next_bates, 'ACME00000042-X', 'Reset works');
}

# Test 12: Position parsing
{
    my $wm1 = PDF::Make::Watermark->text('TEST', position => 'center');
    is($wm1->position, 0, 'center = 0');
    
    my $wm2 = PDF::Make::Watermark->text('TEST', position => 'diagonal');
    is($wm2->position, 1, 'diagonal = 1');
    
    my $wm3 = PDF::Make::Watermark->text('TEST', position => 'top_right');
    is($wm3->position, 6, 'top_right = 6');
    
    my $wm4 = PDF::Make::Watermark->text('TEST', position => 'bottom_left');
    is($wm4->position, 7, 'bottom_left = 7');
}

# Test 13: Invalid position
{
    eval { PDF::Make::Watermark->text('TEST', position => 'invalid') };
    like($@, qr/Unknown position/, 'Invalid position rejected');
}

# Test 14: Overlay option
{
    my $wm1 = PDF::Make::Watermark->text('TEST');
    is($wm1->overlay, 0, 'Default is underlay');
    
    my $wm2 = PDF::Make::Watermark->text('TEST', overlay => 1);
    is($wm2->overlay, 1, 'Can set overlay');
}

# Test 15: Tile spacing
{
    my $wm = PDF::Make::Watermark->text('TEST',
        position => 'tile',
        tile_spacing_x => 200,
        tile_spacing_y => 250,
    );
    is($wm->tile_spacing_x, 200, 'Custom tile spacing X');
    is($wm->tile_spacing_y, 250, 'Custom tile spacing Y');
}

# Test 16: Stamp with custom options
{
    my $stamp = PDF::Make::Stamp->text('Footer text',
        position => 'bottom_right',
        margin_x => 72,
        margin_y => 18,
        font     => 'Courier',
        size     => 8,
        color    => [0.5, 0.5, 0.5],
    );
    is($stamp->position, 9, 'bottom_right position');
    is($stamp->margin_x, 72, 'Custom margin_x');
    is($stamp->margin_y, 18, 'Custom margin_y');
    is($stamp->font, 'Courier', 'Custom font');
    is($stamp->size, 8, 'Custom size');
    is_deeply($stamp->color, [0.5, 0.5, 0.5], 'Custom color');
}

# Test 17: Format specifiers
{
    my $stamp = PDF::Make::Stamp->text('%%p=%p %%P=%P %%d=%d %%t=%t');
    my $text = $stamp->expand(5, 20);
    like($text, qr/%p=5/, 'Escaped %p and page number');
    like($text, qr/%P=20/, 'Escaped %P and total pages');
    like($text, qr/%d=\d{4}/, 'Escaped %d and date');
    like($text, qr/%t=\d{2}:\d{2}/, 'Escaped %t and time');
}

# Test 18: Document methods exist
can_ok('PDF::Make::Document', qw(add_watermark apply_stamp));

# Test 19: Watermark requires text
{
    eval { PDF::Make::Watermark->text('') };
    like($@, qr/Text required/, 'Empty text rejected');
    
    eval { PDF::Make::Watermark->text(undef) };
    like($@, qr/Text required/, 'Undef text rejected');
}

# Test 20: Add watermark to document (integration test)
{
    my $doc = PDF::Make::Document->new;
    $doc->add_page;
    $doc->add_page;
    
    my $wm = PDF::Make::Watermark->text('DRAFT');



( run in 0.638 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )