a0ad424add1532b0e8c09bf0945657185474cb9b
[gitmo/Mouse.git] / author / import-moose-test.pl
1 #!/usr/bin/perl -w
2 use 5.10.0;
3 use strict;
4 use warnings FATAL => 'all';
5 use File::Path qw(mkpath);
6 use File::Find;
7 use autodie;
8
9 my($moose_dir, $result) = @ARGV;
10 unless(defined $moose_dir and -d "$moose_dir/t") {
11     die "Usage: $0 Moose-dir result-dir\n";
12 }
13 $result //= 'Moose-test';
14 if(-e $result) {
15     die "'$result' exists, stopped";
16 }
17
18 my @tests;
19 sub wanted {
20     (my $mouse_test         = $_) =~ s{\A $moose_dir/t }{$result}xmso;
21     (my $mouse_failing_test = $_) =~ s{\A $moose_dir/t }{$result-failing}xmso;
22     if( -d $_ ) {
23         mkpath [$mouse_test, $mouse_failing_test];
24         return;
25     }
26     copy_as_mouse($_ => $mouse_test);
27     push @tests, [$mouse_test, $mouse_failing_test]
28         if $mouse_test =~/\.t\z/xms;
29     return;
30 }
31
32 find { wanted => \&wanted, no_chdir => 1 }, "$moose_dir/t/";
33
34 say "Testing ...";
35
36 $ENV{PERL5LIB} = join ':', "$result/lib", @INC;
37
38 my $ok = 0;
39 foreach my $t(sort { $b cmp $a } @tests) {
40     my($t, $fail) = @{$t};
41     if(system(qq{$^X $t 2>&1 >/dev/null}) == 0) {
42         say "$t ... ok";
43         $ok++;
44     }
45     else {
46         # make it TODO and retyr it
47         open my $in,'<', $t;
48         open my $out, '>', "/tmp/retry.t.$$";
49         while(<$in>) {
50             print $out $_;
51             /use Test::More/
52                 && say $out '$TODO = q{Mouse is not yet completed};';
53         }
54         close $in;
55         close $out;
56
57         rename "/tmp/retry.t.$$", $t;
58
59         if(system(qq{$^X $t 2>&1 >/dev/null}) == 0) {
60             say "$t ... ok (TODO)";
61             $ok++;
62         }
63         else {
64             say "$t ... not ok";
65             rename $t, $fail;
66         }
67     }
68 }
69 say sprintf "%d %% (%d/%d) succeed.", ($ok/@tests)*100, $ok, scalar @tests;
70
71 sub copy_as_mouse {
72     my($moose, $mouse) = @_;
73     open my $in, '<',  $moose;
74     open my $out, '>', $mouse;
75  
76     while(<$in>) {
77         if($. == 2) {
78             say $out 'use t::lib::MooseCompat;';
79         }
80         s/\b Class::MOP::([a-z_]+) \b/Mouse::Util::$1/xmsg;
81         s/\b Class::MOP \b /Mouse::Meta/xmsg;
82         s/\b Moose \b/Mouse/xmsg;
83
84         # make classes simple
85         s{\b(Mouse::Meta::TypeConstraint)::\w+    }{$1}xmsg;
86         s{\b(Mouse::Meta::Role::Application)::\w+ }{$1}xmsg;
87         s{\b(Mouse::Meta::Method)::\w+            }{$1}xmsg;
88
89         print $out $_;
90     }
91     close $in;
92     close $out;
93 }