# Before "make install", this script should be runnable with "make test".
# After "make install" it should work as "perl t/QuickTime.t".

BEGIN {
    $| = 1; print "1..22\n"; $Image::ExifTool::configFile = '';
    require './t/TestLib.pm'; t::TestLib->import();
}
END {print "not ok 1\n" unless $loaded;}

# test 1: Load the module(s)
use Image::ExifTool 'ImageInfo';
use Image::ExifTool::QuickTime;
$loaded = 1;
print "ok 1\n";

my $testname = 'QuickTime';
my $testnum = 1;

# tests 2-3: Extract information from QuickTime.mov and QuickTime.m4a
{
    my $ext;
    foreach $ext (qw(mov m4a)) {
        ++$testnum;
        my $exifTool = Image::ExifTool->new;
        my $info = $exifTool->ImageInfo("t/images/QuickTime.$ext");
        notOK() unless check($exifTool, $info, $testname, $testnum);
        print "ok $testnum\n";
    }
}

# tests 4-5: Try writing XMP to the different file formats
{
    my $ext;
    my $exifTool = Image::ExifTool->new;
    $exifTool->Options(SavePath => 1); # to save group 5 names
    $exifTool->SetNewValue('XMP:Title' => 'x');
    $exifTool->SetNewValue('TrackCreateDate' => '2000:01:02 03:04:05');
    $exifTool->SetNewValue('Track1:TrackModifyDate' => '2013:11:04 10:32:15');
    foreach $ext (qw(mov m4a)) {
        ++$testnum;
        unless (eval { require Time::Local }) {
            print "ok $testnum # skip Requires Time::Local\n";
            next;
        }
        my $testfile = "t/${testname}_${testnum}_failed.$ext";
        unlink $testfile;
        my $rtnVal = $exifTool->WriteInfo("t/images/QuickTime.$ext", $testfile);
        my $info = $exifTool->ImageInfo($testfile, 'title', 'time:all');
        if (check($exifTool, $info, $testname, $testnum, undef, 5)) {
            unlink $testfile;
        } else {
            notOK();
        }
        print "ok $testnum\n";
    }
}

# test 6: Write video rotation
{
    ++$testnum;
    my $exifTool = Image::ExifTool->new;
    $exifTool->SetNewValue('Rotation' => '270', Protected => 1);
    my $testfile = "t/${testname}_${testnum}_failed.mov";
    unlink $testfile;
    my $rtnVal = $exifTool->WriteInfo('t/images/QuickTime.mov', $testfile);
    my $info = $exifTool->ImageInfo($testfile, 'Rotation', 'MatrixStructure');
    if (check($exifTool, $info, $testname, $testnum)) {
        unlink $testfile;
    } else {
        notOK();
    }
    print "ok $testnum\n";
}

# test 7: Add a bunch of new tags and delete one
{
    ++$testnum;
    my @writeInfo = (
        ['QuickTime:Artist' => 'me'],
        ['QuickTime:Model' => 'model'],
        ['UserData:Genre' => 'rock'],
        ['UserData:Album' => 'albumA'],
        ['ItemList:Album' => 'albumB'],
        ['ItemList:ID-albm:Album' => 'albumC'],
        ['QuickTime:Comment-fra-FR' => 'fr comment'],
        ['Keys:Director' => 'director'],
        ['Keys:CameraDirection' => '90'],
        ['Keys:Album' => undef ],
    );
    my @extract = ('ItemList:all', 'UserData:all', 'Keys:all');
    notOK() unless writeCheck(\@writeInfo, $testname, $testnum, 't/images/QuickTime.mov', \@extract);
    print "ok $testnum\n";
}

# test 8-9: Delete everything then add back some tags in one step
{
    my $ext;
    my $exifTool = Image::ExifTool->new;
    my @writeInfo = (
        ['all' => undef],
        ['artist' => 'me'],
        ['keys:director' => 'dir'],
        ['userdata:arranger' => 'arr'],
    );
    my @extract = ('QuickTime:all', 'XMP:all');
    foreach $ext (qw(mov m4a)) {
        ++$testnum;
        notOK() unless writeCheck(\@writeInfo, $testname, $testnum, "t/images/QuickTime.$ext", \@extract);
        print "ok $testnum\n";
    }
}

