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); }