class RobotTest(unittest.TestCase): def __init__(self, *args, **kwargs): if not os.path.isdir(SANDBOX): os.mkdir(SANDBOX) super(RobotTest, self).__init__(*args, **kwargs) def setUp(self): self.robot = Robot(COMPILER, SANDBOX) self.make_file(IO_TEST_1_IN, """1 2 3 4 5\n""") self.make_file(IO_TEST_1_OUT, """15 120\n""") self.make_file(IO_TEST_2_IN, """0 1 2 3 4\n""") self.make_file(IO_TEST_2_OUT, """10 0\n""") def make_file(self, path, content): with open(path, 'w') as new: new.write(content) def test_compile_with_no_source(self): with open(DEVNULL, 'w') as devnull: self.assertRaises(ValueError, self.robot.compile, NO_SOURCE, EXECUTABLE, stdout=devnull, stderr=devnull) def test_compile_with_bad_executable(self): self.make_file(SOURCE, OK_SOURCE) with open(DEVNULL, 'w') as devnull: self.assertRaises(ValueError, self.robot.compile, SOURCE, BAD_EXECUTABLE, stdout=devnull, stderr=devnull) def test_evaluate_with_no_executable(self): self.make_file(SOURCE, CE_SOURCE) with open(DEVNULL, 'w') as devnull: self.robot.compile([SOURCE], EXECUTABLE, stdout=devnull, stderr=devnull) self.assertRaises(ValueError, self.robot.evaluate, EXECUTABLE, INPUT, OUTPUT, stdout=devnull, stderr=devnull) def test_evaluate_no_input(self): self.make_file(SOURCE, OK_SOURCE) with open(DEVNULL, 'w') as devnull, open(EXECUTABLE, 'w'): self.assertRaises(ValueError, self.robot.evaluate, EXECUTABLE, NO_INPUT, OUTPUT, stdout=devnull, stderr=devnull) def test_diff_with_equal_output(self): test_output = """3\n1 2 3\n""" user_output = """3 1 2 3\n""" self.make_file(TEST_OUTPUT, test_output) self.make_file(OUTPUT, user_output) self.assertFalse(self.robot.diff(TEST_OUTPUT, OUTPUT)) def test_diff_with_non_equal_output(self): test_output = """4 1 2 3 4\n""" user_output = """3 1 2 3\n""" self.make_file(TEST_OUTPUT, test_output) self.make_file(OUTPUT, user_output) self.assertTrue(self.robot.diff(TEST_OUTPUT, OUTPUT)) def test_diff_with_equal_float_output(self): test_output = """12.9999999 9.9999999\n""" user_output = """13 10\n""" self.make_file(TEST_OUTPUT, test_output) self.make_file(OUTPUT, user_output) self.assertFalse(self.robot.diff(TEST_OUTPUT, OUTPUT)) def test_diff_with_non_equal_float_output(self): test_output = """12.99999 9.99999\n""" user_output = """13.0 10.1\n""" self.make_file(TEST_OUTPUT, test_output) self.make_file(OUTPUT, user_output) self.assertTrue(self.robot.diff(TEST_OUTPUT, OUTPUT)) def test_run_with_ce_source(self): self.make_file(SOURCE, CE_SOURCE) test_cases = {1: dict(input=IO_TEST_1_IN, output=IO_TEST_1_OUT), 2: dict(input=IO_TEST_2_IN, output=IO_TEST_2_OUT)} status, memory, time, failed, log = self.robot.run([SOURCE], test_cases, IO_TEST_TIME_LIMIT, IO_TEST_MEMORY_LIMIT) self.assertEqual(status, Status.CE) self.assertEqual(memory, None) self.assertEqual(time, None) self.assertEqual(failed, None) self.assertNotEqual(log, None) def test_run_with_ok_source(self): self.make_file(SOURCE, OK_SOURCE) test_cases = {1: dict(input=IO_TEST_1_IN, output=IO_TEST_1_OUT), 2: dict(input=IO_TEST_2_IN, output=IO_TEST_2_OUT)} status, memory, time, failed, log = self.robot.run([SOURCE], test_cases, IO_TEST_TIME_LIMIT, IO_TEST_MEMORY_LIMIT) self.assertEqual(status, Status.OK) self.assertNotEqual(memory, None) self.assertNotEqual(time, None) self.assertEqual(failed, None) self.assertEqual(log, None) def test_run_with_fe_source(self): self.make_file(SOURCE, FE_SOURCE) test_cases = {1: dict(input=IO_TEST_1_IN, output=IO_TEST_1_OUT), 2: dict(input=IO_TEST_2_IN, output=IO_TEST_2_OUT)} status, memory, time, failed, log = self.robot.run([SOURCE], test_cases, IO_TEST_TIME_LIMIT, IO_TEST_MEMORY_LIMIT) self.assertEqual(status, Status.FE) self.assertNotEqual(memory, None) self.assertNotEqual(time, None) self.assertEqual(failed, 2) self.assertEqual(log, None) def test_run_with_tl_source(self): self.make_file(SOURCE, TL_SOURCE) test_cases = {1: dict(input=IO_TEST_1_IN, output=IO_TEST_1_OUT), 2: dict(input=IO_TEST_2_IN, output=IO_TEST_2_OUT)} status, memory, time, failed, log = self.robot.run([SOURCE], test_cases, IO_TEST_TIME_LIMIT, IO_TEST_MEMORY_LIMIT) self.assertEqual(status, Status.TL) self.assertEqual(memory, None) self.assertEqual(time, None) self.assertEqual(failed, 1) self.assertEqual(log, None) def test_run_with_sf_source(self): self.make_file(SOURCE, SF_SOURCE) test_cases = {1: dict(input=IO_TEST_1_IN, output=IO_TEST_1_OUT), 2: dict(input=IO_TEST_2_IN, output=IO_TEST_2_OUT)} status, memory, time, failed, log = self.robot.run([SOURCE], test_cases, IO_TEST_TIME_LIMIT, IO_TEST_MEMORY_LIMIT) self.assertEqual(status, Status.SF) self.assertNotEqual(memory, None) self.assertNotEqual(time, None) self.assertEqual(failed, 1) self.assertEqual(log, None) def test_run_with_wa_source(self): self.make_file(SOURCE, WA_SOURCE) test_cases = {1: dict(input=IO_TEST_1_IN, output=IO_TEST_1_OUT), 2: dict(input=IO_TEST_2_IN, output=IO_TEST_2_OUT)} status, memory, time, failed, log = self.robot.run([SOURCE], test_cases, IO_TEST_TIME_LIMIT, IO_TEST_MEMORY_LIMIT) self.assertEqual(status, Status.WA) self.assertNotEqual(memory, None) self.assertNotEqual(time, None) self.assertEqual(failed, 1) self.assertEqual(log, None) def test_run_with_re_source(self): self.make_file(SOURCE, RE_SOURCE) test_cases = {1: dict(input=IO_TEST_1_IN, output=IO_TEST_1_OUT), 2: dict(input=IO_TEST_2_IN, output=IO_TEST_2_OUT)} status, memory, time, failed, log = self.robot.run([SOURCE], test_cases, IO_TEST_TIME_LIMIT, IO_TEST_MEMORY_LIMIT) self.assertEqual(status, Status.RE) self.assertNotEqual(memory, None) self.assertNotEqual(time, None) self.assertEqual(failed, 1) self.assertEqual(log, None)