NAME¶
Test::LongString - tests strings for equality, with more helpful failures
SYNOPSIS¶
use Test::More tests => 1;
use Test::LongString;
like_string( $html, qr/(perl|cpan)\.org/ );
# Failed test (html-test.t at line 12)
# got: "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Trans"...
# length: 58930
# doesn't match '(?-xism:(perl|cpan)\.org)'
DESCRIPTION¶
This module provides some drop-in replacements for the string comparison
functions of Test::More, but which are more suitable when you test against
long strings. If you've ever had to search for text in a multi-line string
like an HTML document, or find specific items in binary data, this is the
module for you.
FUNCTIONS¶
is_string( $string, $expected [, $label ] )¶
"is_string()" is equivalent to "Test::More::is()", but with
more helpful diagnostics in case of failure.
- •
- It doesn't print the entire strings in the failure message.
- •
- It reports the lengths of the strings that have been compared.
- •
- It reports the length of the common prefix of the strings.
- •
- It reports the line and column the strings started to differ on.
- •
- In the diagnostics, non-ASCII characters are escaped as
"\x{xx}".
For example:
is_string( $soliloquy, $juliet );
# Failed test (soliloquy.t at line 15)
# got: "To be, or not to be: that is the question:\x{0a}Whether"...
# length: 1490
# expected: "O Romeo, Romeo,\x{0a}wherefore art thou Romeo?\x{0a}Deny thy"...
# length: 154
# strings begin to differ at char 1 (line 1 column 1)
is_string_nows( $string, $expected [, $label ] )¶
Like "is_string()", but removes whitespace (in the "\s"
sense) from the arguments before comparing them.
like_string( $string, qr/regex/ [, $label ] )¶
unlike_string( $string, qr/regex/ [, $label ] )¶
"like_string()" and "unlike_string()" are replacements for
"Test::More:like()" and "unlike()" that only print the
beginning of the received string in the output. Unfortunately, they can't
print out the position where the regex failed to match.
like_string( $soliloquy, qr/Romeo|Juliet|Mercutio|Tybalt/ );
# Failed test (soliloquy.t at line 15)
# got: "To be, or not to be: that is the question:\x{0a}Whether"...
# length: 1490
# doesn't match '(?-xism:Romeo|Juliet|Mercutio|Tybalt)'
contains_string( $string, $substring [, $label ] )¶
"contains_string()" searches for
$substring in
$string. It's the same as "like_string()",
except that it's not a regular expression search.
contains_string( $soliloquy, "Romeo" );
# Failed test (soliloquy.t at line 10)
# searched: "To be, or not to be: that is the question:\x{0a}Whether"...
# and can't find: "Romeo"
As of version 0.12, "contains_string()" will also report the Longest
Common SubString (LCSS) found in
$string and, if the LCSS
is short enough, the surroundings will also be shown under
LCSS
Context. This should help debug tests for really long strings like HTML
output, so you'll get something like:
contains_string( $html, '<div id="MainContent">' );
# Failed test at t/foo.t line 10.
# searched: "<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Stric"...
# can't find: "<div id="MainContent">"
# LCSS: "ainContent""
# LCSS context: "dolor sit amet</span>\x{0a}<div id="mainContent" class="
You can turn off LCSS reporting by setting $Test::LongString::LCSS to 0, or by
specifying an argument to "use":
use Test::LongString lcss => 0;
lacks_string( $string, $substring [, $label ] )¶
"lacks_string()" makes sure that
$substring does
NOT exist in
$string. It's the same as
"like_string()", except that it's not a regular expression search.
lacks_string( $soliloquy, "slings" );
# Failed test (soliloquy.t at line 10)
# searched: "To be, or not to be: that is the question:\x{0a}Whether"...
# and found: "slings"
# at position: 147 (line 3 column 4)
CONTROLLING OUTPUT¶
By default, only the first 50 characters of the compared strings are shown in
the failure message. This value is in $Test::LongString::Max, and can be set
at run-time.
You can also set it by specifying an argument to "use":
use Test::LongString max => 100;
When the compared strings begin to differ after a large prefix, Test::LongString
will not print them from the beginning, but will start at the middle, more
precisely at $Test::LongString::Context characters before the first
difference. By default this value is 10 characters. If you want
Test::LongString to always print the beginning of compared strings no matter
where they differ, undefine $Test::LongString::Context.
When computing line numbers this module uses "\n" to count line
endings. This may not be appropriate for strings on your platform, and can be
overridden by setting the $Test::LongString::EOL variable to a suitable
regular expression (either a reference to a regular expression or a string
that can be interpolated into a regular expression.)
You can also set it by specifying an argument to "use":
use Test::LongString eol => "\x{0a}\x{0c}";
AUTHOR¶
Written by Rafael Garcia-Suarez. Thanks to Mark Fowler (and to Joss Whedon) for
the inspirational Acme::Test::Buffy. Thanks to Andy Lester for lots of
patches.
This program is free software; you may redistribute it and/or modify it under
the same terms as Perl itself.
A git repository for this module is available at
git://github.com/rgs/Test-LongString.git
and the project page at
http://github.com/rgs/Test-LongString
SEE ALSO¶
Test::Builder, Test::Builder::Tester, Test::More.