packages feed

error-message-1.1: tests/runtests.hs

-- @+leo-ver=4-thin
-- @+node:gcross.20091202203048.6990:@thin runtests.hs
-- @@language Haskell

-- @<< Import needed modules >>
-- @+node:gcross.20091202203048.6992:<< Import needed modules >>
import Control.Applicative
import Control.Monad

import Data.Either.Unwrap
import Data.ErrorMessage
import Data.Monoid

import Test.Framework
import Test.Framework.Providers.HUnit
import Test.HUnit

import Text.PrettyPrint.ANSI.Leijen
-- @-node:gcross.20091202203048.6992:<< Import needed modules >>
-- @nl

-- @+others
-- @+node:gcross.20091202203048.7047:Values
-- @+node:gcross.20091202203048.7049:dictionary_mapping_words_to_lengths
dictionary_mapping_words_to_lengths :: [(String,Int)]
dictionary_mapping_words_to_lengths =
    [("foo",3)
    ,("bar",3)
    ]
-- @-node:gcross.20091202203048.7049:dictionary_mapping_words_to_lengths
-- @-node:gcross.20091202203048.7047:Values
-- @+node:gcross.20091202203048.6995:Functions
-- @+node:gcross.20091202203048.7002:sqrtWithError
sqrtWithError :: Float -> Either ErrorMessage Float
sqrtWithError x
    | x < 0
        = leftErrorMessageText
            ("Error computing the square root of " ++ (show x) ++ ":")
            "Square roots cannot be taken of negative numbers."
    | otherwise
        = Right (sqrt x)
-- @nonl
-- @-node:gcross.20091202203048.7002:sqrtWithError
-- @+node:gcross.20091202203048.7013:sumWithError
-- @+node:gcross.20091202203048.7001:sumWithError
sumWithError :: Either ErrorMessage Float -> Either ErrorMessage Float -> Either ErrorMessage Float
sumWithError (Left error1) (Left error2) = Left (error1 `mappend` error2)
sumWithError (Left error) _ = Left error
sumWithError _ (Left error) = Left error
sumWithError (Right value1) (Right value2) = Right (value1 + value2)

-- @-node:gcross.20091202203048.7001:sumWithError
-- @+node:gcross.20091202203048.7006:sumWithError_2
sumWithError_2 argument1 argument2 = do
    value1 <- argument1
    value2 <- argument2
    return (value1 + value2)
-- @-node:gcross.20091202203048.7006:sumWithError_2
-- @+node:gcross.20091202203048.7012:sumWithError_3
sumWithError_3 = liftM2 (+)
-- @-node:gcross.20091202203048.7012:sumWithError_3
-- @+node:gcross.20091202203048.7020:sumWithError_4
sumWithError_4 :: Either ErrorMessage Float -> Either ErrorMessage Float -> Either ErrorMessage Float
sumWithError_4 = liftA2 (+)
-- @-node:gcross.20091202203048.7020:sumWithError_4
-- @-node:gcross.20091202203048.7013:sumWithError
-- @+node:gcross.20091202203048.7014:showSumOrErrorOf
-- @+node:gcross.20091202203048.6997:showSumOrErrorOf
showSumOrErrorOf :: Float -> Float -> String
showSumOrErrorOf x y =
    case sumWithError (sqrtWithError x) (sqrtWithError y) of
        Right value -> "The value is " ++ show value
        Left error -> show . formatErrorMessage $ error
-- @nonl
-- @-node:gcross.20091202203048.6997:showSumOrErrorOf
-- @+node:gcross.20091202203048.7016:showSumOrErrorOf_2
showSumOrErrorOf_2 :: Float -> Float -> String
showSumOrErrorOf_2 x y =
    case sumWithError_2 (sqrtWithError x) (sqrtWithError y) of
        Right value -> "The value is " ++ show value
        Left error -> show . formatErrorMessage $ error
-- @-node:gcross.20091202203048.7016:showSumOrErrorOf_2
-- @+node:gcross.20091202203048.7018:showSumOrErrorOf_3
showSumOrErrorOf_3 :: Float -> Float -> String
showSumOrErrorOf_3 x y =
    case sumWithError_3 (sqrtWithError x) (sqrtWithError y) of
        Right value -> "The value is " ++ show value
        Left error -> show . formatErrorMessage $ error
-- @-node:gcross.20091202203048.7018:showSumOrErrorOf_3
-- @+node:gcross.20091202203048.7024:showSumOrErrorOf_4
showSumOrErrorOf_4 :: Float -> Float -> String
showSumOrErrorOf_4 x y =
    case sumWithError_4 (sqrtWithError x) (sqrtWithError y) of
        Right value -> "The value is " ++ show value
        Left error -> show . formatErrorMessage $ error
-- @-node:gcross.20091202203048.7024:showSumOrErrorOf_4
-- @-node:gcross.20091202203048.7014:showSumOrErrorOf
-- @-node:gcross.20091202203048.6995:Functions
-- @-others

main = defaultMain $
    -- @    << Tests >>
    -- @+node:gcross.20091202203048.6996:<< Tests >>
    -- @+others
    -- @+node:gcross.20091202203048.6993:Documentation examples
    [testGroup "Documentation examples"
        -- @    @+others
        -- @+node:gcross.20091202203048.6994:showSumOrErrorOf
        [testGroup "showSumOrErrorOf" $
            [testCase "(-1) (-2)" $
                assertEqual
                    "Was the expected message produced?"
                    (show . vcat . map text $
                        ["Error computing the square root of -1.0:"
                        ,"    Square roots cannot be taken of negative numbers."
                        ,"Error computing the square root of -2.0:"
                        ,"    Square roots cannot be taken of negative numbers."
                        ]
                    )
                    $
                    showSumOrErrorOf (-1) (-2)
            ,testCase "(-1) (-1)" $
                assertEqual
                    "Was the expected message produced?"
                    (show . vcat . map text $
                        ["Error computing the square root of -1.0:"
                        ,"    Square roots cannot be taken of negative numbers."
                        ]
                    )
                    $
                    showSumOrErrorOf (-1) (-1)
            ]
        -- @-node:gcross.20091202203048.6994:showSumOrErrorOf
        -- @+node:gcross.20091202203048.7008:showSumOrErrorOf_2
        ,testGroup "showSumOrErrorOf_2" $
            [testCase "(-1) (-2)" $
                assertEqual
                    "Was the expected message produced?"
                    (show . vcat . map text $
                        ["Error computing the square root of -1.0:"
                        ,"    Square roots cannot be taken of negative numbers."
                        ]
                    )
                    $
                    showSumOrErrorOf_2 (-1) (-2)
            ]
        -- @-node:gcross.20091202203048.7008:showSumOrErrorOf_2
        -- @+node:gcross.20091202203048.7010:showSumOrErrorOf_3
        ,testGroup "showSumOrErrorOf_3" $
            [testCase "(-1) (-2)" $
                assertEqual
                    "Was the expected message produced?"
                    (show . vcat . map text $
                        ["Error computing the square root of -1.0:"
                        ,"    Square roots cannot be taken of negative numbers."
                        ]
                    )
                    $
                    showSumOrErrorOf_3 (-1) (-2)
            ]
        -- @-node:gcross.20091202203048.7010:showSumOrErrorOf_3
        -- @+node:gcross.20091202203048.7022:showSumOrErrorOf_4
        ,testGroup "showSumOrErrorOf_3" $
            [testCase "(-1) (-2)" $
                assertEqual
                    "Was the expected message produced?"
                    (show . vcat . map text $
                        ["Error computing the square root of -1.0:"
                        ,"    Square roots cannot be taken of negative numbers."
                        ,"Error computing the square root of -2.0:"
                        ,"    Square roots cannot be taken of negative numbers."
                        ]
                    )
                    $
                    showSumOrErrorOf_4 (-1) (-2)
            ]
        -- @-node:gcross.20091202203048.7022:showSumOrErrorOf_4
        -- @+node:gcross.20091203120301.1651:Multiline strings
        ,testGroup "Multiline strings" $
            [testCase "errorMessageText" $
                assertEqual
                    "Was the expected message produced?"
                    (show . vcat . map text $
                        ["A poem:"
                        ,"    Roses are red."
                        ,"Violets are blue."
                        ]
                    )
                    .
                    show
                    .
                    formatErrorMessage
                    $
                    errorMessageText "A poem:" "Roses are red.\nViolets are blue."
            ,testCase "errorMessageTextFromMultilineString" $
                assertEqual
                    "Was the expected message produced?"
                    (show . vcat . map text $
                        ["A poem:"
                        ,"    Roses are red."
                        ,"    Violets are blue."
                        ]
                    )
                    .
                    show
                    .
                    formatErrorMessage
                    $
                    errorMessageTextFromMultilineString "A poem:" "Roses are red.\nViolets are blue."
            ]
        -- @-node:gcross.20091203120301.1651:Multiline strings
        -- @-others
        ]
    -- @-node:gcross.20091202203048.6993:Documentation examples
    -- @-others
    -- @nonl
    -- @-node:gcross.20091202203048.6996:<< Tests >>
    -- @nl
    ]
-- @-node:gcross.20091202203048.6990:@thin runtests.hs
-- @-leo