# test 10: Delete everything then add back some tags in two steps
{
    ++$testnum;
    my $testfile = "t/${testname}_${testnum}a_failed.mov";
    unlink $testfile;
    my $exifTool = Image::ExifTool->new;
    $exifTool->Options(QuickTimeHandler => 1);
    $exifTool->SetNewValue('all' => undef);
    writeInfo($exifTool, 't/images/QuickTime.mov', $testfile);
    my @writeInfo = (
        ['quicktime:artist' => 'me'],
        ['keys:director' => 'dir'],
        ['userdata:arranger' => 'arr'],
    );
    my @extract = ('QuickTime:all', 'XMP:all', '-Track1:all', '-Track2:all');
    notOK() unless writeCheck(\@writeInfo, $testname, $testnum, $testfile, \@extract);
    print "ok $testnum\n";
}

# tests 11-13: HEIC write tests
{
    ++$testnum;
    my $testfile = "t/${testname}_${testnum}_failed.heic";
    unlink $testfile;
    my $exifTool = Image::ExifTool->new;
    $exifTool->Options(Composite => 0);
    $exifTool->SetNewValue('XMP-dc:Title' => 'a title');
    writeInfo($exifTool, 't/images/QuickTime.heic', $testfile);
    my $info = $exifTool->ImageInfo($testfile, '-file:all');
    unless (check($exifTool, $info, $testname, $testnum)) {
        notOK();
    }
    print "ok $testnum\n";

    ++$testnum;
    my $testfile2 = "t/${testname}_${testnum}_failed.heic";
    unlink $testfile2;
    $exifTool->SetNewValue();
    $exifTool->SetNewValue('XMP:all' => undef);
    $exifTool->SetNewValue('EXIF:Artist' => 'an artist');
    writeInfo($exifTool, $testfile, $testfile2);
    $info = $exifTool->ImageInfo($testfile2, '-file:all');
    if (check($exifTool, $info, $testname, $testnum)) {
        unlink $testfile;
    } else {
        notOK();
    }
    print "ok $testnum\n";

    ++$testnum;
    $testfile = "t/${testname}_${testnum}_failed.heic";
    unlink $testfile;
    $exifTool->SetNewValue();
    $exifTool->SetNewValue('EXIF:all' => undef);
    $exifTool->SetNewValue('EXIF:UserComment' => 'a comment');
    $exifTool->SetNewValue('XMP:Subject' => 'a subject');
    $exifTool->SetNewValue('XMP:Subject' => 'another subject');
    writeInfo($exifTool, $testfile2, $testfile);
    $info = $exifTool->ImageInfo($testfile, '-file:all');
    if (check($exifTool, $info, $testname, $testnum)) {
        unlink $testfile;
        unlink $testfile2;
    } else {
        notOK();
    }
    print "ok $testnum\n";
}

# test 14: Delete everything then add back a tag without specifying the group
{
    ++$testnum;
    my $testfile = "t/${testname}_10a_failed.mov";  # use source file from test 10
    my @writeInfo = ( ['publisher' => 'pub'] );
    my @extract = ('QuickTime:all', 'XMP:all', '-Track1:all', '-Track2:all');
    if (writeCheck(\@writeInfo, $testname, $testnum, $testfile, \@extract)) {
        unlink $testfile;
    } else {
        notOK();
    }
    print "ok $testnum\n";
}

# test 15: Test WriteMode option with QuickTime tags
{
    ++$testnum;
    my $exifTool = Image::ExifTool->new;
    $exifTool->Options(WriteMode => 'c');
    $exifTool->SetNewValue('ItemList:Composer' => 'WRONG');
    $exifTool->SetNewValue('ItemList:Author' => 'aut');
    $exifTool->SetNewValue('Keys:Artist' => 'WRONG');
    $exifTool->SetNewValue('UserData:Artist' => 'art');
    my $testfile = "t/${testname}_${testnum}_failed.m4a";
    unlink $testfile;
    my $rtnVal = $exifTool->WriteInfo('t/images/QuickTime.m4a', $testfile);
    my $info = $exifTool->ImageInfo($testfile, 'ItemList:all', 'Keys:all', 'UserData:all');
    if (check($exifTool, $info, $testname, $testnum)) {
        unlink $testfile;
    } else {
        notOK();
    }
    print "ok $testnum\n";
}

# test 16: Write some Microsoft Xtra tags
{
    ++$testnum;
    my @writeInfo = (
        ['Microsoft:Director' => 'dir1'],
        ['Microsoft:Director' => 'dir2'],
        ['Microsoft:SharedUserRating' => 75],
    );
    my @extract = ('Microsoft:all');
    notOK() unless writeCheck(\@writeInfo, $testname, $testnum, 't/images/QuickTime.mov', \@extract);
    print "ok $testnum\n";
}

