expect_json/expect/ops/expect_integer/
expect_integer.rs1use crate::expect::ops::expect_integer::ExpectIntegerSubOp;
2use crate::expect_core::expect_op;
3use crate::expect_core::Context;
4use crate::expect_core::ExpectOp;
5use crate::expect_core::ExpectOpResult;
6use crate::JsonType;
7use core::ops::RangeBounds;
8
9#[expect_op(internal, name = "integer")]
10#[derive(Debug, Clone, Default, PartialEq)]
11pub struct ExpectInteger {
12 sub_ops: Vec<ExpectIntegerSubOp>,
13}
14
15impl ExpectInteger {
16 pub(crate) fn new() -> Self {
17 Self { sub_ops: vec![] }
18 }
19
20 pub fn in_range<R>(mut self, range: R) -> Self
48 where
49 R: RangeBounds<i64>,
50 {
51 let min = range.start_bound().cloned();
52 let max = range.end_bound().cloned();
53
54 self.sub_ops.push(ExpectIntegerSubOp::InRange {
55 min: min.into(),
56 max: max.into(),
57 });
58
59 self
60 }
61
62 pub fn outside_range<R>(mut self, range: R) -> Self
63 where
64 R: RangeBounds<i64>,
65 {
66 let min = range.start_bound().cloned();
67 let max = range.end_bound().cloned();
68
69 self.sub_ops.push(ExpectIntegerSubOp::OutsideRange {
70 min: min.into(),
71 max: max.into(),
72 });
73
74 self
75 }
76
77 pub fn zero(mut self) -> Self {
78 self.sub_ops.push(ExpectIntegerSubOp::Zero);
79 self
80 }
81
82 pub fn not_zero(mut self) -> Self {
83 self.sub_ops.push(ExpectIntegerSubOp::NotZero);
84 self
85 }
86
87 pub fn positive(mut self) -> Self {
88 self.sub_ops.push(ExpectIntegerSubOp::Positive);
89 self
90 }
91
92 pub fn negative(mut self) -> Self {
93 self.sub_ops.push(ExpectIntegerSubOp::Negative);
94 self
95 }
96}
97
98impl ExpectOp for ExpectInteger {
99 fn on_i64(&self, context: &mut Context, received: i64) -> ExpectOpResult<()> {
100 for sub_op in &self.sub_ops {
101 sub_op.on_i64(self, context, received)?;
102 }
103
104 Ok(())
105 }
106
107 fn on_u64(&self, context: &mut Context, received: u64) -> ExpectOpResult<()> {
108 for sub_op in &self.sub_ops {
109 sub_op.on_u64(self, context, received)?;
110 }
111
112 Ok(())
113 }
114
115 fn debug_supported_types(&self) -> &'static [JsonType] {
116 &[JsonType::Integer]
117 }
118}
119
120#[cfg(test)]
121mod test_in_range {
122 use crate::expect;
123 use crate::expect_json_eq;
124 use pretty_assertions::assert_eq;
125 use serde_json::json;
126
127 #[test]
128 fn it_should_be_true_for_all_values_in_total_range() {
129 let left = json!(1);
130 let right = json!(expect::integer().in_range(..));
131 let output = expect_json_eq(&left, &right);
132 assert!(output.is_ok());
133
134 let left = json!(i64::MIN);
135 let right = json!(expect::integer().in_range(..));
136 let output = expect_json_eq(&left, &right);
137 assert!(output.is_ok());
138
139 let left = json!(u64::MAX);
140 let right = json!(expect::integer().in_range(..));
141 let output = expect_json_eq(&left, &right);
142 assert!(output.is_ok());
143 }
144
145 #[test]
146 fn it_should_be_true_for_all_values_in_partial_range() {
147 let left = json!(0);
148 let right = json!(expect::integer().in_range(-10..10));
149 let output = expect_json_eq(&left, &right);
150 assert!(output.is_ok());
151
152 let left = json!(-10);
153 let right = json!(expect::integer().in_range(-10..10));
154 let output = expect_json_eq(&left, &right);
155 assert!(output.is_ok());
156
157 let left = json!(5);
158 let right = json!(expect::integer().in_range(-10..10));
159 let output = expect_json_eq(&left, &right);
160 assert!(output.is_ok());
161 }
162
163 #[test]
164 fn it_should_be_false_for_all_values_out_of_range() {
165 let left = json!(1);
166 let right = json!(expect::integer().in_range(0..1));
167
168 let output = expect_json_eq(&left, &right).unwrap_err().to_string();
169 assert_eq!(
170 output,
171 r#"Json expect::integer() error at root:
172 integer is not in range
173 expected 0..1
174 received 1"#
175 );
176
177 let left = json!(-11);
178 let right = json!(expect::integer().in_range(0..1));
179
180 let output = expect_json_eq(&left, &right).unwrap_err().to_string();
181 assert_eq!(
182 output,
183 r#"Json expect::integer() error at root:
184 integer is not in range
185 expected 0..1
186 received -11"#
187 );
188 }
189
190 #[test]
191 fn it_should_be_true_for_value_in_inclusive_range() {
192 let left = json!(1);
193 let right = json!(expect::integer().in_range(0..=1));
194
195 let output = expect_json_eq(&left, &right);
196 assert!(output.is_ok());
197 }
198
199 #[test]
200 fn it_should_be_true_for_positive_value_with_negative_min() {
201 let left = json!(5);
202 let right = json!(expect::integer().in_range(-10..10));
203
204 let output = expect_json_eq(&left, &right);
205 assert!(output.is_ok());
206 }
207
208 #[test]
209 fn it_should_be_false_for_positive_value_outside_range_with_negative_min() {
210 let left = json!(11);
211 let right = json!(expect::integer().in_range(-10..10));
212
213 let output = expect_json_eq(&left, &right).unwrap_err().to_string();
214 assert_eq!(
215 output,
216 r#"Json expect::integer() error at root:
217 integer is not in range
218 expected -10..10
219 received 11"#
220 );
221 }
222
223 #[test]
224 fn it_should_be_false_for_positive_value_outside_range_with_negative_range() {
225 let left = json!(11);
226 let right = json!(expect::integer().in_range(-10..-1));
227
228 let output = expect_json_eq(&left, &right).unwrap_err().to_string();
229 assert_eq!(
230 output,
231 r#"Json expect::integer() error at root:
232 integer is not in range
233 expected -10..-1
234 received 11"#
235 );
236 }
237}
238
239#[cfg(test)]
240mod test_outside_range {
241 use crate::expect;
242 use crate::expect_json_eq;
243 use pretty_assertions::assert_eq;
244 use serde_json::json;
245
246 #[test]
247 fn it_should_be_false_for_all_values_in_total_range() {
248 let left = json!(1);
249 let right = json!(expect::integer().outside_range(..));
250 let output = expect_json_eq(&left, &right).unwrap_err().to_string();
251 assert_eq!(
252 output,
253 r#"Json expect::integer() error at root:
254 integer is in range
255 expected ..
256 received 1"#
257 );
258
259 let left = json!(i64::MIN);
260 let right = json!(expect::integer().outside_range(..));
261 let output = expect_json_eq(&left, &right).unwrap_err().to_string();
262 assert_eq!(
263 output,
264 r#"Json expect::integer() error at root:
265 integer is in range
266 expected ..
267 received -9223372036854775808"#
268 );
269
270 let left = json!(u64::MAX);
271 let right = json!(expect::integer().outside_range(..));
272 let output = expect_json_eq(&left, &right).unwrap_err().to_string();
273 assert_eq!(
274 output,
275 r#"Json expect::integer() error at root:
276 integer is in range
277 expected ..
278 received 18446744073709551615"#
279 );
280 }
281
282 #[test]
283 fn it_should_be_false_for_all_values_overlapping_partial_ranges() {
284 let left = json!(0);
285 let right = json!(expect::integer().outside_range(-10..10));
286 let output = expect_json_eq(&left, &right).unwrap_err().to_string();
287 assert_eq!(
288 output,
289 r#"Json expect::integer() error at root:
290 integer is in range
291 expected -10..10
292 received 0"#
293 );
294
295 let left = json!(-10);
296 let right = json!(expect::integer().outside_range(-10..10));
297 let output = expect_json_eq(&left, &right).unwrap_err().to_string();
298 assert_eq!(
299 output,
300 r#"Json expect::integer() error at root:
301 integer is in range
302 expected -10..10
303 received -10"#
304 );
305
306 let left = json!(5);
307 let right = json!(expect::integer().outside_range(-10..10));
308 let output = expect_json_eq(&left, &right).unwrap_err().to_string();
309 assert_eq!(
310 output,
311 r#"Json expect::integer() error at root:
312 integer is in range
313 expected -10..10
314 received 5"#
315 );
316 }
317
318 #[test]
319 fn it_should_be_true_for_all_values_out_of_range() {
320 let left = json!(1);
321 let right = json!(expect::integer().outside_range(0..1));
322
323 let output = expect_json_eq(&left, &right);
324 assert!(output.is_ok());
325
326 let left = json!(-11);
327 let right = json!(expect::integer().outside_range(0..1));
328
329 let output = expect_json_eq(&left, &right);
330 assert!(output.is_ok());
331 }
332
333 #[test]
334 fn it_should_be_false_for_value_in_inclusive_range() {
335 let left = json!(1);
336 let right = json!(expect::integer().outside_range(0..=1));
337
338 let output = expect_json_eq(&left, &right).unwrap_err().to_string();
339 assert_eq!(
340 output,
341 r#"Json expect::integer() error at root:
342 integer is in range
343 expected 0..=1
344 received 1"#
345 );
346 }
347
348 #[test]
349 fn it_should_be_false_for_positive_value_with_negative_min() {
350 let left = json!(5);
351 let right = json!(expect::integer().outside_range(-10..10));
352
353 let output = expect_json_eq(&left, &right).unwrap_err().to_string();
354 assert_eq!(
355 output,
356 r#"Json expect::integer() error at root:
357 integer is in range
358 expected -10..10
359 received 5"#
360 );
361 }
362
363 #[test]
364 fn it_should_be_true_for_positive_value_outside_range_with_negative_min() {
365 let left = json!(11);
366 let right = json!(expect::integer().outside_range(-10..10));
367
368 let output = expect_json_eq(&left, &right);
369 assert!(output.is_ok());
370 }
371
372 #[test]
373 fn it_should_be_true_for_positive_value_outside_range_with_negative_range() {
374 let left = json!(11);
375 let right = json!(expect::integer().outside_range(-10..-1));
376
377 let output = expect_json_eq(&left, &right);
378 assert!(output.is_ok());
379 }
380}
381
382#[cfg(test)]
383mod test_zero {
384 use crate::expect;
385 use crate::expect_json_eq;
386 use pretty_assertions::assert_eq;
387 use serde_json::json;
388
389 #[test]
390 fn it_should_be_true_for_zero() {
391 let left = json!(0);
392 let right = json!(expect::integer().zero());
393
394 let output = expect_json_eq(&left, &right);
395 assert!(output.is_ok());
396 }
397
398 #[test]
399 fn it_should_be_false_for_negative_value() {
400 let left = json!(-1);
401 let right = json!(expect::integer().zero());
402
403 let output = expect_json_eq(&left, &right).unwrap_err().to_string();
404 assert_eq!(
405 output,
406 r#"Json expect::integer() error at root, is not zero:
407 expected 0
408 received -1"#
409 );
410 }
411
412 #[test]
413 fn it_should_be_false_for_negative_max() {
414 let left = json!(i64::MIN);
415 let right = json!(expect::integer().zero());
416
417 let output = expect_json_eq(&left, &right).unwrap_err().to_string();
418 assert_eq!(
419 output,
420 r#"Json expect::integer() error at root, is not zero:
421 expected 0
422 received -9223372036854775808"#
423 );
424 }
425
426 #[test]
427 fn it_should_be_false_for_positive_value() {
428 let left = json!(1);
429 let right = json!(expect::integer().zero());
430
431 let output = expect_json_eq(&left, &right).unwrap_err().to_string();
432 assert_eq!(
433 output,
434 r#"Json expect::integer() error at root, is not zero:
435 expected 0
436 received 1"#
437 );
438 }
439
440 #[test]
441 fn it_should_be_false_for_i64_max() {
442 let left = json!(i64::MAX);
443 let right = json!(expect::integer().zero());
444
445 let output = expect_json_eq(&left, &right).unwrap_err().to_string();
446 assert_eq!(
447 output,
448 r#"Json expect::integer() error at root, is not zero:
449 expected 0
450 received 9223372036854775807"#
451 );
452 }
453
454 #[test]
455 fn it_should_be_false_for_u64_max() {
456 let left = json!(u64::MAX);
457 let right = json!(expect::integer().zero());
458
459 let output = expect_json_eq(&left, &right).unwrap_err().to_string();
460 assert_eq!(
461 output,
462 r#"Json expect::integer() error at root, is not zero:
463 expected 0
464 received 18446744073709551615"#
465 );
466 }
467}
468
469#[cfg(test)]
470mod test_not_zero {
471 use crate::expect;
472 use crate::expect_json_eq;
473 use pretty_assertions::assert_eq;
474 use serde_json::json;
475
476 #[test]
477 fn it_should_be_false_for_zero() {
478 let left = json!(0);
479 let right = json!(expect::integer().not_zero());
480
481 let output = expect_json_eq(&left, &right).unwrap_err().to_string();
482 assert_eq!(
483 output,
484 r#"Json expect::integer() error at root, is zero:
485 expected non-zero integer
486 received 0"#
487 );
488 }
489
490 #[test]
491 fn it_should_be_true_for_negative_value() {
492 let left = json!(-1);
493 let right = json!(expect::integer().not_zero());
494
495 let output = expect_json_eq(&left, &right);
496 assert!(output.is_ok());
497 }
498
499 #[test]
500 fn it_should_be_true_for_negative_max() {
501 let left = json!(i64::MIN);
502 let right = json!(expect::integer().not_zero());
503
504 let output = expect_json_eq(&left, &right);
505 assert!(output.is_ok());
506 }
507
508 #[test]
509 fn it_should_be_true_for_positive_value() {
510 let left = json!(1);
511 let right = json!(expect::integer().not_zero());
512
513 let output = expect_json_eq(&left, &right);
514 assert!(output.is_ok());
515 }
516
517 #[test]
518 fn it_should_be_true_for_i64_max() {
519 let left = json!(i64::MAX);
520 let right = json!(expect::integer().not_zero());
521
522 let output = expect_json_eq(&left, &right);
523 assert!(output.is_ok());
524 }
525
526 #[test]
527 fn it_should_be_true_for_u64_max() {
528 let left = json!(u64::MAX);
529 let right = json!(expect::integer().not_zero());
530
531 let output = expect_json_eq(&left, &right);
532 assert!(output.is_ok());
533 }
534}
535
536#[cfg(test)]
537mod test_positive {
538 use crate::expect;
539 use crate::expect_json_eq;
540 use pretty_assertions::assert_eq;
541 use serde_json::json;
542
543 #[test]
544 fn it_should_be_true_for_zero() {
545 let left = json!(0);
546 let right = json!(expect::integer().positive());
547
548 let output = expect_json_eq(&left, &right);
549 assert!(output.is_ok());
550 }
551
552 #[test]
553 fn it_should_be_false_for_negative_i64() {
554 let left = json!(-1);
555 let right = json!(expect::integer().positive());
556
557 let output = expect_json_eq(&left, &right).unwrap_err().to_string();
558 assert_eq!(
559 output,
560 r#"Json expect::integer() error at root:
561 integer is not positive
562 received -1"#
563 );
564 }
565
566 #[test]
567 fn it_should_be_true_for_positive_i64() {
568 let left = json!(123_i64);
569 let right = json!(expect::integer().positive());
570
571 let output = expect_json_eq(&left, &right);
572 assert!(output.is_ok());
573 }
574
575 #[test]
576 fn it_should_be_true_for_positive_u64() {
577 let left = json!(123_u64);
578 let right = json!(expect::integer().positive());
579
580 let output = expect_json_eq(&left, &right);
581 assert!(output.is_ok());
582 }
583}
584
585#[cfg(test)]
586mod test_negative {
587 use crate::expect;
588 use crate::expect_json_eq;
589 use pretty_assertions::assert_eq;
590 use serde_json::json;
591
592 #[test]
593 fn it_should_be_false_for_zero() {
594 let left = json!(0);
595 let right = json!(expect::integer().negative());
596
597 let output = expect_json_eq(&left, &right).unwrap_err().to_string();
598 assert_eq!(
599 output,
600 r#"Json expect::integer() error at root:
601 integer is not negative
602 received 0"#
603 );
604 }
605
606 #[test]
607 fn it_should_be_true_for_negative_i64() {
608 let left = json!(-1);
609 let right = json!(expect::integer().negative());
610
611 let output = expect_json_eq(&left, &right);
612 assert!(output.is_ok());
613 }
614
615 #[test]
616 fn it_should_be_false_for_positive_i64() {
617 let left = json!(123_i64);
618 let right = json!(expect::integer().negative());
619
620 let output = expect_json_eq(&left, &right).unwrap_err().to_string();
621 assert_eq!(
622 output,
623 r#"Json expect::integer() error at root:
624 integer is not negative
625 received 123"#
626 );
627 }
628
629 #[test]
630 fn it_should_be_false_for_positive_u64() {
631 let left = json!(123_u64);
632 let right = json!(expect::integer().negative());
633
634 let output = expect_json_eq(&left, &right).unwrap_err().to_string();
635 assert_eq!(
636 output,
637 r#"Json expect::integer() error at root:
638 integer is not negative
639 received 123"#
640 );
641 }
642}