language-ecmascript 0.15.1 → 0.15.2
raw patch · 6 files changed
+162/−4 lines, 6 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- CHANGELOG +4/−0
- language-ecmascript.cabal +8/−4
- test/Test/Diff.hs +58/−0
- test/Test/Pretty.hs +43/−0
- test/Test/Unit.hs +49/−0
- test/diff/expects/t1.diff +0/−0
CHANGELOG view
@@ -1,5 +1,9 @@ Version change log. +=0.15.2=+Fixed an error in the .cabal file that prevented some of the test modules+to be packaged.+ =0.15.1= Added semicolons after the "return" statement in the pretty printer to avoid certain class of syntax error when printed code is parsed
language-ecmascript.cabal view
@@ -1,5 +1,5 @@ Name: language-ecmascript-Version: 0.15.1+Version: 0.15.2 Cabal-Version: >= 1.10 Copyright: (c) 2007-2012 Brown University, (c) 2008-2010 Claudiu Saftoiu, (c) 2012-2013 Stevens Institute of Technology@@ -19,8 +19,8 @@ Description: Tools for working with ECMAScript 3 (popularly known as JavaScript). Includes a parser, pretty-printer, tools for working with source tree- annotations and an arbitrary instance. Analyses have migrated to - language-ecmascript-analysis+ annotations and an arbitrary instance. See CHANGELOG for a summary of+ changes. Source-repository head type: git@@ -29,7 +29,7 @@ Source-repository this type: git location: git://github.com/jswebtools/language-ecmascript.git- tag: 0.15.1+ tag: 0.15.2 Library Hs-Source-Dirs:@@ -70,6 +70,10 @@ Hs-Source-Dirs: test Type: exitcode-stdio-1.0 Main-Is: TestMain.hs+ Other-Modules:+ Test.Diff+ Test.Unit+ Test.Pretty Build-Depends: base >= 4 && < 5, mtl >= 1.1.0.1,
+ test/Test/Diff.hs view
@@ -0,0 +1,58 @@+module Test.Diff where++import Test.HUnit hiding (Test)+import Test.Framework+import Test.Framework.Providers.HUnit+import System.Exit+import System.Directory+import qualified System.FilePath as FP+import Language.ECMAScript3.Parser+import Language.ECMAScript3.PrettyPrint+import Language.ECMAScript3.Syntax+import Language.ECMAScript3.Syntax.Annotations+import Language.ECMAScript3.SourceDiff+import Control.Monad++tests_diff :: Test+tests_diff =+ buildTest $+ do allLefts <- getDirectoryContents leftDir+ allRights <- getDirectoryContents rightDir+ allDiffs <- getDirectoryContents expectsDir+ let validLefts = getValidJS allLefts+ let validRights = getValidJS allRights+ let validDiffs = getValidDiffs allDiffs+ return $ testGroup "Source Diff tests" $+ map genTest $ filter ((`elem` (map FP.dropExtension validDiffs)) .+ FP.dropExtension)+ $ filter (`elem` validRights) validLefts+ where getValidJS = filter $ \x -> FP.takeExtension x == ".js"+ getValidDiffs = filter $ \x -> FP.takeExtension x == ".diff"++leftDir = "test/diff/left"+rightDir = "test/diff/right"+expectsDir = "test/diff/expects"++genTest :: FilePath -> Test+genTest testFileName = testCase testFileName $+ diffTest (leftDir `FP.combine` testFileName)+ (rightDir `FP.combine` testFileName)+ (expectsDir `FP.combine`+ ((FP.dropExtension testFileName)+ `FP.addExtension` "diff"))++diffTest :: FilePath -> FilePath -> FilePath -> Assertion+diffTest leftFile rightFile diffFile =+ do left <- readFile leftFile+ right <- readFile rightFile+ expect<- readFile diffFile+ let x = do ljs <- parseFromString left+ rjs <- parseFromString right+ return (removeAnnotations ljs, removeAnnotations rjs)+ case x of+ Left err -> assertFailure $ "Parsing error: " ++ (show err)+ Right (ljs, rjs) ->+ let diff = jsDiff ljs rjs+ msg = "Failed to match diff output to an expected one. Expected:\n"+ ++ expect ++ "\nSaw:\n" ++ diff+ in unless (diff == expect) (assertFailure msg)
+ test/Test/Pretty.hs view
@@ -0,0 +1,43 @@+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
+ test/Test/Unit.hs view
@@ -0,0 +1,49 @@+module Test.Unit where++import Test.Framework+import Test.Framework.Providers.HUnit+import Test.HUnit hiding (Test)+import System.Exit+import System.Directory+import qualified System.FilePath as FilePath+import Language.ECMAScript3.Parser+import Language.ECMAScript3.PrettyPrint+import Language.ECMAScript3.Syntax+import Language.ECMAScript3.Syntax.Annotations+import Language.ECMAScript3.SourceDiff+import Control.Monad+++tests_unit :: Test+tests_unit =+ buildTest $+ do allFiles <- getDirectoryContents testDir+ let validFiles = filter (\x -> FilePath.takeExtension x == ".js") allFiles+ return $ testGroup "Parser Unit tests" $ map genTest validFiles+++genTest :: FilePath -> Test+genTest file = testCase file $ parsePrettyTest (testDir `FilePath.combine` file) ++testDir = "test/parse-pretty"++-- | tests the parser with pre-defined test-cases+parsePrettyTest :: FilePath -> Assertion+parsePrettyTest filename =+ readFile filename >>= \src ->+ case parseFromString src of+ Left err -> assertFailure $ "Can't parse a test-case: " ++ filename+ Right js -> let str = show $ prettyPrint js+ in case parseFromString str of+ Left err ->+ let msg = "Can't parse pretty-printed code. The error was: "+ ++ (show err)+ ++ "\nThe pretty-printed code in question:\n" ++ str+ in assertFailure msg+ Right js' -> do+ let str' = show $ prettyPrint js'+ unless (str == str') $ do+ let msg = "The parse of the pretty-printed AST didn't match the original\n"+ ++ "Diff:\n" ++ jsDiff js js'+ assertFailure msg+
test/diff/expects/t1.diff view