packages feed

edit-distance-linear-0.2.0.1: test/Spec.hs

{-# LANGUAGE ViewPatterns #-}

import qualified Data.ByteString.Char8 as BS
import qualified Text.EditDistance as TED
import Test.Hspec
import Test.QuickCheck

import Text.EditDistance.Linear

baseLevDist :: String -> String -> Int
baseLevDist = TED.levenshteinDistance TED.defaultEditCosts

main :: IO ()
main = hspec $ do
  describe "Obvious cases" $ do
    it "Edit distance to self is always 0" $
      property $ \(BS.pack -> s) -> levenshteinDistance s s `shouldBe` 0
    it "Edit distance to completely different string is strictly positive" $ do
      property $ \(BS.pack . getNonEmpty -> s) -> levenshteinDistance s (BS.map succ s) > 0
    it "Edit distance to completely different string is not greater than string's length" $ do
      property $ \(BS.pack -> s) -> levenshteinDistance s (BS.map succ s) <= BS.length s
  describe "Comparing to edit-distance" $
    it "Edit distances always match" $
      property $ \(getASCIIString -> s1) (getASCIIString -> s2) -> levenshteinDistance (BS.pack s1) (BS.pack s2) `shouldBe` baseLevDist s1 s2