use std::i32; use postgres::types::range::{RangeBound, Range, Inclusive, Exclusive, UpperBound, LowerBound, Normalizable, BoundType}; #[test] fn test_range_bound_lower_lt() { fn check(val1: int, inc1: BoundType, val2: int, inc2: BoundType, expected: bool) { let a: RangeBound = RangeBound::new(val1, inc1); let b: RangeBound = RangeBound::new(val2, inc2); assert_eq!(expected, a < b); } check(1, Inclusive, 2, Exclusive, true); check(1, Exclusive, 2, Inclusive, true); check(1, Inclusive, 1, Exclusive, true); check(2, Inclusive, 1, Inclusive, false); check(2, Exclusive, 1, Exclusive, false); check(1, Exclusive, 1, Inclusive, false); check(1, Exclusive, 1, Exclusive, false); check(1, Inclusive, 1, Inclusive, false); } #[test] fn test_range_bound_upper_lt() { fn check(val1: int, inc1: BoundType, val2: int, inc2: BoundType, expected: bool) { let a: RangeBound = RangeBound::new(val1, inc1); let b: RangeBound = RangeBound::new(val2, inc2); assert_eq!(expected, a < b); } check(1, Inclusive, 2, Exclusive, true); check(1, Exclusive, 2, Exclusive, true); check(1, Exclusive, 1, Inclusive, true); check(2, Inclusive, 1, Inclusive, false); check(2, Exclusive, 1, Exclusive, false); check(1, Inclusive, 1, Exclusive, false); check(1, Inclusive, 1, Inclusive, false); check(1, Exclusive, 1, Exclusive, false); } #[test] fn test_range_bound_lower_in_bounds() { fn check(bound: int, inc: BoundType, val: int, expected: bool) { let b: RangeBound = RangeBound::new(bound, inc); assert_eq!(expected, b.in_bounds(&val)); } check(1, Inclusive, 1, true); check(1, Exclusive, 1, false); check(1, Inclusive, 2, true); check(1, Inclusive, 0, false); } #[test] fn test_range_bound_upper_in_bounds() { fn check(bound: int, inc: BoundType, val: int, expected: bool) { let b: RangeBound = RangeBound::new(bound, inc); assert_eq!(expected, b.in_bounds(&val)); } check(1, Inclusive, 1, true); check(1, Exclusive, 1, false); check(1, Inclusive, 2, false); check(1, Inclusive, 0, true); } #[test] fn test_range_contains() { let r = range!('[' 1i32, 3i32 ']'); assert!(!r.contains(&4)); assert!(r.contains(&3)); assert!(r.contains(&2)); assert!(r.contains(&1)); assert!(!r.contains(&0)); let r = range!('(' 1i32, 3i32 ')'); assert!(!r.contains(&4)); assert!(!r.contains(&3)); assert!(r.contains(&2)); assert!(!r.contains(&1)); assert!(!r.contains(&0)); let r = range!('(', 3i32 ']'); assert!(!r.contains(&4)); assert!(r.contains(&2)); assert!(r.contains(&i32::MIN)); let r = range!('[' 1i32, ')'); assert!(r.contains(&i32::MAX)); assert!(r.contains(&4)); assert!(!r.contains(&0)); let r = range!('(', ')'); assert!(r.contains(&i32::MAX)); assert!(r.contains(&0i32)); assert!(r.contains(&i32::MIN)); } #[test] fn test_normalize_lower() { let r: RangeBound = RangeBound::new(10i32, Inclusive); assert_eq!(RangeBound::new(10i32, Inclusive), Normalizable::normalize(r)); let r: RangeBound = RangeBound::new(10i32, Exclusive); assert_eq!(RangeBound::new(11i32, Inclusive), Normalizable::normalize(r)); } #[test] fn test_normalize_upper() { let r: RangeBound = RangeBound::new(10i32, Inclusive); assert_eq!(RangeBound::new(11i32, Exclusive), Normalizable::normalize(r)); let r: RangeBound = RangeBound::new(10i32, Exclusive); assert_eq!(RangeBound::new(10i32, Exclusive), Normalizable::normalize(r)); } #[test] fn test_range_normalizes() { let r1 = range!('(' 10i32, 15i32 ']'); let r2 = range!('[' 11i32, 16i32 ')'); assert_eq!(r1, r2); } #[test] fn test_range_empty() { assert!((range!('(' 9i32, 10i32 ')')).is_empty()); assert!((range!('[' 10i32, 10i32 ')')).is_empty()); assert!((range!('(' 10i32, 10i32 ']')).is_empty()); assert!((range!('[' 10i32, 9i32 ']')).is_empty()); } #[test] fn test_intersection() { let r1 = range!('[' 10i32, 15i32 ')'); let r2 = range!('(' 20i32, 25i32 ']'); assert!(r1.intersect(&r2).is_empty()); assert!(r2.intersect(&r1).is_empty()); assert_eq!(r1, r1.intersect(&range!('(', ')'))); assert_eq!(r1, (range!('(', ')')).intersect(&r1)); let r2 = range!('(' 10i32, ')'); let exp = Range::new(r2.lower().map(|v| v.clone()), r1.upper().map(|v| v.clone())); assert_eq!(exp, r1.intersect(&r2)); assert_eq!(exp, r2.intersect(&r1)); let r2 = range!('(', 15i32 ']'); assert_eq!(r1, r1.intersect(&r2)); assert_eq!(r1, r2.intersect(&r1)); let r2 = range!('[' 11i32, 14i32 ')'); assert_eq!(r2, r1.intersect(&r2)); assert_eq!(r2, r2.intersect(&r1)); } #[test] fn test_union() { let r1 = range!('[' 10i32, 15i32 ')'); let r2 = range!('(' 20i32, 25i32 ']'); assert_eq!(None, r1.union(&r2)); assert_eq!(None, r2.union(&r1)); let r2 = range!('(', ')'); assert_eq!(Some(r2), r1.union(&r2)); assert_eq!(Some(r2), r2.union(&r1)); let r2 = range!('[' 13i32, 50i32 ')'); assert_eq!(Some(range!('[' 10i32, 50i32 ')')), r1.union(&r2)); assert_eq!(Some(range!('[' 10i32, 50i32 ')')), r2.union(&r1)); let r2 = range!('[' 3i32, 50i32 ')'); assert_eq!(Some(range!('[' 3i32, 50i32 ')')), r1.union(&r2)); assert_eq!(Some(range!('[' 3i32, 50i32 ')')), r2.union(&r1)); let r2 = range!('(', 11i32 ')'); assert_eq!(Some(range!('(', 15i32 ')')), r1.union(&r2)); assert_eq!(Some(range!('(', 15i32 ')')), r2.union(&r1)); let r2 = range!('(' 11i32, ')'); assert_eq!(Some(range!('[' 10i32, ')')), r1.union(&r2)); assert_eq!(Some(range!('[' 10i32, ')')), r2.union(&r1)); let r2 = range!('(' 15i32, 20i32 ')'); assert_eq!(None, r1.union(&r2)); assert_eq!(None, r2.union(&r1)); let r2 = range!('[' 15i32, 20i32 ']'); assert_eq!(Some(range!('[' 10i32, 20i32 ']')), r1.union(&r2)); assert_eq!(Some(range!('[' 10i32, 20i32 ']')), r2.union(&r1)); } #[test] fn test_contains_range() { assert!(Range::::empty().contains_range(&Range::empty())); let r1 = range!('[' 10i32, 15i32 ')'); assert!(r1.contains_range(&r1)); let r2 = range!('(' 10i32, ')'); assert!(!r1.contains_range(&r2)); assert!(!r2.contains_range(&r1)); let r2 = range!('(', 15i32 ']'); assert!(!r1.contains_range(&r2)); assert!(r2.contains_range(&r1)); }