]> git.vpit.fr Git - perl/modules/rgit.git/blob - t/20-each.t
Check the value returned by git correctly. POSIX is now a dependency
[perl/modules/rgit.git] / t / 20-each.t
1 #!perl
2
3 use strict;
4 use warnings;
5
6 use Cwd qw/cwd abs_path/;
7 use File::Spec::Functions qw/catdir catfile/;
8 use File::Temp qw/tempfile tempdir/;
9
10 use Test::More tests => 2 + 2 * 2 + 11 * (3 + 1);
11
12 use App::Rgit;
13
14 sub build {
15  my ($tree, $prefix) = @_;
16  my @ret;
17  my $r = delete $tree->{_};
18  while (my ($d, $v) = each %$tree) {
19   if (ref $v) {
20    my $dir = catdir $prefix, $d;
21    mkdir $dir or die "mkdir($dir): $!";
22    my @r = build($v, $dir);
23    push @ret, map [
24                $_->[0],
25                ref eq 'main' ? @{$_}[1 .. 3]
26                              : map { catdir($d, $_) } @{$_}[1 .. 3]
27               ], @r unless $r;
28   } else {
29    my $file = catfile($prefix, $d);
30    open my $fh, '>', $file or die "open($file): $!";
31    print $fh $v;
32    close $fh;
33   }
34  }
35  return $r ? bless $r, 'main' : @ret;
36 }
37
38 my $repogit = {
39  HEAD    => 1,
40  refs    => { dummy => 1 },
41  objects => { dummy => 1 },
42 };
43
44 sub repo {
45  my ($n, $bare) = @_;
46  return $bare ? [ $n, "$n.git",           "$n.git", "$n.git" ]
47               : [ $n, catdir($n, '.git'), $n,       "$n.git" ]
48 }
49
50 my $tmpdir = tempdir(CLEANUP => 1);
51 my $cwd = cwd;
52 chdir $tmpdir or die "chdir($tmpdir): $!";
53 my @expected = sort { $a->[1] cmp $b->[1] } build({
54  x => {
55   a => {
56    _ => repo('a', 0),
57    '.git' => $repogit
58   },
59   z => {
60    '.git' => {
61     refs => { dummy => 1 },
62    }
63   }
64  },
65  y => {
66   'b.git' => {
67    _ => repo('b', 1),
68    %$repogit
69   },
70   't' => {
71    't.git' => {
72     refs => { dummy => 1 },
73     objects => { dummy => 1 },
74    }
75   }
76  },
77  c => {
78   _ => repo('c', 0),
79   '.git' => $repogit
80  }
81 }, '.');
82 chdir $cwd or die "chdir($cwd): $!";
83
84 is(@expected, 3, 'only three valid git repos');
85 is(grep({ ref eq 'ARRAY' } @expected), 3, 'all of them are array references');
86
87 @expected = map [
88              @$_,
89              map({ catdir($tmpdir, $_) } @{$_}[1 .. 3]),
90              $tmpdir,
91              '^n'
92             ], @expected;
93
94 for my $cmd (qw/commit FAIL/) {
95  my ($fh, $filename) = tempfile(UNLINK => 1);
96  my $ar = App::Rgit->new(
97   git  => abs_path('t/bin/git'),
98   root => $tmpdir,
99   cmd  => $cmd,
100   args => [ abs_path($filename), $cmd, qw/^n ^g ^w ^b ^G ^W ^B ^R ^^n/ ]
101  );
102  isnt($ar, undef, "each $cmd has a defined object");
103  my $exit = $ar->run;
104  my $fail = $cmd eq 'FAIL' ? 1 : 0;
105  is($exit, $fail, "each $cmd returned $fail");
106  my @lines = split /\n/, do { local $/; <$fh> };
107  my $res = [ map [ split /\|/, $_ ], @lines ];
108  my $exp = [ map [ $cmd, @$_ ], $fail ? $expected[0] : @expected ];
109  for my $i (0 .. $#$exp) {
110   my $e = $exp->[$i];
111   my $r = shift @$res;
112   isnt($r, undef, "each $cmd visited repository $i");
113 SKIP:
114   {
115    skip 'didn\'t visited that repo' => 10 unless defined $r;
116    is($r->[$_], $e->[$_], "each $cmd argument $_ for repository $i is ok")
117     for 0 .. 9;
118   }
119  }
120 }