From 44b82a797feee1f26cf7e98f0bee1896e842ec56 Mon Sep 17 00:00:00 2001
From: Jake Wheat <jakewheatmail@gmail.com>
Date: Sat, 14 Dec 2013 20:42:01 +0200
Subject: [PATCH] add tests to cabal

---
 simple-sql-parser.cabal                       |  27 +-
 .../Language/SQL/SimpleSQL/Tests.lhs          |  27 +-
 PrettyIt.lhs => tools/PrettyIt.lhs            |   0
 tools/RunTests.lhs                            |   8 +
 Tpch.lhs => tools/Tpch.lhs                    |   0
 tpch.sql                                      | 689 ------------------
 6 files changed, 50 insertions(+), 701 deletions(-)
 rename Tests.lhs => tools/Language/SQL/SimpleSQL/Tests.lhs (97%)
 rename PrettyIt.lhs => tools/PrettyIt.lhs (100%)
 create mode 100644 tools/RunTests.lhs
 rename Tpch.lhs => tools/Tpch.lhs (100%)
 delete mode 100644 tpch.sql

diff --git a/simple-sql-parser.cabal b/simple-sql-parser.cabal
index a781e1c..3e0716f 100644
--- a/simple-sql-parser.cabal
+++ b/simple-sql-parser.cabal
@@ -23,7 +23,7 @@ library
                        Language.SQL.SimpleSQL.Parser,
                        Language.SQL.SimpleSQL.Syntax
   other-modules:       Language.SQL.SimpleSQL.Fixity
-  -- other-extensions:
+  other-extensions:    TupleSections
   build-depends:       base >=4.6 && <4.7,
                        parsec >=3.1 && <3.2,
                        mtl >=2.1 && <2.2,
@@ -31,4 +31,27 @@ library
                        haskell-src-exts >= 1.14 && < 1.15
   -- hs-source-dirs:
   default-language:    Haskell2010
-  ghc-options:         -Wall
\ No newline at end of file
+  ghc-options:         -Wall
+
+Test-Suite Tests
+  type:                exitcode-stdio-1.0
+  main-is:             RunTests.lhs
+  hs-source-dirs:      .,tools
+  Build-Depends:       base >=4.6 && <4.7,
+                       parsec >=3.1 && <3.2,
+                       mtl >=2.1 && <2.2,
+                       pretty >= 1.1 && < 1.2,
+                       haskell-src-exts >= 1.14 && < 1.15,
+
+                       HUnit >= 1.2 && < 1.3,
+                       test-framework >= 0.8 && < 0.9,
+                       test-framework-hunit >= 0.3 && < 0.4
+
+  Other-Modules:       Language.SQL.SimpleSQL.Pretty,
+                       Language.SQL.SimpleSQL.Parser,
+                       Language.SQL.SimpleSQL.Syntax,
+                       Language.SQL.SimpleSQL.Fixity,
+                       Language.SQL.SimpleSQL.Tests
+  other-extensions:    TupleSections
+  default-language:    Haskell2010
+  ghc-options:         -Wall
diff --git a/Tests.lhs b/tools/Language/SQL/SimpleSQL/Tests.lhs
similarity index 97%
rename from Tests.lhs
rename to tools/Language/SQL/SimpleSQL/Tests.lhs
index d0edb97..5cdb6a5 100644
--- a/Tests.lhs
+++ b/tools/Language/SQL/SimpleSQL/Tests.lhs
@@ -1,12 +1,17 @@
 
-> module Tests (testData, TestItem(..), runTests) where
+> module Language.SQL.SimpleSQL.Tests
+>     (testData
+>     ,tests
+>     ,TestItem(..)
+>     ) where
 
 > import Language.SQL.SimpleSQL.Syntax
 > import Language.SQL.SimpleSQL.Pretty
 > import Language.SQL.SimpleSQL.Parser
 > import qualified Test.HUnit as H
-> import Control.Monad
 > import Tpch
+> import Test.Framework
+> import Test.Framework.Providers.HUnit
 
 > data TestItem = Group String [TestItem]
 >               | TestScalarExpr String ScalarExpr
