about summary refs log tree commit diff
diff options
context:
space:
mode:
authorWilliam Carroll <wpcarro@gmail.com>2020-01-18T17·05+0000
committerWilliam Carroll <wpcarro@gmail.com>2020-01-18T17·05+0000
commitbb0de3dec2a610a3789c0fd02dd9e018e239b487 (patch)
treeeb5d3e83f5ccb61e8f6aba061d583ccacd861ff8
parent34dc3e05c8a42c47023776d52ff33f100f2d310f (diff)
Begin tests for Haskell File module
Cameron sent over some property tests for his File.split function, which is a
part of a larger effort to port f.el, a nice library for working with file
paths, over to Haskell.
-rw-r--r--haskell-file/f.hs17
-rw-r--r--haskell-file/tests.hs39
2 files changed, 56 insertions, 0 deletions
diff --git a/haskell-file/f.hs b/haskell-file/f.hs
index 9ddb930ee103..295575f3f48d 100644
--- a/haskell-file/f.hs
+++ b/haskell-file/f.hs
@@ -1,7 +1,14 @@
 module F
   ( join
+  , split
   ) where
 
+--------------------------------------------------------------------------------
+-- Dependencies
+--------------------------------------------------------------------------------
+
+import Data.List (span)
+import System.FilePath (FilePath, pathSeparator)
 import System.FilePath.Posix (FilePath)
 import qualified System.FilePath.Posix as F
 
@@ -25,6 +32,16 @@ simpleAssert x y =
 join :: [FilePath] -> FilePath
 join = F.joinPath
 
+-- | Split path and return  list containing parts.
+split :: FilePath -> [String]
+split = splitJoin . span (/= pathSeparator)
+  where
+    splitJoin :: (String, String) -> [String]
+    splitJoin ([], []) = []
+    splitJoin (a, []) = [a]
+    splitJoin (a, [_]) = [a]
+    splitJoin (a, _:b) = a : split b
+
 --------------------------------------------------------------------------------
 -- Tests
 --------------------------------------------------------------------------------
diff --git a/haskell-file/tests.hs b/haskell-file/tests.hs
new file mode 100644
index 000000000000..e3967b77de1f
--- /dev/null
+++ b/haskell-file/tests.hs
@@ -0,0 +1,39 @@
+module FTest where
+--------------------------------------------------------------------------------
+import Test.Tasty
+import Test.Tasty.Hedgehog
+import Hedgehog
+--------------------------------------------------------------------------------
+import qualified Hedgehog as H
+import qualified Hedgehog.Gen as Gen
+import qualified Hedgehog.Range as Range
+--------------------------------------------------------------------------------
+import Data.List (intercalate)
+import System.FilePath (pathSeparator)
+--------------------------------------------------------------------------------
+import F
+--------------------------------------------------------------------------------
+main :: IO ()
+main
+  = defaultMain
+  . localOption (HedgehogTestLimit $ Just 50)
+  $ testGroup "f functions"
+  [ test_split
+  ]
+--------------------------------------------------------------------------------
+test_split :: TestTree
+test_split
+  = testGroup "split function"
+  [ testProperty "splits parts properly" splitSuccess
+  ]
+splitSuccess :: Property
+splitSuccess = property $ do
+  -- separator
+  --   <- H.forAll
+  --   $ Gen.element ['/', '\\']
+  parts
+    <- H.forAll
+    . Gen.list (Range.linear 0 10)
+    $ Gen.list (Range.linear 1 10) Gen.alphaNum
+  let path = intercalate [pathSeparator] parts
+  F.split path === parts