NGLess-1.4.0: Tests-Src/Tests/Types.hs
{-# LANGUAGE TemplateHaskell #-}
module Tests.Types
( tgroup_Types
) where
import Test.Tasty.TH
import Test.Tasty.HUnit
import qualified Data.Text as T
import Tests.Utils
import Types
import Language
import BuiltinFunctions (builtinModule)
import NGLess.NGLEnvironment (NGLVersion(..))
tgroup_Types = $(testGroupGenerator)
mods = [builtinModule (NGLVersion 1 3)]
isOkTypes :: Script -> IO ()
isOkTypes script = case checktypes mods script of
(Right _) -> return ()
(Left err) -> assertFailure ("Type error on good code (error was '"++show err++"'")
isOkTypesText scriptText = case parsetest scriptText >>= checktypes mods of
(Right _) -> return ()
(Left err) -> assertFailure ("Type error on good code (error was '"++show err++"') for script: '"++T.unpack scriptText++"'")
isErrorText scriptText = isError $ parsetest scriptText>>= checktypes mods
case_bad_type_fastq = isError $ checktypes mods (Script Nothing [(0,FunctionCall (FuncName "fastq") (ConstInt 3) [] Nothing)])
case_good_type_fastq = isOkTypes (Script Nothing [(0,FunctionCall (FuncName "fastq") (ConstStr "fastq.fq") [] Nothing)])
case_type_complete = isOkTypesText
"ngless '0.0'\n\
\reads = fastq('input1.fq')\n\
\reads = unique(reads,max_copies=2)\n\
\preprocess(reads) using |read|:\n\
\ read = read[5:]\n\
\ read = substrim(read, min_quality=24)\n\
\ if len(read) < 30:\n\
\ discard\n"
case_indent_empty_line = isOkTypesText
"ngless '0.0'\n\
\reads = fastq('input1.fq')\n\
\preprocess(reads) using |read|:\n\
\ read = read[5:]\n\
\ \n\
\ if len(read) < 24:\n\
\ discard\n"
case_invalid_func_fastq = isError $ checktypes mods $
Script Nothing [(0,FunctionCall (FuncName "fastq") (ConstStr "fastq.fq") [(Variable "fname", ConstInt 10)] Nothing)]
-- unique
case_valid_funique_mc = isOkTypesText
"ngless '0.0'\n\
\x = fastq('fq')\n\
\unique(x, max_copies=10)\n"
case_invalid_funique_mc = isErrorText
"ngless '0.0'\n\
\x = fastq('fq')\n\
\unique(x, max_copies='test')\n"
-- substrim
case_valid_fsubstrim_mq = isOkTypesText
"ngless '0.0'\n\
\x = fastq('fq')\n\
\preprocess(x) using |read|:\n\
\ read = read[5:]\n\
\ read = substrim(read, min_quality=2)\n"
case_invalid_fsubstrim_mq = isErrorText
"ngless '0.0'\n\
\x = fastq('fq')\n\
\preprocess(x) using |read|:\n\
\ read = read[5:]\n\
\ read = substrim(read, min_quality='2')\n"
case_invalid_fmap_ref = isErrorText
"ngless '0.0'\n\
\x = fastq('fq')\n\
\map(x, reference=10)\n"
case_valid_fmap_ref = isOkTypesText
"ngless '0.0'\n\
\x = fastq('fq')\n\
\map(x, reference='xpto')\n"
-- count
case_valid_fannot_gff = isOkTypesText
"ngless '0.0'\n\
\x = fastq('fq')\n\
\y = map(x, reference='xpto')\n\
\count(y, gff_file='xpto')"
case_invalid_fannot_gff = isErrorText
"ngless '0.0'\n\
\x = fastq('fq')\n\
\y = map(x, reference='xpto')\n\
\count(y, gff_file={xpto})"
case_valid_fannot_mode = isOkTypesText
"ngless '0.0'\n\
\x = fastq('fq')\n\
\y = map(x, reference='xpto')\n\
\count(y, mode={union})"
case_invalid_fannot_mode = isErrorText
"ngless '0.0'\n\
\x = fastq('fq')\n\
\y = map(x, reference='xpto')\n\
\count(y, mode='union')"
case_valid_fannot_features = isOkTypesText
"ngless '0.0'\n\
\x = fastq('fq')\n\
\y = map(x, reference='xpto')\n\
\count(y, features=['gene'])"
case_invalid_fannot_features = isErrorText
"ngless '0.0'\n\
\x = fastq('fq')\n\
\y = map(x, reference='xpto')\n\
\count(y, features={gene})"
case_valid_fcount_min = isOkTypesText
"ngless '0.0'\n\
\x = fastq('fq')\n\
\y = map(x, reference='xpto')\n\
\z = count(y, features=['gene'], min=10)"
-- write
case_valid_fwrite_format = isOkTypesText
"ngless '0.0'\n\
\x = fastq('fq')\n\
\y = map(x, reference='xpto')\n\
\z = count(y, features=['gene'])\n\
\write(z, format={tsv})"
case_invalid_fwrite_format = isErrorText
"ngless '0.0'\n\
\x = fastq('fq')\n\
\y = map(x, reference='xpto')\n\
\z = count(y, features=[{gene}])\n\
\write(count(z), format='tsv')"
case_mixed_addition = isErrorText
"ngless '0.0'\n\
\nglessIsNotJS = 1 + '2'\n"