The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl
use strict;
use warnings;

use Test::More;
use Math::Prime::Util qw/primes
                         nth_prime nth_prime_lower nth_prime_upper nth_prime_approx
                         prime_count prime_count_lower prime_count_upper prime_count_approx
                         next_prime prev_prime
                        /;


my @trials = qw/1 2 3 4 5 6 7 17 57 89 102 1337 8573 84763 784357 1000001 2573622/;

my $use64 = Math::Prime::Util::prime_get_config->{'maxbits'} > 32;
my $extra = defined $ENV{RELEASE_TESTING} && $ENV{RELEASE_TESTING};

plan tests => 5 * scalar @trials;

my $last = 0;
foreach my $n (@trials) {

  is( prime_count($n), scalar @{primes($n)}, "Prime count and scalar primes agree for $n" );

  is( prime_count($n) - prime_count($last),
      scalar @{primes( $last+1, $n )},
      "scalar primes($last+1,$n) = prime_count($n) - prime_count($last)" );

  is( prime_count(nth_prime($n)), $n, "Pi(pn)) = n for $n");

  is( nth_prime(prime_count($n)+1), next_prime($n), "p(Pi(n)+1) = next_prime(n) for $n" );

  is( nth_prime(prime_count($n)), prev_prime($n+1), "p(Pi(n)) = prev_prime(n) for $n" );

  $last = $n;
}