packages feed

cppfilt-0.1.0.0: test/Spec.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeApplications #-}

import Test.Hspec

import qualified Data.ByteString.Char8 as BS
import Data.String
import Control.Monad

import qualified System.Demangle as D
import qualified System.Demangle.Pure as DP

import Data.CStringRepresentable

ioDemangledIs :: (Eq a, Show a, CStringRepresentable a) => a -> Maybe a -> IO ()
ioDemangledIs mangled ref = do
  res <- D.demangle mangled
  res `shouldBe` ref

pureDemangledIs :: (Eq a, Show a, CStringRepresentable a) => a -> Maybe a -> IO ()
pureDemangledIs mangled ref = DP.demangle mangled `shouldBe` ref

testData :: IsString a => [(String, [(a, Maybe a)])]
testData = [
    ("demangles simple class names", [
        ("_ZTS5IInfo", Just "typeinfo name for IInfo")
      ]),
    ("demangles some operators", [
        ("_ZrsR11QDataStreamR5QUuid", Just "operator>>(QDataStream&, QUuid&)")
      ]),
    ("demangle fails", [
        ("_test", Nothing)
      ])
  ]

runTests :: IsString a => (a -> Maybe a -> IO ()) -> SpecWith ()
runTests func =
  forM_ testData $ \(str, pairs) ->
    it str $ forM_ pairs $ uncurry func

main :: IO ()
main = hspec $ do
  describe "Strings" $ do
    describe "IO demangle" $ runTests @String ioDemangledIs
    describe "Pure demangle" $ runTests @String pureDemangledIs
  describe "ByteStrings" $ do
    describe "IO demangle" $ runTests @BS.ByteString ioDemangledIs
    describe "Pure demangle" $ runTests @BS.ByteString pureDemangledIs