Acme-MetaSyntactic
view release on metacpan or search on metacpan
lib/Test/MetaSyntactic.pm view on Meta::CPAN
$tb->plan( tests => 1 );
my ($pkg) = _load($theme);
# meta$theme should not exist
eval "package $pkg; meta$theme(1);";
$tb->ok( $@ =~ /^Undefined subroutine &$pkg\::meta$theme called/,
"meta$theme function not exported" );
}
# t/21format.t
sub subtest_format {
my ($theme) = @_;
my $tb = __PACKAGE__->builder;
my @metas = _theme_sublists($theme);
$tb->plan( tests => scalar @metas );
for my $test (@metas) {
my ( $ams, $theme ) = @$test;
my @items = $ams->name(0);
my @failed;
my $ok = 0;
( /^[A-Za-z_]\w*$/ && ++$ok ) || push @failed, $_ for @items;
$tb->is_num( $ok, scalar @items, "All names correct for $theme" );
$tb->diag("Bad names: @failed") if @failed;
}
}
# t/23length.t
sub subtest_length {
my ($theme) = @_;
my $tb = __PACKAGE__->builder;
my @metas = _theme_sublists($theme);
$tb->plan( tests => 2 * @metas );
for my $t (@metas) {
my ( $ams, $theme ) = @$t;
# no empty themes
my @items = $ams->name(0);
$tb->cmp_ok( 0 + @items, '>=', 1, "$theme has at least one item" );
# no empty names
my @failed;
my $ok = 0;
( length($_) >= 1 && length($_) <= 251 && ++$ok ) || push @failed, $_
for @items;
$tb->is_num( $ok, scalar @items, "All names correct for $theme" );
$tb->diag("Names too long: @failed") if @failed;
}
}
# t/24data.t
sub subtest_data {
my ( $theme, $file ) = @_;
$file = '' if !defined $file;
_check_file_lines(
$theme, $file,
"__DATA__ section for %s",
sub {
my @lines;
my $in_data;
for my $line (@_) {
$in_data++ if $line =~ /^__DATA__$/;
next if !$in_data;
push @lines, $line
if /^#/ && !/^# ?(?:names(?: +[-\w]+)*|default)\s*$/;
}
return @lines;
}
);
}
sub subtest_version {
my ($theme) = @_;
my $tb = __PACKAGE__->builder;
$tb->plan( tests => 1 );
no strict 'refs';
my $version = "Acme::MetaSyntactic::$theme"->VERSION || '';
$tb->ok( $version, "$theme version $version" );
}
# t/90up2date.t
my ($has_lwp, $has_test_diff, $has_network);
BEGIN {
$has_lwp = eval { require LWP::UserAgent; 1; };
$has_network = $has_lwp
&& LWP::UserAgent->new( timeout => 5, env_proxy => 1 )
->get('http://www.google.com/intl/en/')
->is_success;
};
sub subtest_remote {
my ($theme) = @_;
my $class = "Acme::MetaSyntactic::$theme";
# find out if we're in one of the many cases for skipping
my $why
= !$ENV{RELEASE_TESTING}
&& !$ENV{AUTHOR_TESTING} ? 'Remote list test is RELEASE_TESTING'
: $ENV{AUTOMATED_TESTING} ? "Remote list test isn't AUTOMATED_TESTING"
: !$class->has_remotelist ? "Theme $theme does not have a remote list"
: !$has_lwp ? 'Remote list test needs LWP::UserAgent'
: !$has_network ? 'Remote list test needs network'
: '';
my $tb = __PACKAGE__->builder;
my @metas = _theme_sublists($theme);
$tb->plan( tests => scalar @metas );
SKIP: {
if ($why) {
$tb->skip($why) for 1 .. @metas;
last SKIP;
}
for my $test (@metas) {
my ( $ams, $theme ) = @$test;
lib/Test/MetaSyntactic.pm view on Meta::CPAN
=head1 DESCRIPTION
This module provides the minimum set of tests that any Acme::MetaSyntactic theme
should pass.
The goal is to make is easier for theme creators build a distribution and ensure
theirs themes will work as expected when installed.
=head1 EXPORTED FUNCTIONS
=head2 all_themes_ok( @lib )
Will find all themes under the directories listed in C<@lib>, and run C<theme_ok()>
on them.
C<@lib> is optional (it will try to find themes in F<blib/lib> or F<lib> if not provided).
=head2 theme_ok( $theme, $source )
Will run all tests on the given C<$theme>. Some tests require access to the source, but
they will be skipped if C<$source> is not provided.
If the C<subtest_load()> test fails, no further test will be run.
=head1 SUBTESTS
The individual tests are run as subtests. All substests but C<subtest_load()>
assume that the module can be successfully loaded.
=head2 subtest_fixme( $theme, $source )
Checks that the theme source file does not contain the word "FIXME".
=head2 subtest_encoding( $theme, $source )
Checks that the theme source files contains an C<=encoding> line if
it contains some non us-ascii characters.
=head2 subtest_load( $theme )
Tries to load the theme module.
First in the currently running process, and then in isolation inside
its own environment.
=head2 subtest_version( $theme )
Checks that the theme has a C<$VERSION>.
=head2 subtest_format( $theme )
Checks that each metasyntactic name in the theme is a valid Perl
variable name.
=head2 subtest_length( $theme )
Checks that each name in the theme has valid length.
=head2 subtest_data( $theme, $source )
Checks that the C<__DATA__> section (if any) of the theme source is
properly formatted.
=head2 subtest_import( $theme )
Checks that the exported C<meta$theme> function returns an item from
C<$theme>.
=head2 subtest_noimport( $theme )
Checks that C<use Acme::MetaSyntactic::I<$theme> ()> does not export
the C<meta$theme> function.
=head2 subtest_theme( $theme )
Checks that the C<theme()> function returns the theme name.
=head2 subtest_remote( $theme )
For themes with a remote list, checks that the remote list (if any)
is identical to the current list of items in the theme.
This subtest will only be run if C<RELEASE_TESTING>
(or C<AUTHOR_TESTING>, for backward compatibility reasons) is true and
C<AUTOMATED_TESTING> is false. Requires L<LWP::UserAgent>.
=head1 AUTHOR
Philippe Bruhat (BooK), C<< <book@cpan.org> >>
=head1 COPYRIGHT
Copyright 2012-2017 Philippe Bruhat (BooK), All Rights Reserved.
=head1 LICENSE
This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
=cut
( run in 0.618 second using v1.01-cache-2.11-cpan-39bf76dae61 )