packages feed

hssqlppp-th-0.6.0: tests/Database/HsSqlPpp/Tests/QuasiQuoteTests.lhs

Tests mainly for antiquotation, plus examples of where antiquotes work.

> {-# LANGUAGE QuasiQuotes,ScopedTypeVariables #-}
>
> module Database.HsSqlPpp.Tests.QuasiQuoteTests (quasiQuoteTests, quasiQuoteTestData, Item(..)) where
>
> import qualified Test.Tasty as T
> import qualified Test.Tasty.HUnit as H

> import Data.Data
>
> import Database.HsSqlPpp.Syntax
> import Database.HsSqlPpp.Annotation
> import Database.HsSqlPpp.Pretty
> import Database.HsSqlPpp.Quote
> import Database.HsSqlPpp.Utility
> --import Database.HsSqlPpp.Tests.TestUtils
> import qualified Data.Text.Lazy as L
>
> data Item = Expr ScalarExpr ScalarExpr
>           | Stmts [Statement] [Statement]
>           | PgSqlStmts [Statement] [Statement]
>           | Stmt Statement Statement
>           | PgSqlStmt Statement Statement
>           | Group String [Item]

> quasiQuoteTests :: T.TestTree
> quasiQuoteTests = itemToTft quasiQuoteTestData
>
> quasiQuoteTestData :: Item
> quasiQuoteTestData =
>   Group "quasiQuoteTests" [

>     let tableName = [sqlName| my_table |]
>         varname = [sqlNameComponent| my_field |]
>         typename = [sqlName| text |]
>     in Stmt [sqlStmt|
>
>      create table $n(tableName) (
>        $m(varname) $n(typename)
>      );
>
>      |]
>      [sqlStmt|
>      create table my_table (
>        my_field text
>      );
>      |]


>     ,let fnname = [sqlName| my_function |]
>          tablename = [sqlName| my_table |]
>          typename = [sqlName| int |]
>      in Stmt [sqlStmt|
>
>   create function $n(fnname)() returns $n(typename) as $a$
>     select * from $n(tablename);
>   $a$ language sql stable;
>
>      |]
>      [sqlStmt|
>   create function my_function() returns int as $a$
>     select * from my_table;
>   $a$ language sql stable;
>      |]


>     ,let fnname = [sqlName|my_function|]
>      in Stmt [sqlStmt| drop function $n(fnname)();|]
>              [sqlStmt| drop function my_function();|]
>
>     ,let expr = StringLit ea "testing"
>      in PgSqlStmt [pgsqlStmt| return $e(expr); |]
>                   [pgsqlStmt| return 'testing'; |]

>     ,let expr = [sqlExpr| 3 + 4 |]
>      in PgSqlStmt [pgsqlStmt| return $e(expr); |]
>                   [pgsqlStmt| return 3 + 4; |]
>

>     ,let triggername = [sqlNameComponent|my_trigger|]
>          tablename = [sqlName|my_table|]
>          opname = [sqlName|my_function|]
>      in Stmt [sqlStmt|
>   create trigger $m(triggername)
>     after insert or update or delete on $n(tablename)
>     for each statement
>     execute procedure $n(opname)();
>             |]
>              [sqlStmt|
>   create trigger my_trigger
>     after insert or update or delete on my_table
>     for each statement
>     execute procedure my_function();
>             |]

>     ,let tablename = [sqlName|lotsastuff|]
>      in Expr [sqlExpr|(select count(*) from $n(tablename))|]
>              [sqlExpr|(select count(*) from lotsastuff)|]
>
>     ,let trigname = [sqlNameComponent|tbl_trig1|]
>          tablename = [sqlName|tbl|]
>          tevent = TUpdate
>          fn = [sqlName|checkit|]
>      in Stmt [sqlStmt|
>      create trigger $m(trigname)
>         after $t(tevent) on $n(tablename)
>         for each row
>         execute procedure $n(fn)();
>             |] [sqlStmt|
>      create trigger tbl_trig1
>         after update on tbl
>         for each row
>         execute procedure checkit();
>             |]
>     ,let x = [sqlName| fnname |]
>      in Expr [sqlExpr| $n(x)('a') |]
>              [sqlExpr| fnname('a') |]
>     ,let x = StringLit ea "splicedstring"
>      in Expr [sqlExpr| $e(x) |]
>              [sqlExpr| 'splicedstring' |]
>     ,let x = [sqlName|splicedIdentifier|]
>      in Expr [sqlExpr| $n(x) |]
>              [sqlExpr| splicedIdentifier |]
>     ,let errMsg = "string splice"
>      in PgSqlStmt [pgsqlStmt| raise exception $s(errMsg); |]
>                   [pgsqlStmt| raise exception 'string splice'; |]

>

--------------------------------------------------------------------------------

expressions

>   ]


================================================================================

Unit test helpers

> itemToTft :: Item -> T.TestTree
> itemToTft (Expr a b) = H.testCase (L.unpack $ prettyScalarExpr defaultPrettyFlags b) $ stripEqual a b
> itemToTft (PgSqlStmt a b) = H.testCase (L.unpack $ prettyStatements defaultPrettyFlags [b]) $ stripEqual a b
> itemToTft (Stmt a b) = H.testCase (L.unpack $ prettyStatements defaultPrettyFlags [b]) $  stripEqual a b
> itemToTft (PgSqlStmts a b) = H.testCase (L.unpack $ prettyStatements defaultPrettyFlags b) $ stripEqual a b
> itemToTft (Stmts a b) = H.testCase (L.unpack $ prettyStatements defaultPrettyFlags b) $ stripEqual a b
> itemToTft (Group s is) = T.testGroup s $ map itemToTft is
> stripEqual :: (Data a, Eq a, Show a) =>
>               a -> a -> H.Assertion
> stripEqual a b = H.assertEqual "" (resetAnnotations a) (resetAnnotations b)

> ea :: Annotation
> ea = emptyAnnotation