8000 Make test cases work with all possible variations. · judge0/judge0-python@e8b05b2 · GitHub
[go: up one dir, main page]

Skip to content

Commit e8b05b2

Browse files
committed
Make test cases work with all possible variations.
1 parent 2861d33 commit e8b05b2

File tree

2 files changed

+110
-7
lines changed

2 files changed

+110
-7
lines changed

src/judge0/api.py

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -260,10 +260,27 @@ def create_submissions_from_test_cases(
260260

261261
if isinstance(test_cases, TestCase) or test_cases is None:
262262
test_cases_list = [test_cases]
263+
multiple_test_cases = False
263264
else:
264-
test_cases_list = test_cases
265-
266-
test_cases_list = [TestCase.from_record(tc) for tc in test_cases_list]
265+
try:
266+
# Let's assume that we are dealing with multiple test_cases that
267+
# can be created from test_cases argument. If this fails, i.e.
268+
# raises a ValueError, we know we are dealing with a test_cases=dict,
269+
# or test_cases=["in", "out"], or test_cases=tuple("in", "out").
270+
test_cases_list = [TestCase.from_record(tc) for tc in test_cases]
271+
272+
# It is possible to send test_cases={}, or test_cases=[], or
273+
# test_cases=tuple([]). In this case, we are treating that as None.
274+
if len(test_cases) > 0:
275+
multiple_test_cases = True
276+
else:
277+
multiple_test_cases = False
278+
test_cases_list = [None]
279+
except ValueError:
280+
test_cases_list = [test_cases]
281+
multiple_test_cases = False
282+
283+
test_cases_list = [TestCase.from_record(test_case=tc) for tc in test_cases_list]
267284

268285
all_submissions = []
269286
for submission in submissions_list:
@@ -274,9 +291,7 @@ def create_submissions_from_test_cases(
274291
submission_copy.expected_output = test_case.expected_output
275292
all_submissions.append(submission_copy)
276293

277-
if isinstance(submissions, Submission) and (
278-
isinstance(test_cases, TestCase) or test_cases is None
279-
):
294+
if isinstance(submissions, Submission) and (not multiple_test_cases):
280295
return all_submissions[0]
281296
else:
282297
return all_submissions

tests/test_api_test_cases.py

Lines changed: 89 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
"""Separate file containg tests related to test case functionality."""
1+
"""Separate file containing tests related to test case functionality."""
22

33
import judge0
44
import pytest
@@ -67,6 +67,94 @@ def test_create_submissions_from_test_cases_return_type(
6767
assert type(output) is expected_type
6868

6969

70+
class TestCreateSubmissionsFromTestCases:
71+
@pytest.mark.parametrize(
72+
"test_case,stdin,expected_output",
73+
[
74+
[TestCase(), None, None],
75+
[[], None, None],
76+
[{}, None, None],
77+
[tuple([]), None, None],
78+
],
79+
)
80+
def test_empty_test_case(self, test_case, stdin, expected_output):
81+
submission = create_submissions_from_test_cases(
82+
Submission(), test_cases=test_case
83+
)
84+
85+
assert (
86+
submission.stdin == stdin and submission.expected_output == expected_output
87+
)
88+
89+
@pytest.mark.parametrize(
90+
"test_case,stdin,expected_output",
91+
[
92+
[TestCase(), None, None],
93+
[TestCase(input="input"), "input", None],
94+
[TestCase(expected_output="output"), None, "output"],
95+
[["input_list"], "input_list", None],
96+
[["input_list", "output_list"], "input_list", "output_list"],
97+
[{"input": "input_dict"}, "input_dict", None],
98+
[
99+
{"input": "input_dict", "expected_output": "output_dict"},
100+
"input_dict",
101+
"output_dict",
102+
],
103+
[("input_tuple",), "input_tuple", None],
104+
[("input_tuple", "output_tuple"), "input_tuple", "output_tuple"],
105+
],
106+
)
107+
def test_single_test_case(self, test_case, stdin, expected_output):
108+
submission = create_submissions_from_test_cases(
109+
Submission(), test_cases=test_case
110+
)
111+
112+
assert (
113+
submission.stdin == stdin and submission.expected_output == expected_output
114+
)
115+
116+
@pytest.mark.parametrize(
117+
"test_cases,stdin,expected_output",
118+
[
119+
[[TestCase()], None, None],
120+
[[TestCase(input="input")], "input", None],
121+
[[TestCase(expected_output="output")], None, "output"],
122+
[(["input_list"],), "input_list", None],
123+
[(["input_list", "output_list"],), "input_list", "output_list"],
124+
[({"input": "input_dict"},), "input_dict", None],
125+
[
126+
({"input": "input_dict", "expected_output": "output_dict"},),
127+
"input_dict",
128+
"output_dict",
129+
],
130+
[
131+
[
132+
("input_tuple",),
133+
],
134+
"input_tuple",
135+
None,
136+
],
137+
[
138+
[
139+
("input_tuple", "output_tuple"),
140+
],
141+
"input_tuple",
142+
"output_tuple",
143+
],
144+
],
145+
)
146+
def test_single_test_case_in_iterable(self, test_cases, stdin, expected_output):
147+
submissions = create_submissions_from_test_cases(
148+
Submission(), test_cases=test_cases
149+
)
150+
151+
for submission in submissions:
152+
assert (
153+
submission.stdin == stdin
154+
and submission.expected_output == expected_output
155+
)
156+
157+
70158
@pytest.mark.parametrize(
71159
"source_code_or_submissions,test_cases,expected_status",
72160
[

0 commit comments

Comments
 (0)
0