packages feed

hssqlppp-0.4.2: src-extra/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 Test.HUnit
> import Test.Framework
> import Test.Framework.Providers.HUnit
> import Data.Data
>
> import Database.HsSqlPpp.Ast
> import Database.HsSqlPpp.Annotation
> import Database.HsSqlPpp.Pretty
> import Database.HsSqlPpp.Quote
> import Database.HsSqlPpp.Tests.TestUtils
>
> data Item = Expr ScalarExpr ScalarExpr
>           | Stmts [Statement] [Statement]
>           | PgSqlStmts [Statement] [Statement]
>           | Stmt Statement Statement
>           | PgSqlStmt Statement Statement
>           | Group String [Item]
> quasiQuoteTests :: Test.Framework.Test
> quasiQuoteTests = itemToTft quasiQuoteTestData
>
> quasiQuoteTestData :: Item
> quasiQuoteTestData =
>   Group "quasiQuoteTests" [

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

expressions

>    Group "stuff" [
>      let tablename = "my_table"
>          varname = "my_field"
>          typename = "text"
>      in Stmt [sqlStmt|
>
>      create table $(tablename) (
>        $(varname) $(typename)
>      );
>
>      |]
>      [sqlStmt|
>      create table my_table (
>        my_field text
>      );
>      |]
>
>     ,let fnname = "my_function"
>          tablename = "my_table"
>          typename = "int"
>      in Stmt [sqlStmt|
>
>   create function $(fnname)() returns $(typename) as $a$
>     select * from $(tablename);
>   $a$ language sql stable;
>
>      |]
>      [sqlStmt|
>   create function my_function() returns int as $a$
>     select * from my_table;
>   $a$ language sql stable;
>      |]
>
>     ,let fnname = "my_function"
>      in Stmt [sqlStmt| drop function $(fnname)();|]
>              [sqlStmt| drop function my_function();|]
>
>     ,let expr = StringLit ea "testing"
>      in PgSqlStmt [pgsqlStmt| return $(expr); |]
>                   [pgsqlStmt| return 'testing'; |]
>
>     ,let expr = (FunCall ea (Name ea [Nmc "+"]) [NumberLit ea "3",NumberLit ea "4"])
>      in PgSqlStmt [pgsqlStmt| return $(expr); |]
>                   [pgsqlStmt| return 3 + 4; |]
>
>     ,let errMsg = "this splice is slighty dodgy"
>      in PgSqlStmt [pgsqlStmt|
>      if true then
>        raise exception '$(errMsg)';
>      end if;|]
>      [pgsqlStmt|
>      if true then
>        raise exception 'this splice is slighty dodgy';
>      end if;|]
>
>     ,let triggername = "my_trigger"
>          tablename = "my_table"
>          opname = "my_function"
>      in Stmt [sqlStmt|
>   create trigger $(triggername)
>     after insert or update or delete on $(tablename)
>     for each statement
>     execute procedure $(opname)();
>             |]
>              [sqlStmt|
>   create trigger my_trigger
>     after insert or update or delete on my_table
>     for each statement
>     execute procedure my_function();
>             |]
>     ,let tablename = "lotsastuff"
>      in Expr [sqlExpr|(select count(*) from $(tablename))|]
>              [sqlExpr|(select count(*) from lotsastuff)|]
>
>     ,let trigname = "tbl_trig1"
>          tablename = "tbl"
>          tevent = TUpdate
>          fn = "checkit"
>      in Stmt [sqlStmt|
>      create trigger $(trigname)
>         after $(tevent) on $(tablename)
>         for each row
>         execute procedure $(fn)();
>             |] [sqlStmt|
>      create trigger tbl_trig1
>         after update on tbl
>         for each row
>         execute procedure checkit();
>             |]
>     ,let x = "fnname"
>      in Expr [sqlExpr| $(x)('a') |]
>              [sqlExpr| fnname('a') |]
>     ,let x = "splicedstring"
>      in Expr [sqlExpr| $s(x) |]
>              (StringLit ea "splicedstring")
>     ,let x = "splicedIdentifier"
>      in Expr [sqlExpr| $i(x) |]
>              (Identifier ea $ Nmc "splicedIdentifier")
>     ,let errMsg = "this splice isn't too dodgy"
>      in PgSqlStmt [pgsqlStmt| raise exception $s(errMsg); |]
>                   [pgsqlStmt| raise exception 'this splice isn''t too dodgy'; |]

>     {-,let s1 = [sqlStmts| select * from tbl; |]
>      in Stmts [sqlStmts|
>      select 1;
>      $(s1);
>      select 2;|]
>        [sqlStmts|
>      select 1;
>      select * from tbl;
>      select 2;|]

>     ,let s1 = [sqlStmt| select * from tbl; |]
>          s2 = [s1,s2]
>      in Stmts [sqlStmts|
>      select 1;
>      $(s2);
>      select 2;|]
>        [sqlStmts|
>      select 1;
>      select * from tbl;
>      select * from tbl;
>      select 2;|]-}


>   ]]


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

Unit test helpers

> itemToTft :: Item -> Test.Framework.Test
> itemToTft (Expr a b) = testCase (printScalarExpr b) $ stripEqual a b
> itemToTft (PgSqlStmt a b) = testCase (printStatements [b]) $ stripEqual a b
> itemToTft (Stmt a b) = testCase (printStatements [b]) $  stripEqual a b
> itemToTft (PgSqlStmts a b) = testCase (printStatements b) $ stripEqual a b
> itemToTft (Stmts a b) = testCase (printStatements b) $ stripEqual a b
> itemToTft (Group s is) = testGroup s $ map itemToTft is
> stripEqual :: (Data a, Eq a, Show a) =>
>               a -> a -> Assertion
> stripEqual a b = assertEqual "" (resetAnnotations a) (resetAnnotations b)

> ea :: Annotation
> ea = emptyAnnotation