packages feed

tilia-0.1.3.0: tests/Tilia/SpanSpec.hs

-- | The span algebra.
module Tilia.SpanSpec (spec) where

import Test.Hspec
import Test.QuickCheck
import Tilia.Gen (AnySpan (..))
import Tilia.Span

spec :: Spec
spec = do
  it "recognises a single-line span" $
    isSingleLine (mkSpan (3, 1) (3, 40)) `shouldBe` True
  it "recognises a multi-line span" $
    isSingleLine (mkSpan (3, 1) (4, 1)) `shouldBe` False
  it "unions to cover both operands" $
    mkSpan (1, 5) (1, 9) <> mkSpan (3, 2) (4, 1)
      `shouldBe` mkSpan (1, 5) (4, 1)
  it "takes the earlier start column when starts share a line" $
    mkSpan (1, 9) (1, 20) <> mkSpan (1, 3) (1, 5)
      `shouldBe` mkSpan (1, 3) (1, 20)

  it "unions associatively" $
    property $ \(AnySpan a) (AnySpan b) (AnySpan c) ->
      (a <> b) <> c === a <> (b <> c)

  it "unions to something covering both operands" $
    property $ \(AnySpan a) (AnySpan b) ->
      let u = a <> b
       in counterexample (show u) (covers u a && covers u b)

  it "is idempotent under union" $
    property $
      \(AnySpan a) -> a <> a === a