packages feed

neuron-1.0.0.0: test/Neuron/Zettelkasten/ZettelSpec.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE NoImplicitPrelude #-}

module Neuron.Zettelkasten.ZettelSpec
  ( spec,
  )
where

import Data.TagTree
import Data.Time.Calendar
import Data.Time.DateMayTime
import Data.Time.LocalTime
import Neuron.Reader.Markdown
import Neuron.Reader.Type
import Neuron.Zettelkasten.ID
import Neuron.Zettelkasten.Zettel
import Neuron.Zettelkasten.Zettel.Meta
import Relude
import Test.Hspec

spec :: Spec
spec = do
  let noQueries = mempty -- TODO: test queries
      noError = Right mempty
      noContent = MetadataOnly ()
  describe "sortZettelsReverseChronological" $ do
    let mkDay = fromGregorian 2020 3
        mkZettelDay n =
          Just $ mkDateMayTime $ Left (mkDay n)
        mkZettelLocalTime day hh mm =
          Just $ mkDateMayTime $ Right $ LocalTime (mkDay day) (TimeOfDay hh mm 0)

        (_ :: Maybe Meta, _dummyContent) = either (error . show) id $ parseMarkdown "<spec>" "Dummy"

        mkZettel zid datetime =
          Zettel
            (unsafeMkZettelID zid)
            ZettelFormat_Markdown
            "<spec>.md"
            "Some title"
            False
            [Tag "science", Tag "journal/class"]
            datetime
            False
            noQueries
            noError
            noContent

    it "sorts correctly with day" $ do
      let zs =
            [ mkZettel "a" (mkZettelDay 3),
              mkZettel "b" (mkZettelDay 5)
            ]
      sortZettelsReverseChronological zs
        `shouldBe` reverse zs

    it "sorts correctly with localtime" $ do
      let zs =
            [ mkZettel "a" (mkZettelLocalTime 3 9 59),
              mkZettel "b" (mkZettelLocalTime 3 10 0)
            ]
      sortZettelsReverseChronological zs
        `shouldBe` reverse zs

    it "sorts correctly with mixed dates" $ do
      let zs =
            [ mkZettel "c" (mkZettelLocalTime 7 0 0),
              mkZettel "a" (mkZettelDay 5),
              mkZettel "b" (mkZettelLocalTime 3 0 0)
            ]
      sortZettelsReverseChronological zs
        `shouldBe` zs