diff --git a/fortran-src.cabal b/fortran-src.cabal index 1502ad07..4dbd3ba3 100644 --- a/fortran-src.cabal +++ b/fortran-src.cabal @@ -84,6 +84,7 @@ library Language.Fortran.AST.Literal.Complex Language.Fortran.AST.Literal.Real Language.Fortran.Common.Array + Language.Fortran.Generate Language.Fortran.Intrinsics Language.Fortran.LValue Language.Fortran.Parser @@ -186,6 +187,7 @@ library , happy >=1.19 build-depends: GenericPretty >=1.2.2 && <2 + , QuickCheck >=2.10 && <2.15 , array ==0.5.* , base >=4.6 && <5 , binary >=0.8.3.0 && <0.11 @@ -249,6 +251,7 @@ executable fortran-src ghc-options: -Wall -fno-warn-tabs build-depends: GenericPretty >=1.2.2 && <2 + , QuickCheck >=2.10 && <2.15 , array ==0.5.* , base >=4.6 && <5 , binary >=0.8.3.0 && <0.11 diff --git a/package.yaml b/package.yaml index fed00c38..f3cb422a 100644 --- a/package.yaml +++ b/package.yaml @@ -105,6 +105,8 @@ dependencies: - singletons-th >= 3.0 && < 3.4 - singletons-base >= 3.0 && < 3.4 +- QuickCheck >=2.10 && <2.15 + library: source-dirs: src ghc-options: -fno-warn-tabs diff --git a/src/Language/Fortran/Generate.hs b/src/Language/Fortran/Generate.hs new file mode 100644 index 00000000..2fdab0c9 --- /dev/null +++ b/src/Language/Fortran/Generate.hs @@ -0,0 +1,45 @@ +module Language.Fortran.Generate where + +import Language.Fortran.AST +import Test.QuickCheck + +import Language.Fortran.Util.Position +import Language.Fortran.PrettyPrint +import Language.Fortran.Version + +import Text.PrettyPrint +import Text.PrettyPrint.HughesPJ + +-- instance Gen SrcSpan where +-- arbitrary = do +-- start <- arbitrary +-- end <- arbitrary +-- return $ SrcSpan start end + +-- instance Gen Position where +-- arbitrary = do +-- absOffset <- arbitrary +-- col <- arbitrary +-- line <- arbitrary +-- filePath <- arbitrary +-- pragmaOffset <- arbitrary +-- return $ Position absOffset col line filePath pragmaOffset + +instance Arbitrary a => Arbitrary (Value a) where + arbitrary = oneof + [ do x <- arbitrary :: Gen Integer + pure $ ValInteger (show x) Nothing + , do s <- arbitrary :: Gen String + pure $ ValString s + , ValLogical <$> arbitrary <*> pure Nothing + , pure $ ValVariable "myVar" + ] + +-- Generate a list of 10 values and pretty print +-- the results +demo :: IO () +demo = do + values :: [Value ()] <- generate $ vectorOf 10 arbitrary + let prettyValues = map (pprint' Fortran90) values + mapM_ (putStrLn . render) prettyValues + putStrLn $ "Generated " ++ show (length values) ++ " values."