Exemplo n.º 1
0
        public ProgramTestingResult Release(
            ref dynamic compilerConfiguration,
            ref ICompilerPlugin compilerPlugin
            )
        {
            /*
             * Получаем информацию о тестах
             * для     release-тестирования
             * пользовательского    решения
             * посталвенной задачи.
             */

            var ReleaseTestsInfo = GetTestsInfo();

            /*
             * Сохраняем первоначальное количество
             * тестов в отдельной переменной, дабы
             * не затерять   эту   информацию  при
             * видоизменении очереди.
             */

            var testsCount = ReleaseTestsInfo.Count;

            /*
             * Создаём объект,  который будет
             * хранить  результаты  релизного
             * тестирования пользовательского
             * решения  поставленной  задачи.
             */

            var programTestingResult = new ProgramTestingResult(testsCount);

            /*
             * В цикле  тестируем  пользовательское
             * решение   поставленной   задачи   на
             * заранее  подготовленных   тестах   и
             * записываем  результаты  проверки  по
             * каждому тесту в специально созданный
             * для этих нужд массив.
             */

            for (var currentTestIndex = 0; currentTestIndex < testsCount; currentTestIndex++)
            {
                /*
                 * Делаем выборку  данных о текущем
                 * релизном тесте из очереди тестов
                 */

                var currentTest = ReleaseTestsInfo.Dequeue();

                /*
                 * Запускаем  тестирование  пользовательского
                 * решения поставленной задачи  на  указанном
                 * тесте и получаем  промежуточные результаты
                 * тестирования, заносим их в соответственную
                 * переменную,  созданную специально для этих
                 * нужд.
                 */

                var currentTestResult = new ProgramTester(
                    ref compilerConfiguration,
                    ref compilerPlugin,
                    exeFileUrl,
                    "",
                    currentTest.MemoryLimit,
                    currentTest.ProcessorTimeLimit,
                    currentTest.InputData,
                    Encoding.UTF8.GetString(currentTest.OutputData).Length * 2,
                    submissionInfo.ProblemInformation.AdaptProgramOutput
                    ).RunTesting();

                /*
                 * Если временный  результат  успешен,
                 * проводим   финальную   перепроверку
                 * результата тестирования  на  данном
                 * тесте и выносим финальный результат
                 * данного теста.
                 */

                if (currentTestResult.Result == TestResult.MiddleSuccessResult)
                {
                    /*
                     * Сравнение выходных потоков
                     * и вынесение  результата по
                     * данному тесту.
                     */
                    currentTestResult.Result =
                        Convert.ToBase64String(currentTestResult.Output) == Convert.ToBase64String(currentTest.OutputData)
                            ? TestResult.FullSuccessResult
                            : TestResult.FullNoSuccessResult;
                }

                /*
                 * Заносим результат проведения
                 * текущего теста в специальный
                 * массив.
                 */

                programTestingResult.TestingResults[currentTestIndex] = currentTestResult;
            }

            /*
             * Возвращаем информацию  о  тестировании
             * пользовательского решения поставленной
             * задачи.
             */

            return(programTestingResult);
        }
        /*
         * Функция, ответственная за debug
         * тестирование   пользовательских
         * решений.
         */

        public ProgramTestingResult Debug()
        {
            /*
             * Переменная хранит полный путь
             * к запускаемому файлу авторского
             * решения задачи
             */

            var authorSolutionExePath = GetAuthorSolutionExePath(
                out var authorLanguageConfiguration,
                out var authorCompilerPlugin
                );

            /*
             * Передаём новосозданным переменным
             * информацию о лимитах для пользовательского
             * процесса (пользовательского решения задачи)
             */

            GetDebugProgramLimits(
                out var memoryLimit, // переменная, хранящая значение лимита по памяти
                out var timeLimit    // переменная, хранящая значение лимита по процессорному времени
                );

            /*
             * Проводим нетестовый запуск авторского решения
             * и получаем всё необходимое для тестирования
             * пользовательской программы
             */

            var authorTestingResult = new ProgramTester(
                ref authorLanguageConfiguration,
                ref authorCompilerPlugin,
                authorSolutionExePath,
                "-author-solution",
                memoryLimit,
                timeLimit,
                submissionInfo.CustomTest,
                0,
                submissionInfo.ProblemInformation.AdaptProgramOutput
                ).RunTesting();

            /*
             * Проверяем,    успешно  ли  проведен  запуск
             * авторского   решения     задачи.   В случае
             * обнаружения  каких-либо  ошибок выбрасываем
             * исключение  AuthorSolutionRunningException,
             * которое информирует улавливатель исключений
             * о необходимости  предоставления  информации
             * об  ошибке  в  лог-файлах  сервера и прочих
             * местах, где это важно и необходимо.
             */

            if (authorTestingResult.Result != TestResult.MiddleSuccessResult)
            {
                throw new SimplePM_Exceptions.AuthorSolutionRunningException();
            }

            /*
             * Получаем ссылку на объект, который
             * хранит информацию  о  конфигурации
             * компиляционного модуля для данного
             * языка программирования.
             */

            var userLanguageConfiguration = SimplePM_Compiler.GetCompilerConfig(
                ref _languageConfigurations,
                submissionInfo.CodeLang
                );

            /*
             * Получаем ссылку на объект,
             * созданный на основании класса,
             * который, в свою очередь, создан
             * по подобию интерфейса ICompilerPlugin.
             */

            var userCompilerPlugin = SimplePM_Compiler.FindCompilerPlugin(
                ref _compilerPlugins,
                (string)userLanguageConfiguration.module_name
                );

            /*
             * Проводим тестовый запуск пользовательского
             * решения поставленной задачи и получаем всё
             * необходимое для тестирования программы.
             */

            var userTestingResult = new ProgramTester(
                ref userLanguageConfiguration,
                ref userCompilerPlugin,
                exeFileUrl,
                "-user-solution",
                memoryLimit,
                timeLimit,
                submissionInfo.CustomTest,
                Encoding.UTF8.GetString(authorTestingResult.Output).Length,
                submissionInfo.ProblemInformation.AdaptProgramOutput
                ).RunTesting();

            /*
             * Если результат тестирования не полностью
             * известен, осуществляем проверку по дополнительным
             * тестам и выдвигаем остаточный результат debug
             * тестирования пользовательского решения задачи.
             */

            if (userTestingResult.Result == TestResult.MiddleSuccessResult)
            {
                userTestingResult.Result =
                    Convert.ToBase64String(userTestingResult.Output) == Convert.ToBase64String(authorTestingResult.Output)
                    ? TestResult.FullSuccessResult
                    : TestResult.FullNoSuccessResult;
            }

            /*
             * Формируем результат тестирования пользовательского
             * решения поставленной задачи, добавляем информацию
             * о единственном тесте, который был проведен
             * непосредственно при тестировании данного
             * пользовательского решения данной задачи.
             */

            var programTestingResult = new ProgramTestingResult(1)
            {
                TestingResults =
                {
                    [0] = userTestingResult
                }
            };

            /*
             * Возвращаем сформированный результат
             * тестирования пользовательского
             * решения поставленной задачи.
             */

            return(programTestingResult);
        }