📄 ppphtest.t
字号:
################################################################################## !!!!! Do NOT edit this file directly! !!!!!## Edit mktests.PL and/or parts/inc/ppphtest instead.## This file was automatically generated from the definition files in the# parts/inc/ subdirectory by mktests.PL. To learn more about how all this# works, please read the F<HACKERS> file that came with this distribution.#################################################################################BEGIN { if ($ENV{'PERL_CORE'}) { chdir 't' if -d 't'; @INC = ('../lib', '../ext/Devel/PPPort/t') if -d '../lib' && -d '../ext'; require Config; import Config; use vars '%Config'; if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) { print "1..0 # Skip -- Perl configured without Devel::PPPort module\n"; exit 0; } } else { unshift @INC, 't'; } sub load { eval "use Test"; require 'testutil.pl' if $@; } if (229) { load(); plan(tests => 229); }}use Devel::PPPort;use strict;$^W = 1;package Devel::PPPort;use vars '@ISA';require DynaLoader;@ISA = qw(DynaLoader);bootstrap Devel::PPPort;package main;BEGIN { if ($ENV{'SKIP_SLOW_TESTS'}) { for (1 .. 229) { skip("skip: SKIP_SLOW_TESTS", 0); } exit 0; }}use File::Path qw/rmtree mkpath/;use Config;my $tmp = 'ppptmp';my $inc = '';my $isVMS = $^O eq 'VMS';my $isMAC = $^O eq 'MacOS';my $perl = find_perl();rmtree($tmp) if -d $tmp;mkpath($tmp) or die "mkpath $tmp: $!\n";chdir($tmp) or die "chdir $tmp: $!\n";if ($ENV{'PERL_CORE'}) { if (-d '../../lib') { if ($isVMS) { $inc = '"-I../../lib"'; } elsif ($isMAC) { $inc = '-I:::lib'; } else { $inc = '-I../../lib'; } unshift @INC, '../../lib'; }}if ($perl =~ m!^\./!) { $perl = ".$perl";}END { chdir('..') if !-d $tmp && -d "../$tmp"; rmtree($tmp) if -d $tmp;}ok(&Devel::PPPort::WriteFile("ppport.h"));sub comment{ my $c = shift; $c =~ s/^/# | /mg; $c .= "\n" unless $c =~ /[\r\n]$/; print $c;}sub ppport{ my @args = ('ppport.h', @_); unshift @args, $inc if $inc; my $run = $perl =~ m/\s/ ? qq("$perl") : $perl; $run .= ' -MMac::err=unix' if $isMAC; for (@args) { $_ = qq("$_") if $isVMS && /^[^"]/; $run .= " $_"; } print "# *** running $run ***\n"; $run .= ' 2>&1' unless $isMAC; my @out = `$run`; my $out = join '', @out; comment($out); return wantarray ? @out : $out;}sub matches{ my($str, $re, $mod) = @_; my @n; eval "\@n = \$str =~ /$re/g$mod;"; if ($@) { my $err = $@; $err =~ s/^/# *** /mg; print "# *** ERROR ***\n$err\n"; } return $@ ? -42 : scalar @n;}sub eq_files{ my($f1, $f2) = @_; return 0 unless -e $f1 && -e $f2; local *F; for ($f1, $f2) { print "# File: $_\n"; unless (open F, $_) { print "# couldn't open $_: $!\n"; return 0; } $_ = do { local $/; <F> }; close F; comment($_); } return $f1 eq $f2;}my @tests;for (split /\s*={70,}\s*/, do { local $/; <DATA> }) { s/^\s+//; s/\s+$//; my($c, %f); ($c, @f{m/-{20,}\s+(\S+)\s+-{20,}/g}) = split /\s*-{20,}\s+\S+\s+-{20,}\s*/; push @tests, { code => $c, files => \%f };}my $t;for $t (@tests) { print "#\n", ('# ', '-'x70, "\n")x3, "#\n"; my $f; for $f (keys %{$t->{files}}) { my @f = split /\//, $f; if (@f > 1) { pop @f; my $path = join '/', @f; mkpath($path) or die "mkpath('$path'): $!\n"; } my $txt = $t->{files}{$f}; local *F; open F, ">$f" or die "open $f: $!\n"; print F "$txt\n"; close F; $txt =~ s/^/# | /mg; print "# *** writing $f ***\n$txt\n"; } my $code = $t->{code}; $code =~ s/^/# | /mg; print "# *** evaluating test code ***\n$code\n"; eval $t->{code}; if ($@) { my $err = $@; $err =~ s/^/# *** /mg; print "# *** ERROR ***\n$err\n"; } ok($@, ''); for (keys %{$t->{files}}) { unlink $_ or die "unlink('$_'): $!\n"; }}sub find_perl{ my $perl = $^X; return $perl if $isVMS; my $exe = $Config{'_exe'} || ''; if ($perl =~ /^perl\Q$exe\E$/i) { $perl = "perl$exe"; eval "require File::Spec"; if ($@) { $perl = "./$perl"; } else { $perl = File::Spec->catfile(File::Spec->curdir(), $perl); } } if ($perl !~ /\Q$exe\E$/i) { $perl .= $exe; } warn "find_perl: cannot find $perl from $^X" unless -f $perl; return $perl;}__DATA__my $o = ppport(qw(--help));ok($o =~ /^Usage:.*ppport\.h/m);ok($o =~ /--help/m);$o = ppport(qw(--version));ok($o =~ /^This is.*ppport.*\d+\.\d+(?:_?\d+)?\.$/);$o = ppport(qw(--nochanges));ok($o =~ /^Scanning.*test\.xs/mi);ok($o =~ /Analyzing.*test\.xs/mi);ok(matches($o, '^Scanning', 'm'), 1);ok(matches($o, 'Analyzing', 'm'), 1);ok($o =~ /Uses Perl_newSViv instead of newSViv/);$o = ppport(qw(--quiet --nochanges));ok($o =~ /^\s*$/);---------------------------- test.xs ------------------------------------------Perl_newSViv();===============================================================================# check if C and C++ comments are filtered correctlymy $o = ppport(qw(--copy=a));ok($o =~ /^Scanning.*MyExt\.xs/mi);ok($o =~ /Analyzing.*MyExt\.xs/mi);ok(matches($o, '^Scanning', 'm'), 1);ok($o =~ /^Needs to include.*ppport\.h/m);ok($o !~ /^Uses grok_bin/m);ok($o !~ /^Uses newSVpv/m);ok($o =~ /Uses 1 C\+\+ style comment/m);ok(eq_files('MyExt.xsa', 'MyExt.ra'));# check if C++ are left untouched with --cplusplus$o = ppport(qw(--copy=b --cplusplus));ok($o =~ /^Scanning.*MyExt\.xs/mi);ok($o =~ /Analyzing.*MyExt\.xs/mi);ok(matches($o, '^Scanning', 'm'), 1);ok($o =~ /^Needs to include.*ppport\.h/m);ok($o !~ /^Uses grok_bin/m);ok($o !~ /^Uses newSVpv/m);ok($o !~ /Uses \d+ C\+\+ style comment/m);ok(eq_files('MyExt.xsb', 'MyExt.rb'));unlink qw(MyExt.xsa MyExt.xsb);---------------------------- MyExt.xs -----------------------------------------newSVuv(); // newSVpv(); XPUSHs(foo);/* grok_bin(); */---------------------------- MyExt.ra -----------------------------------------#include "ppport.h"newSVuv(); /* newSVpv(); */ XPUSHs(foo);/* grok_bin(); */---------------------------- MyExt.rb -----------------------------------------#include "ppport.h"newSVuv(); // newSVpv(); XPUSHs(foo);/* grok_bin(); */===============================================================================my $o = ppport(qw(--nochanges file1.xs));ok($o =~ /^Scanning.*file1\.xs/mi);ok($o =~ /Analyzing.*file1\.xs/mi);ok($o !~ /^Scanning.*file2\.xs/mi);ok($o =~ /^Uses newCONSTSUB/m);ok($o =~ /^Uses SvPV_nolen.*depends.*sv_2pv_flags/m);ok($o =~ /WARNING: PL_expect/m);ok($o =~ /hint for newCONSTSUB/m);ok($o =~ /^Looks good/m);$o = ppport(qw(--nochanges --nohints file1.xs));ok($o =~ /^Scanning.*file1\.xs/mi);ok($o =~ /Analyzing.*file1\.xs/mi);ok($o !~ /^Scanning.*file2\.xs/mi);ok($o =~ /^Uses newCONSTSUB/m);ok($o =~ /^Uses SvPV_nolen.*depends.*sv_2pv_flags/m);ok($o =~ /WARNING: PL_expect/m);ok($o !~ /hint for newCONSTSUB/m);ok($o =~ /^Looks good/m);$o = ppport(qw(--nochanges --nohints --nodiag file1.xs));ok($o =~ /^Scanning.*file1\.xs/mi);ok($o =~ /Analyzing.*file1\.xs/mi);ok($o !~ /^Scanning.*file2\.xs/mi);ok($o !~ /^Uses newCONSTSUB/m);ok($o !~ /^Uses SvPV_nolen/m);ok($o =~ /WARNING: PL_expect/m);ok($o !~ /hint for newCONSTSUB/m);ok($o =~ /^Looks good/m);$o = ppport(qw(--nochanges --quiet file1.xs));ok($o =~ /^\s*$/);$o = ppport(qw(--nochanges file2.xs));ok($o =~ /^Scanning.*file2\.xs/mi);ok($o =~ /Analyzing.*file2\.xs/mi);ok($o !~ /^Scanning.*file1\.xs/mi);ok($o =~ /^Uses mXPUSHp/m);ok($o =~ /^Needs to include.*ppport\.h/m);ok($o !~ /^Looks good/m);ok($o =~ /^1 potentially required change detected/m);$o = ppport(qw(--nochanges --nohints file2.xs));ok($o =~ /^Scanning.*file2\.xs/mi);ok($o =~ /Analyzing.*file2\.xs/mi);ok($o !~ /^Scanning.*file1\.xs/mi);ok($o =~ /^Uses mXPUSHp/m);ok($o =~ /^Needs to include.*ppport\.h/m);ok($o !~ /^Looks good/m);ok($o =~ /^1 potentially required change detected/m);$o = ppport(qw(--nochanges --nohints --nodiag file2.xs));ok($o =~ /^Scanning.*file2\.xs/mi);ok($o =~ /Analyzing.*file2\.xs/mi);ok($o !~ /^Scanning.*file1\.xs/mi);ok($o !~ /^Uses mXPUSHp/m);ok($o !~ /^Needs to include.*ppport\.h/m);ok($o !~ /^Looks good/m);ok($o =~ /^1 potentially required change detected/m);$o = ppport(qw(--nochanges --quiet file2.xs));ok($o =~ /^\s*$/);---------------------------- file1.xs -----------------------------------------#define NEED_newCONSTSUB#define NEED_sv_2pv_flags#include "ppport.h"newCONSTSUB();SvPV_nolen();PL_expect = 0;---------------------------- file2.xs -----------------------------------------mXPUSHp(foo);===============================================================================my $o = ppport(qw(--nochanges));ok($o =~ /^Scanning.*FooBar\.xs/mi);ok($o =~ /Analyzing.*FooBar\.xs/mi);ok(matches($o, '^Scanning', 'm'), 1);ok($o !~ /^Looks good/m);ok($o =~ /^Uses grok_bin/m);---------------------------- FooBar.xs ----------------------------------------newSViv();XPUSHs(foo);grok_bin();===============================================================================my $o = ppport(qw(--nochanges));ok($o =~ /^Scanning.*First\.xs/mi);ok($o =~ /Analyzing.*First\.xs/mi);ok($o =~ /^Scanning.*second\.h/mi);ok($o =~ /Analyzing.*second\.h/mi);ok($o =~ /^Scanning.*sub.*third\.c/mi);ok($o =~ /Analyzing.*sub.*third\.c/mi);ok($o !~ /^Scanning.*foobar/mi);ok(matches($o, '^Scanning', 'm'), 3);---------------------------- First.xs -----------------------------------------one---------------------------- foobar.xyz ---------------------------------------two---------------------------- second.h -----------------------------------------three---------------------------- sub/third.c --------------------------------------four===============================================================================my $o = ppport(qw(--nochanges));ok($o =~ /Possibly wrong #define NEED_foobar in.*test.xs/i);---------------------------- test.xs ------------------------------------------#define NEED_foobar===============================================================================# And now some complex "real-world" examplemy $o = ppport(qw(--copy=f));for (qw(main.xs mod1.c mod2.c mod3.c mod4.c mod5.c)) { ok($o =~ /^Scanning.*\Q$_\E/mi); ok($o =~ /Analyzing.*\Q$_\E/i);}ok(matches($o, '^Scanning', 'm'), 6);ok(matches($o, '^Writing copy of', 'm'), 5);ok(!-e "mod5.cf");for (qw(main.xs mod1.c mod2.c mod3.c mod4.c)) { ok($o =~ /^Writing copy of.*\Q$_\E.*with changes/mi); ok(-e "${_}f"); ok(eq_files("${_}f", "${_}r")); unlink "${_}f";}---------------------------- main.xs ------------------------------------------#include "EXTERN.h"#include "perl.h"#include "XSUB.h"#define NEED_newCONSTSUB#define NEED_grok_hex_GLOBAL#include "ppport.h"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -