Beispiel #1
0
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)