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