diff options
author | Lucas Kanashiro <kanashiro.duarte@gmail.com> | 2015-08-08 19:35:58 -0300 |
---|---|---|
committer | Lucas Kanashiro <kanashiro.duarte@gmail.com> | 2015-08-08 19:35:58 -0300 |
commit | 99077894c2b1ef069a095b11b523e34595f79a08 (patch) | |
tree | 29ff532cdb8a2ce43c928701281d2e51012c91b5 /t | |
parent | 0048a08177fd5b057eb391d1c94b53d0857a623c (diff) | |
parent | c485810d5f1fff2d81854cdf3654b6207e246d6d (diff) |
Imported Upstream version 3.008
Diffstat (limited to 't')
-rw-r--r-- | t/00-report-prereqs.dd | 37 | ||||
-rw-r--r-- | t/00-report-prereqs.t | 176 | ||||
-rw-r--r-- | t/000-report-versions-tiny.t | 79 | ||||
-rw-r--r-- | t/abstractions.t | 26 |
4 files changed, 238 insertions, 80 deletions
diff --git a/t/00-report-prereqs.dd b/t/00-report-prereqs.dd new file mode 100644 index 0000000..d3c0699 --- /dev/null +++ b/t/00-report-prereqs.dd @@ -0,0 +1,37 @@ +do { my $x = { + 'configure' => { + 'requires' => { + 'ExtUtils::MakeMaker' => '0' + } + }, + 'develop' => { + 'requires' => { + 'Test::Pod' => '1.41' + } + }, + 'runtime' => { + 'requires' => { + 'Carp' => '0', + 'Email::Simple' => '1.998', + 'MRO::Compat' => '0', + 'Module::Pluggable' => '1.5', + 'Scalar::Util' => '0', + 'perl' => '5.006', + 'strict' => '0', + 'warnings' => '0' + } + }, + 'test' => { + 'recommends' => { + 'CPAN::Meta' => '2.120900' + }, + 'requires' => { + 'ExtUtils::MakeMaker' => '0', + 'File::Spec' => '0', + 'Test::More' => '0.96', + 'lib' => '0' + } + } + }; + $x; + }
\ No newline at end of file diff --git a/t/00-report-prereqs.t b/t/00-report-prereqs.t new file mode 100644 index 0000000..402b3d9 --- /dev/null +++ b/t/00-report-prereqs.t @@ -0,0 +1,176 @@ +#!perl + +use strict; +use warnings; + +# This test was generated by Dist::Zilla::Plugin::Test::ReportPrereqs 0.019 + +use Test::More tests => 1; + +use ExtUtils::MakeMaker; +use File::Spec; + +# from $version::LAX +my $lax_version_re = + qr/(?: undef | (?: (?:[0-9]+) (?: \. | (?:\.[0-9]+) (?:_[0-9]+)? )? + | + (?:\.[0-9]+) (?:_[0-9]+)? + ) | (?: + v (?:[0-9]+) (?: (?:\.[0-9]+)+ (?:_[0-9]+)? )? + | + (?:[0-9]+)? (?:\.[0-9]+){2,} (?:_[0-9]+)? + ) + )/x; + +# hide optional CPAN::Meta modules from prereq scanner +# and check if they are available +my $cpan_meta = "CPAN::Meta"; +my $cpan_meta_pre = "CPAN::Meta::Prereqs"; +my $HAS_CPAN_META = eval "require $cpan_meta; $cpan_meta->VERSION('2.120900')" && eval "require $cpan_meta_pre"; ## no critic + +# Verify requirements? +my $DO_VERIFY_PREREQS = 1; + +sub _max { + my $max = shift; + $max = ( $_ > $max ) ? $_ : $max for @_; + return $max; +} + +sub _merge_prereqs { + my ($collector, $prereqs) = @_; + + # CPAN::Meta::Prereqs object + if (ref $collector eq $cpan_meta_pre) { + return $collector->with_merged_prereqs( + CPAN::Meta::Prereqs->new( $prereqs ) + ); + } + + # Raw hashrefs + for my $phase ( keys %$prereqs ) { + for my $type ( keys %{ $prereqs->{$phase} } ) { + for my $module ( keys %{ $prereqs->{$phase}{$type} } ) { + $collector->{$phase}{$type}{$module} = $prereqs->{$phase}{$type}{$module}; + } + } + } + + return $collector; +} + +my @include = qw( + +); + +my @exclude = qw( + +); + +# Add static prereqs to the included modules list +my $static_prereqs = do 't/00-report-prereqs.dd'; + +# Merge all prereqs (either with ::Prereqs or a hashref) +my $full_prereqs = _merge_prereqs( + ( $HAS_CPAN_META ? $cpan_meta_pre->new : {} ), + $static_prereqs +); + +# Add dynamic prereqs to the included modules list (if we can) +my ($source) = grep { -f } 'MYMETA.json', 'MYMETA.yml'; +if ( $source && $HAS_CPAN_META ) { + if ( my $meta = eval { CPAN::Meta->load_file($source) } ) { + $full_prereqs = _merge_prereqs($full_prereqs, $meta->prereqs); + } +} +else { + $source = 'static metadata'; +} + +my @full_reports; +my @dep_errors; +my $req_hash = $HAS_CPAN_META ? $full_prereqs->as_string_hash : $full_prereqs; + +# Add static includes into a fake section +for my $mod (@include) { + $req_hash->{other}{modules}{$mod} = 0; +} + +for my $phase ( qw(configure build test runtime develop other) ) { + next unless $req_hash->{$phase}; + next if ($phase eq 'develop' and not $ENV{AUTHOR_TESTING}); + + for my $type ( qw(requires recommends suggests conflicts modules) ) { + next unless $req_hash->{$phase}{$type}; + + my $title = ucfirst($phase).' '.ucfirst($type); + my @reports = [qw/Module Want Have/]; + + for my $mod ( sort keys %{ $req_hash->{$phase}{$type} } ) { + next if $mod eq 'perl'; + next if grep { $_ eq $mod } @exclude; + + my $file = $mod; + $file =~ s{::}{/}g; + $file .= ".pm"; + my ($prefix) = grep { -e File::Spec->catfile($_, $file) } @INC; + + my $want = $req_hash->{$phase}{$type}{$mod}; + $want = "undef" unless defined $want; + $want = "any" if !$want && $want == 0; + + my $req_string = $want eq 'any' ? 'any version required' : "version '$want' required"; + + if ($prefix) { + my $have = MM->parse_version( File::Spec->catfile($prefix, $file) ); + $have = "undef" unless defined $have; + push @reports, [$mod, $want, $have]; + + if ( $DO_VERIFY_PREREQS && $HAS_CPAN_META && $type eq 'requires' ) { + if ( $have !~ /\A$lax_version_re\z/ ) { + push @dep_errors, "$mod version '$have' cannot be parsed ($req_string)"; + } + elsif ( ! $full_prereqs->requirements_for( $phase, $type )->accepts_module( $mod => $have ) ) { + push @dep_errors, "$mod version '$have' is not in required range '$want'"; + } + } + } + else { + push @reports, [$mod, $want, "missing"]; + + if ( $DO_VERIFY_PREREQS && $type eq 'requires' ) { + push @dep_errors, "$mod is not installed ($req_string)"; + } + } + } + + if ( @reports ) { + push @full_reports, "=== $title ===\n\n"; + + my $ml = _max( map { length $_->[0] } @reports ); + my $wl = _max( map { length $_->[1] } @reports ); + my $hl = _max( map { length $_->[2] } @reports ); + splice @reports, 1, 0, ["-" x $ml, "-" x $wl, "-" x $hl]; + + push @full_reports, map { sprintf(" %*s %*s %*s\n", -$ml, $_->[0], $wl, $_->[1], $hl, $_->[2]) } @reports; + push @full_reports, "\n"; + } + } +} + +if ( @full_reports ) { + diag "\nVersions for all modules listed in $source (including optional ones):\n\n", @full_reports; +} + +if ( @dep_errors ) { + diag join("\n", + "\n*** WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING ***\n", + "The following REQUIRED prerequisites were not satisfied:\n", + @dep_errors, + "\n" + ); +} + +pass; + +# vim: ts=4 sts=4 sw=4 et: diff --git a/t/000-report-versions-tiny.t b/t/000-report-versions-tiny.t deleted file mode 100644 index e86c814..0000000 --- a/t/000-report-versions-tiny.t +++ /dev/null @@ -1,79 +0,0 @@ -use strict; -use warnings; -use Test::More 0.88; -# This is a relatively nice way to avoid Test::NoWarnings breaking our -# expectations by adding extra tests, without using no_plan. It also helps -# avoid any other test module that feels introducing random tests, or even -# test plans, is a nice idea. -our $success = 0; -END { $success && done_testing; } - -# List our own version used to generate this -my $v = "\nGenerated by Dist::Zilla::Plugin::ReportVersions::Tiny v1.10\n"; - -eval { # no excuses! - # report our Perl details - my $want = '5.006'; - $v .= "perl: $] (wanted $want) on $^O from $^X\n\n"; -}; -defined($@) and diag("$@"); - -# Now, our module version dependencies: -sub pmver { - my ($module, $wanted) = @_; - $wanted = " (want $wanted)"; - my $pmver; - eval "require $module;"; - if ($@) { - if ($@ =~ m/Can't locate .* in \@INC/) { - $pmver = 'module not found.'; - } else { - diag("${module}: $@"); - $pmver = 'died during require.'; - } - } else { - my $version; - eval { $version = $module->VERSION; }; - if ($@) { - diag("${module}: $@"); - $pmver = 'died during VERSION check.'; - } elsif (defined $version) { - $pmver = "$version"; - } else { - $pmver = '<undef>'; - } - } - - # So, we should be good, right? - return sprintf('%-45s => %-10s%-15s%s', $module, $pmver, $wanted, "\n"); -} - -eval { $v .= pmver('Carp','any version') }; -eval { $v .= pmver('Email::Simple','1.998') }; -eval { $v .= pmver('ExtUtils::MakeMaker','6.30') }; -eval { $v .= pmver('MRO::Compat','any version') }; -eval { $v .= pmver('Module::Pluggable','1.5') }; -eval { $v .= pmver('Scalar::Util','any version') }; -eval { $v .= pmver('Test::More','0.96') }; -eval { $v .= pmver('lib','any version') }; -eval { $v .= pmver('strict','any version') }; -eval { $v .= pmver('warnings','any version') }; - - -# All done. -$v .= <<'EOT'; - -Thanks for using my code. I hope it works for you. -If not, please try and include this output in the bug report. -That will help me reproduce the issue and solve your problem. - -EOT - -diag($v); -ok(1, "we really didn't test anything, just reporting data"); -$success = 1; - -# Work around another nasty module on CPAN. :/ -no warnings 'once'; -$Template::Test::NO_FLUSH = 1; -exit 0; diff --git a/t/abstractions.t b/t/abstractions.t index 0a2e4dc..8044d1b 100644 --- a/t/abstractions.t +++ b/t/abstractions.t @@ -12,7 +12,7 @@ my @classes plan tests => 2 + (@classes * 2 + 2) * Test::EmailAbstract->tests_per_object + (@classes + 4) * Test::EmailAbstract->tests_per_class - + 3; + + 4; use_ok("Email::Abstract"); @@ -110,3 +110,27 @@ for my $ref (0..1) { ); } } + +{ + SKIP: { + $tester->load('Email::MIME', { SKIP => 1 }); + + open my $fh, '<', 't/multipart.msg' or die "can't open t/multipart.msg: $!"; + my $message = do { local $/; <$fh>; }; + close $fh or die "error closing t/multipart.msg after read: $!"; + + # Let's be generous and start with real CRLF, no matter what stupid thing the + # VCS or archive tools have done to the message. + $message =~ s/\x0a\x0d|\x0d\x0a|\x0d|\x0a/\x0d\x0a/g; + + my $email = Email::MIME->new(\$message); + + my $abstract = Email::Abstract->new($email); + + like( + $abstract->get_body, + qr/us-ascii/, + "minimal body test on MIME::Entity", + ); + } +} |