Skip to content
This repository was archived by the owner on Jun 15, 2023. It is now read-only.

Commit 0b722b5

Browse files
committed
Fix remaining bugs, more robust tests
1 parent 11fed36 commit 0b722b5

File tree

18 files changed

+710
-703
lines changed

18 files changed

+710
-703
lines changed

bower.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@
2020
"purescript-pathy": "^4.0.0",
2121
"purescript-profunctor": "^3.2.0",
2222
"purescript-profunctor-lenses": "^3.2.0",
23-
"purescript-ejson": "^10.0.0",
23+
"purescript-ejson": "^10.0.1",
2424
"purescript-argonaut-codecs": "^3.1.0",
25-
"purescript-strongcheck": "^3.1.0"
25+
"purescript-quickcheck": "^4.4.0"
2626
},
2727
"devDependencies": {
2828
"purescript-argonaut": "^3.0.0",

src/SqlSquared.purs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ import SqlSquared.Lenses as Lenses
3535
import SqlSquared.Constructors as Constructors
3636
import SqlSquared.Parser as Parser
3737

38-
import Test.StrongCheck.Gen as Gen
38+
import Test.QuickCheck.Gen as Gen
3939

4040
type Sql = Mu (Sig.SqlF EJ.EJsonF)
4141

src/SqlSquared/Parser.purs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ withToken ∷ ∀ m a. Monad m ⇒ String → (Token → P.ParserT TokenStream m
6464
withToken err k =
6565
PC.try
6666
$ withErrorMessage (append $ err <> ", but got ")
67-
((withErrorMessage' (const "end of input") token) >>= k)
67+
$ (withErrorMessage' (const "end of input") token) >>= k
6868

6969
prettyParse
7070
a
@@ -387,7 +387,7 @@ functionExpr ∷ ∀ m t. SqlParser' m t
387387
functionExpr = PC.try do
388388
name ← ident <|> anyKeyword
389389
args ← parenList
390-
pure $ C.invokeFunction name args
390+
pure $ C.invokeFunction (S.toUpper name) args
391391

392392
functionDecl
393393
m a
@@ -692,7 +692,7 @@ _LIKE ∷ ∀ t. Corecursive t (Sig.SqlF EJ.EJsonF) ⇒ Maybe t → t → t →
692692
_LIKE mbEsc lhs rhs = C.invokeFunction "LIKE" $ lhs : rhs : (fromMaybe (C.string "\\") mbEsc) : L.Nil
693693

694694
_NOT t. Corecursive t (Sig.SqlF EJ.EJsonF) t t
695-
_NOT = C.unop Sig.Not
695+
_NOT = C.unop Sig.NotC.pars
696696

697697
_BINOP t. Corecursive t (Sig.SqlF EJ.EJsonF) t Sig.BinaryOperator t t
698698
_BINOP = flip C.binop

src/SqlSquared/Parser/Tokenizer.purs

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ operators =
8585
, "[*:]"
8686
, "[*]"
8787
, "[:*]"
88+
, "[_:]"
8889
, "[_]"
8990
, "..."
9091
, ".."
@@ -182,14 +183,12 @@ digits ∷ Array Char
182183
digits = ['0','1','2','3','4','5','6','7','8','9' ]
183184

184185
identOrKeyword m. Monad m P.ParserT String m Token
185-
identOrKeyword = PC.try quotedIdent <|> notQuotedIdentOrKeyword
186+
identOrKeyword = quotedIdent <|> notQuotedIdentOrKeyword
186187

187188
oneLineComment m. Monad m P.ParserT String m Token
188-
oneLineComment =
189-
PC.between (PS.string "--") (PS.string "\n")
190-
$ map (CommentS.fromCharArray)
191-
$ A.many $ PS.satisfy
192-
$ not ∘ eq '\n'
189+
oneLineComment = do
190+
_ ← PS.string "--"
191+
CommentS.fromCharArray <$> A.many (PS.satisfy (not ∘ eq '\n'))
193192

194193
multiLineComment m. Monad m P.ParserT String m Token
195194
multiLineComment = do
@@ -212,7 +211,7 @@ quotedIdent =
212211
map Identifier
213212
$ PC.between (PS.string "`") (PS.string "`")
214213
$ map S.fromCharArray
215-
$ A.some identChar
214+
$ A.some (PC.asErrorMessage "identifier character" identChar)
216215
where
217216
identChar = identEscape <|> identLetter
218217
identLetter = PS.satisfy (not ∘ eq '`')
@@ -245,11 +244,19 @@ charLit = PS.char '\'' *> charAtom <* PS.char '\''
245244
ch ← PS.anyChar
246245
LitStringS.singleton <$> case ch of
247246
'\''P.fail "Expected character"
248-
'\\' → charEscape <|> PS.anyChar
247+
'\\' → charEscape
249248
_ → pure ch
250249

251250
charEscape = do
252-
_ ← PS.char 'u'
251+
ch ← PS.anyChar
252+
case ch of
253+
't' → pure '\t'
254+
'r' → pure '\r'
255+
'n' → pure '\n'
256+
'u' → hexEscape
257+
_ → pure ch
258+
259+
hexEscape = do
253260
hex ← S.fromCharArray <$> sequence (A.replicate 4 PT.hexDigit)
254261
case Int.fromStringAs Int.hexadecimal hex of
255262
NothingP.fail "Expected character escape sequence"

src/SqlSquared/Signature.purs

Lines changed: 30 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ import Data.HugeInt as HI
5353
import Data.HugeNum as HN
5454
import Data.Int as Int
5555
import Data.Json.Extended as EJ
56-
import Data.List ((:))
5756
import Data.List as L
5857
import Data.Maybe (Maybe(..))
5958
import Data.Monoid (mempty)
@@ -75,8 +74,8 @@ import SqlSquared.Signature.Projection as PR
7574
import SqlSquared.Signature.Relation as RL
7675
import SqlSquared.Signature.UnaryOperator as UO
7776
import SqlSquared.Utils (type (×), (×), (∘), (⋙))
78-
import Test.StrongCheck.Arbitrary as SC
79-
import Test.StrongCheck.Gen as Gen
77+
import Test.QuickCheck.Arbitrary as QC
78+
import Test.QuickCheck.Gen as Gen
8079

8180
type BinopR a =
8281
{ lhs a
@@ -472,6 +471,7 @@ printSqlF printLiteralF = case _ of
472471
Match { expr, cases, else_ } →
473472
"CASE "
474473
<> expr
474+
<> " "
475475
<> F.intercalate " " (map CS.printCase cases)
476476
<> F.foldMap (" ELSE " <> _) else_
477477
<> " END"
@@ -501,7 +501,7 @@ printSqlDeclF = case _ of
501501
FunctionDecl { ident, args, body } →
502502
"CREATE FUNCTION "
503503
<> ID.printIdent ident
504-
<> "(" <> F.intercalate ", " (map (":" <> _) args) <> ") BEGIN "
504+
<> "(" <> F.intercalate ", " (append ":" ID.printIdent <$> args) <> ") BEGIN "
505505
<> body
506506
<> " END"
507507
Import s →
@@ -741,14 +741,14 @@ arbitrarySqlF
741741
CoalgebraM Gen.Gen (SqlF l) Int
742742
arbitrarySqlF genLiteral n
743743
| n < 2 =
744-
Gen.oneOf (map Literal $ genLiteral n)
744+
Gen.oneOf $ (Literal <$> genLiteral n) :|
745745
[ map Ident genIdent
746746
, map Vari genIdent
747747
, pure $ Splice Nothing
748748
, pure $ SetLiteral L.Nil
749749
]
750750
| otherwise = do
751-
Gen.oneOf (map Literal $ genLiteral n)
751+
Gen.oneOf $ (Literal <$> genLiteral n) :|
752752
[ pure $ Splice $ Just $ n - 1
753753
, pure $ Parens $ n - 1
754754
, genSetLiteral n
@@ -763,7 +763,7 @@ arbitrarySqlF genLiteral n
763763

764764
arbitrarySqlDeclF CoalgebraM Gen.Gen SqlDeclF Int
765765
arbitrarySqlDeclF n =
766-
Gen.oneOf genImport
766+
Gen.oneOf $ genImport :|
767767
[ genFunctionDecl n
768768
]
769769

@@ -780,12 +780,12 @@ genSetLiteral n = do
780780

781781
genBinop l. CoalgebraM Gen.Gen (SqlF l) Int
782782
genBinop n = do
783-
op ← SC.arbitrary
783+
op ← QC.arbitrary
784784
pure $ Binop { op, lhs: n - 1, rhs: n - 1 }
785785

786786
genUnop l. CoalgebraM Gen.Gen (SqlF l) Int
787787
genUnop n = do
788-
op ← SC.arbitrary
788+
op ← QC.arbitrary
789789
pure $ Unop { op, expr: n - 1 }
790790

791791
genInvokeFunction l. CoalgebraM Gen.Gen (SqlF l) Int
@@ -796,7 +796,7 @@ genInvokeFunction n = do
796796

797797
genMatch l. CoalgebraM Gen.Gen (SqlF l) Int
798798
genMatch n = do
799-
nothing ← SC.arbitrary
799+
nothing ← QC.arbitrary
800800
len ← Gen.chooseInt 0 $ n - 1
801801
let
802802
foldFn acc _ = do
@@ -809,7 +809,7 @@ genMatch n = do
809809
}
810810
genSwitch l. CoalgebraM Gen.Gen (SqlF l) Int
811811
genSwitch n = do
812-
nothing ← SC.arbitrary
812+
nothing ← QC.arbitrary
813813
len ← Gen.chooseInt 0 $ n - 1
814814
let
815815
foldFn acc _ = do
@@ -831,11 +831,11 @@ genLet n = do
831831
genSelect l. CoalgebraM Gen.Gen (SqlF l) Int
832832
genSelect n = do
833833
prjLen ← Gen.chooseInt 0 $ n - 1
834-
mbRelation ← SC.arbitrary
835-
mbFilter ← SC.arbitrary
836-
mbGroupBy ← SC.arbitrary
837-
mbOrderBy ← SC.arbitrary
838-
isDistinct ← SC.arbitrary
834+
mbRelation ← QC.arbitrary
835+
mbFilter ← QC.arbitrary
836+
mbGroupBy ← QC.arbitrary
837+
mbOrderBy ← QC.arbitrary
838+
isDistinct ← QC.arbitrary
839839

840840
let
841841
foldPrj acc _ = do
@@ -883,11 +883,8 @@ genImport = Import <$> genIdent
883883

884884
genIdent Gen.Gen String
885885
genIdent = do
886-
start ←
887-
Gen.elements "a"
888-
$ L.fromFoldable
889-
$ S.split (S.Pattern "") "bcdefghijklmnopqrstuvwxyz"
890-
body ← map (Int.toStringAs Int.hexadecimal) SC.arbitrary
886+
start ← Gen.elements $ "a" :| S.split (S.Pattern "") "bcdefghijklmnopqrstuvwxyz"
887+
body ← map (Int.toStringAs Int.hexadecimal) QC.arbitrary
891888
pure $ start <> body
892889

893890
genDecls Int Gen.Gen (L.List (SqlDeclF Int))
@@ -910,7 +907,7 @@ genSql ∷ ∀ t. Int → GenSql t
910907
genSql n
911908
| n < 2 = genLeaf
912909
| otherwise =
913-
Gen.oneOf (genLetP $ n - 1) [genQueryExprP $ n - 1]
910+
Gen.oneOf $ genLetP (n - 1) :| [ genQueryExprP (n - 1) ]
914911

915912
genLeaf t. GenSql t
916913
genLeaf =
@@ -931,21 +928,22 @@ genLetP n = do
931928

932929
genQueryExprP t. Int GenSql t
933930
genQueryExprP n
934-
| n < 2 = Gen.oneOf (genQueryP n) [ genDefinedExprP n ]
931+
| n < 2 = Gen.oneOf $ genQueryP n :| [ genDefinedExprP n ]
935932
| otherwise = do
936933
op ←
937-
Gen.elements BO.Limit
938-
$ BO.Offset : BO.Sample : BO.Union
939-
: BO.UnionAll : BO.Intersect : BO.IntersectAll
940-
: BO.Except : L.Nil
941-
lhs ← Gen.oneOf (genQueryP n) [ genDefinedExprP n ]
942-
rhs ← Gen.oneOf (genQueryP n) [ genDefinedExprP n ]
934+
Gen.elements $ BO.Limit :|
935+
[ BO.Offset, BO.Sample, BO.Union
936+
, BO.UnionAll, BO.Intersect, BO.IntersectAll
937+
, BO.Except
938+
]
939+
lhs ← Gen.oneOf $ genQueryP n :| [ genDefinedExprP n ]
940+
rhs ← Gen.oneOf $ genQueryP n :| [ genDefinedExprP n ]
943941
pure $ embed $ Binop { op, lhs, rhs }
944942

945943
genDefinedExprP t. Int GenSql t
946944
genDefinedExprP n = do
947-
binops ← Gen.vectorOf n SC.arbitrary
948-
unops ← Gen.vectorOf n SC.arbitrary
945+
binops ← Gen.vectorOf n QC.arbitrary
946+
unops ← Gen.vectorOf n QC.arbitrary
949947
start ← genPrimaryExprP n
950948
adds ← Gen.vectorOf n $ genPrimaryExprP n
951949
pure $ F.foldl foldFn start $ A.zip binops $ A.zip unops adds
@@ -961,7 +959,7 @@ genDefinedExprP n = do
961959

962960
genPrimaryExprP t. Int GenSql t
963961
genPrimaryExprP n =
964-
Gen.oneOf genLeaf
962+
Gen.oneOf $ genLeaf :|
965963
[ genCaseP n
966964
, genUnaryP n
967965
, genFunctionP n

0 commit comments

Comments
 (0)