aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--minishell_test/config.py40
-rw-r--r--minishell_test/suites/builtin.py40
-rw-r--r--minishell_test/suites/cmd.py70
-rw-r--r--minishell_test/suites/flow.py212
-rw-r--r--minishell_test/suites/preprocess.py32
-rw-r--r--tests/test/test_test.py6
-rw-r--r--tests/test_config.py194
7 files changed, 406 insertions, 188 deletions
diff --git a/minishell_test/config.py b/minishell_test/config.py
index 2af1348..2334a48 100644
--- a/minishell_test/config.py
+++ b/minishell_test/config.py
@@ -6,7 +6,7 @@
# By: cacharle <me@cacharle.xyz> +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ #
# Created: 2021/02/26 09:40:36 by cacharle #+# #+# #
-# Updated: 2021/03/01 19:30:33 by cacharle ### ########.fr #
+# Updated: 2021/03/03 16:26:59 by cacharle ### ########.fr #
# #
# ############################################################################ #
@@ -15,9 +15,9 @@ import sys
import configparser
import inspect
import shutil
-import distutils
+import distutils.spawn
from pathlib import Path
-from typing import cast, List, Tuple
+from typing import cast, List, Tuple, Optional
import minishell_test.data
from minishell_test.args import parse_args
@@ -38,10 +38,10 @@ class ConfigParser(configparser.ConfigParser):
def getargs(self, section, options):
value = self.get(section, options)
- return value.strip().split(' ') if len(value) != 0 else []
+ return value.strip().split()
def getmultiline(self, section, options):
- return self.get(section, options).strip().split('\n')
+ return self.get(section, options).strip().splitlines()
class Config():
@@ -136,7 +136,7 @@ class Config():
if cls.check_leaks:
valgrind_path = distutils.spawn.find_executable("valgrind")
if valgrind_path is None:
- raise RuntimeError("could not find valgrind command on your system")
+ raise ConfigSetupException("Could not find the valgrind command on your system")
cls.valgrind_cmd = [
str(valgrind_path),
"--trace-children=no",
@@ -148,12 +148,12 @@ class Config():
cls.term_cols = shutil.get_terminal_size().columns
if cls.term_cols < 40:
- raise RuntimeError("You're terminal isn't wide enough 40 cols minimum required")
+ raise ConfigSetupException("You're terminal isn't wide enough 40 cols minimum required")
cls.platform = sys.platform
supported = ['linux', 'darwin']
if cls.platform not in supported:
- raise RuntimeError("Your platform ({cls.platform}) is not supported, supported platforms are: {', '.join(supported)}")
+ raise ConfigSetupException(f"Your platform ({cls.platform}) is not supported, supported platforms are: {', '.join(supported)}")
@classmethod
def _load_cfg(cls):
@@ -164,10 +164,30 @@ class Config():
for section in user_cfg:
if section not in cfg:
- raise RuntimeError(f"Unknown section name: {section}")
+ raise ConfigParserException(section)
for key in user_cfg[section]:
if key not in cfg[section]:
- raise RuntimeError(f"Unknown key name: {key}")
+ raise ConfigParserException(section, key)
cfg.read_dict({**cfg, **user_cfg})
return cfg
+
+
+class MinishellTestException(Exception):
+ pass
+
+
+class ConfigSetupException(MinishellTestException):
+ pass
+
+
+class ConfigParserException(MinishellTestException):
+ def __init__(self, section: str, key: Optional[str] = None):
+ self._section = section
+ self._key = key
+
+ def __str__(self) -> str:
+ if self._key is None:
+ return f"Configuration parsing error: unknown section name: {self._section}"
+ else:
+ return f"Configuration parsing error: unknown key name: {self._key} in {self._section}"
diff --git a/minishell_test/suites/builtin.py b/minishell_test/suites/builtin.py
index 900bd93..8310ce4 100644
--- a/minishell_test/suites/builtin.py
+++ b/minishell_test/suites/builtin.py
@@ -66,14 +66,14 @@ def suite_echo(test):
@suite()
def suite_export(test):
""" export builtin tests """
- test("export", hook=hooks.export_singleton)
- test("export", exports={"A": ""}, hook=hooks.export_singleton)
- test("export", exports={"A": "\""}, hook=hooks.export_singleton)
- test("export", exports={"A": "\\"}, hook=hooks.export_singleton)
- test("export", exports={"A": "$"}, hook=hooks.export_singleton)
- test("export", exports={"A": "\t"}, hook=hooks.export_singleton)
- test("export", exports={"A": "'"}, hook=hooks.export_singleton)
- test("export", exports={"A": "a"}, hook=hooks.export_singleton)
+ test("export", hooks=hooks.export_singleton)
+ test("export", exports={"A": ""}, hooks=hooks.export_singleton)
+ test("export", exports={"A": "\""}, hooks=hooks.export_singleton)
+ test("export", exports={"A": "\\"}, hooks=hooks.export_singleton)
+ test("export", exports={"A": "$"}, hooks=hooks.export_singleton)
+ test("export", exports={"A": "\t"}, hooks=hooks.export_singleton)
+ test("export", exports={"A": "'"}, hooks=hooks.export_singleton)
+ test("export", exports={"A": "a"}, hooks=hooks.export_singleton)
test("export A=a; echo $A")
test("export A=a B=b C=c; echo $A$B$C")
test("export A=a B=b C=c D=d E=e F=f G=g H=h I=i J=j K=k L=l"
@@ -116,7 +116,7 @@ def suite_export(test):
test("export 'asdf ' B ' asdf asdf asd f' ' asdf ' '' 'asdf ' C; echo $A$B$C")
test("export A 'asdf ' B ' asdf asdf asd f' ' asdf ' '' 'asdf '; echo $A$B$C")
test("export A B C; echo $A$B$C")
- test("export A B C; env", hook=hooks.sort_lines)
+ test("export A B C; env", hooks=hooks.sort_lines)
test("export 'AH@'=nop")
test("export \"AH'\"=nop")
test("export 'AH\"'=nop")
@@ -157,18 +157,18 @@ def suite_cd(test):
# hard and weird to implement with pwd
# test("cd /etc; pwd; echo $PWD")
test("echo $PWD; echo $OLDPWD; cd ''; pwd; echo $PWD; echo $OLDPWD")
- test("echo $PWD; echo $OLDPWD; cd '' ''; pwd; echo $PWD; echo $OLDPWD", hook=linux_discard)
- test("echo $PWD; echo $OLDPWD; cd '' '' ''; pwd; echo $PWD; echo $OLDPWD", hook=linux_discard)
+ test("echo $PWD; echo $OLDPWD; cd '' ''; pwd; echo $PWD; echo $OLDPWD", hooks=linux_discard)
+ test("echo $PWD; echo $OLDPWD; cd '' '' ''; pwd; echo $PWD; echo $OLDPWD", hooks=linux_discard)
test("echo $PWD; echo $OLDPWD; cd ' '; pwd; echo $PWD; echo $OLDPWD")
- test("echo $PWD; echo $OLDPWD; cd d ''; pwd; echo $PWD; echo $OLDPWD", setup="mkdir d", hook=linux_discard)
- test("echo $PWD; echo $OLDPWD; cd d d; pwd; echo $PWD; echo $OLDPWD", setup="mkdir d", hook=linux_discard)
- test("echo $PWD; echo $OLDPWD; cd d ' '; pwd; echo $PWD; echo $OLDPWD", setup="mkdir d", hook=linux_discard)
+ test("echo $PWD; echo $OLDPWD; cd d ''; pwd; echo $PWD; echo $OLDPWD", setup="mkdir d", hooks=linux_discard)
+ test("echo $PWD; echo $OLDPWD; cd d d; pwd; echo $PWD; echo $OLDPWD", setup="mkdir d", hooks=linux_discard)
+ test("echo $PWD; echo $OLDPWD; cd d ' '; pwd; echo $PWD; echo $OLDPWD", setup="mkdir d", hooks=linux_discard)
test("echo $PWD; echo $OLDPWD; cd $HOME; pwd; echo $PWD; echo $OLDPWD", exports={"HOME": os.getenv("HOME")})
test("echo $PWD; echo $OLDPWD; cd /; pwd; echo $PWD; echo $OLDPWD")
test("echo $PWD; echo $OLDPWD; cd /.; pwd; echo $PWD; echo $OLDPWD")
test("echo $PWD; echo $OLDPWD; cd /./; pwd; echo $PWD; echo $OLDPWD")
test("echo $PWD; echo $OLDPWD; cd /././././; pwd; echo $PWD; echo $OLDPWD")
- test("echo $PWD; echo $OLDPWD; cd //; pwd; echo $PWD; echo $OLDPWD", hook=hooks.replace_double("/"))
+ test("echo $PWD; echo $OLDPWD; cd //; pwd; echo $PWD; echo $OLDPWD", hooks=hooks.replace_double("/"))
test("echo $PWD; echo $OLDPWD; cd ///; pwd; echo $PWD; echo $OLDPWD")
test("echo $PWD; echo $OLDPWD; cd ////; pwd; echo $PWD; echo $OLDPWD")
test("echo $PWD; echo $OLDPWD; cd //////////////////////////////////////////////////////; pwd; echo $PWD; echo $OLDPWD")
@@ -179,7 +179,7 @@ def suite_cd(test):
test("echo $PWD; echo $OLDPWD; cd ' /'; pwd; echo $PWD; echo $OLDPWD")
test("echo $PWD; echo $OLDPWD; cd ' / '; pwd; echo $PWD; echo $OLDPWD")
test("echo $PWD; echo $OLDPWD; cd ' // '; pwd; echo $PWD; echo $OLDPWD")
- test("echo $PWD; echo $OLDPWD; cd //home; pwd; echo $PWD; echo $OLDPWD", hook=hooks.replace_double("/"))
+ test("echo $PWD; echo $OLDPWD; cd //home; pwd; echo $PWD; echo $OLDPWD", hooks=hooks.replace_double("/"))
test("echo $PWD; echo $OLDPWD; cd ' //home'; pwd; echo $PWD; echo $OLDPWD")
test("echo $PWD; echo $OLDPWD; cd ' //home '; pwd; echo $PWD; echo $OLDPWD")
test("echo $PWD; echo $OLDPWD; cd d; echo $OLDPWD", setup="mkdir -m 000 d")
@@ -302,10 +302,10 @@ def suite_pwd(test):
@suite()
def suite_env(test):
""" env builtin tests """
- test("env", hook=[hooks.sort_lines, hooks.shlvl_0_to_1])
- test("env", setup="export A=a", hook=[hooks.sort_lines, hooks.shlvl_0_to_1])
- test("env", setup="export A=a B=b C=c", hook=[hooks.sort_lines, hooks.shlvl_0_to_1])
- test("env | cat -e", setup="export A=a B=b C=c", hook=[hooks.sort_lines, hooks.shlvl_0_to_1])
+ test("env", hooks=[hooks.sort_lines, hooks.shlvl_0_to_1])
+ test("env", setup="export A=a", hooks=[hooks.sort_lines, hooks.shlvl_0_to_1])
+ test("env", setup="export A=a B=b C=c", hooks=[hooks.sort_lines, hooks.shlvl_0_to_1])
+ test("env | cat -e", setup="export A=a B=b C=c", hooks=[hooks.sort_lines, hooks.shlvl_0_to_1])
test("Env")
test("enV")
test("Env", exports={"PATH": "/bin:/usr/bin"})
diff --git a/minishell_test/suites/cmd.py b/minishell_test/suites/cmd.py
index 66acf97..a4c4e88 100644
--- a/minishell_test/suites/cmd.py
+++ b/minishell_test/suites/cmd.py
@@ -68,21 +68,21 @@ def suite_redirection(test):
files=["abcdefghijklmnopqrstuvwxyz"])
test("> file", files=["file"])
test("< file", setup="echo bonjour > file")
- test(">", hook=hooks.error_line0, hook_status=hooks.platform_status(1, 2))
- test(">>", hook=hooks.error_line0, hook_status=hooks.platform_status(1, 2))
- test("<", hook=hooks.error_line0, hook_status=hooks.platform_status(1, 2))
- test("echo >", hook=hooks.error_line0, hook_status=hooks.platform_status(1, 2))
- test("echo >>", hook=hooks.error_line0, hook_status=hooks.platform_status(1, 2))
- test("echo <", hook=hooks.error_line0, hook_status=hooks.platform_status(1, 2))
+ test(">", hooks=hooks.error_line0, hook_status=hooks.platform_status(1, 2))
+ test(">>", hooks=hooks.error_line0, hook_status=hooks.platform_status(1, 2))
+ test("<", hooks=hooks.error_line0, hook_status=hooks.platform_status(1, 2))
+ test("echo >", hooks=hooks.error_line0, hook_status=hooks.platform_status(1, 2))
+ test("echo >>", hooks=hooks.error_line0, hook_status=hooks.platform_status(1, 2))
+ test("echo <", hooks=hooks.error_line0, hook_status=hooks.platform_status(1, 2))
test("> test", files=["test"])
test(">> test", files=["test"])
test("< test", setup="touch test")
- test("echo foo >>> bar", hook=hooks.error_line0, hook_status=hooks.platform_status(1, 2))
- test("echo foo >>>> bar", hook=hooks.error_line0, hook_status=hooks.platform_status(1, 2))
- test("echo foo >>>>> bar", hook=hooks.error_line0, hook_status=hooks.platform_status(1, 2))
- test("cat << < bar", setup="echo bonjour > bar", hook=hooks.error_line0, hook_status=hooks.platform_status(1, 2))
- test("cat << << bar", setup="echo bonjour > bar", hook=hooks.error_line0, hook_status=hooks.platform_status(1, 2))
- test("cat <<<<< bar", setup="echo bonjour > bar", hook=hooks.error_line0, hook_status=hooks.platform_status(1, 2))
+ test("echo foo >>> bar", hooks=hooks.error_line0, hook_status=hooks.platform_status(1, 2))
+ test("echo foo >>>> bar", hooks=hooks.error_line0, hook_status=hooks.platform_status(1, 2))
+ test("echo foo >>>>> bar", hooks=hooks.error_line0, hook_status=hooks.platform_status(1, 2))
+ test("cat << < bar", setup="echo bonjour > bar", hooks=hooks.error_line0, hook_status=hooks.platform_status(1, 2))
+ test("cat << << bar", setup="echo bonjour > bar", hooks=hooks.error_line0, hook_status=hooks.platform_status(1, 2))
+ test("cat <<<<< bar", setup="echo bonjour > bar", hooks=hooks.error_line0, hook_status=hooks.platform_status(1, 2))
test("cat < doesnotexist")
test("echo bonjour >> a", setup="echo a > a", files=["a"])
test("echo bonjour >> a >> a", setup="echo a > a", files=["a"])
@@ -173,15 +173,15 @@ def suite_cmd_path(test):
test("./somefile", setup="echo > somefile; chmod 111 somefile")
test("./somefile", setup="echo > somefile; chmod 222 somefile")
test("./somefile", setup="echo > somefile; chmod 333 somefile")
- test("somedir/", setup="mkdir somedir", hook=hooks.is_directory)
- test("./somedir/", setup="mkdir somedir", hook=hooks.is_directory)
+ test("somedir/", setup="mkdir somedir", hooks=hooks.is_directory)
+ test("./somedir/", setup="mkdir somedir", hooks=hooks.is_directory)
test("somedir", setup="mkdir somedir")
- test("./somedir", setup="mkdir somedir", hook=hooks.is_directory)
+ test("./somedir", setup="mkdir somedir", hooks=hooks.is_directory)
test("somedir", setup="mkdir somedir")
- test("somedirsoftlink/", setup="mkdir somedir; ln -s somedir somedirsoftlink", hook=hooks.is_directory)
- test("./somedirsoftlink/", setup="mkdir somedir; ln -s somedir somedirsoftlink", hook=hooks.is_directory)
+ test("somedirsoftlink/", setup="mkdir somedir; ln -s somedir somedirsoftlink", hooks=hooks.is_directory)
+ test("./somedirsoftlink/", setup="mkdir somedir; ln -s somedir somedirsoftlink", hooks=hooks.is_directory)
test("somedirsoftlink", setup="mkdir somedir; ln -s somedir somedirsoftlink")
- test("./somedirsoftlink", setup="mkdir somedir; ln -s somedir somedirsoftlink", hook=hooks.is_directory)
+ test("./somedirsoftlink", setup="mkdir somedir; ln -s somedir somedirsoftlink", hooks=hooks.is_directory)
test("somedirsoftlink", setup="mkdir somedir; ln -s somedir somedirsoftlink")
test("./someremovedlink", setup="touch somefile; ln -s somefile someremovedlink; rm -f somefile")
test("./somelink2", setup="touch somefile; ln -s somefile somelink1; ln -s somelink1 somelink2")
@@ -201,8 +201,8 @@ def suite_cmd_path(test):
test("'-'", setup="touch -")
test("./_", setup="touch _")
test("./-", setup="touch a; mv a ./-")
- test("./.", setup="touch .", hook=hooks.is_directory)
- test("./..", setup="touch ..", hook=hooks.is_directory)
+ test("./.", setup="touch .", hooks=hooks.is_directory)
+ test("./..", setup="touch ..", hooks=hooks.is_directory)
test("./somefile", setup='echo > somefile && chmod 0777 somefile')
test("./somefile", setup='echo > somefile && chmod 1000 somefile')
test("./somefile", setup='echo > somefile && chmod 2000 somefile')
@@ -219,21 +219,21 @@ def suite_cmd_path(test):
test("./somefile", setup='echo > somefile && chmod 6777 somefile')
test("./somefile", setup='echo > somefile && chmod 7777 somefile')
test("./somefile", setup='echo > somefile && chmod 0000 somefile')
- test("./somedir", setup='mkdir -m 0777 somedir', hook=hooks.is_directory)
- test("./somedir", setup='mkdir -m 1000 somedir', hook=hooks.is_directory)
- test("./somedir", setup='mkdir -m 2000 somedir', hook=hooks.is_directory)
- test("./somedir", setup='mkdir -m 3000 somedir', hook=hooks.is_directory)
- test("./somedir", setup='mkdir -m 4000 somedir', hook=hooks.is_directory)
- test("./somedir", setup='mkdir -m 5000 somedir', hook=hooks.is_directory)
- test("./somedir", setup='mkdir -m 6000 somedir', hook=hooks.is_directory)
- test("./somedir", setup='mkdir -m 7000 somedir', hook=hooks.is_directory)
- test("./somedir", setup='mkdir -m 1777 somedir', hook=hooks.is_directory)
- test("./somedir", setup='mkdir -m 2777 somedir', hook=hooks.is_directory)
- test("./somedir", setup='mkdir -m 3777 somedir', hook=hooks.is_directory)
- test("./somedir", setup='mkdir -m 4777 somedir', hook=hooks.is_directory)
- test("./somedir", setup='mkdir -m 5777 somedir', hook=hooks.is_directory)
- test("./somedir", setup='mkdir -m 6777 somedir', hook=hooks.is_directory)
- test("./somedir", setup='mkdir -m 0000 somedir', hook=hooks.is_directory)
+ test("./somedir", setup='mkdir -m 0777 somedir', hooks=hooks.is_directory)
+ test("./somedir", setup='mkdir -m 1000 somedir', hooks=hooks.is_directory)
+ test("./somedir", setup='mkdir -m 2000 somedir', hooks=hooks.is_directory)
+ test("./somedir", setup='mkdir -m 3000 somedir', hooks=hooks.is_directory)
+ test("./somedir", setup='mkdir -m 4000 somedir', hooks=hooks.is_directory)
+ test("./somedir", setup='mkdir -m 5000 somedir', hooks=hooks.is_directory)
+ test("./somedir", setup='mkdir -m 6000 somedir', hooks=hooks.is_directory)
+ test("./somedir", setup='mkdir -m 7000 somedir', hooks=hooks.is_directory)
+ test("./somedir", setup='mkdir -m 1777 somedir', hooks=hooks.is_directory)
+ test("./somedir", setup='mkdir -m 2777 somedir', hooks=hooks.is_directory)
+ test("./somedir", setup='mkdir -m 3777 somedir', hooks=hooks.is_directory)
+ test("./somedir", setup='mkdir -m 4777 somedir', hooks=hooks.is_directory)
+ test("./somedir", setup='mkdir -m 5777 somedir', hooks=hooks.is_directory)
+ test("./somedir", setup='mkdir -m 6777 somedir', hooks=hooks.is_directory)
+ test("./somedir", setup='mkdir -m 0000 somedir', hooks=hooks.is_directory)
test("./Somefile", setup='echo > somefile && chmod 000 somefile')
test("./someFILE", setup='echo > somefile && chmod 000 somefile')
diff --git a/minishell_test/suites/flow.py b/minishell_test/suites/flow.py
index ff3b51f..67cd1b1 100644
--- a/minishell_test/suites/flow.py
+++ b/minishell_test/suites/flow.py
@@ -31,9 +31,9 @@ def suite_end(test):
test("echo; ")
test("echo ; ")
test("echo ;")
- test("; echo", hook=error_line0, hook_status=platform_status(2, 1))
- test(" ;echo", hook=error_line0, hook_status=platform_status(2, 1))
- test(" ; echo", hook=error_line0, hook_status=platform_status(2, 1))
+ test("; echo", hooks=error_line0, hook_status=platform_status(2, 1))
+ test(" ;echo", hooks=error_line0, hook_status=platform_status(2, 1))
+ test(" ; echo", hooks=error_line0, hook_status=platform_status(2, 1))
test("echo a; echo b; echo c; echo d; echo e; echo f; echo g; echo h; echo i;"
"echo j; echo k; echo l; echo m; echo c; echo c; echo c; echo c; echo c;"
"echo c; echo c; echo c; echo v; echo w; echo x; echo y; echo z")
@@ -43,17 +43,17 @@ def suite_end(test):
test("ls doesnotexists ; echo bonjour")
test("ls doesnotexists; echo bonjour")
test("echo bonjour; ls doesnotexists")
- test("echo a ; ;", hook=error_line0, hook_status=platform_status(2, 1))
- test("echo a ; ;", hook=error_line0, hook_status=platform_status(2, 1))
- test(";", hook=error_line0, hook_status=platform_status(2, 1))
- test("; ;", hook=error_line0, hook_status=platform_status(2, 1))
- test("; ; ;", hook=error_line0, hook_status=platform_status(2, 1))
- test("echo a ; ; echo b", hook=error_line0, hook_status=platform_status(2, 1))
- test(";;", hook=[error_line0, replace_double(";")], hook_status=platform_status(2, 1))
- test(";;;", hook=[error_line0, replace_double(";")], hook_status=platform_status(2, 1))
- test(";;;;;", hook=[error_line0, replace_double(";")], hook_status=platform_status(2, 1))
- test("echo a ;; echo b", hook=[error_line0, replace_double(";")], hook_status=platform_status(2, 1))
- test("echo a ;;;;; echo b", hook=[error_line0, replace_double(";")], hook_status=platform_status(2, 1))
+ test("echo a ; ;", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("echo a ; ;", hooks=error_line0, hook_status=platform_status(2, 1))
+ test(";", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("; ;", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("; ; ;", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("echo a ; ; echo b", hooks=error_line0, hook_status=platform_status(2, 1))
+ test(";;", hooks=[error_line0, replace_double(";")], hook_status=platform_status(2, 1))
+ test(";;;", hooks=[error_line0, replace_double(";")], hook_status=platform_status(2, 1))
+ test(";;;;;", hooks=[error_line0, replace_double(";")], hook_status=platform_status(2, 1))
+ test("echo a ;; echo b", hooks=[error_line0, replace_double(";")], hook_status=platform_status(2, 1))
+ test("echo a ;;;;; echo b", hooks=[error_line0, replace_double(";")], hook_status=platform_status(2, 1))
test("ls " + 40 * " ; ls", setup="touch a b c")
test("ls " + 80 * " ; ls", setup="touch a b c")
test("ls " + 40 * " ; ls" + ";", setup="touch a b c")
@@ -67,9 +67,9 @@ def suite_pipe(test):
test("cat -e /etc/shells | head -c 10")
test("cat -e /etc/shells | cat -e | head -c 10")
test("cat -e /etc/shells | cat -e | cat -e | head -c 10")
- test("cat -e /dev/random | head -c 10", hook=discard)
- test("cat -e /dev/random | cat -e | head -c 10", hook=discard)
- test("cat -e /dev/random | cat -e | cat -e | head -c 10", hook=discard)
+ test("cat -e /dev/random | head -c 10", hooks=discard)
+ test("cat -e /dev/random | cat -e | head -c 10", hooks=discard)
+ test("cat -e /dev/random | cat -e | cat -e | head -c 10", hooks=discard)
test("echo bonjour | cat")
test("echo bonjour | cat -e")
test("echo bonjour | cat -e | cat -e | cat -e | cat -e | cat -e | cat -e | cat -e")
@@ -78,18 +78,18 @@ def suite_pipe(test):
test("ls -l | cat -e | cat | cat | cat", setup="touch a b c d; mkdir m1 m2 m3")
test("ls -l | cat -e | cat -e | cat -e | cat -e", setup="touch a b c d; mkdir m1 m2 m3")
test("ls -l | cat -e < a", setup="touch a b c d; mkdir m1 m2 m3; echo bonjour > a")
- test("echo|", hook=discard, hook_status=platform_status(2, 1))
- test("echo |", hook=discard, hook_status=platform_status(2, 1))
- test("echo | ", hook=discard, hook_status=platform_status(2, 1))
- test("|cat", hook=error_line0, hook_status=platform_status(2, 1))
- test("| cat", hook=error_line0, hook_status=platform_status(2, 1))
- test(" | cat", hook=error_line0, hook_status=platform_status(2, 1))
+ test("echo|", hooks=discard, hook_status=platform_status(2, 1))
+ test("echo |", hooks=discard, hook_status=platform_status(2, 1))
+ test("echo | ", hooks=discard, hook_status=platform_status(2, 1))
+ test("|cat", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("| cat", hooks=error_line0, hook_status=platform_status(2, 1))
+ test(" | cat", hooks=error_line0, hook_status=platform_status(2, 1))
test("echo a | export A=a; echo $A")
test("export A=a | cat; echo $A")
- test("echo bonjour | | cat -e", hook=error_line0, hook_status=platform_status(2, 1))
+ test("echo bonjour | | cat -e", hooks=error_line0, hook_status=platform_status(2, 1))
test("echo bonjour | asdf")
test("asdf | echo bonjour")
- test("echo a ||| echo b", hook=error_line0, hook_status=platform_status(2, 1))
+ test("echo a ||| echo b", hooks=error_line0, hook_status=platform_status(2, 1))
test("ls " + 40 * " | ls", setup="touch a b c")
test("ls " + 80 * " | ls", setup="touch a b c")
test("echo bonjour " + 40 * " | cat -e")
@@ -110,13 +110,13 @@ def suite_and(test):
test("echo bonjour&& echo je")
test("echo bonjour &&echo je")
test("echo bonjour && echo je")
- test("echo bonjour&&", hook=discard, hook_status=platform_status(2, 1))
- test("echo&& ", hook=discard, hook_status=platform_status(2, 1))
- test("echo && ", hook=discard, hook_status=platform_status(2, 1))
- test("echo &&", hook=discard, hook_status=platform_status(2, 1))
- test("&&echo", hook=error_line0, hook_status=platform_status(2, 1))
- test("&& echo", hook=error_line0, hook_status=platform_status(2, 1))
- test(" && echo", hook=error_line0, hook_status=platform_status(2, 1))
+ test("echo bonjour&&", hooks=discard, hook_status=platform_status(2, 1))
+ test("echo&& ", hooks=discard, hook_status=platform_status(2, 1))
+ test("echo && ", hooks=discard, hook_status=platform_status(2, 1))
+ test("echo &&", hooks=discard, hook_status=platform_status(2, 1))
+ test("&&echo", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("&& echo", hooks=error_line0, hook_status=platform_status(2, 1))
+ test(" && echo", hooks=error_line0, hook_status=platform_status(2, 1))
test("echo a&& echo b&& echo c&& echo d&& echo e&& echo f&& echo g&& echo h&& echo i&&"
"echo j&& echo k&& echo l&& echo m&& echo c&& echo c&& echo c&& echo c&& echo c&&"
"echo c&& echo c&& echo c&& echo v&& echo w&& echo x&& echo y&& echo z")
@@ -136,13 +136,13 @@ def suite_or(test):
test("echo bonjour|| echo je")
test("echo bonjour ||echo je")
test("echo bonjour || echo je")
- test("echo bonjour||", hook=discard, hook_status=platform_status(2, 1))
- test("echo|| ", hook=discard, hook_status=platform_status(2, 1))
- test("echo || ", hook=discard, hook_status=platform_status(2, 1))
- test("echo ||", hook=discard, hook_status=platform_status(2, 1))
- test("||echo", hook=error_line0, hook_status=platform_status(2, 1))
- test("|| echo", hook=error_line0, hook_status=platform_status(2, 1))
- test(" || echo", hook=error_line0, hook_status=platform_status(2, 1))
+ test("echo bonjour||", hooks=discard, hook_status=platform_status(2, 1))
+ test("echo|| ", hooks=discard, hook_status=platform_status(2, 1))
+ test("echo || ", hooks=discard, hook_status=platform_status(2, 1))
+ test("echo ||", hooks=discard, hook_status=platform_status(2, 1))
+ test("||echo", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("|| echo", hooks=error_line0, hook_status=platform_status(2, 1))
+ test(" || echo", hooks=error_line0, hook_status=platform_status(2, 1))
test("echo a|| echo b|| echo c|| echo d|| echo e|| echo f|| echo g|| echo h|| echo i||"
"echo j|| echo k|| echo l|| echo m|| echo c|| echo c|| echo c|| echo c|| echo c||"
"echo c|| echo c|| echo c|| echo v|| echo w|| echo x|| echo y|| echo z")
@@ -216,81 +216,81 @@ def suite_parenthesis(test):
test("(cat /etc/shells) | (cat -e) | (cat -e) | (cat -e)")
test("(cat /etc/shells) | (cat -e) | (cat -e) | (cat -e) | (cat -e) | (cat -e) | (cat -e) | (cat -e) | (cat -e)")
test("(cat /etc/shells | (cat -e) | (cat -e) | (cat -e)",
- hook=[error_line0, error_eof_to_expected_token], hook_status=platform_status(2, 1))
+ hooks=[error_line0, error_eof_to_expected_token], hook_status=platform_status(2, 1))
test("(cat /etc/shells) | (cat -e) | (cat -e | (cat -e)",
- hook=[error_line0, error_eof_to_expected_token], hook_status=platform_status(2, 1))
+ hooks=[error_line0, error_eof_to_expected_token], hook_status=platform_status(2, 1))
@suite()
def suite_syntax_error(test):
""" separator syntax error test """
- test("< | a", hook=error_line0, hook_status=platform_status(2, 1))
- test("> | a", hook=error_line0, hook_status=platform_status(2, 1))
- test(">> | a", hook=error_line0, hook_status=platform_status(2, 1))
- test("< ; a", hook=error_line0, hook_status=platform_status(2, 1))
- test("> ; a", hook=error_line0, hook_status=platform_status(2, 1))
- test(">> ; a", hook=error_line0, hook_status=platform_status(2, 1))
- test("; | a", hook=error_line0, hook_status=platform_status(2, 1))
- test("; < a", hook=error_line0, hook_status=platform_status(2, 1))
- test("; > a", hook=error_line0, hook_status=platform_status(2, 1))
- test("; >> a", hook=error_line0, hook_status=platform_status(2, 1))
- test("| ; a", hook=error_line0, hook_status=platform_status(2, 1))
- test("| < a", hook=error_line0, hook_status=platform_status(2, 1))
- test("| > a", hook=error_line0, hook_status=platform_status(2, 1))
- test("| >> a", hook=error_line0, hook_status=platform_status(2, 1))
- test("> a ; a", hook=error_line0)
- test("< a ; a", hook=error_line0)
- test(">> a ; a", hook=error_line0)
- test(Config.lorem + " > >" + Config.lorem, hook=error_line0, hook_status=platform_status(2, 1))
- test(Config.lorem + " < <" + Config.lorem, hook=error_line0, hook_status=platform_status(2, 1))
- test(Config.lorem + " ; |" + Config.lorem, hook=error_line0, hook_status=platform_status(2, 1))
- test(Config.lorem + " | ;" + Config.lorem, hook=error_line0, hook_status=platform_status(2, 1))
+ test("< | a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("> | a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test(">> | a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("< ; a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("> ; a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test(">> ; a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("; | a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("; < a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("; > a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("; >> a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("| ; a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("| < a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("| > a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("| >> a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("> a ; a", hooks=error_line0)
+ test("< a ; a", hooks=error_line0)
+ test(">> a ; a", hooks=error_line0)
+ test(Config.lorem + " > >" + Config.lorem, hooks=error_line0, hook_status=platform_status(2, 1))
+ test(Config.lorem + " < <" + Config.lorem, hooks=error_line0, hook_status=platform_status(2, 1))
+ test(Config.lorem + " ; |" + Config.lorem, hooks=error_line0, hook_status=platform_status(2, 1))
+ test(Config.lorem + " | ;" + Config.lorem, hooks=error_line0, hook_status=platform_status(2, 1))
@suite(bonus=True)
def suite_syntax_error_bonus(test):
""" separator syntax error bonus test """
- test("< && a", hook=error_line0, hook_status=platform_status(2, 1))
- test("> && a", hook=error_line0, hook_status=platform_status(2, 1))
- test(">> && a", hook=error_line0, hook_status=platform_status(2, 1))
- test("< || a", hook=error_line0, hook_status=platform_status(2, 1))
- test("> || a", hook=error_line0, hook_status=platform_status(2, 1))
- test(">> || a", hook=error_line0, hook_status=platform_status(2, 1))
- test("< ( a", hook=error_line0, hook_status=platform_status(2, 1))
- test("> ( a", hook=error_line0, hook_status=platform_status(2, 1))
- test(">> ( a", hook=error_line0, hook_status=platform_status(2, 1))
- test("< ) a", hook=error_line0, hook_status=platform_status(2, 1))
- test("> ) a", hook=error_line0, hook_status=platform_status(2, 1))
- test(">> ) a", hook=error_line0, hook_status=platform_status(2, 1))
- test("&& < a", hook=error_line0, hook_status=platform_status(2, 1))
- test("&& > a", hook=error_line0, hook_status=platform_status(2, 1))
- test("&& >> a", hook=error_line0, hook_status=platform_status(2, 1))
- test("&& || a", hook=error_line0, hook_status=platform_status(2, 1))
- test("&& ( a", hook=error_line0, hook_status=platform_status(2, 1))
- test("&& ) a", hook=error_line0, hook_status=platform_status(2, 1))
- test("|| < a", hook=error_line0, hook_status=platform_status(2, 1))
- test("|| > a", hook=error_line0, hook_status=platform_status(2, 1))
- test("|| >> a", hook=error_line0, hook_status=platform_status(2, 1))
- test("|| && a", hook=error_line0, hook_status=platform_status(2, 1))
- test("|| ( a", hook=error_line0, hook_status=platform_status(2, 1))
- test("|| ) a", hook=error_line0, hook_status=platform_status(2, 1))
- test("( < a", hook=[error_line0, error_eof_to_expected_token], hook_status=platform_status(2, 1))
- test("( > a", hook=[error_line0, error_eof_to_expected_token], hook_status=platform_status(2, 1))
- test("( >> a", hook=[error_line0, error_eof_to_expected_token], hook_status=platform_status(2, 1))
- test(") < a", hook=error_line0, hook_status=platform_status(2, 1))
- test(") > a", hook=error_line0, hook_status=platform_status(2, 1))
- test(") >> a", hook=error_line0, hook_status=platform_status(2, 1))
- test("( && a", hook=error_line0, hook_status=platform_status(2, 1))
- test("( || a", hook=error_line0, hook_status=platform_status(2, 1))
- test("( ) a", hook=error_line0, hook_status=platform_status(2, 1))
- test(") && a", hook=error_line0, hook_status=platform_status(2, 1))
- test(") || a", hook=error_line0, hook_status=platform_status(2, 1))
- test(") ( a", hook=error_line0, hook_status=platform_status(2, 1))
- test("() a", hook=error_line0, hook_status=platform_status(2, 1))
- test("( a", hook=[error_line0, error_eof_to_expected_token], hook_status=platform_status(2, 1))
- test(") a", hook=error_line0, hook_status=platform_status(2, 1))
- test(Config.lorem + " && &&" + Config.lorem, hook=error_line0, hook_status=platform_status(2, 1))
- test(Config.lorem + " || ||" + Config.lorem, hook=error_line0, hook_status=platform_status(2, 1))
- test(Config.lorem + " ( (" + Config.lorem, hook=error_line0, hook_status=platform_status(2, 1))
- test(Config.lorem + " ) )" + Config.lorem, hook=error_line0, hook_status=platform_status(2, 1))
- test("(); () ;() ;() ;() ;() ;() ;() ;() ;() ;a", hook=error_line0, hook_status=platform_status(2, 1))
+ test("< && a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("> && a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test(">> && a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("< || a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("> || a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test(">> || a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("< ( a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("> ( a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test(">> ( a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("< ) a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("> ) a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test(">> ) a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("&& < a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("&& > a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("&& >> a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("&& || a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("&& ( a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("&& ) a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("|| < a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("|| > a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("|| >> a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("|| && a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("|| ( a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("|| ) a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("( < a", hooks=[error_line0, error_eof_to_expected_token], hook_status=platform_status(2, 1))
+ test("( > a", hooks=[error_line0, error_eof_to_expected_token], hook_status=platform_status(2, 1))
+ test("( >> a", hooks=[error_line0, error_eof_to_expected_token], hook_status=platform_status(2, 1))
+ test(") < a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test(") > a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test(") >> a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("( && a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("( || a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("( ) a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test(") && a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test(") || a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test(") ( a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("() a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test("( a", hooks=[error_line0, error_eof_to_expected_token], hook_status=platform_status(2, 1))
+ test(") a", hooks=error_line0, hook_status=platform_status(2, 1))
+ test(Config.lorem + " && &&" + Config.lorem, hooks=error_line0, hook_status=platform_status(2, 1))
+ test(Config.lorem + " || ||" + Config.lorem, hooks=error_line0, hook_status=platform_status(2, 1))
+ test(Config.lorem + " ( (" + Config.lorem, hooks=error_line0, hook_status=platform_status(2, 1))
+ test(Config.lorem + " ) )" + Config.lorem, hooks=error_line0, hook_status=platform_status(2, 1))
+ test("(); () ;() ;() ;() ;() ;() ;() ;() ;() ;a", hooks=error_line0, hook_status=platform_status(2, 1))
diff --git a/minishell_test/suites/preprocess.py b/minishell_test/suites/preprocess.py
index e3b5ff5..6e717a1 100644
--- a/minishell_test/suites/preprocess.py
+++ b/minishell_test/suites/preprocess.py
@@ -56,18 +56,18 @@ def suite_quote(test):
test("echo '\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"'")
test('echo "\'"')
test('echo "\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'"')
- test("echo '", hook=hooks.error_line0, hook_status=hooks.platform_status(2, 1))
- test('echo "', hook=hooks.error_line0, hook_status=hooks.platform_status(2, 1))
- test("echo '''", hook=hooks.error_line0, hook_status=hooks.platform_status(2, 1))
- test('echo """', hook=hooks.error_line0, hook_status=hooks.platform_status(2, 1))
- test("echo '''''''''''''''''''''''''''''''''''''''''''", hook=hooks.error_line0, hook_status=hooks.platform_status(2, 1))
- test('echo """""""""""""""""""""""""""""""""""""""""""', hook=hooks.error_line0, hook_status=hooks.platform_status(2, 1))
+ test("echo '", hooks=hooks.error_line0, hook_status=hooks.platform_status(2, 1))
+ test('echo "', hooks=hooks.error_line0, hook_status=hooks.platform_status(2, 1))
+ test("echo '''", hooks=hooks.error_line0, hook_status=hooks.platform_status(2, 1))
+ test('echo """', hooks=hooks.error_line0, hook_status=hooks.platform_status(2, 1))
+ test("echo '''''''''''''''''''''''''''''''''''''''''''", hooks=hooks.error_line0, hook_status=hooks.platform_status(2, 1))
+ test('echo """""""""""""""""""""""""""""""""""""""""""', hooks=hooks.error_line0, hook_status=hooks.platform_status(2, 1))
test("echo 'AH\\'")
- test('echo "AH\\"', hook=hooks.error_line0, hook_status=hooks.platform_status(2, 1))
+ test('echo "AH\\"', hooks=hooks.error_line0, hook_status=hooks.platform_status(2, 1))
test('echo "AH\\""')
- test("echo '\\''", hook=hooks.error_line0, hook_status=hooks.platform_status(2, 1))
+ test("echo '\\''", hooks=hooks.error_line0, hook_status=hooks.platform_status(2, 1))
test('echo "\\""')
- test('echo "\\\\""', hook=hooks.error_line0, hook_status=hooks.platform_status(2, 1))
+ test('echo "\\\\""', hooks=hooks.error_line0, hook_status=hooks.platform_status(2, 1))
test('echo bonjour > "fi le"', files=['fi le'])
test("echo bonjour > 'fi le'", files=['fi le'])
@@ -169,7 +169,7 @@ def suite_interpolation(test):
test('echo "@""$A" "@"', exports={"A": " "})
test('echo $A$B$C', exports={"A": "", "B": "", "C": ""})
test('echo bonjour > $A', exports={"A": 'file'}, files=['file'])
- test('echo bonjour > $A', exports={"A": 'fi le'}, files=['fi le'], hook=hooks.error_line0)
+ test('echo bonjour > $A', exports={"A": 'fi le'}, files=['fi le'], hooks=hooks.error_line0)
test('echo bonjour > "$A"', exports={"A": 'fi le'}, files=['fi le'])
test("echo bonjour > '$A'", exports={"A": 'fi le'}, files=['fi le'])
@@ -226,7 +226,7 @@ def suite_escape(test):
test(r"/bin/echo ' \$? '")
test(r"/bin/echo ' \\ '")
test(r"/bin/echo ' \\\ '")
- test("echo \\", hook=hooks.delete_escape)
+ test("echo \\", hooks=hooks.delete_escape)
test("echo \"\\\"\"'bonjour'")
@@ -242,11 +242,11 @@ def suite_spaces(test):
test("\t\t\t\t\t\techo\tfoo")
test("echo\tfoo\t\t\t\t\t\t")
test("\t\t\t\techo\t\t\t\tfoo\t\t\t\t")
- test("\fecho\ffoo", hook=hooks.should_not_be("foo\n"))
- test("\necho\nfoo", hook=hooks.should_not_be("foo\n"))
- test("\recho\rfoo", hook=hooks.should_not_be("foo\n"))
- test("\vecho\vfoo", hook=hooks.should_not_be("foo\n"))
- test("\t\r\v\fecho\v\t\r\vfoo", hook=hooks.should_not_be("foo\n"))
+ test("\fecho\ffoo", hooks=hooks.should_not_be("foo\n"))
+ test("\necho\nfoo", hooks=hooks.should_not_be("foo\n"))
+ test("\recho\rfoo", hooks=hooks.should_not_be("foo\n"))
+ test("\vecho\vfoo", hooks=hooks.should_not_be("foo\n"))
+ test("\t\r\v\fecho\v\t\r\vfoo", hooks=hooks.should_not_be("foo\n"))
test("")
test(" ")
test("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t")
diff --git a/tests/test/test_test.py b/tests/test/test_test.py
index 15f3e9b..cad0e19 100644
--- a/tests/test/test_test.py
+++ b/tests/test/test_test.py
@@ -6,7 +6,7 @@
# By: cacharle <me@cacharle.xyz> +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ #
# Created: 2021/03/02 18:48:57 by cacharle #+# #+# #
-# Updated: 2021/03/03 12:22:32 by cacharle ### ########.fr #
+# Updated: 2021/03/03 15:59:01 by cacharle ### ########.fr #
# #
# ############################################################################ #
@@ -29,6 +29,10 @@ Config.init([])
class TestTest:
+ @pytest.fixture(autouse=True)
+ def reset_config(self):
+ Config.init([])
+
def test_init_timeout(self):
assert Config.timeout_test == Test("")._timeout
assert Config.timeout_test == Test("", timeout=0)._timeout
diff --git a/tests/test_config.py b/tests/test_config.py
new file mode 100644
index 0000000..b0a9142
--- /dev/null
+++ b/tests/test_config.py
@@ -0,0 +1,194 @@
+# ############################################################################ #
+# #
+# ::: :::::::: #
+# test_config.py :+: :+: :+: #
+# +:+ +:+ +:+ #
+# By: cacharle <me@cacharle.xyz> +#+ +:+ +#+ #
+# +#+#+#+#+#+ +#+ #
+# Created: 2021/03/03 12:25:29 by cacharle #+# #+# #
+# Updated: 2021/03/03 16:27:07 by cacharle ### ########.fr #
+# #
+# ############################################################################ #
+
+import os
+import sys
+import pytest
+from pathlib import Path
+import contextlib
+import distutils.spawn
+import shutil
+
+from minishell_test import config
+from minishell_test.config import (
+ Config,
+ ConfigSetupException,
+ ConfigParser,
+ ConfigParserException,
+)
+
+
+Config.init([])
+
+
+class TestConfigParser:
+ @pytest.fixture
+ def config(self):
+ c = ConfigParser()
+ c.read_dict({
+ "general": {
+ "somepath": "bonjour/je/suis",
+ "someargs": "bonjour je suis",
+ "someargs_spaces": "bonjour je suis",
+ "someargs_around": " bonjour je suis ",
+ "someargs_spaces_only": " ",
+ "someargs_none": "",
+ "somemultiline": "bonjour\nje\nsuis",
+ "somemultiline_around": "\n\n bonjour\nje\nsuis\n\n",
+ "somemultiline_crlf": "bonjour\r\nje\r\nsuis",
+ "somemultiline_sep_only": "\n\n \n\n",
+ "somemultiline_none": "",
+ }
+ })
+ return c
+
+ def test_getpath(self, config):
+ p = config.getpath("general", "somepath")
+ assert isinstance(p, Path)
+ assert Path("bonjour/je/suis").resolve() == p
+
+ def test_getargs(self, config):
+ assert ["bonjour", "je", "suis"] == config.getargs("general", "someargs")
+ assert ["bonjour", "je", "suis"] == config.getargs("general", "someargs_spaces")
+ assert ["bonjour", "je", "suis"] == config.getargs("general", "someargs_around")
+ assert [] == config.getargs("general", "someargs_spaces_only")
+ assert [] == config.getargs("general", "someargs_none")
+
+ def test_getmultiline(self, config):
+ assert ["bonjour", "je", "suis"] == config.getmultiline("general", "somemultiline")
+ assert ["bonjour", "je", "suis"] == config.getmultiline("general", "somemultiline_around")
+ assert ["bonjour", "je", "suis"] == config.getmultiline("general", "somemultiline_crlf")
+ assert [] == config.getmultiline("general", "somemultiline_sep_only")
+ assert [] == config.getmultiline("general", "somemultiline_none")
+
+
+class TestConfig:
+ # @pytest.fixture
+ # def default_config(self):
+ # c = ConfigParser()
+ # c.read(config.DATA_DIR / 'default.cfg')
+ # return c
+ #
+ # @pytest.mark.parametrize(
+ # "config_dict",
+ # [
+ # {"minishell_test": {"bonus": True}},
+ # {"minishell_test": {"bonus": True}},
+ # ]
+ # )
+ # def test_load_cfg_defaults(self, tmpdir, config_dict, default_config):
+ # c = ConfigParser()
+ # c.read_dict(config_dict)
+ # for suite in default_config:
+ # for key in default_config:
+
+
+
+ @pytest.mark.parametrize(
+ "file_content",
+ [
+ ("foo", "[{}]\nbonus = true"),
+ ("minishell_test ", "[{}]\nbonus = true"),
+ (" minishell_test", "[{}]\nbonus = true"),
+ (" minishell_test ", "[{}]\nbonus = true"),
+ ("minishell_tes", "[{}]\nbonus = true"),
+ ("inishell_test", "[{}]\nbonus = true"),
+ ("shell_", "[{}]\nbonus = true"),
+ ("she ll", "[{}]\nbonus = true"),
+ ("shell:reference ", "[{}]\nbonus = true"),
+ ("timout", "[{}]\nbonus = true"),
+ ]
+ )
+ def test_load_cfg_unknown_section(self, tmpdir, file_content):
+ with open(tmpdir / config.CONFIG_FILENAME, "w") as file:
+ file.write(file_content[1].format(file_content[0]))
+ with pytest.raises(ConfigParserException) as e:
+ Config.init(["--path", str(tmpdir)])
+ assert file_content[0] == e.value._section
+ assert e.value._key is None
+ assert f"Configuration parsing error: unknown section name: {file_content[0]}" == e.value.__str__()
+
+ @pytest.mark.parametrize(
+ "file_content",
+ [
+ ("minishell_test", "bonu", "[{}]\n{} = true"),
+ ("minishell_test", "exec name", "[{}]\n{} = hello"),
+ ("minishell_test", "log_pat", "[{}]\n{} = a/b/c"),
+ ("minishell_test", "ager_prog", "[{}]\n{} = a/b/c"),
+ ("shell", "available_command", "[{}]\n{} = a/b/c"),
+ ("shell:reference", "pa", "[{}]\n{} = /bin/sh"),
+ ]
+ )
+ def test_load_cfg_unknown_section_key(self, tmpdir, file_content):
+ with open(tmpdir / config.CONFIG_FILENAME, "w") as file:
+ file.write(file_content[2].format(file_content[0], file_content[1]))
+ with pytest.raises(ConfigParserException) as e:
+ Config.init(["--path", str(tmpdir)])
+ assert file_content[0] == e.value._section
+ assert file_content[1] == e.value._key
+ assert f"Configuration parsing error: unknown key name: {file_content[1]} in {file_content[0]}" == e.value.__str__()
+
+ def test_init_cache_dir_xdg_cache_home(self, monkeypatch):
+ monkeypatch.setenv("XDG_CACHE_HOME", "bonjour")
+ Config.init([])
+ assert Path("bonjour", "minishell_test") == Config.cache_dir
+
+ def test_init_cache_dir_xdg_cache_home_missing(self, monkeypatch):
+ monkeypatch.delenv("XDG_CACHE_HOME")
+ Config.init([])
+ assert Path("~", ".cache", "minishell_test").expanduser() == Config.cache_dir
+
+ def test_init_cache_dir_home(self, monkeypatch):
+ monkeypatch.delenv("XDG_CACHE_HOME")
+ monkeypatch.setenv("HOME", "bonjour")
+ Config.init([])
+ assert Path("bonjour", ".cache", "minishell_test") == Config.cache_dir
+
+ def test_init_cache_dir_home_missing(self, monkeypatch):
+ monkeypatch.delenv("XDG_CACHE_HOME")
+ monkeypatch.delenv("HOME")
+ Config.init([])
+ assert Path(".cache", "minishell_test") == Config.cache_dir
+
+ def test_init_show_range(self):
+ Config.init([])
+ assert not Config.show_range
+ Config.init(["--show-range"])
+ assert Config.show_range
+ Config.init(["--check-leaks"])
+ assert Config.show_range
+ Config.init(["--range", "1", "100"])
+ assert Config.show_range
+
+ def test_init_valgrind_not_found(self):
+ prev = distutils.spawn.find_executable
+ distutils.spawn.find_executable = lambda _: None # noqa
+ with pytest.raises(ConfigSetupException) as e:
+ Config.init(["--check-leaks"])
+ distutils.spawn.find_executable = prev
+ assert "Could not find the valgrind command on your system" == e.value.__str__()
+
+ def test_init_term_cols_too_low(self):
+ prev = shutil.get_terminal_size
+ shutil.get_terminal_size = lambda: os.terminal_size((39, 80)) # noqa
+ with pytest.raises(ConfigSetupException) as e:
+ Config.init(["--check-leaks"])
+ shutil.get_terminal_size = prev
+ assert "You're terminal isn't wide enough 40 cols minimum required" == e.value.__str__()
+
+ def test_platform_not_supported(self):
+ prev = sys.platform
+ sys.platform = 'windows'
+ with pytest.raises(ConfigSetupException) as e:
+ Config.init(["--check-leaks"])
+ sys.platform = prev
+ assert "Your platform (windows) is not supported, supported platforms are: linux, darwin" == e.value.__str__()