Added a test: see if my parsers aren't modifying the input.

master
Philippe Pittoli 2024-02-01 01:52:15 +01:00
parent ea72414e6a
commit d7f713839c
1 changed files with 27 additions and 1 deletions

View File

@ -1,6 +1,6 @@
module Test.Main where
import Prelude (Unit, discard, show, ($), (<>))
import Prelude (Unit, discard, show, ($), (<>), (==))
import Data.Either (Either(..))
import Data.Maybe (Maybe(..), maybe)
import Data.String.CodeUnits (fromCharArray)
@ -17,6 +17,29 @@ import GenericParser.IPAddress as IP
import GenericParser.EmailAddress as E
import Test.TestValues as T
run :: forall e v. Parser e v -> String -> P.Result e v
run (Parser p) str = p { string: str, position: 0 }
data COMPARISON = SAME | DIFFERENT | FAILED
compare_results :: forall e v. Parser e v -> Parser e v -> String -> COMPARISON
compare_results p1 p2 str
= let e1 = run p1 str
e2 = run p2 str
in case e1, e2 of
Right r1, Right r2 -> if r1.suffix == r2.suffix
then SAME
else DIFFERENT
_, _ -> FAILED
compare_parsers :: forall e v. String -> Parser e v -> Parser e v -> String -> Effect Unit
compare_parsers s p1 p2 str
= log $ s <> " "
<> case compare_results p1 p2 str of
SAME -> "SAME"
DIFFERENT -> "DIFFERENT"
FAILED -> "FAILED"
<> " [" <> str <>"] "
logtest :: forall e v. String -> Parser e v -> String -> (v -> String) -> (e -> String) -> Effect Unit
logtest fname (Parser p) str r e = do
log $ "(" <> fname <> ") parsing '" <> str <> "': "
@ -99,3 +122,6 @@ main = do
let quotedstrings = [ """" "spaces?""", """ " " """ ]
test_series "E.quoted_string---------------" E.quoted_string id showerror_email quotedstrings
test_series "P.read_input (E.quoted_string)" (P.read_input E.quoted_string) id showerror_email quotedstrings
log "Does parsers behave correctly (give the exact same input)?"
foreachE T.valid_email_addresses_short (\s -> compare_parsers "E.address" (P.read_input E.address) E.address s)