javelin-io-0.1.1.1: test/Test/Data/Series/IO.hs
{-# LANGUAGE OverloadedStrings #-}
module Test.Data.Series.IO (tests) where
import Data.Csv ( FromNamedRecord(..), (.:), ToNamedRecord(..), (.=), namedRecord )
import Data.Series.Generic ( Series, at)
import qualified Data.Series.Generic as Series
import Data.Series.IO ( readCSVFromFile, writeCSVToFile )
import Data.String ( IsString )
import Data.Vector ( Vector )
import System.FilePath ( (</>) )
import System.IO.Temp ( withSystemTempDirectory )
import Test.Tasty ( testGroup, TestTree )
import Test.Tasty.HUnit ( testCase, assertEqual )
tests :: TestTree
tests = testGroup "Data.Series.IO" [ testReadCSVFromFile
, testWriteCSVToFile
]
data LatLong = MkLatLong {lat :: Double, long :: Double} deriving (Eq, Show)
instance FromNamedRecord LatLong where
parseNamedRecord r = MkLatLong <$> r .: "latitude"
<*> r .: "longitude"
instance ToNamedRecord LatLong where
toNamedRecord (MkLatLong lat long) = namedRecord [ "latitude" .= lat
, "longitude" .= long
]
newtype City = MkCity String
deriving (Eq, Ord, IsString, Show)
instance FromNamedRecord City where
parseNamedRecord r = MkCity <$> r .: "city"
instance ToNamedRecord City where
toNamedRecord (MkCity city) = namedRecord ["city" .= city]
testReadCSVFromFile :: TestTree
testReadCSVFromFile = testCase "Read CSV data" $ do
(latlongs :: Series Vector City LatLong) <- either error id <$> readCSVFromFile "test/data/lat-long-city.csv"
let latitudes = fmap lat latlongs
longitudes = fmap long latlongs
assertEqual mempty 4 (Series.length latitudes)
assertEqual mempty (Just 48.856667) (latitudes `at` "Paris")
assertEqual mempty (Just 40.712778) (latitudes `at` "New York City")
assertEqual mempty (Just 25.0375) (latitudes `at` "Taipei")
assertEqual mempty (Just (-34.603333)) (latitudes `at` "Buenos Aires")
assertEqual mempty 4 (Series.length longitudes)
assertEqual mempty (Just 2.352222) (longitudes `at` "Paris")
assertEqual mempty (Just (-74.006111)) (longitudes `at` "New York City")
assertEqual mempty (Just 121.5625) (longitudes `at` "Taipei")
assertEqual mempty (Just (-58.381667)) (longitudes `at` "Buenos Aires")
testWriteCSVToFile :: TestTree
testWriteCSVToFile = testCase "Write CSV data" $ do
(latlongs :: Series Vector City LatLong) <- either error id <$> readCSVFromFile "test/data/lat-long-city.csv"
(written :: Series Vector City LatLong) <- withSystemTempDirectory "test-javelin-op" $ \dirname -> do
writeCSVToFile (dirname </> "myseries.csv") latlongs
either error id <$> readCSVFromFile (dirname </> "myseries.csv")
assertEqual mempty latlongs written