( Cidr(..),
cidr_from_string,
cidr_tests,
- combine_all
+ combine_all,
+ contains,
+ contains_proper,
+ prop_all_cidrs_contain_themselves,
+ prop_contains_proper_intransitive
) where
import Data.List (nubBy)
import Test.HUnit
+import Test.QuickCheck
import IPv4Address
import ListUtils
show cidr = (show (ipv4address cidr)) ++ "/" ++ (show (maskbits cidr))
+instance Arbitrary Cidr where
+ arbitrary = do
+ ipv4 <- arbitrary :: Gen IPv4Address
+ mask <- arbitrary :: Gen Maskbits
+ return (Cidr ipv4 mask)
+
+ coarbitrary _ = variant 0
+
+
-- Two CIDR ranges are equivalent if they have the same network bits
-- and the masks are the same.
equivalent :: Cidr -> Cidr -> Bool
contains_proper :: Cidr -> Cidr -> Bool
contains_proper cidr1 cidr2 =
- (cidr1 `contains` cidr2) && (not (cidr1 == cidr2))
+ (cidr1 `contains` cidr2) && (not (cidr2 `contains` cidr1))
-- A CIDR range is redundant (with respect to the given list) if
test_combine_contained1,
test_combine_contained2
]
+
+
+-- QuickCheck Tests
+prop_all_cidrs_contain_themselves :: Cidr -> Bool
+prop_all_cidrs_contain_themselves cidr1 = cidr1 `contains` cidr1
+
+
+-- If cidr1 properly contains cidr2, then by definition cidr2
+-- does not properly contain cidr1.
+prop_contains_proper_intransitive :: Cidr -> Cidr -> Property
+prop_contains_proper_intransitive cidr1 cidr2 =
+ (cidr1 `contains_proper` cidr2) ==>
+ (not (cidr2 `contains_proper` cidr1))