packages feed

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