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)