packages feed

timeseries-0.1.0: test-src/Data/TimeSeries/SeriesSpec.hs

module Data.TimeSeries.SeriesSpec (spec) where

import Test.Hspec
import Data.Time.Clock.POSIX (posixSecondsToUTCTime)

import qualified Data.TimeSeries as TS


spec :: Spec
spec = do

  describe "Basic operations" $ do

    it "return series size" $ do
        let idx = [1, 2, 3]
        let values = [1.0, 2.0, 3.0]
        TS.size (TS.tsSeries idx values) `shouldBe` 3

    it "return data point value at given index" $ do
        let idx = [10, 20, 30]
        let values = [10.0, 12.0, 32.4]
        let pos = posixSecondsToUTCTime $ fromIntegral 20
        TS.valueAt (TS.tsSeries idx values) pos `shouldBe` Just 12.0

    it "return Nothing value if wrong index" $ do
        let idx = [10, 20, 30]
        let values = [10.0, 12.0, 32.4]
        let pos = posixSecondsToUTCTime $ fromIntegral 1234
        TS.valueAt (TS.tsSeries idx values) pos `shouldBe` Nothing

    it "return subset" $ do
        let xs = TS.tsSeries [1..5] [10.0, 1.2, 32.4, 0.65, 11.0]
        let start = posixSecondsToUTCTime $ fromIntegral 2
        let end = posixSecondsToUTCTime $ fromIntegral 3
        TS.size (TS.slice xs start end) `shouldBe` 2

    it "return empty subset" $ do
        let xs = TS.tsSeries [1..5] [10.0, 1.2, 32.4, 0.65, 11.0]
        let start = posixSecondsToUTCTime $ fromIntegral 12
        let end = posixSecondsToUTCTime $ fromIntegral 34
        TS.slice xs start end `shouldBe` TS.emptySeries

    it "maximum value" $ do
        let xs = TS.tsSeries [1..5] [10.0, 1.2, 32.4, 0.65, 11.0]
        TS.max xs `shouldBe` 32.4

    it "minimum value" $ do
        let xs = TS.tsSeries [1..5] [10.0, 1.2, 32.4, 0.65, 11.0]
        TS.min xs `shouldBe` 0.65