]> gitweb.michael.orlitzky.com - hath.git/blobdiff - src/Maskbits.hs
Switch from test-framework to tasty.
[hath.git] / src / Maskbits.hs
index cbd4dbe86fd0d76efa15ea349dfd353d06e62985..27fa29fa2934e146f1d6ba848453bfacd0c7bfc7 100644 (file)
-module Maskbits
-( Maskbits(..),
-  maskbits_from_string
-) where
+module Maskbits(
+  Maskbits(..) )
+where
 
--- A type representing the number of bits in a CIDR netmask.
-data Maskbits = None
-              | Zero
-              | One
-              | Two
-              | Three
-              | Four
-              | Five
-              | Six
-              | Seven
-              | Eight
-              | Nine
-              | Ten
-              | Eleven
-              | Twelve
-              | Thirteen
-              | Fourteen
-              | Fifteen
-              | Sixteen
-              | Seventeen
-              | Eighteen
-              | Nineteen
-              | Twenty
-              | TwentyOne
-              | TwentyTwo
-              | TwentyThree
-              | TwentyFour
-              | TwentyFive
-              | TwentySix
-              | TwentySeven
-              | TwentyEight
-              | TwentyNine
-              | Thirty
-              | ThirtyOne
-              | ThirtyTwo
-              deriving (Eq, Ord, Show)
+import Test.Tasty.QuickCheck ( Arbitrary(..), elements )
 
 
--- There are only 32 bits in an IPv4 address, so there
--- can't be more bits than that in the mask.
-maskbits_from_int :: Int -> Maskbits
-maskbits_from_int 0  = Zero
-maskbits_from_int 1  = One
-maskbits_from_int 2  = Two
-maskbits_from_int 3  = Three
-maskbits_from_int 4  = Four
-maskbits_from_int 5  = Five
-maskbits_from_int 6  = Six
-maskbits_from_int 7  = Seven
-maskbits_from_int 8  = Eight
-maskbits_from_int 9  = Nine
-maskbits_from_int 10 = Ten
-maskbits_from_int 11 = Eleven
-maskbits_from_int 12 = Twelve
-maskbits_from_int 13 = Thirteen
-maskbits_from_int 14 = Fourteen
-maskbits_from_int 15 = Fifteen
-maskbits_from_int 16 = Sixteen
-maskbits_from_int 17 = Seventeen
-maskbits_from_int 18 = Eighteen
-maskbits_from_int 19 = Nineteen
-maskbits_from_int 20 = Twenty
-maskbits_from_int 21 = TwentyOne
-maskbits_from_int 22 = TwentyTwo
-maskbits_from_int 23 = TwentyThree
-maskbits_from_int 24 = TwentyFour
-maskbits_from_int 25 = TwentyFive
-maskbits_from_int 26 = TwentySix
-maskbits_from_int 27 = TwentySeven
-maskbits_from_int 28 = TwentyEight
-maskbits_from_int 29 = TwentyNine
-maskbits_from_int 30 = Thirty
-maskbits_from_int 31 = ThirtyOne
-maskbits_from_int 32 = ThirtyTwo
-maskbits_from_int _ = None
+-- | A type representing the number of bits in a CIDR netmask.
+data Maskbits =
+    Zero
+  | One
+  | Two
+  | Three
+  | Four
+  | Five
+  | Six
+  | Seven
+  | Eight
+  | Nine
+  | Ten
+  | Eleven
+  | Twelve
+  | Thirteen
+  | Fourteen
+  | Fifteen
+  | Sixteen
+  | Seventeen
+  | Eighteen
+  | Nineteen
+  | Twenty
+  | TwentyOne
+  | TwentyTwo
+  | TwentyThree
+  | TwentyFour
+  | TwentyFive
+  | TwentySix
+  | TwentySeven
+  | TwentyEight
+  | TwentyNine
+  | Thirty
+  | ThirtyOne
+  | ThirtyTwo
+    deriving (Enum, Eq, Ord)
 
 
-maskbits_from_string :: String -> Maskbits
-maskbits_from_string s =
+instance Show Maskbits where
+  show Zero        = "0"
+  show One         = "1"
+  show Two         = "2"
+  show Three       = "3"
+  show Four        = "4"
+  show Five        = "5"
+  show Six         = "6"
+  show Seven       = "7"
+  show Eight       = "8"
+  show Nine        = "9"
+  show Ten         = "10"
+  show Eleven      = "11"
+  show Twelve      = "12"
+  show Thirteen    = "13"
+  show Fourteen    = "14"
+  show Fifteen     = "15"
+  show Sixteen     = "16"
+  show Seventeen   = "17"
+  show Eighteen    = "18"
+  show Nineteen    = "19"
+  show Twenty      = "20"
+  show TwentyOne   = "21"
+  show TwentyTwo   = "22"
+  show TwentyThree = "23"
+  show TwentyFour  = "24"
+  show TwentyFive  = "25"
+  show TwentySix   = "26"
+  show TwentySeven = "27"
+  show TwentyEight = "28"
+  show TwentyNine  = "29"
+  show Thirty      = "30"
+  show ThirtyOne   = "31"
+  show ThirtyTwo   = "32"
+
+
+instance Arbitrary Maskbits where
+  arbitrary =
+    elements [ Zero,
+               One,
+               Two,
+               Three,
+               Four,
+               Five,
+               Six,
+               Seven,
+               Eight,
+               Nine,
+               Ten,
+               Eleven,
+               Twelve,
+               Thirteen,
+               Fourteen,
+               Fifteen,
+               Sixteen,
+               Seventeen,
+               Eighteen,
+               Nineteen,
+               Twenty,
+               TwentyOne,
+               TwentyTwo,
+               TwentyThree,
+               TwentyFour,
+               TwentyFive,
+               TwentySix,
+               TwentySeven,
+               TwentyEight,
+               TwentyNine,
+               Thirty,
+               ThirtyOne,
+               ThirtyTwo ]
+
+
+instance Read Maskbits where
+  readsPrec _ s =
     case (reads s :: [(Int, String)]) of
-      []   -> None
-      x:_ -> maskbits_from_int (fst x)
+      []              -> []
+      (x,leftover):_  -> go x leftover
+    where
+      go :: Int -> String -> [(Maskbits, String)]
+      go x' leftover'
+        | x' < minBound || x' > maxBound = []
+        | otherwise = [(toEnum x', leftover')]