from typing import List
import errors
from errors import DppArgparseInvalidCaseExpressionError
from taxonomy.taxonomy import Defect, Taxonomy
from bugscpp.command import TestCommand
[docs]def out_of_index_error(cmd: TestCommand, default_cmds: List[str], expr: str):
try:
cmd.parser.parse_args([*default_cmds, expr])
except DppArgparseInvalidCaseExpressionError:
return True
else:
return False
[docs]def test_validate_case(dummy_config):
d = dummy_config("test_validate_case")
cmd = TestCommand()
default_cmds = f"{str(d)} --case".split()
args = cmd.parser.parse_args([*default_cmds, "1,2,5,9"])
assert args.case == ({1, 2, 5, 9}, set())
args = cmd.parser.parse_args([*default_cmds, "1-5,5-9"])
assert args.case == ({1, 2, 3, 4, 5, 6, 7, 8, 9}, set())
args = cmd.parser.parse_args([*default_cmds, "1-5,5-9:"])
assert args.case == ({1, 2, 3, 4, 5, 6, 7, 8, 9}, set())
args = cmd.parser.parse_args([*default_cmds, "1-5,5-9:1"])
assert args.case == ({1, 2, 3, 4, 5, 6, 7, 8, 9}, {1})
args = cmd.parser.parse_args([*default_cmds, "1-5,5-9:1,2"])
assert args.case == ({1, 2, 3, 4, 5, 6, 7, 8, 9}, {1, 2})
args = cmd.parser.parse_args([*default_cmds, "1-5,5-9:1-3"])
assert args.case == ({1, 2, 3, 4, 5, 6, 7, 8, 9}, {1, 2, 3})
args = cmd.parser.parse_args([*default_cmds, "4-8:1-3,9"])
assert args.case == ({4, 5, 6, 7, 8}, {1, 2, 3, 9})
args = cmd.parser.parse_args([*default_cmds, ":1-3,9"])
assert args.case == (set(), {1, 2, 3, 9})
lower_bound = 1
assert out_of_index_error(cmd, default_cmds, f"{lower_bound-1}")
assert not out_of_index_error(cmd, default_cmds, f"{lower_bound}")
assert out_of_index_error(cmd, default_cmds, f":{lower_bound-1}")
assert not out_of_index_error(cmd, default_cmds, f":{lower_bound}")
assert out_of_index_error(cmd, default_cmds, f"{lower_bound-1},{lower_bound}")
assert out_of_index_error(
cmd, default_cmds, f"{lower_bound}-{lower_bound+10}:{lower_bound-1}"
)
upper_bound = 201
assert out_of_index_error(cmd, default_cmds, f"{upper_bound+1}")
assert not out_of_index_error(cmd, default_cmds, f"{upper_bound}")
assert out_of_index_error(cmd, default_cmds, f":{upper_bound+1}")
assert not out_of_index_error(cmd, default_cmds, f":{upper_bound}")
assert out_of_index_error(cmd, default_cmds, f"{upper_bound},{upper_bound+1}")
assert out_of_index_error(
cmd, default_cmds, f"{upper_bound-10}-{upper_bound}:{upper_bound+1}"
)
[docs]def test_invalid_case_expression(dummy_config):
d = dummy_config("test_validate_case")
cmd = TestCommand()
project_name = "yara"
index = 1
default_cmds = f"{str(d)} --case".split()
t = Taxonomy()
project = t[project_name]
cases = project.defects[index].num_cases
expr = f"{cases+1}"
try:
cmd.parser.parse_args([*default_cmds, expr])
except errors.DppArgparseInvalidCaseExpressionError:
assert True
else:
assert False
[docs]def test_no_case_is_provided(dummy_config):
d = dummy_config("test_validate_case")
cmd = TestCommand()
default_cmds = f"{str(d)}".split()
args = cmd.parser.parse_args(default_cmds)
metadata = args.metadata
index = args.worktree.index
selected_defect: Defect = metadata.defects[index - 1]
script_generator = cmd.create_script_generator(cmd.parser.parse_args(default_cmds))
assert len(list(script_generator.create())) == (selected_defect.num_cases * 2)
[docs]def test_exclude_only(dummy_config):
d = dummy_config("test_validate_case")
cmd = TestCommand()
default_cmds = f"{str(d)} --case :1-100".split()
args = cmd.parser.parse_args(default_cmds)
metadata = args.metadata
index = args.worktree.index
selected_defect: Defect = metadata.defects[index - 1]
script_generator = cmd.create_script_generator(cmd.parser.parse_args(default_cmds))
assert len(list(script_generator.create())) == (selected_defect.num_cases - 100) * 2