@@ -476,13 +481,15 @@
 >     ,tpchTests
 >     ]
 
+> tests :: Test.Framework.Test
+> tests = itemToTest testData
 
-> runTests :: IO ()
-> runTests = void $ H.runTestTT $ itemToTest testData
+> --runTests :: IO ()
+> --runTests = void $ H.runTestTT $ itemToTest testData
 
-> itemToTest :: TestItem -> H.Test
+> itemToTest :: TestItem -> Test.Framework.Test
 > itemToTest (Group nm ts) =
->     H.TestLabel nm $ H.TestList $ map itemToTest ts
+>     testGroup nm $ map itemToTest ts
 > itemToTest (TestScalarExpr str expected) =
 >     toTest parseScalarExpr prettyScalarExpr str expected
 > itemToTest (TestQueryExpr str expected) =
@@ -497,8 +504,8 @@
 >        -> (a -> String)
 >        -> String
 >        -> a
->        -> H.Test
-> toTest parser pp str expected = H.TestLabel str $ H.TestCase $ do
+>        -> Test.Framework.Test
+> toTest parser pp str expected = testCase str $ do
 >         let egot = parser "" Nothing str
 >         case egot of
 >             Left e -> H.assertFailure $ peFormattedError e
@@ -514,8 +521,8 @@
 >           (String -> Maybe (Int,Int) -> String -> Either ParseError a)
 >        -> (a -> String)
 >        -> String
->        -> H.Test
-> toPTest parser pp str = H.TestLabel str $ H.TestCase $ do
+>        -> Test.Framework.Test
+> toPTest parser pp str = testCase str $ do
 >         let egot = parser "" Nothing str
 >         case egot of
 >             Left e -> H.assertFailure $ peFormattedError e
