import Data.Attoparsec.IP (ipv4, ipv6) import qualified Net.IPv4 as IPv4 import qualified Net.IPv6 as IPv6 import Data.Text (Text) import Data.Attoparsec.Text (Parser, parseOnly) import Test.Tasty (testGroup, defaultMain) import Test.QuickCheck (Arbitrary (..)) import qualified Test.Tasty.QuickCheck as Q import Test.QuickCheck.Property (Result, succeeded, failed) instance Arbitrary IPv4.IPv4 where arbitrary = IPv4.ipv4 <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary instance Arbitrary IPv6.IPv6 where arbitrary = IPv6.ipv6 <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary main :: IO () main = defaultMain $ testGroup "IP tests" [ Q.testProperty "IPv4" (parsePrintIso IPv4.encode ipv4) , Q.testProperty "IPv6" (parsePrintIso IPv6.encode ipv6) ] parsePrintIso :: Eq a => (a -> Text) -> Parser a -> a -> Result parsePrintIso print' parser x = case parseOnly parser (print' x) of Left _ -> failed Right y | y == x -> succeeded | otherwise -> failed