1use Test::More; 2 3use strict; 4use warnings; 5 6BEGIN { use_ok("Number::Tolerant"); } 7 8{ # x_to_y & x_to_y 9 my $demand = Number::Tolerant->new(40 => to => 60); 10 my $offer = Number::Tolerant->new(30 => to => 50); 11 12 isa_ok($demand, 'Number::Tolerant'); 13 isa_ok($offer, 'Number::Tolerant'); 14 15 my $range = $demand & $offer; 16 17 isa_ok($range, 'Number::Tolerant', 'intersection'); 18 19 is("$range", '40 <= x <= 50', ' ... stringifies'); 20 21 is($range->{min}, 40, ' ... minimum : 40'); 22 is($range->{max}, 50, ' ... maximum : 50'); 23} 24 25{ # x_to_y & x_or_more 26 my $demand = Number::Tolerant->new(40 => 'or_more'); 27 my $offer = Number::Tolerant->new(30 => to => 50); 28 29 isa_ok($demand, 'Number::Tolerant'); 30 isa_ok($offer, 'Number::Tolerant'); 31 32 my $range = $demand & $offer; 33 34 isa_ok($range, 'Number::Tolerant', 'intersection'); 35 36 is("$range", '40 <= x <= 50', ' ... stringifies'); 37 38 is($range->{min}, 40, ' ... minimum : 40'); 39 is($range->{max}, 50, ' ... maximum : 50'); 40} 41 42{ # x_or_more & x_or_more 43 my $demand = Number::Tolerant->new(40 => 'or_more'); 44 my $offer = Number::Tolerant->new(30 => 'or_more'); 45 46 isa_ok($demand, 'Number::Tolerant'); 47 isa_ok($offer, 'Number::Tolerant'); 48 49 my $range = $demand & $offer; 50 51 isa_ok($range, 'Number::Tolerant', 'intersection'); 52 53 is("$range", '40 <= x', ' ... stringifies'); 54 55 is($range->{min}, 40, ' ... minimum : 40'); 56 is($range->{max}, undef, ' ... maximum : undef'); 57} 58 59{ # x_or_less & x_or_less 60 my $demand = Number::Tolerant->new(40 => 'or_less'); 61 my $offer = Number::Tolerant->new(30 => 'or_less'); 62 63 isa_ok($demand, 'Number::Tolerant'); 64 isa_ok($offer, 'Number::Tolerant'); 65 66 my $range = $demand & $offer; 67 68 isa_ok($range, 'Number::Tolerant', 'intersection'); 69 70 is("$range", 'x <= 30', ' ... stringifies'); 71 72 is($range->{min}, undef, ' ... minimum : undef'); 73 is($range->{max}, 30, ' ... maximum : 30'); 74} 75 76{ # x_or_more & more_than_x 77 my $demand = Number::Tolerant->new(40 => 'or_more'); 78 my $offer = Number::Tolerant->new(30 => 'more_than'); 79 80 isa_ok($demand, 'Number::Tolerant'); 81 isa_ok($offer, 'Number::Tolerant'); 82 83 my $range = $demand & $offer; 84 85 isa_ok($range, 'Number::Tolerant', 'intersection'); 86 87 is("$range", '40 <= x', ' ... stringifies'); 88 89 is($range->{min}, 40, ' ... minimum : undef'); 90 is($range->{max}, undef, ' ... maximum : 30'); 91} 92 93{ # more_than_x & x_or_more 94 my $demand = Number::Tolerant->new(30 => 'or_more'); 95 my $offer = Number::Tolerant->new(40 => 'more_than'); 96 97 isa_ok($demand, 'Number::Tolerant'); 98 isa_ok($offer, 'Number::Tolerant'); 99 100 my $range = $offer & $demand; 101 102 isa_ok($range, 'Number::Tolerant', 'intersection'); 103 104 is("$range", '40 < x', ' ... stringifies'); 105 106 is($range->{min}, 40, ' ... minimum : 40'); 107 is($range->{max}, undef, ' ... maximum : undef'); 108} 109 110{ # x_or_more & more_than_x 111 my $demand = Number::Tolerant->new(30 => 'or_more'); 112 my $offer = Number::Tolerant->new(40 => 'more_than'); 113 114 isa_ok($demand, 'Number::Tolerant'); 115 isa_ok($offer, 'Number::Tolerant'); 116 117 my $range = $demand & $offer; 118 119 isa_ok($range, 'Number::Tolerant', 'intersection'); 120 121 is("$range", '40 < x', ' ... stringifies'); 122 123 is($range->{min}, 40, ' ... minimum : 40'); 124 is($range->{max}, undef, ' ... maximum : undef'); 125} 126 127{ # x_or_less & less_than_x 128 my $demand = Number::Tolerant->new(40 => 'or_less'); 129 my $offer = Number::Tolerant->new(30 => 'less_than'); 130 131 isa_ok($demand, 'Number::Tolerant'); 132 isa_ok($offer, 'Number::Tolerant'); 133 134 my $range = $demand & $offer; 135 136 isa_ok($range, 'Number::Tolerant', 'intersection'); 137 138 is("$range", 'x < 30', ' ... stringifies'); 139 140 is($range->{min}, undef, ' ... minimum : undef'); 141 is($range->{max}, 30, ' ... maximum : 30'); 142} 143 144{ # less_than_x & x_or_less 145 my $demand = Number::Tolerant->new(40 => 'or_less'); 146 my $offer = Number::Tolerant->new(30 => 'less_than'); 147 148 isa_ok($demand, 'Number::Tolerant'); 149 isa_ok($offer, 'Number::Tolerant'); 150 151 my $range = $offer & $demand; 152 153 isa_ok($range, 'Number::Tolerant', 'intersection'); 154 155 is("$range", 'x < 30', ' ... stringifies'); 156 157 is($range->{min}, undef, ' ... minimum : undef'); 158 is($range->{max}, 30, ' ... maximum : 30'); 159} 160 161{ # less_than_x & more_than_x 162 my $demand = Number::Tolerant->new(40 => 'less_than'); 163 my $offer = Number::Tolerant->new(30 => 'more_than'); 164 165 isa_ok($demand, 'Number::Tolerant'); 166 isa_ok($offer, 'Number::Tolerant'); 167 168 my $range = $demand & $offer; 169 170 isa_ok($range, 'Number::Tolerant', 'intersection'); 171 172 is("$range", '30 < x < 40', ' ... stringifies'); 173 174 is($range->{min}, 30, ' ... minimum : 30'); 175 is($range->{max}, 40, ' ... maximum : 40'); 176 is($range->{exclude_min}, 1, ' ... exclude minimum'); 177 is($range->{exclude_max}, 1, ' ... exclude maximum'); 178 179 ok($range == 31, "31 is inside range"); 180 ok($range != 30, "30 is outside range"); 181 182 ok($range == 39, "39 is inside range"); 183 ok($range != 40, "40 is ouside range"); 184} 185 186{ # x_to_y & x_or_less 187 my $demand = Number::Tolerant->new(40 => to => 60); 188 my $offer = Number::Tolerant->new(50 => 'or_less'); 189 190 isa_ok($demand, 'Number::Tolerant'); 191 isa_ok($offer, 'Number::Tolerant'); 192 193 my $range = $demand & $offer; 194 195 isa_ok($range, 'Number::Tolerant', 'intersection'); 196 197 is("$range", '40 <= x <= 50', ' ... stringifies'); 198 199 is($range->{min}, 40, ' ... minimum : 40'); 200 is($range->{max}, 50, ' ... maximum : 50'); 201} 202 203{ # x_or_less & x_to_y 204 my $demand = Number::Tolerant->new(40 => to => 60); 205 my $offer = Number::Tolerant->new(50 => 'or_less'); 206 207 isa_ok($demand, 'Number::Tolerant'); 208 isa_ok($offer, 'Number::Tolerant'); 209 210 my $range = $offer & $demand; 211 212 isa_ok($range, 'Number::Tolerant', 'intersection'); 213 214 is("$range", '40 <= x <= 50', ' ... stringifies'); 215 216 is($range->{min}, 40, ' ... minimum : 40'); 217 is($range->{max}, 50, ' ... maximum : 50'); 218} 219 220{ # x_to_y & infinite 221 my $demand = Number::Tolerant->new(40 => to => 60); 222 my $offer = Number::Tolerant->new('infinite'); 223 224 isa_ok($demand, 'Number::Tolerant'); 225 isa_ok($offer, 'Number::Tolerant'); 226 227 my $range = $demand & $offer; 228 229 isa_ok($range, 'Number::Tolerant', 'intersection'); 230 231 is("$range", '40 <= x <= 60', ' ... stringifies'); 232 233 is($range->{min}, 40, ' ... minimum : 40'); 234 is($range->{max}, 60, ' ... maximum : 50'); 235} 236 237{ # infinite & infinite 238 my $demand = Number::Tolerant->new('infinite'); 239 my $offer = Number::Tolerant->new('infinite'); 240 241 isa_ok($demand, 'Number::Tolerant'); 242 isa_ok($offer, 'Number::Tolerant'); 243 244 my $range = $demand & $offer; 245 246 isa_ok($range, 'Number::Tolerant', 'intersection'); 247 248 is("$range", 'any number', ' ... stringifies'); 249 250 is($range->{min}, undef, ' ... minimum : undef'); 251 is($range->{max}, undef, ' ... maximum : undef'); 252} 253 254{ # min = 0 for first limit 255 my $demand = Number::Tolerant->new(0 => 'or_more'); 256 my $offer = Number::Tolerant->new(10 => 'or_less'); 257 258 isa_ok($demand, 'Number::Tolerant'); 259 isa_ok($offer, 'Number::Tolerant'); 260 261 my $range = $demand & $offer; 262 263 isa_ok($range, 'Number::Tolerant', 'intersection'); 264 265 is("$range", '0 <= x <= 10', ' ... stringifies'); 266 267 is($range->{min}, 0, ' ... minimum : 0'); 268 is($range->{max}, 10, ' ... maximum : 10'); 269} 270 271{ # max = 0 for first limit 272 my $demand = Number::Tolerant->new(0 => 'or_less'); 273 my $offer = Number::Tolerant->new(-5 => 'or_more'); 274 275 isa_ok($demand, 'Number::Tolerant'); 276 isa_ok($offer, 'Number::Tolerant'); 277 278 my $range = $demand & $offer; 279 280 isa_ok($range, 'Number::Tolerant', 'intersection'); 281 282 is("$range", '-5 <= x <= 0', ' ... stringifies'); 283 284 is($range->{min}, -5, ' ... minimum : -5'); 285 is($range->{max}, 0, ' ... maximum : 0'); 286} 287 288done_testing; 289