diff --git a/PrettyIt.lhs b/tools/PrettyIt.lhs
similarity index 100%
rename from PrettyIt.lhs
rename to tools/PrettyIt.lhs
diff --git a/tools/RunTests.lhs b/tools/RunTests.lhs
new file mode 100644
index 0000000..560079a
--- /dev/null
+++ b/tools/RunTests.lhs
@@ -0,0 +1,8 @@
+
+
+> import Test.Framework
+
+> import Language.SQL.SimpleSQL.Tests
+
+> main :: IO ()
+> main = defaultMain [tests]
diff --git a/Tpch.lhs b/tools/Tpch.lhs
similarity index 100%
rename from Tpch.lhs
rename to tools/Tpch.lhs
diff --git a/tpch.sql b/tpch.sql
deleted file mode 100644
index cb0f161..0000000
--- a/tpch.sql
+++ /dev/null
@@ -1,689 +0,0 @@
--- q1
-select
-        l_returnflag,
-        l_linestatus,
-        sum(l_quantity) as sum_qty,
-        sum(l_extendedprice) as sum_base_price,
-        sum(l_extendedprice * (1 - l_discount)) as sum_disc_price,
-        sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge,
-        avg(l_quantity) as avg_qty,
-        avg(l_extendedprice) as avg_price,
-        avg(l_discount) as avg_disc,
-        count(*) as count_order
-from
-        lineitem
-where
-        l_shipdate <= date '1998-12-01' - interval '63' day (3)
-group by
-        l_returnflag,
-        l_linestatus
-order by
-        l_returnflag,
-        l_linestatus;
-
--- q2
-
-select
-        s_acctbal,
-        s_name,
-        n_name,
-        p_partkey,
-        p_mfgr,
-        s_address,
-        s_phone,
-        s_comment
-from
-        part,
-        supplier,
-        partsupp,
-        nation,
-        region
-where
-        p_partkey = ps_partkey
-        and s_suppkey = ps_suppkey
-        and p_size = 15
-        and p_type like '%BRASS'
-        and s_nationkey = n_nationkey
-        and n_regionkey = r_regionkey
-        and r_name = 'EUROPE'
-        and ps_supplycost = (
-                select
-                        min(ps_supplycost)
-                from
-                        partsupp,
-                        supplier,
-                        nation,
-                        region
-                where
-                        p_partkey = ps_partkey
-                        and s_suppkey = ps_suppkey
-                        and s_nationkey = n_nationkey
-                        and n_regionkey = r_regionkey
-                        and r_name = 'EUROPE'
-        )
-order by
-        s_acctbal desc,
-        n_name,
-        s_name,
-        p_partkey
-limit 100;
---q3
-select
-        l_orderkey,
-        sum(l_extendedprice * (1 - l_discount)) as revenue,
-        o_orderdate,
-        o_shippriority
-from
-        customer,
-        orders,
-        lineitem
-where
-        c_mktsegment = 'MACHINERY'
-        and c_custkey = o_custkey
-        and l_orderkey = o_orderkey
-        and o_orderdate < date '1995-03-21'
-        and l_shipdate > date '1995-03-21'
-group by
-        l_orderkey,
-        o_orderdate,
-        o_shippriority
-order by
-        revenue desc,
-        o_orderdate
-limit 10;
-
--- q4
-select
-        o_orderpriority,
-        count(*) as order_count
-from
-        orders
-where
-        o_orderdate >= date '1996-03-01'
-        and o_orderdate < date '1996-03-01' + interval '3' month
-        and exists (
-                select
-                        *
-                from
-                        lineitem
-                where
-                        l_orderkey = o_orderkey
-                        and l_commitdate < l_receiptdate
-        )
-group by
-        o_orderpriority
-order by
-        o_orderpriority;
---q5
-select
-        n_name,
-        sum(l_extendedprice * (1 - l_discount)) as revenue
-from
-        customer,
-        orders,
-        lineitem,
-        supplier,
-        nation,
-        region
-where
-        c_custkey = o_custkey
-        and l_orderkey = o_orderkey
-        and l_suppkey = s_suppkey
-        and c_nationkey = s_nationkey
-        and s_nationkey = n_nationkey
-        and n_regionkey = r_regionkey
-        and r_name = 'EUROPE'
-        and o_orderdate >= date '1997-01-01'
-        and o_orderdate < date '1997-01-01' + interval '1' year
-group by
-        n_name
-order by
-        revenue desc;
-
--- q6
-
-select
-        sum(l_extendedprice * l_discount) as revenue
-from
-        lineitem
-where
-        l_shipdate >= date '1997-01-01'
-        and l_shipdate < date '1997-01-01' + interval '1' year
-        and l_discount between 0.07 - 0.01 and 0.07 + 0.01
-        and l_quantity < 24;
-
---q7
-select
-        supp_nation,
-        cust_nation,
-        l_year,
-        sum(volume) as revenue
-from
-        (
-                select
-                        n1.n_name as supp_nation,
-                        n2.n_name as cust_nation,
-                        extract(year from l_shipdate) as l_year,
-                        l_extendedprice * (1 - l_discount) as volume
-                from
-                        supplier,
-                        lineitem,
-                        orders,
-                        customer,
-                        nation n1,
-                        nation n2
-                where
-                        s_suppkey = l_suppkey
-                        and o_orderkey = l_orderkey
-                        and c_custkey = o_custkey
-                        and s_nationkey = n1.n_nationkey
-                        and c_nationkey = n2.n_nationkey
-                        and (
-                                (n1.n_name = 'PERU' and n2.n_name = 'IRAQ')
-                                or (n1.n_name = 'IRAQ' and n2.n_name = 'PERU')
-                        )
-                        and l_shipdate between date '1995-01-01' and date '1996-12-31'
-        ) as shipping
-group by
-        supp_nation,
-        cust_nation,
-        l_year
-order by
-        supp_nation,
-        cust_nation,
-        l_year;
--- q8
-select
-        o_year,
-        sum(case
-                when nation = 'IRAQ' then volume
-                else 0
-        end) / sum(volume) as mkt_share
-from
-        (
-                select
-                        extract(year from o_orderdate) as o_year,
-                        l_extendedprice * (1 - l_discount) as volume,
-                        n2.n_name as nation
-                from
-                        part,
-                        supplier,
-                        lineitem,
-                        orders,
-                        customer,
-                        nation n1,
-                        nation n2,
-                        region
-                where
-                        p_partkey = l_partkey
-                        and s_suppkey = l_suppkey
-                        and l_orderkey = o_orderkey
-                        and o_custkey = c_custkey
-                        and c_nationkey = n1.n_nationkey
-                        and n1.n_regionkey = r_regionkey
-                        and r_name = 'MIDDLE EAST'
-                        and s_nationkey = n2.n_nationkey
-                        and o_orderdate between date '1995-01-01' and date '1996-12-31'
-                        and p_type = 'STANDARD ANODIZED BRASS'
-        ) as all_nations
-group by
-        o_year
-order by
-        o_year;
--- q9
-
-select
-        nation,
-        o_year,
-        sum(amount) as sum_profit
-from
-        (
-                select
-                        n_name as nation,
-                        extract(year from o_orderdate) as o_year,
-                        l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity as amount
-                from
-                        part,
-                        supplier,
-                        lineitem,
-                        partsupp,
-                        orders,
-                        nation
-                where
-                        s_suppkey = l_suppkey
-                        and ps_suppkey = l_suppkey
-                        and ps_partkey = l_partkey
-                        and p_partkey = l_partkey
-                        and o_orderkey = l_orderkey
-                        and s_nationkey = n_nationkey
-                        and p_name like '%antique%'
-        ) as profit
-group by
-        nation,
-        o_year
-order by
-        nation,
-        o_year desc;
--- q10
-
-select
-        c_custkey,
-        c_name,
-        sum(l_extendedprice * (1 - l_discount)) as revenue,
-        c_acctbal,
-        n_name,
-        c_address,
-        c_phone,
-        c_comment
-from
-        customer,
-        orders,
-        lineitem,
-        nation
-where
-        c_custkey = o_custkey
-        and l_orderkey = o_orderkey
-        and o_orderdate >= date '1993-12-01'
-        and o_orderdate < date '1993-12-01' + interval '3' month
-        and l_returnflag = 'R'
-        and c_nationkey = n_nationkey
-group by
-        c_custkey,
-        c_name,
-        c_acctbal,
-        c_phone,
-        n_name,
-        c_address,
-        c_comment
-order by
-        revenue desc
-limit 20;
-
--- q11
-select
-        ps_partkey,
-        sum(ps_supplycost * ps_availqty) as value
-from
-        partsupp,
-        supplier,
-        nation
-where
-        ps_suppkey = s_suppkey
-        and s_nationkey = n_nationkey
-        and n_name = 'CHINA'
-group by
-        ps_partkey having
-                sum(ps_supplycost * ps_availqty) > (
-                        select
-                                sum(ps_supplycost * ps_availqty) * 0.0001000000
-                        from
-                                partsupp,
-                                supplier,
-                                nation
-                        where
-                                ps_suppkey = s_suppkey
-                                and s_nationkey = n_nationkey
-                                and n_name = 'CHINA'
-                )
-order by
-        value desc;
--- q12
-
-select
-        l_shipmode,
-        sum(case
-                when o_orderpriority = '1-URGENT'
-                        or o_orderpriority = '2-HIGH'
-                        then 1
-                else 0
-        end) as high_line_count,
-        sum(case
-                when o_orderpriority <> '1-URGENT'
-                        and o_orderpriority <> '2-HIGH'
-                        then 1
-                else 0
-        end) as low_line_count
-from
-        orders,
-        lineitem
-where
-        o_orderkey = l_orderkey
-        and l_shipmode in ('AIR', 'RAIL')
-        and l_commitdate < l_receiptdate
-        and l_shipdate < l_commitdate
-        and l_receiptdate >= date '1994-01-01'
-        and l_receiptdate < date '1994-01-01' + interval '1' year
-group by
-        l_shipmode
-order by
-        l_shipmode;
-
--- q13
-
-select
-        c_count,
-        count(*) as custdist
-from
-        (
-                select
-                        c_custkey,
-                        count(o_orderkey)
-                from
-                        customer left outer join orders on
-                                c_custkey = o_custkey
-                                and o_comment not like '%pending%requests%'
-                group by
-                        c_custkey
-        ) as c_orders (c_custkey, c_count)
-group by
-        c_count
-order by
-        custdist desc,
-        c_count desc;
-
--- q14
-
-select
-        100.00 * sum(case
-                when p_type like 'PROMO%'
-                        then l_extendedprice * (1 - l_discount)
-                else 0
-        end) / sum(l_extendedprice * (1 - l_discount)) as promo_revenue
-from
-        lineitem,
-        part
-where
-        l_partkey = p_partkey
-        and l_shipdate >= date '1994-12-01'
-        and l_shipdate < date '1994-12-01' + interval '1' month;
-
--- q15
-/*create view revenue0 (supplier_no, total_revenue) as
-        select
-                l_suppkey,
-                sum(l_extendedprice * (1 - l_discount))
-        from
-                lineitem
-        where
-                l_shipdate >= date '1995-06-01'
-                and l_shipdate < date '1995-06-01' + interval '3' month
-        group by
-                l_suppkey;*/
-
-with
-revenue0 as
-        (select
-                l_suppkey as supplier_no,
-                sum(l_extendedprice * (1 - l_discount)) as total_revenue
-        from
-                lineitem
-        where
-                l_shipdate >= date '1995-06-01'
-                and l_shipdate < date '1995-06-01' + interval '3' month
-        group by
-                l_suppkey)
-select
-        s_suppkey,
-        s_name,
-        s_address,
-        s_phone,
-        total_revenue
-from
-        supplier,
-        revenue0
-where
-        s_suppkey = supplier_no
-        and total_revenue = (
-                select
-                        max(total_revenue)
-                from
-                        revenue0
-        )
-order by
-        s_suppkey;
-
--- q16
-
-select
-        p_brand,
-        p_type,
-        p_size,
-        count(distinct ps_suppkey) as supplier_cnt
-from
-        partsupp,
-        part
-where
-        p_partkey = ps_partkey
-        and p_brand <> 'Brand#15'
-        and p_type not like 'MEDIUM BURNISHED%'
-        and p_size in (39, 26, 18, 45, 19, 1, 3, 9)
-        and ps_suppkey not in (
-                select
-                        s_suppkey
-                from
-                        supplier
-                where
-                        s_comment like '%Customer%Complaints%'
-        )
-group by
-        p_brand,
-        p_type,
-        p_size
-order by
-        supplier_cnt desc,
-        p_brand,
-        p_type,
-        p_size;
-
--- q17
-
-select
-        sum(l_extendedprice) / 7.0 as avg_yearly
-from
-        lineitem,
-        part
-where
-        p_partkey = l_partkey
-        and p_brand = 'Brand#52'
-        and p_container = 'JUMBO CAN'
-        and l_quantity < (
-                select
-                        0.2 * avg(l_quantity)
-                from
-                        lineitem
-                where
-                        l_partkey = p_partkey
-        );
-
--- q18
-select
-        c_name,
-        c_custkey,
-        o_orderkey,
-        o_orderdate,
-        o_totalprice,
-        sum(l_quantity)
-from
-        customer,
-        orders,
-        lineitem
-where
-        o_orderkey in (
-                select
-                        l_orderkey
-                from
-                        lineitem
-                group by
-                        l_orderkey having
-                                sum(l_quantity) > 313
-        )
-        and c_custkey = o_custkey
-        and o_orderkey = l_orderkey
-group by
-        c_name,
-        c_custkey,
-        o_orderkey,
-        o_orderdate,
-        o_totalprice
-order by
-        o_totalprice desc,
-        o_orderdate
-limit 100;
-
--- q19
-select
-        sum(l_extendedprice* (1 - l_discount)) as revenue
-from
-        lineitem,
-        part
-where
-        (
-                p_partkey = l_partkey
-                and p_brand = 'Brand#43'
-                and p_container in ('SM CASE', 'SM BOX', 'SM PACK', 'SM PKG')
-                and l_quantity >= 3 and l_quantity <= 3 + 10
-                and p_size between 1 and 5
-                and l_shipmode in ('AIR', 'AIR REG')
-                and l_shipinstruct = 'DELIVER IN PERSON'
-        )
-        or
-        (
-                p_partkey = l_partkey
-                and p_brand = 'Brand#25'
-                and p_container in ('MED BAG', 'MED BOX', 'MED PKG', 'MED PACK')
-                and l_quantity >= 10 and l_quantity <= 10 + 10
-                and p_size between 1 and 10
-                and l_shipmode in ('AIR', 'AIR REG')
-                and l_shipinstruct = 'DELIVER IN PERSON'
-        )
-        or
-        (
-                p_partkey = l_partkey
-                and p_brand = 'Brand#24'
-                and p_container in ('LG CASE', 'LG BOX', 'LG PACK', 'LG PKG')
-                and l_quantity >= 22 and l_quantity <= 22 + 10
-                and p_size between 1 and 15
-                and l_shipmode in ('AIR', 'AIR REG')
-                and l_shipinstruct = 'DELIVER IN PERSON'
-        );
-
--- q20
-select
-        s_name,
-        s_address
-from
-        supplier,
-        nation
-where
-        s_suppkey in (
-                select
-                        ps_suppkey
-                from
-                        partsupp
-                where
-                        ps_partkey in (
-                                select
-                                        p_partkey
-                                from
-                                        part
-                                where
-                                        p_name like 'lime%'
-                        )
-                        and ps_availqty > (
-                                select
-                                        0.5 * sum(l_quantity)
-                                from
-                                        lineitem
-                                where
-                                        l_partkey = ps_partkey
-                                        and l_suppkey = ps_suppkey
-                                        and l_shipdate >= date '1994-01-01'
-                                        and l_shipdate < date '1994-01-01' + interval '1' year
-                        )
-        )
-        and s_nationkey = n_nationkey
-        and n_name = 'VIETNAM'
-order by
-        s_name;
-
--- q21
-select
-        s_name,
-        count(*) as numwait
-from
-        supplier,
-        lineitem l1,
-        orders,
-        nation
-where
-        s_suppkey = l1.l_suppkey
-        and o_orderkey = l1.l_orderkey
-        and o_orderstatus = 'F'
-        and l1.l_receiptdate > l1.l_commitdate
-        and exists (
-                select
-                        *
-                from
-                        lineitem l2
-                where
-                        l2.l_orderkey = l1.l_orderkey
-                        and l2.l_suppkey <> l1.l_suppkey
-        )
-        and not exists (
-                select
-                        *
-                from
-                        lineitem l3
-                where
-                        l3.l_orderkey = l1.l_orderkey
-                        and l3.l_suppkey <> l1.l_suppkey
-                        and l3.l_receiptdate > l3.l_commitdate
-        )
-        and s_nationkey = n_nationkey
-        and n_name = 'INDIA'
-group by
-        s_name
-order by
-        numwait desc,
-        s_name
-limit 100;
-
--- q22
-
-select
-        cntrycode,
-        count(*) as numcust,
-        sum(c_acctbal) as totacctbal
-from
-        (
-                select
-                        substring(c_phone from 1 for 2) as cntrycode,
-                        c_acctbal
-                from
-                        customer
-                where
-                        substring(c_phone from 1 for 2) in
-                                ('41', '28', '39', '21', '24', '29', '44')
-                        and c_acctbal > (
-                                select
-                                        avg(c_acctbal)
-                                from
-                                        customer
-                                where
-                                        c_acctbal > 0.00
-                                        and substring(c_phone from 1 for 2) in
-                                                ('41', '28', '39', '21', '24', '29', '44')
-                        )
-                        and not exists (
-                                select
-                                        *
-                                from
-                                        orders
-                                where
-                                        o_custkey = c_custkey
-                        )
-        ) as custsale
-group by
-        cntrycode
-order by
-        cntrycode;