Allow stat() and -X file tests work on dirhandles.
[p5sagit/p5-mst-13.2.git] / ext / Devel / PPPort / t / ppphtest.t
CommitLineData
adfe19db 1################################################################################
2#
3# !!!!! Do NOT edit this file directly! !!!!!
4#
5# Edit mktests.PL and/or parts/inc/ppphtest instead.
6#
7################################################################################
8
9BEGIN {
10 if ($ENV{'PERL_CORE'}) {
11 chdir 't' if -d 't';
12 @INC = ('../lib', '../ext/Devel/PPPort/t') if -d '../lib' && -d '../ext';
13 require Config; import Config;
14 use vars '%Config';
a745474a 15 if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
adfe19db 16 print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
17 exit 0;
18 }
19 }
20 else {
21 unshift @INC, 't';
22 }
23
c07deaaf 24 sub load {
25 eval "use Test";
26 require 'testutil.pl' if $@;
adfe19db 27 }
c07deaaf 28
29 if (202) {
30 load();
0d0f8426 31 plan(tests => 202);
adfe19db 32 }
33}
34
35use Devel::PPPort;
36use strict;
37$^W = 1;
38
236afa0a 39package Devel::PPPort;
40use vars '@ISA';
41require DynaLoader;
42@ISA = qw(DynaLoader);
43bootstrap Devel::PPPort;
44
45package main;
46
0d0f8426 47BEGIN {
0c96388f 48 if ($ENV{'SKIP_SLOW_TESTS'}) {
0d0f8426 49 for (1 .. 202) {
0c96388f 50 skip("skip: SKIP_SLOW_TESTS", 0);
0d0f8426 51 }
52 exit 0;
53 }
54}
55
adfe19db 56use File::Path qw/rmtree mkpath/;
96ad942f 57use Config;
adfe19db 58
59my $tmp = 'ppptmp';
96ad942f 60my $inc = '';
4a582685 61my $isVMS = $^O eq 'VMS';
62my $isMAC = $^O eq 'MacOS';
14e93752 63my $perl = find_perl();
adfe19db 64
65rmtree($tmp) if -d $tmp;
66mkpath($tmp) or die "mkpath $tmp: $!\n";
67chdir($tmp) or die "chdir $tmp: $!\n";
68
adfe19db 69if ($ENV{'PERL_CORE'}) {
87499469 70 if (-d '../../lib') {
4a582685 71 if ($isVMS) {
72 $inc = '"-I../../lib"';
73 }
74 elsif ($isMAC) {
75 $inc = '-I:::lib';
76 }
77 else {
78 $inc = '-I../../lib';
79 }
87499469 80 unshift @INC, '../../lib';
81 }
adfe19db 82}
96ad942f 83if ($perl =~ m!^\./!) {
84 $perl = ".$perl";
85}
adfe19db 86
87END {
cd266515 88 chdir('..') if !-d $tmp && -d "../$tmp";
89 rmtree($tmp) if -d $tmp;
adfe19db 90}
91
92ok(&Devel::PPPort::WriteFile("ppport.h"));
93
4a582685 94sub comment
95{
96 my $c = shift;
97 $c =~ s/^/# | /mg;
98 $c .= "\n" unless $c =~ /[\r\n]$/;
99 print $c;
100}
101
adfe19db 102sub ppport
103{
4a582685 104 my @args = ('ppport.h', @_);
105 unshift @args, $inc if $inc;
106 my $run = $perl =~ m/\s/ ? qq("$perl") : $perl;
107 $run .= ' -MMac::err=unix' if $isMAC;
108 for (@args) {
109 $_ = qq("$_") if $isVMS && /^[^"]/;
110 $run .= " $_";
111 }
112 print "# *** running $run ***\n";
113 $run .= ' 2>&1' unless $isMAC;
114 my @out = `$run`;
115 my $out = join '', @out;
116 comment($out);
117 return wantarray ? @out : $out;
adfe19db 118}
119
120sub matches
121{
122 my($str, $re, $mod) = @_;
123 my @n;
124 eval "\@n = \$str =~ /$re/g$mod;";
125 if ($@) {
126 my $err = $@;
127 $err =~ s/^/# *** /mg;
128 print "# *** ERROR ***\n$err\n";
129 }
130 return $@ ? -42 : scalar @n;
131}
132
133sub eq_files
134{
135 my($f1, $f2) = @_;
136 return 0 unless -e $f1 && -e $f2;
137 local *F;
138 for ($f1, $f2) {
139 print "# File: $_\n";
140 unless (open F, $_) {
141 print "# couldn't open $_: $!\n";
142 return 0;
143 }
144 $_ = do { local $/; <F> };
145 close F;
4a582685 146 comment($_);
adfe19db 147 }
148 return $f1 eq $f2;
149}
150
151my @tests;
152
153for (split /\s*={70,}\s*/, do { local $/; <DATA> }) {
154 s/^\s+//; s/\s+$//;
155 my($c, %f);
156 ($c, @f{m/-{20,}\s+(\S+)\s+-{20,}/g}) = split /\s*-{20,}\s+\S+\s+-{20,}\s*/;
157 push @tests, { code => $c, files => \%f };
158}
159
160my $t;
161for $t (@tests) {
162 my $f;
163 for $f (keys %{$t->{files}}) {
164 my @f = split /\//, $f;
165 if (@f > 1) {
166 pop @f;
167 my $path = join '/', @f;
168 mkpath($path) or die "mkpath('$path'): $!\n";
169 }
170 my $txt = $t->{files}{$f};
171 local *F;
172 open F, ">$f" or die "open $f: $!\n";
173 print F "$txt\n";
174 close F;
175 $txt =~ s/^/# | /mg;
176 print "# *** writing $f ***\n$txt\n";
177 }
178
179 eval $t->{code};
180 if ($@) {
181 my $err = $@;
182 $err =~ s/^/# *** /mg;
183 print "# *** ERROR ***\n$err\n";
184 }
185 ok($@, '');
186
187 for (keys %{$t->{files}}) {
188 unlink $_ or die "unlink('$_'): $!\n";
189 }
190}
191
96ad942f 192sub find_perl
193{
194 my $perl = $^X;
4a582685 195
196 return $perl if $isVMS;
197
96ad942f 198 my $exe = $Config{'_exe'} || '';
4a582685 199
96ad942f 200 if ($perl =~ /^perl\Q$exe\E$/i) {
201 $perl = "perl$exe";
202 eval "require File::Spec";
203 if ($@) {
204 $perl = "./$perl";
205 } else {
206 $perl = File::Spec->catfile(File::Spec->curdir(), $perl);
207 }
208 }
4a582685 209
96ad942f 210 if ($perl !~ /\Q$exe\E$/i) {
211 $perl .= $exe;
212 }
4a582685 213
96ad942f 214 warn "find_perl: cannot find $perl from $^X" unless -f $perl;
4a582685 215
96ad942f 216 return $perl;
217}
218
adfe19db 219__DATA__
220
221my $o = ppport(qw(--help));
222ok($o =~ /^Usage:.*ppport\.h/m);
223ok($o =~ /--help/m);
224
225$o = ppport(qw(--nochanges));
4a582685 226ok($o =~ /^Scanning.*test\.xs/mi);
227ok($o =~ /Analyzing.*test\.xs/mi);
228ok(matches($o, '^Scanning', 'm'), 1);
229ok(matches($o, 'Analyzing', 'm'), 1);
adfe19db 230ok($o =~ /Uses Perl_newSViv instead of newSViv/);
231
232$o = ppport(qw(--quiet --nochanges));
233ok($o =~ /^\s*$/);
234
235---------------------------- test.xs ------------------------------------------
236
237Perl_newSViv();
238
239===============================================================================
240
241# check if C and C++ comments are filtered correctly
242
243my $o = ppport(qw(--copy=a));
4a582685 244ok($o =~ /^Scanning.*MyExt\.xs/mi);
245ok($o =~ /Analyzing.*MyExt\.xs/mi);
246ok(matches($o, '^Scanning', 'm'), 1);
adfe19db 247ok($o =~ /^Needs to include.*ppport\.h/m);
248ok($o !~ /^Uses grok_bin/m);
249ok($o !~ /^Uses newSVpv/m);
250ok($o =~ /Uses 1 C\+\+ style comment/m);
251ok(eq_files('MyExt.xsa', 'MyExt.ra'));
252
253# check if C++ are left untouched with --cplusplus
254
255$o = ppport(qw(--copy=b --cplusplus));
4a582685 256ok($o =~ /^Scanning.*MyExt\.xs/mi);
257ok($o =~ /Analyzing.*MyExt\.xs/mi);
258ok(matches($o, '^Scanning', 'm'), 1);
adfe19db 259ok($o =~ /^Needs to include.*ppport\.h/m);
260ok($o !~ /^Uses grok_bin/m);
261ok($o !~ /^Uses newSVpv/m);
262ok($o !~ /Uses \d+ C\+\+ style comment/m);
263ok(eq_files('MyExt.xsb', 'MyExt.rb'));
264
265unlink qw(MyExt.xsa MyExt.xsb);
266
267---------------------------- MyExt.xs -----------------------------------------
4a582685 268
adfe19db 269newSVuv();
270 // newSVpv();
271 XPUSHs(foo);
272/* grok_bin(); */
273
274---------------------------- MyExt.ra -----------------------------------------
4a582685 275
adfe19db 276#include "ppport.h"
277newSVuv();
278 /* newSVpv(); */
279 XPUSHs(foo);
280/* grok_bin(); */
281
282---------------------------- MyExt.rb -----------------------------------------
4a582685 283
adfe19db 284#include "ppport.h"
285newSVuv();
286 // newSVpv();
287 XPUSHs(foo);
288/* grok_bin(); */
289
290===============================================================================
291
292my $o = ppport(qw(--nochanges file1.xs));
4a582685 293ok($o =~ /^Scanning.*file1\.xs/mi);
294ok($o =~ /Analyzing.*file1\.xs/mi);
295ok($o !~ /^Scanning.*file2\.xs/mi);
adfe19db 296ok($o =~ /^Uses newCONSTSUB/m);
297ok($o =~ /^Uses SvPV_nolen.*depends.*sv_2pv_nolen/m);
298ok($o =~ /hint for newCONSTSUB/m);
299ok($o !~ /hint for sv_2pv_nolen/m);
300ok($o =~ /^Looks good/m);
301
302$o = ppport(qw(--nochanges --nohints file1.xs));
4a582685 303ok($o =~ /^Scanning.*file1\.xs/mi);
304ok($o =~ /Analyzing.*file1\.xs/mi);
305ok($o !~ /^Scanning.*file2\.xs/mi);
adfe19db 306ok($o =~ /^Uses newCONSTSUB/m);
307ok($o =~ /^Uses SvPV_nolen.*depends.*sv_2pv_nolen/m);
308ok($o !~ /hint for newCONSTSUB/m);
309ok($o !~ /hint for sv_2pv_nolen/m);
310ok($o =~ /^Looks good/m);
311
312$o = ppport(qw(--nochanges --nohints --nodiag file1.xs));
4a582685 313ok($o =~ /^Scanning.*file1\.xs/mi);
314ok($o =~ /Analyzing.*file1\.xs/mi);
315ok($o !~ /^Scanning.*file2\.xs/mi);
adfe19db 316ok($o !~ /^Uses newCONSTSUB/m);
317ok($o !~ /^Uses SvPV_nolen/m);
318ok($o !~ /hint for newCONSTSUB/m);
319ok($o !~ /hint for sv_2pv_nolen/m);
320ok($o =~ /^Looks good/m);
321
322$o = ppport(qw(--nochanges --quiet file1.xs));
323ok($o =~ /^\s*$/);
324
325$o = ppport(qw(--nochanges file2.xs));
4a582685 326ok($o =~ /^Scanning.*file2\.xs/mi);
327ok($o =~ /Analyzing.*file2\.xs/mi);
328ok($o !~ /^Scanning.*file1\.xs/mi);
adfe19db 329ok($o =~ /^Uses mXPUSHp/m);
330ok($o =~ /^Needs to include.*ppport\.h/m);
331ok($o !~ /^Looks good/m);
332ok($o =~ /^1 potentially required change detected/m);
333
334$o = ppport(qw(--nochanges --nohints file2.xs));
4a582685 335ok($o =~ /^Scanning.*file2\.xs/mi);
336ok($o =~ /Analyzing.*file2\.xs/mi);
337ok($o !~ /^Scanning.*file1\.xs/mi);
adfe19db 338ok($o =~ /^Uses mXPUSHp/m);
339ok($o =~ /^Needs to include.*ppport\.h/m);
340ok($o !~ /^Looks good/m);
341ok($o =~ /^1 potentially required change detected/m);
342
343$o = ppport(qw(--nochanges --nohints --nodiag file2.xs));
4a582685 344ok($o =~ /^Scanning.*file2\.xs/mi);
345ok($o =~ /Analyzing.*file2\.xs/mi);
346ok($o !~ /^Scanning.*file1\.xs/mi);
adfe19db 347ok($o !~ /^Uses mXPUSHp/m);
348ok($o !~ /^Needs to include.*ppport\.h/m);
349ok($o !~ /^Looks good/m);
350ok($o =~ /^1 potentially required change detected/m);
351
352$o = ppport(qw(--nochanges --quiet file2.xs));
353ok($o =~ /^\s*$/);
354
355---------------------------- file1.xs -----------------------------------------
356
357#define NEED_newCONSTSUB
358#define NEED_sv_2pv_nolen
359#include "ppport.h"
360
361newCONSTSUB();
362SvPV_nolen();
363
364---------------------------- file2.xs -----------------------------------------
365
366mXPUSHp(foo);
367
368===============================================================================
369
370my $o = ppport(qw(--nochanges));
4a582685 371ok($o =~ /^Scanning.*FooBar\.xs/mi);
372ok($o =~ /Analyzing.*FooBar\.xs/mi);
373ok(matches($o, '^Scanning', 'm'), 1);
adfe19db 374ok($o !~ /^Looks good/m);
375ok($o =~ /^Uses grok_bin/m);
376
377---------------------------- FooBar.xs ----------------------------------------
378
379newSViv();
380XPUSHs(foo);
381grok_bin();
382
383===============================================================================
384
385my $o = ppport(qw(--nochanges));
4a582685 386ok($o =~ /^Scanning.*First\.xs/mi);
387ok($o =~ /Analyzing.*First\.xs/mi);
388ok($o =~ /^Scanning.*second\.h/mi);
389ok($o =~ /Analyzing.*second\.h/mi);
390ok($o =~ /^Scanning.*sub.*third\.c/mi);
391ok($o =~ /Analyzing.*sub.*third\.c/mi);
392ok($o !~ /^Scanning.*foobar/mi);
393ok(matches($o, '^Scanning', 'm'), 3);
adfe19db 394
395---------------------------- First.xs -----------------------------------------
396
397one
398
399---------------------------- foobar.xyz ---------------------------------------
400
401two
402
403---------------------------- second.h -----------------------------------------
404
405three
406
407---------------------------- sub/third.c --------------------------------------
408
409four
410
411===============================================================================
412
413my $o = ppport(qw(--nochanges));
414ok($o =~ /Possibly wrong #define NEED_foobar in.*test.xs/i);
415
416---------------------------- test.xs ------------------------------------------
417
418#define NEED_foobar
419
420===============================================================================
421
422# And now some complex "real-world" example
423
424my $o = ppport(qw(--copy=f));
425for (qw(main.xs mod1.c mod2.c mod3.c mod4.c mod5.c)) {
4a582685 426 ok($o =~ /^Scanning.*\Q$_\E/mi);
427 ok($o =~ /Analyzing.*\Q$_\E/i);
adfe19db 428}
4a582685 429ok(matches($o, '^Scanning', 'm'), 6);
adfe19db 430
4a582685 431ok(matches($o, '^Writing copy of', 'm'), 5);
adfe19db 432ok(!-e "mod5.cf");
433
434for (qw(main.xs mod1.c mod2.c mod3.c mod4.c)) {
435 ok($o =~ /^Writing copy of.*\Q$_\E.*with changes/mi);
436 ok(-e "${_}f");
437 ok(eq_files("${_}f", "${_}r"));
438 unlink "${_}f";
439}
440
441---------------------------- main.xs ------------------------------------------
442
443#include "EXTERN.h"
444#include "perl.h"
445#include "XSUB.h"
446
447#define NEED_newCONSTSUB
448#define NEED_grok_hex_GLOBAL
449#include "ppport.h"
450
451newCONSTSUB();
452grok_hex();
453Perl_grok_bin(aTHX_ foo, bar);
454
455/* some comment */
456
457perl_eval_pv();
458grok_bin();
459Perl_grok_bin(bar, sv_no);
460
461---------------------------- mod1.c -------------------------------------------
462
463#include "EXTERN.h"
464#include "perl.h"
465#include "XSUB.h"
466
467#define NEED_grok_bin_GLOBAL
468#define NEED_newCONSTSUB
469#include "ppport.h"
470
471newCONSTSUB();
472grok_bin();
473{
474 Perl_croak ("foo");
475 Perl_sv_catpvf(); /* I know it's wrong ;-) */
476}
477
478---------------------------- mod2.c -------------------------------------------
479
480#include "EXTERN.h"
481#include "perl.h"
482#include "XSUB.h"
483
484#define NEED_eval_pv
485#include "ppport.h"
486
487newSViv();
488
489/*
490 eval_pv();
491*/
492
493---------------------------- mod3.c -------------------------------------------
494
495#include "EXTERN.h"
496#include "perl.h"
497#include "XSUB.h"
498
499grok_oct();
500eval_pv();
501
502---------------------------- mod4.c -------------------------------------------
503
504#include "EXTERN.h"
505#include "perl.h"
506#include "XSUB.h"
507
508START_MY_CXT;
509
510---------------------------- mod5.c -------------------------------------------
511
512#include "EXTERN.h"
513#include "perl.h"
514#include "XSUB.h"
515
516#include "ppport.h"
517call_pv();
518
519---------------------------- main.xsr -----------------------------------------
520
521#include "EXTERN.h"
522#include "perl.h"
523#include "XSUB.h"
524
525#define NEED_eval_pv_GLOBAL
526#define NEED_grok_hex
527#define NEED_newCONSTSUB_GLOBAL
528#include "ppport.h"
529
530newCONSTSUB();
531grok_hex();
532grok_bin(foo, bar);
533
534/* some comment */
535
536eval_pv();
537grok_bin();
538grok_bin(bar, PL_sv_no);
539
540---------------------------- mod1.cr ------------------------------------------
541
542#include "EXTERN.h"
543#include "perl.h"
544#include "XSUB.h"
545
546#define NEED_grok_bin_GLOBAL
547#include "ppport.h"
548
549newCONSTSUB();
550grok_bin();
551{
552 Perl_croak (aTHX_ "foo");
553 Perl_sv_catpvf(aTHX); /* I know it's wrong ;-) */
554}
555
556---------------------------- mod2.cr ------------------------------------------
557
558#include "EXTERN.h"
559#include "perl.h"
560#include "XSUB.h"
561
562
563newSViv();
564
565/*
566 eval_pv();
567*/
568
569---------------------------- mod3.cr ------------------------------------------
570
571#include "EXTERN.h"
572#include "perl.h"
573#include "XSUB.h"
574#define NEED_grok_oct
575#include "ppport.h"
576
577grok_oct();
578eval_pv();
579
580---------------------------- mod4.cr ------------------------------------------
581
582#include "EXTERN.h"
583#include "perl.h"
584#include "XSUB.h"
585#include "ppport.h"
586
587START_MY_CXT;
588
589===============================================================================
590
591my $o = ppport(qw(--nochanges));
592ok($o =~ /Uses grok_hex/m);
593ok($o !~ /Looks good/m);
594
595$o = ppport(qw(--nochanges --compat-version=5.8.0));
596ok($o !~ /Uses grok_hex/m);
597ok($o =~ /Looks good/m);
598
599---------------------------- FooBar.xs ----------------------------------------
600
601grok_hex();
602
603===============================================================================
604
605my $o = ppport(qw(--nochanges));
606ok($o =~ /Uses SvPVutf8_force, which may not be portable/m);
607
4a582685 608$o = ppport(qw(--nochanges --compat-version=5.5.3));
609ok($o =~ /Uses SvPVutf8_force, which may not be portable/m);
610
611$o = ppport(qw(--nochanges --compat-version=5.005_03));
612ok($o =~ /Uses SvPVutf8_force, which may not be portable/m);
613
adfe19db 614$o = ppport(qw(--nochanges --compat-version=5.6.0));
615ok($o !~ /Uses SvPVutf8_force/m);
616
4a582685 617$o = ppport(qw(--nochanges --compat-version=5.006));
618ok($o !~ /Uses SvPVutf8_force/m);
619
620$o = ppport(qw(--nochanges --compat-version=5.999.999));
621ok($o !~ /Uses SvPVutf8_force/m);
622
623$o = ppport(qw(--nochanges --compat-version=6.0.0));
624ok($o =~ /Only Perl 5 is supported/m);
625
626$o = ppport(qw(--nochanges --compat-version=5.1000.999));
627ok($o =~ /Invalid version number: 5.1000.999/m);
628
629$o = ppport(qw(--nochanges --compat-version=5.999.1000));
630ok($o =~ /Invalid version number: 5.999.1000/m);
631
adfe19db 632---------------------------- FooBar.xs ----------------------------------------
633
634SvPVutf8_force();
635
96ad942f 636===============================================================================
637
638my $o = ppport(qw(--nochanges));
639ok($o !~ /potentially required change/);
4a582685 640ok(matches($o, '^Looks good', 'm'), 2);
96ad942f 641
642---------------------------- FooBar.xs ----------------------------------------
643
644#define NEED_grok_numeric_radix
645#define NEED_grok_number
646#include "ppport.h"
647
648GROK_NUMERIC_RADIX();
649grok_number();
650
651---------------------------- foo.c --------------------------------------------
652
653#include "ppport.h"
654
655call_pv();
656
4a582685 657===============================================================================
658
659# check --api-info option
660
661my $o = ppport(qw(--api-info=INT2PTR));
662my %found = map {($_ => 1)} $o =~ /^===\s+(\w+)\s+===/mg;
663ok(scalar keys %found, 1);
664ok(exists $found{INT2PTR});
665ok(matches($o, '^Supported at least starting from perl-5\.6\.0\.', 'm'), 1);
666ok(matches($o, '^Support by .*ppport.* provided back to perl-5\.003\.', 'm'), 1);
667
668$o = ppport(qw(--api-info=Zero));
669%found = map {($_ => 1)} $o =~ /^===\s+(\w+)\s+===/mg;
670ok(scalar keys %found, 1);
671ok(exists $found{Zero});
672ok(matches($o, '^No portability information available\.', 'm'), 1);
673
674$o = ppport(qw(--api-info=/Zero/));
675%found = map {($_ => 1)} $o =~ /^===\s+(\w+)\s+===/mg;
676ok(scalar keys %found, 2);
677ok(exists $found{Zero});
678ok(exists $found{ZeroD});
679
680===============================================================================
681
682# check --list-provided option
683
684my @o = ppport(qw(--list-provided));
685my %p;
686my $fail = 0;
687for (@o) {
688 my($name, $flags) = /^(\w+)(?:\s+\[(\w+(?:,\s+\w+)*)\])?$/ or $fail++;
689 exists $p{$name} and $fail++;
690 $p{$name} = defined $flags ? { map { ($_ => 1) } $flags =~ /(\w+)/g } : '';
691}
692ok(@o > 100);
693ok($fail, 0);
694
695ok(exists $p{call_sv});
696ok(not ref $p{call_sv});
697
698ok(exists $p{grok_bin});
699ok(ref $p{grok_bin}, 'HASH');
700ok(scalar keys %{$p{grok_bin}}, 1);
701ok($p{grok_bin}{explicit});
702
703ok(exists $p{gv_stashpvn});
704ok(ref $p{gv_stashpvn}, 'HASH');
705ok(scalar keys %{$p{gv_stashpvn}}, 1);
706ok($p{gv_stashpvn}{hint});
707
708ok(exists $p{sv_catpvf_mg});
709ok(ref $p{sv_catpvf_mg}, 'HASH');
710ok(scalar keys %{$p{sv_catpvf_mg}}, 2);
711ok($p{sv_catpvf_mg}{explicit});
712ok($p{sv_catpvf_mg}{depend});
713
714===============================================================================
715
716# check --list-unsupported option
717
718my @o = ppport(qw(--list-unsupported));
719my %p;
720my $fail = 0;
721for (@o) {
722 my($name, $ver) = /^(\w+)\s*\.+\s*([\d._]+)$/ or $fail++;
723 exists $p{$name} and $fail++;
724 $p{$name} = $ver;
725}
726ok(@o > 100);
727ok($fail, 0);
728
729ok(exists $p{utf8_distance});
730ok($p{utf8_distance}, '5.6.0');
731
732ok(exists $p{save_generic_svref});
733ok($p{save_generic_svref}, '5.005_03');
734
735===============================================================================
736
737# check --nofilter option
738
739my $o = ppport(qw(--nochanges));
740ok($o =~ /^Scanning.*foo\.cpp/mi);
741ok($o =~ /Analyzing.*foo\.cpp/mi);
742ok(matches($o, '^Scanning', 'm'), 1);
743ok(matches($o, 'Analyzing', 'm'), 1);
744
745$o = ppport(qw(--nochanges foo.cpp foo.o Makefile.PL));
746ok($o =~ /Skipping the following files \(use --nofilter to avoid this\):/m);
747ok(matches($o, '^\|\s+foo\.o', 'mi'), 1);
748ok(matches($o, '^\|\s+Makefile\.PL', 'mi'), 1);
749ok($o =~ /^Scanning.*foo\.cpp/mi);
750ok($o =~ /Analyzing.*foo\.cpp/mi);
751ok(matches($o, '^Scanning', 'm'), 1);
752ok(matches($o, 'Analyzing', 'm'), 1);
753
754$o = ppport(qw(--nochanges --nofilter foo.cpp foo.o Makefile.PL));
755ok($o =~ /^Scanning.*foo\.cpp/mi);
756ok($o =~ /Analyzing.*foo\.cpp/mi);
757ok($o =~ /^Scanning.*foo\.o/mi);
758ok($o =~ /Analyzing.*foo\.o/mi);
759ok($o =~ /^Scanning.*Makefile/mi);
760ok($o =~ /Analyzing.*Makefile/mi);
761ok(matches($o, '^Scanning', 'm'), 3);
762ok(matches($o, 'Analyzing', 'm'), 3);
763
764---------------------------- foo.cpp ------------------------------------------
765
766newSViv();
767
768---------------------------- foo.o --------------------------------------------
769
770newSViv();
771
772---------------------------- Makefile.PL --------------------------------------
773
774newSViv();
775
0d0f8426 776===============================================================================
777
778# check if explicit variables are handled propery
779
780my $o = ppport(qw(--copy=a));
781ok($o =~ /^Needs to include.*ppport\.h/m);
782ok($o =~ /^Uses PL_signals/m);
783ok($o =~ /^File needs PL_signals, adding static request/m);
784ok(eq_files('MyExt.xsa', 'MyExt.ra'));
785
786unlink qw(MyExt.xsa);
787
788---------------------------- MyExt.xs -----------------------------------------
789
790PL_signals = 123;
791if (PL_signals == 42)
792 foo();
793
794---------------------------- MyExt.ra -----------------------------------------
795
796#define NEED_PL_signals
797#include "ppport.h"
798PL_signals = 123;
799if (PL_signals == 42)
800 foo();
801