X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2Fversion.t;h=9ed5d5bde45add4d17d223f829274a186db67974;hb=b30bcf62f5b15c203de3cee9cf8d918ec38ad867;hp=bfb9c463a76d075d57a8476e9798b8ffe32e1f37;hpb=5eb567df529229d30d1a4d7c913a67cbd444dacb;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/version.t b/lib/version.t index bfb9c46..9ed5d5b 100644 --- a/lib/version.t +++ b/lib/version.t @@ -4,12 +4,12 @@ ######################### -use Test::More tests => 183; +use Test::More qw(no_plan); diag "Tests with base class" unless $ENV{PERL_CORE}; BEGIN { - use_ok("version", 0.30); # If we made it this far, we are ok. + use_ok("version", 0.50); # If we made it this far, we are ok. } BaseTests("version"); @@ -17,23 +17,43 @@ BaseTests("version"); diag "Tests with empty derived class" unless $ENV{PERL_CORE}; package version::Empty; -use vars qw($VERSION @ISA); -use version 0.30; -@ISA = qw(version); +use base version; $VERSION = 0.01; +no warnings 'redefine'; +*::qv = sub { return bless version::qv(shift), __PACKAGE__; }; + +package version::Bad; +use base version; +sub new { my($self,$n)=@_; bless \$n, $self } package main; -my $testobj = new version::Empty 1.002_003; +my $testobj = version::Empty->new(1.002_003); isa_ok( $testobj, "version::Empty" ); ok( $testobj->numify == 1.002003, "Numified correctly" ); ok( $testobj->stringify eq "1.002003", "Stringified correctly" ); ok( $testobj->normal eq "v1.2.3", "Normalified correctly" ); -my $verobj = new version "1.2.4"; +my $verobj = version->new("1.2.4"); ok( $verobj > $testobj, "Comparison vs parent class" ); ok( $verobj gt $testobj, "Comparison vs parent class" ); BaseTests("version::Empty"); +diag "tests with bad subclass" unless $ENV{PERL_CORE}; +$testobj = version::Bad->new(1.002_003); +isa_ok( $testobj, "version::Bad" ); +eval { my $string = $testobj->numify }; +like($@, qr/Invalid version object/, + "Bad subclass numify"); +eval { my $string = $testobj->normal }; +like($@, qr/Invalid version object/, + "Bad subclass normal"); +eval { my $string = $testobj->stringify }; +like($@, qr/Invalid version object/, + "Bad subclass stringify"); +eval { my $test = $testobj > 1.0 }; +like($@, qr/Invalid version object/, + "Bad subclass vcmp"); + sub BaseTests { my $CLASS = shift; @@ -74,12 +94,35 @@ sub BaseTests { like($@, qr/underscores before decimal/, "Invalid version format (underscores before decimal)"); - $version = $CLASS->new("99 and 44/100 pure"); + eval {my $version = $CLASS->new("1_2")}; + like($@, qr/alpha without decimal/, + "Invalid version format (alpha without decimal)"); + + # for this first test, just upgrade the warn() to die() + eval { + local $SIG{__WARN__} = sub { die $_[0] }; + $version = $CLASS->new("1.2b3"); + }; + my $warnregex = "Version string '.+' contains invalid data; ". + "ignoring: '.+'"; + + like($@, qr/$warnregex/, + "Version string contains invalid data; ignoring"); + + # from here on out capture the warning and test independently + my $warning; + local $SIG{__WARN__} = sub { $warning = $_[0] }; + $version = $CLASS->new("99 and 44/100 pure"); + + like($warning, qr/$warnregex/, + "Version string contains invalid data; ignoring"); ok ("$version" eq "99.000", '$version eq "99.000"'); ok ($version->numify == 99.0, '$version->numify == 99.0'); ok ($version->normal eq "v99.0.0", '$version->normal eq v99.0.0'); $version = $CLASS->new("something"); + like($warning, qr/$warnregex/, + "Version string contains invalid data; ignoring"); ok (defined $version, 'defined $version'); # reset the test object to something reasonable @@ -89,7 +132,7 @@ sub BaseTests { ok ($version, 'boolean'); # Test class membership - isa_ok ( $version, "version" ); + isa_ok ( $version, $CLASS ); # Test comparison operators with self diag "tests with self" unless $ENV{PERL_CORE}; @@ -215,10 +258,11 @@ sub BaseTests { ok ( $version eq "1.2.0", 'qv("1.2") eq "1.2.0"' ); $version = qv(1.2); ok ( $version eq "1.2.0", 'qv(1.2) eq "1.2.0"' ); + isa_ok( qv('5.008'), $CLASS ); # test creation from existing version object diag "create new from existing version" unless $ENV{PERL_CORE}; - ok (eval {$new_version = version->new($version)}, + ok (eval {$new_version = $CLASS->new($version)}, "new from existing object"); ok ($new_version == $version, "class->new($version) identical"); $new_version = $version->new(); @@ -228,9 +272,9 @@ sub BaseTests { # test the CVS revision mode diag "testing CVS Revision" unless $ENV{PERL_CORE}; - $version = new version qw$Revision: 1.2$; + $version = new $CLASS qw$Revision: 1.2$; ok ( $version eq "1.2.0", 'qw$Revision: 1.2$ eq 1.2.0' ); - $version = new version qw$Revision: 1.2.3.4$; + $version = new $CLASS qw$Revision: 1.2.3.4$; ok ( $version eq "1.2.3.4", 'qw$Revision: 1.2.3.4$ eq 1.2.3.4' ); # test the CPAN style reduced significant digit form @@ -278,4 +322,27 @@ SKIP: { $version = qv(1.2.3); ok("$version" eq "v1.2.3", 'v-string initialized qv()'); } + + diag "Tests with real-world (malformed) data" unless $ENV{PERL_CORE}; + + # trailing zero testing (reported by Andreas Koenig). + $version = $CLASS->new("1"); + ok($version->numify eq "1.000", "trailing zeros preserved"); + $version = $CLASS->new("1.0"); + ok($version->numify eq "1.000", "trailing zeros preserved"); + $version = $CLASS->new("1.0.0"); + ok($version->numify eq "1.000000", "trailing zeros preserved"); + $version = $CLASS->new("1.0.0.0"); + ok($version->numify eq "1.000000000", "trailing zeros preserved"); + + # leading zero testing (reported by Andreas Koenig). + $version = $CLASS->new(".7"); + ok($version->numify eq "0.700", "leading zero inferred"); + + # leading space testing (reported by Andreas Koenig). + $version = $CLASS->new(" 1.7"); + ok($version->numify eq "1.700", "leading space ignored"); + } + +1;