module Test.Pretty where import Test.Framework import Test.Framework.Providers.QuickCheck2 import Language.ECMAScript3.Parser import Language.ECMAScript3.PrettyPrint import Language.ECMAScript3.Syntax import Language.ECMAScript3.Syntax.Arbitrary() import Language.ECMAScript3.Syntax.Annotations --import System.Exit import Language.ECMAScript3.SourceDiff import Test.QuickCheck tests_pretty :: Test tests_pretty = testProperty "Parse is the inverse of pretty" prettyParseEquivalence -- main :: IO () -- main = -- let qcArgs = Args {maxSuccess = 50 -- ,maxDiscardRatio = 10 -- ,maxSize = 10 -- ,replay = Nothing -- ,chatty = False} -- in quickCheckWithResult qcArgs prettyParseEquivalence >>= \res -> -- case res of -- Success {} -> putStrLn "All tests passes" -- GaveUp {} -> putStrLn "Gave up" -- Failure {} -> putStrLn "Test failed" >> exitFailure -- NoExpectedFailure {} -> putStrLn "Unexpected failure" >> exitFailure prettyParseEquivalence :: JavaScript () -> Property prettyParseEquivalence orig = let pp = show $ prettyPrint orig in case parseFromString pp of Left e -> let err = "Can't parse pretty-printed code. The error was: " ++ (show e) ++ "\nThe pretty-printed code in question:\n" ++ pp in whenFail (putStrLn err) False Right parsed -> let eq = (removeAnnotations parsed) == orig msg ="The parse of the pretty-printed AST didn't match the original\n" ++"Diff:\n" ++ jsDiff orig (reannotate (const ()) parsed) in whenFail (putStrLn msg) eq