diff --git a/OiRunner/BetterRunner.py b/OiRunner/BetterRunner.py index 3240494..797c5a9 100755 --- a/OiRunner/BetterRunner.py +++ b/OiRunner/BetterRunner.py @@ -162,7 +162,7 @@ def _check(self, opt_file: str, ipt_file: str, ans_file: str, now = time.time() - ft if run.returncode != 0: - print(f"The return value is{run.returncode}. There may be issues with the program running.") + print(f"The return value is {run.returncode}. There may be issues with the program running.") with open(ans_file, "r") as ans, open(opt_file, "r") as my_ans: ans_list = [line.rstrip() for line in ans if line.rstrip()] @@ -241,7 +241,7 @@ def run(self) -> None: run.wait() if run.returncode != 0: - print(f"The return value is{run.returncode}. There may be issues with the program running.") + print(f"The return value is {run.returncode}. There may be issues with the program running.") # Can't sent Ctrl+c and get the messages. except KeyboardInterrupt: # pragma: no cover @@ -258,4 +258,4 @@ def main(): if __name__ == "__main__": - main() + main() # pragma:no cover diff --git a/tests/data/check_data/large.ans b/tests/data/check_data/large.ans new file mode 100644 index 0000000..e70e303 --- /dev/null +++ b/tests/data/check_data/large.ans @@ -0,0 +1,16 @@ +1111111111111111111111 +1111111111111111111111 +1111111111111111111111 +1111111111111111111111 +1111111111111111111111 +1111111111111111111111 +1111111111111111111111 +1111111111111111111111 +1111111111111111111111 +1111111111111111111111 +1111111111111111111111 +1111111111111111111111 +1111111111111111111111 +1111111111111111111111 +1111111111111111111111 +1111111111111111111111 \ No newline at end of file diff --git a/tests/data/check_data/large.in b/tests/data/check_data/large.in new file mode 100644 index 0000000..e84e5a2 --- /dev/null +++ b/tests/data/check_data/large.in @@ -0,0 +1 @@ +111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 \ No newline at end of file diff --git a/tests/data/check_data/large.out b/tests/data/check_data/large.out new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_basic.py b/tests/test_basic.py index 09db025..9645cf7 100755 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -200,8 +200,8 @@ def setUp(self): if os.getcwd().split(os.sep)[-1] != "data": os.chdir("tests/data") - # def tearDown(self): - # clean(GARBAGE) + def tearDown(self): + clean(GARBAGE) def test_pass(self): out = sys.stdout @@ -209,13 +209,247 @@ def test_pass(self): sys.stdout = f sys.argv = ["BetterRunner.py", "test"] self.runner.cmd_parse() - self.runner.args.if_print = True - if sys.platform == "linux": - if_pass = self.runner._check("check_data/1.out", "check_data/1.in", - "check_data/1.ans", 1, "../../tests/data/check.out") + self.runner.args.if_print = False + if sys.platform == "win32": + self.runner.args.name = "../../tests/data/check.exe" else: - if_pass = self.runner._check("check_data/1.out", "check_data/1.in", - "check_data/1.ans", 1, "../../tests/data/check.exe") + self.runner.args.name = "../../tests/data/check.out" + + if_pass = self.runner._check("check_data/1.out", "check_data/1.in", + "check_data/1.ans", 1) self.assertTrue(if_pass) sys.stdout = out + + with open("~temp", "r") as f: + self.assertEqual(f.read(), "#1:\nCorrect answer.\n") + + os.remove("~temp") + + with open("~temp", "w") as f: + sys.stdout = f + self.runner.args.if_print = True + self.runner._check("check_data/1.out", "check_data/1.in", "check_data/1.ans", 1, if_print=True) + + sys.stdout = out + + with open("~temp", "r") as f: + # We don't know the exact running time. + self.assertIn("Correct answer, takes", f.read()) + + def test_retval(self): + out = sys.stdout + with open("~temp", "w") as f: + sys.stdout = f + sys.argv = ["BetterRunner.py", "test"] + self.runner.cmd_parse() + if sys.platform == "win32": + self.runner.args.name = "../../tests/data/check.exe" + else: + self.runner.args.name = "../../tests/data/check.out" + + self.runner._check("check_data/3.out", "check_data/3.in", "check_data/3.ans", 1) + + sys.stdout = out + with open("~temp", "r") as f: + self.assertIn("#1:\nThe return value is 1. There may be issues with the program running.\n", f.read()) + + def test_fail(self): + out = sys.stdout + with open("~temp", "w") as f: + sys.stdout = f + sys.argv = ["BetterRunner.py", "test"] + self.runner.cmd_parse() + self.runner.args.if_print = False + if sys.platform == "win32": + self.runner.args.name = "../../tests/data/check.exe" + else: + self.runner.args.name = "../../tests/data/check.out" + + if_pass = self.runner._check("check_data/2.out", "check_data/2.in", + "check_data/2.ans", 1) + self.assertFalse(if_pass) + + sys.stdout = out + + with open("~temp", "r") as f: + self.assertEqual(f.read(), "#1:\nWrong answer.\n") + + os.remove("~temp") + + with open("~temp", "w") as f: + sys.stdout = f + self.runner.args.if_print = True + self.runner._check("check_data/2.out", "check_data/2.in", "check_data/2.ans", 1, if_print=True) + + sys.stdout = out + + with open("~temp", "r") as f: + self.assertEqual("#1:\nStandard answer:['wrong_answer']\nYour answer:['2']\n" + "Wrong answer.\nError data:\n2\n\n", f.read()) + + def test_large(self): + out = sys.stdout + with open("~temp", "w") as f: + sys.stdout = f + sys.argv = ["BetterRunner.py", "test"] + self.runner.cmd_parse() + self.runner.args.if_print = True + if sys.platform == "win32": + self.runner.args.name = "../../tests/data/check.exe" + else: + self.runner.args.name = "../../tests/data/check.out" + + if_pass = self.runner._check("check_data/large.out", "check_data/large.in", + "check_data/large.ans", 1, if_print=True) + self.assertFalse(if_pass) + + sys.stdout = out + + with open("~temp", "r") as f: + output = f.read() + self.assertIn("The number of answer lines is too large.", output) + self.assertIn("The number of data words is too large.", output) + + +class Testrun(unittest.TestCase): + + def setUp(self): + self.runner = BetterRunner.BetterRunner() + if os.getcwd().split(os.sep)[-1] != "data": + os.chdir("tests/data") + + def tearDown(self): + clean(GARBAGE) + + def test_directgdb(self): + sys.argv = ["BetterRunner.py", "test", "--directgdb"] + self.runner.cmd_parse() + self.runner.args.directgdb = True + + with self.assertRaises(SystemExit): + def wait(): + return 0 + + new_mock = mock.Mock(wait=wait) + new_mock.return_value = 0 + with mock.patch("subprocess.Popen", return_value=new_mock): + self.runner.run() + + def test_nojudge(self): + sys.argv = ["BetterRunner.py", "test"] + self.runner.cmd_parse() + self.runner.args.onlyinput = True + self.runner.input_file = "../../tests/data/check_data/1.out" + + def wait(): + print("1") + return 0 + + new_mock = mock.Mock(wait=wait, returncode=0) + new_mock.return_value = 0 + with mock.patch("subprocess.Popen", return_value=new_mock): + out = sys.stdout + with open("~temp", "w") as f: + sys.stdout = f + self.runner.run() + sys.stdout = out + with open("~temp", "r") as f: + self.assertEqual("The file has been executed.\n1\n", f.read()) + + self.runner.args.onlyinput = False + self.runner.args.onlyoutput = True + self.runner.output_file = "../../tests/data/check_data/1.out" + + os.remove("~temp") + + new_mock = mock.Mock(wait=wait, returncode=1) + new_mock.return_value = 0 + with mock.patch("subprocess.Popen", return_value=new_mock): + out = sys.stdout + with open("~temp", "w") as f: + sys.stdout = f + self.runner.run() + sys.stdout = out + with open("~temp", "r") as f: + self.assertEqual("1\nThe return value is 1. There may be issues with the program running.\n", f.read()) + + self.runner.args.onlyinput = False + self.runner.args.onlyoutput = False + + os.remove("~temp") + + new_mock = mock.Mock(wait=wait, returncode=1) + new_mock.return_value = 0 + with mock.patch("subprocess.Popen", return_value=new_mock): + out = sys.stdout + with open("~temp", "w") as f: + sys.stdout = f + self.runner.run() + sys.stdout = out + with open("~temp", "r") as f: + self.assertEqual("1\nThe return value is 1. There may be issues with the program running.\n", f.read()) + + def test_judge(self): + sys.argv = ["BetterRunner.py", "test"] + self.runner.cmd_parse() + self.runner.args.judge = True + os.mkdir("~tmp") + + def mock_new_dir(a, b): + os.mkdir("~tmp") + with mock.patch("OiRunner.BetterRunner.Functions._modify_file", return_value=3): + with mock.patch("OiRunner.BetterRunner.Functions._output", side_effect=mock_new_dir): + with mock.patch("OiRunner.BetterRunner.BetterRunner._check", return_value=True): + out = sys.stdout + with open("~temp", "w") as f: + sys.stdout = f + self.runner.run() + + with open("~temp", "r") as f: + self.assertEqual("#final:Accuracy 100.00%\n", f.read()) + self.assertFalse(os.path.exists("~tmp")) + + os.remove("~temp") + + with mock.patch("OiRunner.BetterRunner.BetterRunner._check", return_value=False): + with open("~temp", "w") as f: + sys.stdout = f + self.runner.run() + + with open("~temp", "r") as f: + self.assertEqual("#final:Accuracy 0.00%\n", f.read()) + self.assertFalse(os.path.exists("~tmp")) + sys.stdout = out + + @mock.patch("subprocess.Popen") + def test_gdb(self, mock_sp): + sys.argv = ["BetterRunner.py", "test"] + self.runner.cmd_parse() + self.runner.args.judge = True + self.runner.args.gdb = True + self.runner.args.name = "test" + + def mock_new_dir(a, b): + os.mkdir("~tmp") + + out = sys.stdout + sys.stdout = None + with mock.patch("OiRunner.BetterRunner.Functions._modify_file", return_value=3): + with mock.patch("OiRunner.BetterRunner.Functions._output", side_effect=mock_new_dir): + with mock.patch("OiRunner.BetterRunner.BetterRunner._check", return_value=False): + self.runner.run() + mock_sp.assert_called_once_with(["gdb", "test"]) + sys.stdout = out + + +class TestMisc(unittest.TestCase): + + @mock.patch("OiRunner.BetterRunner.BetterRunner.cmd_parse") + @mock.patch("OiRunner.BetterRunner.BetterRunner.compile") + @mock.patch("OiRunner.BetterRunner.BetterRunner.run") + def test_main_call(self, mock_parse, mock_compile, mock_run): + BetterRunner.main() + mock_compile.assert_called_once() + mock_parse.assert_called_once() + mock_run.assert_called_once()