1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
|
#!perl
use warnings;
use strict;
use Test::More tests => 113;
use Test::Exception;
use Carp::Assert::More;
my $af = qr/Assertion failed!\n/;
my $failed = qr/${af}Failed:/;
NUMERIC_EQ: {
lives_ok( sub { assert_cmp( 1, '==', 1 ) }, 'num == num' );
lives_ok( sub { assert_cmp( 2, '==', '2' ) }, 'num == str' );
lives_ok( sub { assert_cmp( '3', '==', 3 ) }, 'str == num' );
lives_ok( sub { assert_cmp( '4', '==', '4' ) }, 'str == str' );
lives_ok( sub { assert_cmp( 5, '==', 5.0 ) }, 'int == float' );
throws_ok( sub { assert_cmp( -1, '==', 1 ) }, qr/$failed -1 == 1/, 'num == num' );
throws_ok( sub { assert_cmp( -2, '==', '2' ) }, qr/$failed -2 == 2/, 'num == str' );
throws_ok( sub { assert_cmp( '-3', '==', 3 ) }, qr/$failed -3 == 3/, 'str == num' );
throws_ok( sub { assert_cmp( '-4', '==', '4' ) }, qr/$failed -4 == 4/, 'str == str' );
throws_ok( sub { assert_cmp( -5, '==', 5.0 ) }, qr/$failed -5 == 5/, 'int == float' );
}
NUMERIC_NE: {
lives_ok( sub { assert_cmp( -1, '!=', 1 ) }, 'num != num' );
lives_ok( sub { assert_cmp( -2, '!=', '2' ) }, 'num != str' );
lives_ok( sub { assert_cmp( '-3', '!=', 3 ) }, 'str != num' );
lives_ok( sub { assert_cmp( '-4', '!=', '4' ) }, 'str != str' );
lives_ok( sub { assert_cmp( -5, '!=', 5.0 ) }, 'int != float' );
throws_ok( sub { assert_cmp( 1, '!=', 1 ) }, qr/$failed 1 != 1/, 'num != num' );
throws_ok( sub { assert_cmp( 2, '!=', '2' ) }, qr/$failed 2 != 2/, 'num != str' );
throws_ok( sub { assert_cmp( '3', '!=', 3 ) }, qr/$failed 3 != 3/, 'str != num' );
throws_ok( sub { assert_cmp( '4', '!=', '4' ) }, qr/$failed 4 != 4/, 'str != str' );
throws_ok( sub { assert_cmp( 5, '!=', 5.0 ) }, qr/$failed 5 != 5/, 'int != float' );
}
NUMERIC_LT: {
lives_ok( sub { assert_cmp( 1, '<', 2 ) }, 'num < num' );
lives_ok( sub { assert_cmp( 2, '<', '3' ) }, 'num < str' );
lives_ok( sub { assert_cmp( '3', '<', 4 ) }, 'str < num' );
lives_ok( sub { assert_cmp( '4', '<', '5' ) }, 'str < str' );
lives_ok( sub { assert_cmp( 5, '<', 6.0 ) }, 'int < float' );
lives_ok( sub { assert_cmp( 6.0, '<', 7 ) }, 'float < int' );
lives_ok( sub { assert_cmp( 7.0, '<', 8.0 ) }, 'float < float' );
throws_ok( sub { assert_cmp( 1, '<', 1 ) }, qr/$failed 1 < 1/, 'num < num' );
throws_ok( sub { assert_cmp( 2, '<', '2' ) }, qr/$failed 2 < 2/, 'num < str' );
throws_ok( sub { assert_cmp( '3', '<', 3 ) }, qr/$failed 3 < 3/, 'str < num' );
throws_ok( sub { assert_cmp( '4', '<', '4' ) }, qr/$failed 4 < 4/, 'str < str' );
throws_ok( sub { assert_cmp( 5, '<', 5.0 ) }, qr/$failed 5 < 5/, 'int < float' );
throws_ok( sub { assert_cmp( 6.0, '<', 6 ) }, qr/$failed 6 < 6/, 'float < int' );
throws_ok( sub { assert_cmp( 7.0, '<', 7.0 ) }, qr/$failed 7 < 7/, 'float < float' );
}
NUMERIC_LE: {
lives_ok( sub { assert_cmp( 1, '<=', 2 ) }, 'num <= num' );
lives_ok( sub { assert_cmp( 2, '<=', '3' ) }, 'num <= str' );
lives_ok( sub { assert_cmp( '3', '<=', 4 ) }, 'str <= num' );
lives_ok( sub { assert_cmp( '4', '<=', '5' ) }, 'str <= str' );
lives_ok( sub { assert_cmp( 5, '<=', 6.0 ) }, 'int <= float' );
lives_ok( sub { assert_cmp( 6.0, '<=', 7 ) }, 'float <= int' );
lives_ok( sub { assert_cmp( 7.0, '<=', 8.0 ) }, 'float <= float' );
throws_ok( sub { assert_cmp( 1, '<=', 0 ) }, qr/$failed 1 <= 0/, 'num <= num' );
throws_ok( sub { assert_cmp( 2, '<=', '1' ) }, qr/$failed 2 <= 1/, 'num <= str' );
throws_ok( sub { assert_cmp( '3', '<=', 2 ) }, qr/$failed 3 <= 2/, 'str <= num' );
throws_ok( sub { assert_cmp( '4', '<=', '3' ) }, qr/$failed 4 <= 3/, 'str <= str' );
throws_ok( sub { assert_cmp( 5, '<=', 4.0 ) }, qr/$failed 5 <= 4/, 'int <= float' );
throws_ok( sub { assert_cmp( 6.0, '<=', 5 ) }, qr/$failed 6 <= 5/, 'float <= int' );
throws_ok( sub { assert_cmp( 7.0, '<=', 6.0 ) }, qr/$failed 7 <= 6/, 'float <= float' );
}
NUMERIC_GT: {
lives_ok( sub { assert_cmp( 1, '>', 0 ) }, 'num > num' );
lives_ok( sub { assert_cmp( 2, '>', '1' ) }, 'num > str' );
lives_ok( sub { assert_cmp( '3', '>', 2 ) }, 'str > num' );
lives_ok( sub { assert_cmp( '4', '>', '3' ) }, 'str > str' );
lives_ok( sub { assert_cmp( 5, '>', 4.0 ) }, 'int > float' );
lives_ok( sub { assert_cmp( 6.0, '>', 5 ) }, 'float > int' );
lives_ok( sub { assert_cmp( 7.0, '>', 6.0 ) }, 'float > float' );
throws_ok( sub { assert_cmp( 1, '>', 1 ) }, qr/$failed 1 > 1/, 'num > num' );
throws_ok( sub { assert_cmp( 2, '>', '2' ) }, qr/$failed 2 > 2/, 'num > str' );
throws_ok( sub { assert_cmp( '3', '>', 3 ) }, qr/$failed 3 > 3/, 'str > num' );
throws_ok( sub { assert_cmp( '4', '>', '4' ) }, qr/$failed 4 > 4/, 'str > str' );
throws_ok( sub { assert_cmp( 5, '>', 5.0 ) }, qr/$failed 5 > 5/, 'int > float' );
throws_ok( sub { assert_cmp( 6.0, '>', 6 ) }, qr/$failed 6 > 6/, 'float > int' );
throws_ok( sub { assert_cmp( 7.0, '>', 7.0 ) }, qr/$failed 7 > 7/, 'float > float' );
}
NUMERIC_GE: {
lives_ok( sub { assert_cmp( 1, '>=', 1 ) }, 'num >= num' );
lives_ok( sub { assert_cmp( 2, '>=', '2' ) }, 'num >= str' );
lives_ok( sub { assert_cmp( '3', '>=', 3 ) }, 'str >= num' );
lives_ok( sub { assert_cmp( '4', '>=', '4' ) }, 'str >= str' );
lives_ok( sub { assert_cmp( 5, '>=', 5.0 ) }, 'int >= float' );
lives_ok( sub { assert_cmp( 6.0, '>=', 6 ) }, 'float >= int' );
lives_ok( sub { assert_cmp( 7.0, '>=', 7.0 ) }, 'float >= float' );
throws_ok( sub { assert_cmp( 0, '>=', 1 ) }, qr/$failed 0 >= 1/, 'num >= num' );
throws_ok( sub { assert_cmp( 1, '>=', '2' ) }, qr/$failed 1 >= 2/, 'num >= str' );
throws_ok( sub { assert_cmp( '2', '>=', 3 ) }, qr/$failed 2 >= 3/, 'str >= num' );
throws_ok( sub { assert_cmp( '3', '>=', '4' ) }, qr/$failed 3 >= 4/, 'str >= str' );
throws_ok( sub { assert_cmp( 4, '>=', 5.0 ) }, qr/$failed 4 >= 5/, 'int >= float' );
throws_ok( sub { assert_cmp( 5.0, '>=', 6 ) }, qr/$failed 5 >= 6/, 'float >= int' );
throws_ok( sub { assert_cmp( 6.0, '>=', 7.0 ) }, qr/$failed 6 >= 7/, 'float >= float' );
}
BAD_NUMBERS: {
my @operators = qw( == != > >= < <= );
for my $op ( @operators ) {
throws_ok( sub { assert_cmp( 12, $op, undef ) }, qr/$failed 12 $op undef/, "num $op undef" );
throws_ok( sub { assert_cmp( undef, $op, 14 ) }, qr/$failed undef $op 14/, "undef $op num" );
throws_ok( sub { assert_cmp( undef, $op, undef) }, qr/$failed undef $op undef/, "undef $op undef" );
}
}
STRINGS: {
lives_ok( sub { assert_cmp( 'a', 'lt', 'b' ) }, 'lt' );
lives_ok( sub { assert_cmp( 'a', 'le', 'a' ) }, 'le' );
lives_ok( sub { assert_cmp( 'b', 'gt', 'a' ) }, 'gt' );
lives_ok( sub { assert_cmp( 'a', 'ge', 'a' ) }, 'ge' );
throws_ok( sub { assert_cmp( 'a', 'lt', 'a' ) }, qr/$failed a lt a/ );
throws_ok( sub { assert_cmp( 'b', 'le', 'a' ) }, qr/$failed b le a/ );
throws_ok( sub { assert_cmp( 'a', 'gt', 'a' ) }, qr/$failed a gt a/ );
throws_ok( sub { assert_cmp( 'a', 'ge', 'b' ) }, qr/$failed a ge b/ );
}
BAD_OPERATOR: {
for my $op ( qw( xx eq ne lte gte LT LE GT GE ), undef ) {
my $dispop = $op ? qq{"$op"} : '<undef>';
throws_ok( sub { assert_cmp( 3, $op, 3 ) }, qr/${af}Invalid operator $dispop/ );
}
}
BAD_VALUES: {
throws_ok( sub { assert_cmp( 9, '>', undef ) }, qr/$failed 9 > undef/ );
}
exit 0;
|