#!/usr/bin/env perl
require 5.008;
use warnings;
use strict;

unshift(@INC, '.');
require qpdf_test_helpers;

chdir("qpdf") or die "chdir testdir failed: $!\n";

require TestDriver;

cleanup();

my $td = new TestDriver('rotate-pages');

my $n_tests = 18;

# Do absolute, positive, and negative on ranges that include
# inherited and non-inherited.
# Pages 11-15 inherit /Rotate 90
# Pages 1 and 2 have explicit /Rotate 270
# Pages 16 and 17 have explicit /Rotate 180

$td->runtest("page rotation",
             {$td->COMMAND => "qpdf --static-id to-rotate.pdf a.pdf" .
                  " --rotate=+90:1,4,11,16" .
                  " --rotate=180:2,5,12-13" .
                  " --rotate=-90:3,15,17,18"},
             {$td->STRING => "", $td->EXIT_STATUS => 0});
$td->runtest("check output",
             {$td->FILE => "a.pdf"},
             {$td->FILE => "rotated.pdf"});

$td->runtest("remove rotation",
             {$td->COMMAND => "qpdf --static-id rotated.pdf a.pdf" .
                  " --qdf --no-original-object-ids --rotate=0"},
             {$td->STRING => "", $td->EXIT_STATUS => 0});
$td->runtest("check output",
             {$td->FILE => "a.pdf"},
             {$td->FILE => "unrotated.pdf"});

$td->runtest("rotate all pages",
             {$td->COMMAND =>
                  "qpdf --static-id --rotate=180 minimal.pdf a.pdf"},
             {$td->STRING => "", $td->EXIT_STATUS => 0});
$td->runtest("check output",
             {$td->FILE => "a.pdf"},
             {$td->FILE => "minimal-rotated.pdf"});

$td->runtest("flatten with inherited rotate",
             {$td->COMMAND =>
                  "qpdf --static-id --flatten-rotation" .
                  " inherited-rotate.pdf a.pdf"},
             {$td->STRING => "", $td->EXIT_STATUS => 0});
$td->runtest("check output",
             {$td->FILE => "a.pdf"},
             {$td->FILE => "inherited-flattened.pdf"});

foreach my $angle (qw(90 180 270))
{
    $td->runtest("rotate annotations",
                 {$td->COMMAND =>
                      "qpdf --static-id --qdf --rotate=$angle" .
                      " --flatten-rotation --no-original-object-ids" .
                      " form-fields-and-annotations.pdf a.pdf"},
                 {$td->STRING => "", $td->EXIT_STATUS => 0});
    $td->runtest("check output (flatten $angle)",
                 {$td->FILE => "a.pdf"},
                 {$td->FILE => "annotations-rotated-$angle.pdf"});
}

# The file form-fields-and-annotations-shared.pdf contains some
# annotations that appear in multiple pages /Annots, some non-shared
# things that share appearance streams, some form fields appear on
# multiple pages, and an indirect /Annotations array. It is out of
# spec in several ways but still works in most viewers. These test
# make sure we don't make anything worse and also end up exercising
# some cases of things being copied more than once, though we also
# exercise that with legitimate test cases using overlay.

$td->runtest("shared annotations 1 page",
             {$td->COMMAND =>
                  "qpdf --qdf --no-original-object-ids --static-id" .
                  " --rotate=90:1 form-fields-and-annotations-shared.pdf" .
                  " a.pdf --flatten-rotation"},
             {$td->STRING => "", $td->EXIT_STATUS => 0},
             $td->NORMALIZE_NEWLINES);
$td->runtest("check output",
             {$td->FILE => "a.pdf"},
             {$td->FILE => "rotated-shared-annotations-1.pdf"});
$td->runtest("shared annotations 2 pages",
             {$td->COMMAND =>
                  "qpdf --qdf --no-original-object-ids --static-id" .
                  " --rotate=90:1,2 form-fields-and-annotations-shared.pdf" .
                  " a.pdf --flatten-rotation"},
             {$td->STRING => "", $td->EXIT_STATUS => 0},
             $td->NORMALIZE_NEWLINES);
$td->runtest("check output",
             {$td->FILE => "a.pdf"},
             {$td->FILE => "rotated-shared-annotations-2.pdf"});

cleanup();
$td->report($n_tests);