# test 17: Write some 3gp tags
{
    ++$testnum;
    my @writeInfo = (
        ['UserData:LocationInformation' => 'test comment role=Shooting lat=1.2 lon=-2.3 alt=100 body=earth notes=a note'],
        ['UserData:Rating' => 'entity=ABCD criteria=1234 a rating'],
    );
    notOK() unless writeCheck(\@writeInfo, $testname, $testnum, 't/images/QuickTime.mov', 1);
    print "ok $testnum\n";
}

# test 18-20: Write to audio and video tracks, clear the data and write again
{
    ++$testnum;
    my @writeInfo = (
        ['VideoKeys:LensModel' => 'test lens'],
        ['AudioKeys:Treble' => '50'],
    );
    my @writeMore = (
        ['Keys:Title' => 'Keys'],
        ['ItemList:Title' => 'ItemList'],
        ['UserData:Title' => 'UserData'],
    );
    my @tags = (qw(keys:all audiokeys:all videokeys:all itemlist:all userdata:all));
    my $testfile = "t/${testname}_${testnum}_failed.mov";
    my $exifTool = Image::ExifTool->new;
    $exifTool->SetNewValue(@$_) foreach @writeInfo;
    unlink $testfile;
    my $ok = writeInfo($exifTool, 't/images/QuickTime.mov', $testfile);
    if ($ok) {
        my $info = $exifTool->ImageInfo($testfile,{Duplicates=>1,Unknown=>1},@tags);
        $ok = check($exifTool, $info, $testname, $testnum);
    }
    notOK() unless $ok;
    print "ok $testnum\n";

    ++$testnum;
    my $testfile2 = "t/${testname}_${testnum}_failed.mov";
    $exifTool->SetNewValue();
    $exifTool->SetNewValue(all => undef);   # delete all
    unlink $testfile2;
    $ok = writeInfo($exifTool, $testfile, $testfile2);
    if ($ok) {
        my $info = $exifTool->ImageInfo($testfile2,{Duplicates=>1,Unknown=>1},@tags);
        $ok = check($exifTool, $info, $testname, $testnum);
    }
    if ($ok) {
        unlink $testfile;
    } else {
        notOK();
    }
    print "ok $testnum\n";

    ++$testnum;
    my $testfile3 = "t/${testname}_${testnum}_failed.mov";
    $exifTool->SetNewValue();
    $exifTool->SetNewValue(@$_) foreach @writeInfo, @writeMore;
    unlink $testfile3;
    $ok = writeInfo($exifTool, $testfile2, $testfile3);
    if ($ok) {
        my $info = $exifTool->ImageInfo($testfile3,{Duplicates=>1,Unknown=>1},@tags);
        $ok = check($exifTool, $info, $testname, $testnum);
    }
    if ($ok) {
        unlink $testfile2;
        unlink $testfile3;
    } else {
        notOK();
    }
    print "ok $testnum\n";
}

# test 21-22: Write and delete alternate language tags
{
    ++$testnum;
    my $testfile = "t/${testname}_${testnum}_failed.mov";
    my $exifTool = Image::ExifTool->new;
    $exifTool->SetNewValue('Keys:Title-eng-ca' => 'test');
    $exifTool->SetNewValue('ItemList:all' => undef);
    $exifTool->SetNewValue('ItemList:Title-eng-ca' => 'test');
    $exifTool->SetNewValue('ItemList:Title' => 'test');
    unlink $testfile;
    my $ok = writeInfo($exifTool, 't/images/QuickTime.mov', $testfile);
    if ($ok) {
        my $info = $exifTool->ImageInfo($testfile,{Duplicates=>1,Unknown=>1},'Keys:all','ItemList:all');
        $ok = check($exifTool, $info, $testname, $testnum);
    }
    notOK() unless $ok;
    print "ok $testnum\n";

    ++$testnum;
    my $testfile2 = "t/${testname}_${testnum}_failed.mov";
    $exifTool->SetNewValue();
    $exifTool->SetNewValue('Keys:Title-eng-ca' => undef);
    $exifTool->SetNewValue('ItemList:Title-eng-ca' => undef);
    unlink $testfile2;
    $ok = writeInfo($exifTool, $testfile, $testfile2);
    if ($ok) {
        my $info = $exifTool->ImageInfo($testfile2,{Duplicates=>1,Unknown=>1},'Keys:all','ItemList:all');
        $ok = check($exifTool, $info, $testname, $testnum);
    }
    if ($ok) {
        unlink $testfile;
        unlink $testfile2;
    } else {
        notOK();
    }
    print "ok $testnum\n";
}

done(); # end
