{-# language OverloadedStrings, TemplateHaskell #-} module DSL (dslTests) where import Hedgehog import Control.Lens.Fold ((^?)) import Control.Lens.Setter ((.~), over) import Data.Function ((&)) import Language.Python.DSL import Language.Python.Optics import Language.Python.Render (showExpr) import Language.Python.Syntax.Ann import Language.Python.Syntax.CommaSep (CommaSep(..)) import Language.Python.Syntax.Punctuation (Comma(..)) import Language.Python.Syntax.Whitespace (Whitespace(..), Indents(..)) dslTests :: Group dslTests = $$discover prop_subscript_1 :: Property prop_subscript_1 = withTests 1 . property $ do let expr = subs_ (var_ "a") (int_ 1) showExpr expr === "a[1]" prop_subscript_2 :: Property prop_subscript_2 = withTests 1 . property $ do let expr = subs_ (var_ "a") (tuple_ [ti_ $ int_ 1, ti_ $ int_ 2]) showExpr expr === "a[1, 2]" prop_subscript_3 :: Property prop_subscript_3 = withTests 1 . property $ do let expr = subs_ (var_ "a") (tuple_ [ti_ $ int_ 1, s_ $ var_ "b"]) showExpr expr === "a[(1, *b)]" prop_subscript_4 :: Property prop_subscript_4 = withTests 1 . property $ do let expr = subs_ (var_ "a") (tuple_ [ti_ $ int_ 1]) showExpr expr === "a[1,]" prop_subscript_5 :: Property prop_subscript_5 = withTests 1 . property $ do let expr = subs_ (var_ "a") (tuple_ [s_ $ var_ "b"]) showExpr expr === "a[((*b),)]" prop_subscript_6 :: Property prop_subscript_6 = withTests 1 . property $ do let expr = subs_ (var_ "a") (slice_ Nothing Nothing Nothing) showExpr expr === "a[:]" prop_subscript_7 :: Property prop_subscript_7 = withTests 1 . property $ do let expr = subs_ (var_ "a") (tuple_ [ti_ $ slice_ Nothing Nothing Nothing]) showExpr expr === "a[:,]" prop_subscript_8 :: Property prop_subscript_8 = withTests 1 . property $ do let expr = subs_ (var_ "a") (tuple_ [ti_ $ tuple_ [ti_ $ slice_ Nothing Nothing Nothing]]) showExpr expr === "a[(slice(None, None, None),),]" prop_subscript_9 :: Property prop_subscript_9 = withTests 1 . property $ do let expr = subs_ (var_ "a") $ tuple_ [ti_ $ slice_ Nothing Nothing Nothing, ti_ $ slice_ Nothing Nothing Nothing] showExpr expr === "a[:, :]" prop_subscript_10 :: Property prop_subscript_10 = withTests 1 . property $ do let expr = subs_ (var_ "a") (slice_ (Just $ int_ 1) Nothing Nothing) showExpr expr === "a[1:]" prop_subscript_11 :: Property prop_subscript_11 = withTests 1 . property $ do let expr = subs_ (var_ "a") (slice_ (Just $ int_ 1) (Just $ int_ 1) Nothing) showExpr expr === "a[1:1]" prop_subscript_12 :: Property prop_subscript_12 = withTests 1 . property $ do let expr = subs_ (var_ "a") (slice_ (Just $ int_ 1) (Just $ int_ 1) (Just $ int_ 1)) showExpr expr === "a[1:1:1]" prop_subscript_13 :: Property prop_subscript_13 = withTests 1 . property $ do let expr = subs_ (var_ "a") $ tuple_ [ ti_ $ slice_ (Just $ int_ 1) Nothing Nothing , ti_ $ slice_ (Just $ int_ 2) Nothing Nothing ] showExpr expr === "a[1:, 2:]" prop_subscript_14 :: Property prop_subscript_14 = withTests 1 . property $ do let expr = subs_ (var_ "a") $ tuple_ [ ti_ $ slice_ (Just $ int_ 1) (Just $ int_ 1) Nothing , ti_ $ slice_ (Just $ int_ 2) Nothing Nothing ] showExpr expr === "a[1:1, 2:]" prop_subscript_15 :: Property prop_subscript_15 = withTests 1 . property $ do let expr = subs_ (var_ "a") $ tuple_ [ ti_ $ slice_ (Just $ int_ 1) (Just $ int_ 1) (Just $ int_ 1) , ti_ $ slice_ (Just $ int_ 2) Nothing Nothing ] showExpr expr === "a[1:1:1, 2:]" prop_subscript_16 :: Property prop_subscript_16 = withTests 1 . property $ do let expr = subs_ (var_ "a") $ tuple_ [ ti_ $ tuple_ [ ti_ $ slice_ (Just $ int_ 1) Nothing Nothing , ti_ $ int_ 2 ] ] showExpr expr === "a[(slice(1, None, None), 2),]" prop_parameters_1 :: Property prop_parameters_1 = withTests 1 . property $ do let st = def_ "a" [] [line_ pass_] params1 = CommaSepMany (p_ "test1") (MkComma $ replicate 5 Space) $ CommaSepMany (p_ "test2") (MkComma $ replicate 3 Space) $ CommaSepNone st1 = st & _Fundef.fdParameters .~ params1 params2 = CommaSepMany (p_ "test3") (MkComma $ replicate 5 Space) $ CommaSepMany (p_ "test4") (MkComma $ replicate 3 Space) $ CommaSepNone st2 = st & _Fundef.fdParameters .~ params2 (st1 & _Fundef.parameters_ .~ [p_ "test3", p_ "test4"]) === st2 prop_parameters_2 :: Property prop_parameters_2 = withTests 1 . property $ do let st = def_ "a" [] [line_ pass_] params1 = CommaSepMany (p_ "test1") (MkComma $ replicate 5 Space) $ CommaSepMany (p_ "test2") (MkComma $ replicate 3 Space) $ CommaSepNone st1 = st & _Fundef.fdParameters .~ params1 params2 = CommaSepMany (p_ "test3") (MkComma $ replicate 5 Space) $ CommaSepMany (p_ "test4") (MkComma $ replicate 3 Space) $ CommaSepOne (p_ "test5") st2 = st & _Fundef.fdParameters .~ params2 (st1 & _Fundef.parameters_ .~ [p_ "test3", p_ "test4", p_ "test5"]) === st2 prop_parameters_3 :: Property prop_parameters_3 = withTests 1 . property $ do let st = def_ "a" [] [line_ pass_] params1 = CommaSepMany (p_ "test1") (MkComma $ replicate 5 Space) $ CommaSepMany (p_ "test2") (MkComma $ replicate 3 Space) $ CommaSepNone st1 = st & _Fundef.fdParameters .~ params1 params2 = CommaSepMany (p_ "test3") (MkComma $ replicate 5 Space) CommaSepNone st2 = st & _Fundef.fdParameters .~ params2 (st1 & _Fundef.parameters_ .~ [p_ "test3"]) === st2 prop_parameters_4 :: Property prop_parameters_4 = withTests 1 . property $ do let st = def_ "a" [] [line_ pass_] params1 = CommaSepMany (p_ "test1") (MkComma $ replicate 5 Space) $ CommaSepOne (p_ "test2") st1 = st & _Fundef.fdParameters .~ params1 params2 = CommaSepMany (p_ "test3") (MkComma $ replicate 5 Space) $ CommaSepOne (p_ "test4") st2 = st & _Fundef.fdParameters .~ params2 (st1 & _Fundef.parameters_ .~ [p_ "test3", p_ "test4"]) === st2 prop_parameters_5 :: Property prop_parameters_5 = withTests 1 . property $ do let st = def_ "a" [] [line_ pass_] params1 = CommaSepMany (p_ "test1") (MkComma $ replicate 5 Space) $ CommaSepOne (p_ "test2") st1 = st & _Fundef.fdParameters .~ params1 params2 = CommaSepMany (p_ "test3") (MkComma $ replicate 5 Space) $ CommaSepMany (p_ "test4") (MkComma [Space]) $ CommaSepOne (p_ "test5") st2 = st & _Fundef.fdParameters .~ params2 (st1 & _Fundef.parameters_ .~ [p_ "test3", p_ "test4", p_ "test5"]) === st2 prop_body_1 :: Property prop_body_1 = withTests 1 . property $ do let st = def_ "a" [] [line_ pass_] st ^? _Fundef.fdIndents === Just (Indents [] (Ann ())) over (_Fundef.body_) id st === st prop_body_2 :: Property prop_body_2 = withTests 1 . property $ do let st = def_ "a" [] [line_ pass_] st ^? _Fundef.body_ === Just [line_ pass_] prop_body_3 :: Property prop_body_3 = withTests 1 . property $ do let stInner = def_ "b" [] [line_ pass_] stOuter = def_ "a" [] [line_ pass_, line_ stInner] newIndent = replicate 10 Space (stOuter & _Indent .~ newIndent) ^? _Fundef.body_ === Just [ line_ $ pass_ & _Indent .~ newIndent , line_ $ stInner & _Indent .~ newIndent ] prop_body_4 :: Property prop_body_4 = withTests 1 . property $ do let newIndent = replicate 10 Space stInner = def_ "b" [] [line_ pass_] outerBody = [ line_ pass_ , line_ stInner ] outerBody' = [ line_ $ pass_ & _Indent .~ newIndent , line_ $ stInner & _Indent .~ newIndent ] stOuter = def_ "a" [] outerBody & _Indent .~ newIndent finalBody = [ line_ pass_ , line_ $ stInner & _Indent .~ newIndent , line_ pass_ ] stFinal' = def_ "a" [] finalBody & _Indent .~ newIndent stOuter ^? _Fundef.body_ === Just outerBody' (stOuter & _Fundef.body_ .~ finalBody) === stFinal'