def test_name_and_abbrv_handling(self): """ Test that name abbreviation ordering and collisions are handled properly """ with pytest.raises(ParserError): Parser(Argument("arg1", abbrv="a"), Argument("arg2", abbrv="a")) with pytest.raises(ParserError): Parser(Argument("location")) with pytest.raises(ParserError): Parser(Argument("null", abbrv="n")) # Test that under no permutations is the ordering changed in the argparser sys.argv = f"main.py {os.path.join(UnitTestCollection.test_dir, _testdir)}".split( ) sample_args = [ Option("quick-mafs", default=0), Flag("Quick-flag", abbrv="Q"), Option("quick-boi", abbrv="q", default=1), ] for ordering in itertools.permutations(range(len(sample_args))): p = Parser(*(sample_args[i] for i in ordering)) args = p._argparser.parse_args() for i, (argname, value) in enumerate( except_keys(vars(args), [_fixdash(x) for x in Parser._reserved_names]).items()): arg = sample_args[ordering[i]] assert _fixdash(arg.name) == argname assert arg.default == value # Test naming conflicts with pytest.raises(ParserError): Parser(Argument("a-b"), Flag("a_b"))
def test_clear_folders(self): d = os.path.join(self.test_dir, _testdir) os.makedirs(d) with open(os.path.join(d, "tmp.txt"), "w") as f: f.write("") sys.argv = f"main.py {os.path.join(UnitTestCollection.test_dir, _testdir)}".split( ) parser = Parser() parser.parse_args(clear_folders=True) assert not os.listdir(d)
def test_no_default_section(self): sys.argv = _sample_argv_conf(self._no_default_file) parser = Parser(*_sample_arguments, multiple_jobs=False) job = parser.parse_args() assert job.name == "IAMNOTDEFAULT" assert job.location == os.path.join(self.test_dir, _testdir) assert job.gibstr == "not default" assert job.gib_num == float("3.2") assert job.arg_two == ["1", "2"]
def test_no_conf_multiple_jobs(self): sys.argv = _sample_argv + ["--name", "good-name"] parser = Parser(*_sample_arguments, multiple_jobs=True) jobs = parser.parse_args() assert len(jobs) == 1 job = jobs[0] assert job.name == "good-name" assert job.location == os.path.join(self.test_dir, _testdir, job.name) assert job.gibstr == "4" assert job.gib_num == float("3.2") assert job.arg_two == ["b", "c"] assert job.opt_int == 4 assert job.opt_d == 14 assert job.opt_many == list() assert job.iam_bool
def test_no_conf_single_job(self): sys.argv = _sample_argv parser = Parser(*_sample_arguments, multiple_jobs=False) job = parser.parse_args() assert isinstance(job, JobDescription) assert job.location == os.path.join(self.test_dir, _testdir) assert job.gibstr == "4" assert job.gib_num == float("3.2") assert job.arg_two == ["b", "c"] assert job.opt_int == 4 assert job.opt_d == 14 assert job.opt_many == list() assert job.iam_bool assert job.explicit_args == { "location", "gibstr", "gib_num", "arg_two", "opt_d", "iam_bool" }
def test_conf_multiple_jobs(self): sys.argv = _sample_argv_conf(self._multiple_jobs_file) parser = Parser(*_sample_arguments, multiple_jobs=True) jobs = parser.parse_args() assert len(jobs) == 2 assert jobs[0].name == "BUTWHATABOUTSECONDJOB" assert jobs[0].location == os.path.join(self.test_dir, _testdir, jobs[0].name) assert jobs[0].gibstr == "pistaccio" assert jobs[0].gib_num == float("3.2") assert jobs[0].opt_int == 4 assert jobs[0].opt_d == 6 assert not jobs[0].iam_bool assert jobs[1].name == "THETHIRDJOB" assert jobs[1].location == os.path.join(self.test_dir, _testdir, jobs[1].name) assert jobs[ 1].gibstr == "but they were all of them deceived, for another job was made" assert jobs[1].gib_num == float("3.2") assert jobs[1].opt_int == 5 assert jobs[1].opt_d == 16 assert jobs[1].opt_many == [float("1"), float("4.5"), float("-3")] assert jobs[1].iam_bool # Make sure an error is thrown if name is set from the command line sys.argv = _sample_argv_conf( self._default_file) + ["--name", "forbidden-name"] parser = Parser(*_sample_arguments, multiple_jobs=True) with pytest.raises(CLIError): parser.parse_args()
def test_no_unknown_args(self): # Test with command line argument sys.argv = _argv_template + ["--bar", "1", "--foo", "1"] parser = Parser(Argument("bar")) with pytest.raises(SystemExit) as pytest_wrapped_e: parser.parse_args() assert pytest_wrapped_e.type == SystemExit assert pytest_wrapped_e.value.code == 2 # Test with config argument sys.argv = _argv_template + ["-c", self._sample_single_nargs_file] parser = Parser(Option("bar", type=int, default=[1, 2])) with pytest.raises(KeyError): parser.parse_args()
def test_nargs(self): # Test an expected case sys.argv = _argv_template + ["--bar", "1", "2"] parser = Parser(Argument("bar", nargs=2, type=int), Option("foo", nargs=3, default=["a", "b", "c"]), Option("fizz", nargs=1, default=(1, ))) assert parser._arguments["fizz"].type is int args = parser.parse_args() assert len(args.bar) == 2 assert args.bar == [1, 2] assert len(args.foo) == 3 assert args.foo == ["a", "b", "c"] # Test if argument not given sys.argv = _argv_template parser = Parser(Argument("bar", nargs=0, type=int), ) with pytest.raises(ParserError): parser.parse_args() # Test if wrong number of arguments sys.argv = _argv_template + ["--bar", "1", "2"] parser = Parser(Argument("bar", nargs=3)) with pytest.raises(ValueError): parser.parse_args() parser = Parser(Option("bar", nargs=3, default=[1, 2, 3])) with pytest.raises(ValueError): parser.parse_args() # Make sure stuff also works if config file is wrong sys.argv = _argv_template + ["-c", self._sample_single_nargs_file] parser = Parser(Argument("foo", nargs=3)) with pytest.raises(ValueError): parser.parse_args() # Test type parsing parser = Parser(Argument("foo", nargs=2, type=int)) args = parser.parse_args() assert args.foo == [3, 4]
def test_non_optional_args(self): sys.argv = f"main.py {os.path.join(UnitTestCollection.test_dir, _testdir)} -c {self._multiple_jobs_file}".split( ) parser = Parser(*_sample_arguments, multiple_jobs=True) with pytest.raises(ParserError): parser.parse_args()
def test_conf_single_job(self): # Test with only default section sys.argv = _sample_argv_conf(self._single_job_file) parser = Parser(*_sample_arguments, multiple_jobs=False) job = parser.parse_args() assert job.name == "BUTWHATABOUTSECONDJOB" assert job.location == os.path.join(self.test_dir, _testdir) assert job.gibstr == "pistaccio" assert job.gib_num == float("3.2") assert job.opt_int == 4 assert job.opt_d == 6 assert not job.iam_bool # Test that multiple sections throws an error, unless DEFAULT is one of only two sections sys.argv = _sample_argv_conf(self._single_job_file) parser = Parser(*_sample_arguments, multiple_jobs=False) parser.parse_args() sys.argv = _sample_argv_conf(self._multiple_jobs_file) parser = Parser(*_sample_arguments, multiple_jobs=False) with pytest.raises(ConfigError): parser.parse_args()