#!perl -w
# Copyright (C) 2020-2021 all contributors
# License: AGPL-3.0+
use strict;
use Test::More;
use_ok 'PublicInbox::IdxStack';
my $oid_a = '03c21563cf15c241687966b5b2a3f37cdc193316';
my $oid_b = '963caad026055ab9bcbe3ee9550247f9d8840feb';
my $cmt_a = 'df8e4a0612545d53672036641e9f076efc94c2f6';
my $cmt_b = '3ba7c9fa4a083c439e768882c571c2026a981ca5';
my $stk = PublicInbox::IdxStack->new;
is($stk->read_prepare, $stk, 'nothing');
is($stk->num_records, 0, 'no records');
is($stk->pop_rec, undef, 'undef on empty');
$stk = PublicInbox::IdxStack->new;
$stk->push_rec('m', 1234, 5678, $oid_a, $cmt_a);
is($stk->read_prepare, $stk, 'read_prepare');
is($stk->num_records, 1, 'num_records');
is_deeply([$stk->pop_rec], ['m', 1234, 5678, $oid_a, $cmt_a], 'pop once');
is($stk->pop_rec, undef, 'undef on empty');
$stk = PublicInbox::IdxStack->new;
$stk->push_rec('m', 1234, 5678, $oid_a, $cmt_a);
$stk->push_rec('d', 1234, 5678, $oid_b, $cmt_b);
is($stk->read_prepare, $stk, 'read_prepare');
is($stk->num_records, 2, 'num_records');
is_deeply([$stk->pop_rec], ['d', 1234, 5678, $oid_b, $cmt_b], 'pop');
is_deeply([$stk->pop_rec], ['m', 1234, 5678, $oid_a, $cmt_a], 'pop-pop');
is($stk->pop_rec, undef, 'empty');
SKIP: {
$stk = undef;
my $nr = $ENV{TEST_GIT_LOG} or skip 'TEST_GIT_LOG unset', 3;
open my $fh, '-|', qw(git log --pretty=tformat:%at.%ct.%H), "-$nr" or
die "git log: $!";
my @expect;
while (<$fh>) {
chomp;
my ($at, $ct, $H) = split(/\./);
$stk //= PublicInbox::IdxStack->new;
# not bothering to parse blobs here, just using commit OID
# as a blob OID since they're the same size + format
$stk->push_rec('m', $at + 0, $ct + 0, $H, $H);
push(@expect, [ 'm', $at, $ct, $H, $H ]);
}
$stk or skip('nothing from git log', 3);
is($stk->read_prepare, $stk, 'read_prepare');
is($stk->num_records, scalar(@expect), 'num_records matches expected');
my @result;
while (my @tmp = $stk->pop_rec) {
unshift @result, \@tmp;
}
is_deeply(\@result, \@expect, 'results match expected');
}
done_testing;