The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
NAME
    Test::Block - Specify fine granularity test plans

SYNOPSIS
      use Test::More 'no_plan';
      use Test::Block qw($Plan);

      {
          # This block should run exactly two tests
          local $Plan = 2;
          pass 'first test';
          # oops. forgot second test
      };

      SKIP: {
          local $Plan = 3;
          pass('first test in second block');
          skip "skip remaining tests" => $Plan;
      };

      ok( Test::Block->all_in_block, 'all test run in blocks' );
      is( Test::Block->block_count, 2, 'two blocks ran' );

      # This produces...
  
      ok 1 - first test
      not ok 2 - block expected 2 test(s) and ran 1
      #     Failed test (foo.pl at line 6)
      ok 3 - first test in second block
      ok 4 # skip skip remaining tests
      ok 5 # skip skip remaining tests
      ok 6 - all test run in blocks
      ok 7 - two blocks ran
      1..7
      # Looks like you failed 1 tests of 7.

DESCRIPTION
    This module allows you to specify the number of expected tests at a
    finer level of granularity than an entire test script. It is built with
    Test::Builder and plays happily with Test::More and friends.

    If you are not already familiar with Test::More now would be the time to
    go take a look.

  Creating test blocks
    Test::Block supplies a special variable $Plan that you can localize to
    specify the number of tests in a block like this:

        use Test::More 'no_plan';
        use Test::Block qw($Plan);
    
        {
            local $Plan = 2;
            pass('first test');
            pass('second test');
        };
    
  What if the block runs a different number of tests?
    If a block doesn't run the number of tests specified in $Plan then
    Test::Block will automatically produce a failing test. For example:

        {
            local $Plan = 2;
            pass('first test');
            # oops - forgot second test
        };

    will output

        ok 1 - first test
        not ok 2 - block 1 expected 2 test(s) and ran 1

  Tracking the number of remaining tests
    During the execution of a block $Plan will contain the number of
    remaining tests that are expected to run so:

        {
            local $Plan = 2;
            diag "$Plan tests to run";
            pass('first test');
            diag "$Plan tests to run";
            pass('second test');
            diag "$Plan tests to run";
        };

    will produce

        # 2 tests to run
        ok 1 - first test
        # 1 tests to run
        ok 2 - second test
        # 0 tests to run

    This can make skip blocks easier to write and maintain, for example:

        SKIP: {
            local $Plan = 5;
            pass('first test');
            pass('second test');
            skip "debug tests" => $Plan unless DEBUG > 0;
            pass('third test');
            pass('fourth test');
            skip "high level debug tests" => $Plan unless DEBUG > 2;
            pass('fifth test');
        };

  Named blocks
    To make debugging easier you can give your blocks an optional name like
    this:

        {
            local $Plan = { example => 2 };
            pass('first test');
            # oops - forgot second test
        };

    which would output

        ok 1 - first test
        not ok 2 - block example expected 2 test(s) and ran 1

  Test::Block objects
    The $Plan is implemented using a tied variable that stores and retrieves
    Test::Block objects. If you want to avoid the tied interface you can use
    Test::Block objects directly.

    plan
          # create a block expecting 4 tests
          my $block = Test::Block->plan(4);

          # create a named block with two tests
          my $block = Test::Block->plan('test name' => 2);

        You create Test::Block objects with the "plan" method. When the
        object is destroyed it outputs a failing test if the expected number
        of tests have not run.

    remaining
        You can find out the number of remaining tests in the block by
        calling the "remaining" method on the object.

        Test::Block objects overload "" and "0+" to return the result of the
        remaining method.

    builder
        Returns Test::Builder object used by Test::Block. For example:

          Test::Block->builder->skip('skip a test');

        See Test::Builder for more information.

    block_count
        A class method that returns the number of blocks that have been
        created. You can use this to check that the expected number of
        blocks have run by doing something like:

          is( Test::Block->block_count, 5, 'five blocks run' );

        at the end of your test script.

    all_in_block
        Returns true if all tests so far run have been inside the scope of a
        Test::Block object.

          ok( Test::Block->all_in_block, 'all tests run in blocks' );

BUGS
    None known at the time of writing.

    If you find any please let me know by e-mail, or report the problem with
    <http://rt.cpan.org/>.

COMMUNITY
    perl-qa
        If you are interested in testing using Perl I recommend you visit
        <http://qa.perl.org/> and join the excellent perl-qa mailing list.
        See <http://lists.perl.org/showlist.cgi?name=perl-qa> for details on
        how to subscribe.

    perlmonks
        You can find users of Test::Block, including the module author, on
        <http://www.perlmonks.org/>. Feel free to ask questions on
        Test::Block there.

    CPAN::Forum
        The CPAN Forum is a web forum for discussing Perl's CPAN modules.
        The Test::Block forum can be found at
        <http://www.cpanforum.com/dist/Test-Block>.

    AnnoCPAN
        AnnoCPAN is a web site that allows community annotations of Perl
        module documentation. The Test::Block annotations can be found at
        <http://annocpan.org/~ADIE/Test-Block/>.

TO DO
    If you think this module should do something that it doesn't (or does
    something that it shouldn't) please let me know.

    You can see my current to do list at
    <http://adrianh.tadalist.com/lists/public/15423>, with an RSS feed of
    changes at <http://adrianh.tadalist.com/lists/feed_public/15423>.

ACKNOWLEGEMENTS
    Thanks to chromatic and Michael G Schwern for the excellent
    Test::Builder, without which this module wouldn't be possible.

    Thanks to Michael G Schwern and Tony Bowden for the mails on
    perl-qa@perl.org that sparked the idea for this module. Thanks to Fergal
    Daly for suggesting named blocks. Thanks to Michael G Schwern for
    suggesting $Plan.

AUTHOR
    Adrian Howard <adrianh@quietstars.com>

    If you can spare the time, please drop me a line if you find this module
    useful.

SEE ALSO
    Test::Builder
        Support module for building test libraries.

    Test::Simple & Test::More
        Basic utilities for writing tests.

    Test::Class
        Test::Class is an xUnit testing framework for Perl. It allows you to
        specify the number of test run in each method.

    <http://qa.perl.org/test-modules.html>
        Overview of some of the many testing modules available on CPAN.

LICENCE
    Copyright 2003-2005 Adrian Howard, All Rights Reserved.

    This program is free software; you can redistribute it and/or modify it
    under the same terms as Perl itself.