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