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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy