@@ -7,55 +7,117 @@ BEGIN {
7
7
chdir ' t' ;
8
8
9
9
use Config;
10
- use MakeMaker::Test::Utils;
11
- use Test::More tests => 16;
10
+ use MakeMaker::Test::Utils qw( makefile_name make_run run which_perl) ;
11
+ use Test::More;
12
+ use File::Temp qw[ tempdir] ;
12
13
use File::Spec;
14
+ use Cwd;
13
15
14
- my $TB = Test::More-> builder;
16
+ my $TB = Test::More-> builder;
15
17
my $perl = which_perl;
16
18
17
19
BEGIN { use_ok(' ExtUtils::MM' ) }
18
20
19
21
my $mm = bless { NAME => " Foo" , MAKE => $Config {make } }, ' MM' ;
20
- isa_ok($mm , ' ExtUtils::MakeMaker' );
21
- isa_ok($mm , ' ExtUtils::MM_Any' );
22
+ isa_ok( $mm , ' ExtUtils::MakeMaker' );
23
+ isa_ok( $mm , ' ExtUtils::MM_Any' );
22
24
25
+ my $make = make_run();
23
26
24
- sub try_oneliner {
25
- my ($code , $switches , $expect , $name ) = @_ ;
26
- my $cmd = $mm -> oneliner($code , $switches );
27
- $cmd =~ s {\$\( ABSPERLRUN\) } { $perl } ;
27
+ my $tmpdir = tempdir( CLEANUP => 1 );
28
28
29
- # VMS likes to put newlines at the end of commands if there isn't
30
- # one already.
31
- $expect =~ s / ([^\n ])\z / $1 \n / if $^O eq ' VMS' ;
29
+ my $cwd = getcwd;
30
+ END { chdir $cwd if defined $cwd } # so File::Temp can cleanup
32
31
33
- $TB -> is_eq( scalar ` $cmd ` , $expect , $name ) || $TB -> diag( " oneliner: \n $cmd " );
34
- }
32
+ # run all these test from a temporary directory
33
+ chdir ( $tmpdir ) or die " Fail to change to tmp directory: $! " ;
35
34
36
35
# Lets see how it deals with quotes.
37
- try_oneliner(q{ print "foo'o", ' bar"ar'} , [], q{ foo'o bar"ar} , ' quotes' );
36
+ try_oneliner( q{ print "foo'o", ' bar"ar'} , [], q{ foo'o bar"ar} , ' quotes' );
38
37
39
38
# How about dollar signs?
40
- try_oneliner(q{ $PATH = 'foo'; print $PATH} ,[], q{ foo} , ' dollar signs' );
39
+ try_oneliner( q{ my $PATH = 'foo'; print $PATH} , [], q{ foo} , ' dollar signs' );
40
+ try_oneliner( q{ my %h = (1, 2); print $h{1}} , [], q{ 2} , ' %h and $h' );
41
41
42
42
# switches?
43
- try_oneliner(q{ print 'foo'} , [' -l' ], " foo\n " , ' switches' );
43
+ try_oneliner( q{ print 'foo'} , [' -l' ], " foo\n " , ' switches' );
44
44
45
45
# some DOS-specific things
46
- try_oneliner(q{ print " \" "} , [], q{ " } , ' single quote' );
47
- try_oneliner(q{ print " < \" "} , [], q{ < " } , ' bracket, then quote' );
48
- try_oneliner(q{ print " \" < "} , [], q{ " < } , ' quote, then bracket' );
49
- try_oneliner(q{ print " < \"\" < \" < \" < "} , [], q{ < "" < " < " < } , ' quotes and brackets mixed' );
50
- try_oneliner(q{ print " < \" | \" < | \" < \" < "} , [], q{ < " | " < | " < " < } , ' brackets, pipes and quotes' );
46
+ try_oneliner( q{ print " \" "} , [], q{ " } , ' single quote' );
47
+ try_oneliner( q{ print " < \" "} , [], q{ < " } , ' bracket, then quote' );
48
+ try_oneliner( q{ print " \" < "} , [], q{ " < } , ' quote, then bracket' );
49
+ try_oneliner(
50
+ q{ print " < \"\" < \" < \" < "} , [], q{ < "" < " < " < } ,
51
+ ' quotes and brackets mixed'
52
+ );
53
+ try_oneliner(
54
+ q{ print " < \" | \" < | \" < \" < "} , [],
55
+ q{ < " | " < | " < " < } , ' brackets, pipes and quotes'
56
+ );
51
57
52
58
# some examples from http://www.autohotkey.net/~deleyd/parameters/parameters.htm#CPP
53
- try_oneliner(q{ print q[ &<>^|()@ ! ]} , [], q{ &<>^|()@ ! } , ' example 8.1' );
54
- try_oneliner(q{ print q[ &<>^|@()!"&<>^|@()! ]} , [], q{ &<>^|@()!"&<>^|@()! } , ' example 8.2' );
55
- try_oneliner(q{ print q[ "&<>^|@() !"&<>^|@() !" ]} , [], q{ "&<>^|@() !"&<>^|@() !" } , ' example 8.3' );
56
- try_oneliner(q{ print q[ "C:\TEST A\" ]} , [], q{ "C:\TEST A\" } , ' example 8.4' );
57
- try_oneliner(q{ print q[ "C:\TEST %&^ A\" ]} , [], q{ "C:\TEST %&^ A\" } , ' example 8.5' );
59
+ try_oneliner( q{ print q[ &<>^|()@ ! ]} , [], q{ &<>^|()@ ! } , ' example 8.1' );
60
+ try_oneliner(
61
+ q{ print q[ &<>^|@()!"&<>^|@()! ]} , [],
62
+ q{ &<>^|@()!"&<>^|@()! } , ' example 8.2'
63
+ );
64
+ try_oneliner(
65
+ q{ print q[ "&<>^|@() !"&<>^|@() !" ]} , [],
66
+ q{ "&<>^|@() !"&<>^|@() !" } , ' example 8.3'
67
+ );
68
+ try_oneliner(
69
+ q{ print q[ "C:\TEST A\" ]} , [], q{ "C:\TEST A\" } ,
70
+ ' example 8.4'
71
+ );
72
+ try_oneliner(
73
+ q{ print q[ "C:\TEST %&^ A\" ]} , [], q{ "C:\TEST %&^ A\" } ,
74
+ ' example 8.5'
75
+ );
58
76
59
77
# XXX gotta rethink the newline test. The Makefile does newline
60
78
# escaping, then the shell.
61
79
80
+ done_testing;
81
+ exit ;
82
+
83
+ sub try_oneliner {
84
+ my ( $code , $switches , $expect , $name ) = @_ ;
85
+ my $cmd = $mm -> oneliner( $code , $switches );
86
+ $cmd =~ s {\$\( ABSPERLRUN\) } { $perl } ;
87
+
88
+ # VMS likes to put newlines at the end of commands if there isn't
89
+ # one already.
90
+ $expect =~ s / ([^\n ])\z / $1 \n / if $^O eq ' VMS' ;
91
+
92
+ my $Makefile = makefile_name();
93
+
94
+ my $content = Makefile_template($cmd );
95
+ write_file( $Makefile , $content );
96
+
97
+ my $output = run(qq{ $make -s all} );
98
+
99
+ my $ok = $TB -> is_eq( $output , $expect , $name )
100
+ || $TB -> diag(" $Makefile :\n $content " );
101
+
102
+ return $ok ;
103
+ }
104
+
105
+ sub Makefile_template {
106
+ my ($RUN ) = @_ ;
107
+ my $NOECHO = ' @' ;
108
+
109
+ return <<"MAKEFILE" ;
110
+ all:
111
+ ${NOECHO} ${RUN}
112
+ MAKEFILE
113
+ }
114
+
115
+ sub write_file {
116
+ my ( $f , $content ) = @_ ;
117
+
118
+ open ( my $fh , ' >' , $f ) or die $! ;
119
+ print {$fh } $content or die $! ;
120
+ close $fh ;
121
+
122
+ return ;
123
+ }
0 commit comments