packages feed

net-spider-0.4.3.0: test/NetSpider/SeqIDSpec.hs

{-# LANGUAGE OverloadedStrings #-}
module NetSpider.SeqIDSpec (main,spec) where

import Data.Text (Text)
import Test.Hspec

import NetSpider.SeqID
  ( newSeqIDMaker, convertNodeID, convertGraph, originalIDFor
  )
import NetSpider.Snapshot.Internal (SnapshotNode(..), SnapshotLink(..))
import NetSpider.Snapshot (nodeId, linkNodeTuple)
import NetSpider.Timestamp (fromEpochMillisecond)

main :: IO ()
main = hspec spec

spec :: Spec
spec = describe "SeqIDMaker" $ do
  specify "first ID" $ do
    let m = newSeqIDMaker (0 :: Int)
        (got_m, got) = convertNodeID m ("hoge" :: Text)
    got `shouldBe` 0
    (snd $ convertNodeID got_m "hoge") `shouldBe` 0
    originalIDFor got_m 0 `shouldBe` Just "hoge"
    originalIDFor got_m 1 `shouldBe` Nothing
    originalIDFor got_m 2 `shouldBe` Nothing
  specify "second ID" $ do
    let m = newSeqIDMaker (0 :: Int)
        (m1, _) = convertNodeID m ("bar" :: Text)
        (got_m, got) = convertNodeID m1 ("foo" :: Text)
    got `shouldBe` 1
    (snd $ convertNodeID got_m "bar") `shouldBe` 0
    (snd $ convertNodeID got_m "foo") `shouldBe` 1
    originalIDFor got_m 0 `shouldBe` Just "bar"
    originalIDFor got_m 1 `shouldBe` Just "foo"
    originalIDFor got_m 2 `shouldBe` Nothing
  specify "duplicate ID" $ do
    let m = newSeqIDMaker (5 :: Int)
        (m1, id1) = convertNodeID m ("bar" :: Text)
        (got_m,  id2) = convertNodeID m1 ("bar" :: Text)
    id1 `shouldBe` 5
    id2 `shouldBe` 5
    originalIDFor got_m 0 `shouldBe` Nothing
    originalIDFor got_m 5 `shouldBe` Just "bar"
  specify "convertGraph" $ do
    let input = (nodes, links)
        mkNode :: Text -> SnapshotNode Text ()
        mkNode nid = SnapshotNode
                     { _nodeId = nid,
                       _isOnBoundary = False,
                       _nodeTimestamp = Just $ fromEpochMillisecond 100,
                       _nodeAttributes = Just ()
                     }
        mkLink :: Text -> Text -> SnapshotLink Text ()
        mkLink source dest = SnapshotLink
                             { _sourceNode = source,
                               _destinationNode = dest,
                               _isDirected = True,
                               _linkTimestamp = fromEpochMillisecond 100,
                               _linkAttributes = ()
                             }
        nodes = [ mkNode "n1",
                  mkNode "n2",
                  mkNode "n3",
                  mkNode "n4",
                  mkNode "n5"
                ]
        links = [ mkLink "n1" "n3",
                  mkLink "n4" "n2",
                  mkLink "n3" "n5",
                  mkLink "n5" "n2"
                ]
        (got_m, (got_nodes, got_links)) = convertGraph (newSeqIDMaker (1 :: Int)) input
    map nodeId got_nodes `shouldBe` [1,2,3,4,5]
    map linkNodeTuple got_links `shouldBe`
      [ (1, 3), (4, 2), (3, 5), (5, 2)
      ]
    map (originalIDFor got_m) [1 .. 6] `shouldBe`
      [ Just "n1", Just "n2", Just "n3", Just "n4", Just "n5", Nothing
      ]