NAME
    Test::Trivial - Declutter and simplify tests

SYNOPSIS
        use Test::Trivial tests => 11;
    
        OK $expression;
        NOK $expression;
        IS $got => $expected;
        ISNT $got => $expected;
        ISA $obj => $class;
        ID $refA => $refB;
        EQ $numA => $numB;
        LIKE $got => qr/regex/;
        UNLIKE $got => qr/regex/;
        IS ERR { die "OMG No!\n" } => "OMG No!\n";
        TODO IS $got, $expected;

DESCRIPTION
    "Test::Trivial" was written to allow test writters to trivially write
    tests while still allowing the test code to be readable. The output upon
    failure has been modified to provide better diagnostics when things go
    wrong, including the source line number for the failed test. Global
    getopt options are automatically added to all tests files to allow for
    easier debugging when things go wrong.

  OPTIONS
   --verbose
    --verbose passed on the command line to any Test::Trivial test file will
    automatically print out verbose data for each test. Primarily this will
    use Data::Dumper to print out the arguments to the various operators.

   --fatal
    --fatal passed will automatically cause the test run to abort on the
    first (non TODO) "not ok" check.

   --log[=<file>]
    --log can be used to force verbose log to the the given log file name
    (default $0.log) while allowing non-verbose output to go to the
    terminal. This can be useful to diagnose bugs that happen during the
    night when run under some automated testing.

  OK
    Takes one argument which will be evaluated for boolean truth. The
    expression will be evaluated in scalar context.

    Examples:

        OK 1 + 1 == 2;
        # output:
        # ok 1 - 1 + 1 == 2
    
        OK 1 + 1 == 3;
        # output:
        # # Time: 2012-02-28 12:20:19 PM
        # ./example.t:5:1: Test 2 Failed
        # not ok 2 - 1 + 1 == 3
        # #   Failed test '1 + 1 == 3'
    
        @array = (1,2,3);
        OK @array;
        # output:
        # ok 3 - @array
    
        @array = ();
        OK @array;
        # output:
        # # Time: 2012-02-28 12:20:19 PM
        # ./example.t:18:1: Test 4 Failed
        # not ok 4 - @array
        # #   Failed test '@array'

  NOK
    Takes one argument which is evaluated for boolean false. The expression
    will be evaluated in scalar context.

    Examples:

        NOK 1 + 1 == 2;
        # output:
        # # Time: 2012-02-28 12:25:45 PM
        # ./example.t:1:1: Test 1 Failed
        # not ok 1 - not [1 + 1 == 2]
        # #   Failed test 'not [1 + 1 == 2]'
    
        NOK 1 + 1 == 3;
        # output:
        # ok 2 - not [1 + 1 == 3]
    
        @array = (1,2,3);
        NOK @array;
        # output:
        # # Time: 2012-02-28 12:25:45 PM
        # ./example.t:13:1: Test 3 Failed
        # not ok 3 - not [@array]
        # #   Failed test 'not [@array]'
    
        @array = ();
        NOK @array;
        # output:
        # ok 4 - not [@array]

  IS
    Takes two arguments and compares the values (or structures if
    references). The arguments will be evaluated in scalar context. If the
    inputs are strings with embedded newlines then Text::Diff will be used
    to print out the differences when the strings dont match. If the inputs
    are references then the structures will be compared recusively for
    equivalence.

    Examples:

        my $string = "abc";
        IS $string => "abc";
        # output:
        # ok 1 - $string == "abc"
    
        my @array = (1,2,3);
        IS @array => 3;
        # output: 
        # ok 2 - @array == 3
    
        IS "a\nb\n" => "a\nc\n";
        # output:
        # # Time: 2012-02-28 01:27:33 PM
        # ./example.t:10:1: Test 3 Failed
        # not ok 3 - "a\nb\n" == "a\nc\n"
        # #   Failed test '"a\nb\n" == "a\nc\n"'
        # # --- got
        # # +++ expected
        # # @@ -1,2 +1,2 @@
        # #  a
        # # -b
        # # +c
    
        IS [1,2,3,5,8], [1,2,3,5,8];
        # output: 
        # ok 4 - [1,2,3,5,8] == [1,2,3,5,8]
    
        IS [{a=>1}], [{b=>1}];
        # output: 
        # # Time: 2012-02-28 01:27:33 PM
        # ./example.t:26:1: Test 5 Failed
        # not ok 5 - [{a=>1}] == [{b=>1}]
        # #   Failed test '[{a=>1}] == [{b=>1}]'
        # #     Structures begin differing at:
        # #          $got->[0]{b} = Does not exist
        # #     $expected->[0]{b} = '1'
    
        IS substr("abcdef",0,3), "abc";
        # output:
        # ok 6 - substr("abcdef",0,3) == "abc"

  ISNT
    Takes two arguments and compares the values (or structures if
    references) for non equivalence. The arguments will be evaluated in
    scalar context. If the inputs are references then the structures will be
    compared recusively for non equivalence.

    Examples:

        my $string = "abc";
        ISNT $string => "abc";
        # output:
        # # Time: 2012-02-28 01:45:18 PM
        # ./example.t:2:1: Test 1 Failed
        # not ok 1 - $string != "abc"
        # #   Failed test '$string != "abc"'
        # #          got: 'abc'
        # #     expected: anything else
    
        my @array = (1,2,3);
        ISNT @array => 3;
        # output: 
        # # Time: 2012-02-28 01:45:18 PM
        # ./example.t:12:1: Test 2 Failed
        # not ok 2 - @array != 3
        # #   Failed test '@array != 3'
        # #          got: '3'
        # #     expected: anything else
    
        ISNT "a\nb" => "a\nc";
        # output:
        # ok 3 - "a\nb" != "a\nc"
    
        ISNT [1,2,3,5,8], [1,2,3,5,8];
        # output: 
        # not ok 4 - [1,2,3,5,8] != [1,2,3,5,8]
        # #   Failed test '[1,2,3,5,8] != [1,2,3,5,8]'
    
        ISNT [{a=>1}], [{b=>1}];
        # output: 
        # ok 5 - [{a=>1}] != [{b=>1}]
    
        ISNT substr("abcdef",0,3), "abc";
        # output:
        # # Time: 2012-02-28 01:45:18 PM
        # ./example.t:34:1: Test 6 Failed
        # not ok 6 - substr("abcdef",0,3) != "abc"
        # #   Failed test 'substr("abcdef",0,3) != "abc"'
        # #          got: 'abc'
        # #     expected: anything else

  ISA
    Takes two arguments and checks to see if the first argument is a
    reference that inherits from the class/type of the second argument.

    Examples:

        ISA [] => "ARRAY";
        # output:
        # ok 1 - [] ISA "ARRAY"
    
        ISA {} => "HASH";
        # output:
        # ok 2 - {} ISA "HASH"
    
        ISA qr/ABC/ => "REGEXP";
        # output:
        # ok 3 - qr/ABC/ ISA "REGEXP"

        ISA \*STDIO => "GLOB";
        # output:
        # ok 4 - \*STDIO ISA "GLOB"
    
        my $io = IO::File->new();
        ISA $io => "IO::File";
        # output:
        # ok 5 - $io ISA "IO::File"
    
        ISA $io => "IO::Handle";
        # output:
        # ok 6 - $io ISA "IO::Handle"
    
        ISA $io => "Exporter";
        # output:
        # ok 7 - $io ISA "Exporter"
    
        ISA $io => "GLOB";
        # output:
        # ok 8 - $io ISA "GLOB"
    
        ISA $io => "ARRAY";
        # output:
        # # Time: 2012-02-28 02:03:20 PM
        # ./example.t:34:1: Test 9 Failed
        # not ok 9 - $io ISA "ARRAY"
        # #   Failed test '$io ISA "ARRAY"'
    
        ISA $io => "IO::Socket";
        # output:
        # # Time: 2012-02-28 02:03:20 PM
        # ./example.t:41:1: Test 10 Failed
        # not ok 10 - $io ISA "IO::Socket"
        # #   Failed test '$io ISA "IO::Socket"'

  ID
    Takes two arguments and compares them for exact values. ID is similar to
    IS except that references are compared literally (ie the reference
    address is compared) instead of recusively comparing the data
    structures.

    Examples:

        my $arr1 = my $arr2 = [];
        ID $arr1 => $arr2;
        # output:
        # ok 1 - $arr1 == $arr2
    
        ID $arr1 => [];
        # output:
        # # Time: 2012-02-28 02:35:38 PM
        # ./example.t:6:1: Test 2 Failed
        # not ok 2 - $arr1 == []
        # #   Failed test '$arr1 == []'
        # #          got: 'ARRAY(0x186fd80)'
        # #     expected: 'ARRAY(0x188c588)'
    
        my $hash1 = $hash2 = {};
        ID $hash1 => $hash2;
        # output:
        # ok 3 - $hash1 == $hash2
    
        ID $hash1 => {};
        # output:
        # # Time: 2012-02-28 02:35:38 PM
        # ./example.t:20:1: Test 4 Failed
        # not ok 4 - $hash1 == {}
        # #   Failed test '$hash1 == {}'
        # #          got: 'HASH(0x189bcc8)'
        # #     expected: 'HASH(0x1ee95b8)'
    
        my %hash = ();
        my $hash3 = \%hash;
    
        ID $hash3 => \%hash;
        # output:
        # ok 5 - $hash3 == \%hash

  EQ
    Takes two arguments and compares them for numeric equivalence.

    Examples:

        EQ 12 => 12;
        # output:
        # ok 1 - 12 == 12
    
        EQ 12.00001 => 12;
        # output:
        # # Time: 2012-02-28 03:16:49 PM
        # ./example.t:4:1: Test 2 Failed
        # not ok 2 - 12.00001 == 12
        # #   Failed test '12.00001 == 12'
        # #          got: '12.00001'
        # #     expected: '12'
    
        EQ 12.0 => 12;
        # output:
        # ok 3 - 12.0 == 12
    
        EQ 12.0 / 1.0 => 12;
        # output:
        # ok 4 - 12.0 / 1.0 == 12
    
        EQ 0.12E2 => 12;
        # output:
        # ok 5 - 0.12E2 == 12
    
        EQ 1200E-2 => 12;
        # output:
        # ok 6 - 1200E-2 == 12
    
        EQ 0x0C => 12;
        # output:
        # ok 7 - 0x0C == 12
    
        EQ 014 => 12;
        # output:
        # ok 8 - 014 == 12
    
        EQ 0b001100 => 12;
        # output:
        # ok 9 - 0b001100 == 12
    
        EQ "12" => 12;
        # output:
        # ok 10 - "12" == 12
    
        EQ "12.0" => 12;
        # output:
        # ok 11 - "12.0" == 12
    
        EQ "0.12E2" => 12;
        # output:
        # ok 12 - "0.12E2" == 12
    
        EQ "1200E-2" => 12;
        # output:
        # ok 13 - "1200E-2" == 12

        EQ "12 Monkeys" => 12;
        # output:
        # ok 14 - "12 Monkeys" == 12

  LIKE
    Takes two arguments, the first argument should be a string, and the
    second argument should be a REGEXP. The regex will be run against the
    string to verify that there is a successful match.

    Examples:

        LIKE "abc" => qr{^a};
        # output:
        # ok 1 - "abc" =~ qr{^a}
    
        LIKE "ABC" => qr{^a}i;
        # output:
        # ok 2 - "ABC" =~ qr{^a}i
    
        LIKE "ABC" => qr/^(?i:a)/;
        # output:
        # ok 3 - "ABC" =~ qr/^(?i:a)/
    
        use Regexp::Common;
        LIKE "123.456E3" => qr[$RE{num}{real}];
        # output:
        # ok 4 - "123.456E3" =~ qr[$RE{num}{real}]
    
        LIKE "foo" => qr{bar};
        # output:
        # # Time: 2012-02-28 03:44:35 PM
        # ./example.t:18:1: Test 5 Failed
        # not ok 5 - "foo" =~ qr{bar}
        # #   Failed test '"foo" =~ qr{bar}'
        # #                   'foo'
        # #     doesn't match '(?-xism:bar)'

  UNLIKE
    Takes two arguments, the first argument should be a string, and the
    second argument should be a REGEXP. The regex will be run against the
    string to verify that there is a negative match.

    Examples:

        UNLIKE "abc" => qr{^A};
        # output:
        # ok 1 - "abc" !~ qr{^A}
    
        UNLIKE "ABC" => qr{^a}i;
        # output:
        # # Time: 2012-02-28 03:54:31 PM
        # ./example.t:5:1: Test 2 Failed
        # not ok 2 - "ABC" !~ qr{^a}i
        # #   Failed test '"ABC" !~ qr{^a}i'
        # #                   'ABC'
        # #           matches '(?i-xsm:^a)'
    
        UNLIKE "ABC" => qr/^(?i:a)/;
        # output:
        # # Time: 2012-02-28 03:54:31 PM
        # ./example.t:14:1: Test 3 Failed
        # not ok 3 - "ABC" !~ qr/^(?i:a)/
        # #   Failed test '"ABC" !~ qr/^(?i:a)/'
        # #                   'ABC'
        # #           matches '(?-xism:^(?i:a))'
    
        use Regexp::Common;
        UNLIKE "123.456E3" => qr[$RE{num}{int}];
        # output:
        # # Time: 2012-02-28 03:54:31 PM
        # ./example.t:24:1: Test 4 Failed
        # not ok 4 - "123.456E3" !~ qr[$RE{num}{int}]
        # #   Failed test '"123.456E3" !~ qr[$RE{num}{int}]'
        # #                   '123.456E3'
        # #           matches '(?-xism:(?:(?:[+-]?)(?:[0123456789]+)))'
    
        UNLIKE "foo" => qr{bar};
        # output:
        # ok 5 - "foo" !~ qr{bar}

  ERR
    ERR is a wrapper to help capture exceptions to make analyzing error
    cases easier. The argument to ERR is a subroutine or code block.

    Examples:

        package PosixErr;
        use POSIX qw(strerror);
        use overload '""' => \&stringify;
        sub new { bless { code => $_[1] }, $_[0] }
        sub stringify { strerror($_[0]->{code}) }
    
        package main;
        IS ERR { die "OMG No!\n" } => "OMG No!\n";
        # output:
        # ok 1 - ERR { die "OMG No!\n" } == "OMG No!\n"
    
        IS ERR { die PosixErr->new(12) }  => PosixErr->new(12);
        # output:
        # ok 2 - ERR { die PosixErr->new(12) } == PosixErr->new(12)
    
        IS ERR { die PosixErr->new(12) }  => "Cannot allocate memory";
        # output:
        # ok 3 - ERR { die PosixErr->new(12) } == "Cannot allocate memory"
    
        IS ERR { die PosixErr->new(13) }  => "Knock it out, wiseguy";
        # output:
        # # Time: 2012-02-28 04:27:35 PM
        # ./example.t:20:1: Test 4 Failed
        # not ok 4 - ERR { die PosixErr->new(13) } == "Knock it out
        # #   Failed test 'ERR { die PosixErr->new(13) } == "Knock it out'
        # #          got: 'Permission denied'
        # #     expected: 'Knock it out, wiseguy'
    
        IS ERR { die PosixErr->new(13) }  => "Permission denied";
        # output:
        # ok 5 - ERR { die PosixErr->new(13) } == "Permission denied"
    
        IS ERR { "ok" } => "ok";
        # output:
        # ok 6 - ERR { "ok" } == "ok"

  TODO
    TODO can be used a prefix to any test to indicate that it is a known
    failure. For futher reading on TODO please read Test::More.

    Examples:

        TODO OK 1 == 2;
        # output:
        # # Time: 2012-02-28 04:39:55 PM
        # ./example.t:1:6: Test 1 Failed
        # not ok 1 - 1 == 2 # TODO Test Know to fail
        # #   Failed (TODO) test '1 == 2'
    
        TODO NOK 1 == 1;
        # output:
        # # Time: 2012-02-28 04:39:55 PM
        # ./example.t:8:6: Test 2 Failed
        # not ok 2 - not [1 == 1] # TODO Test Know to fail
        # #   Failed (TODO) test 'not [1 == 1]'
    
        TODO IS "abc" => "ABC";
        # output:
        # # Time: 2012-02-28 04:39:55 PM
        # ./example.t:15:6: Test 3 Failed
        # not ok 3 - "abc" == "ABC" # TODO Test Know to fail
        # #   Failed (TODO) test '"abc" == "ABC"'
        # #          got: 'abc'
        # #     expected: 'ABC'
    
        TODO ISNT "abc" => "abc";
        # output:
        # # Time: 2012-02-28 04:39:55 PM
        # ./example.t:24:6: Test 4 Failed
        # not ok 4 - "abc" != "abc" # TODO Test Know to fail
        # #   Failed (TODO) test '"abc" != "abc"'
        # #          got: 'abc'
        # #     expected: anything else
    
        TODO ISA [] => "HASH";
        # output:
        # # Time: 2012-02-28 04:39:55 PM
        # ./example.t:33:6: Test 5 Failed
        # not ok 5 - [] ISA "HASH" # TODO Test Know to fail
        # #   Failed (TODO) test '[] ISA "HASH"'
    
        TODO ID [] => [];
        # output:
        # # Time: 2012-02-28 04:39:55 PM
        # ./example.t:40:6: Test 6 Failed
        # not ok 6 - [] == [] # TODO Test Know to fail
        # #   Failed (TODO) test '[] == []'
        # #          got: 'ARRAY(0x1c62a28)'
        # #     expected: 'ARRAY(0x1c62a10)'
    
        TODO EQ 123 => 124;
        # output:
        # # Time: 2012-02-28 04:39:55 PM
        # ./example.t:49:6: Test 7 Failed
        # not ok 7 - 123 == 124 # TODO Test Know to fail
        # #   Failed (TODO) test '123 == 124'
        # #          got: '123'
        # #     expected: '124'
    
        TODO LIKE "abc" => qr/^ABC$/;
        # output:
        # # Time: 2012-02-28 04:39:55 PM
        # ./example.t:58:6: Test 8 Failed
        # not ok 8 - "abc" =~ qr/^ABC$/ # TODO Test Know to fail
        # #   Failed (TODO) test '"abc" =~ qr/^ABC$/'
        # #                   'abc'
        # #     doesn't match '(?-xism:^ABC$)'
    
        TODO UNLIKE "abc" => qr/^abc$/;
        # output:
        # # Time: 2012-02-28 04:39:55 PM
        # ./example.t:67:6: Test 9 Failed
        # not ok 9 - "abc" !~ qr/^abc$/ # TODO Test Know to fail
        # #   Failed (TODO) test '"abc" !~ qr/^abc$/'
        # #                   'abc'
        # #           matches '(?-xism:^abc$)'

  ENVIRONMENT
   TEST_TRIVIAL_LOG
    This environment variable will act as if --log=$ENV{TEST_TRIVIAL_LOG}
    had been set.

AUTHOR
    2007-2012, Cory Bennett <cpan@corybennett.org>

SOURCE
    The Source is available at github:
    https://github.com/coryb/perl-test-trivial

SEE ALSO
    Test::More, Test::Harness, Text::Diff

COPYRIGHT and LICENSE
    Copyright (c) 2008 Yahoo! Inc. All rights reserved. The copyrights to
    the contents of this file are licensed under the Perl Artistic License
    (ver. 15 Aug 1997).

