NAME

Test::LineName - give names to source code lines

SYNOPSIS

my %Line;
use Test::LineName linename => \%Line;

eval {
    die "oops";   use linename 'foo';
};

$@ eq "oops at $0 line $Line{foo}.\n" or die "message wrong";

DESCRIPTION

Allows you to give symbolic names to lines in Perl source code.

This is useful mainly for testing things that deal with line numbers. For example, suppose you're testing a function that dies with a stack backtrace, such as "confess" in Carp. You might do something like:

use Test::More tests => 1;

eval {
    outer_sub()
};

is $@, <<END;
woo at $0 line 19
    main::inner_sub() called at $0 line 15
    main::outer_sub() called at $0 line 4
    eval {...} called at $0 line 3
END

sub outer_sub {
    inner_sub();
}

sub inner_sub {
    confess "woo";
}

This works, but you can't see that the line numbers are correct at a glance, you have to count lines. I prefer to give meaningful names to the lines of interest:

use Test::More tests => 1;

my %Line;
use Test::LineName linename => \%Line;

eval {                use linename 'eval';
    outer_sub();      use linename 'outer_call';
};

is $@, <<END;
woo at $0 line $Line{confess}
    main::inner_sub() called at $0 line $Line{inner_call}
    main::outer_sub() called at $0 line $Line{outer_call}
    eval {...} called at $0 line $Line{eval}
END

sub outer_sub {
    inner_sub();      use linename 'inner_call';
}

sub inner_sub {
    confess "woo";    use linename 'confess';
}

IMPORTING

When you use() this module, you must pass a pair of arguments to the use() call. The first sets the name of the line naming pragma that will be created, and the second must be a reference to the hash in which line numbers are to be placed.

The line naming pragma must consist of word characters only. Your choice of line naming pragma is a compromise between clarity and brevity. I like to use linename when there's room, but if space is short then line or even just l may be better. Be sure not the use the name of an existing Perl pragma or module.

NAMING LINES

To name a line, you add a call to the line naming pragma to the end of the line. The argument is the name to be given to the line.

You can specify a line offset as a second argument; these three examples are all equivalent:

# normal use
foo();  use linename 'foo';

# name the line below
use linename 'foo', +1;
foo();

# name the line above
foo();
use linename 'foo', -1;

AUTHOR

Nick Cleaton, <nick@cleaton.net>

COPYRIGHT AND LICENSE

Copyright (C) 2010 by Nick Cleaton

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.10.0 or, at your option, any later version of Perl 5 you may have available.