package Visual_DVM_2021.Passes.All; import Common.Constants; import Common.Current; import Common.Global; import Common.UI.UI; import Common.UI.VisualCache.ConfigurationCache; import Common.UI.VisualCache.VisualCaches; import Common.Utils.Index; import ProjectData.LanguageName; import TestingSystem.Common.Group.Group; import TestingSystem.Common.Test.Test; import TestingSystem.Common.TestingServer; import TestingSystem.SAPFOR.Json.SapforConfiguration_json; import TestingSystem.SAPFOR.Json.SapforTest_json; import TestingSystem.SAPFOR.Json.SapforTestingSet_json; import TestingSystem.SAPFOR.SapforConfiguration.SapforConfiguration; import TestingSystem.SAPFOR.SapforConfigurationCommand.SapforConfigurationCommand; import TestingSystem.SAPFOR.SapforPackage.SapforPackage; import TestingSystem.SAPFOR.SapforTask.SapforTask; import TestingSystem.SAPFOR.ServerSapfor.ServerSapforState; import Visual_DVM_2021.Passes.PassCode_2021; import Visual_DVM_2021.Passes.Server.PublishServerObject; import java.io.File; import java.util.LinkedHashMap; import java.util.Vector; public class StartSelectedSAPFORConfigurations extends PublishServerObject { Vector configurations; Vector groups; Vector tests; SapforTestingSet_json testingSet; //то, что добавляем. //-- protected LinkedHashMap testsByDescriptions = null; protected Vector testsNames_lower = null; //все тесты что участвуют здесь protected Vector groupsLanguages = null; protected File sapfor = null; //-- protected Vector new_tasks = null; @Override public String getIconPath() { return "/icons/Start.png"; } //-- boolean checkTerminalCode(SapforConfiguration sapforConfiguration, PassCode_2021 code, int count, Vector codes) { if (count > 2) { Log.Writeln_("Неверная конфигурация:" + sapforConfiguration.id + ": " + code.getDescription() + " возможно только один раз."); return false; } //-- if ((count == 1) && codes.size() > 1) { if (!codes.lastElement().equals(code)) { Log.Writeln_("Неверная конфигурация:" + sapforConfiguration.id + ": " + code.getDescription() + " может быть только завершающей командой!"); return false; } } return true; } boolean checkStartingCode(SapforConfiguration sapforConfiguration, PassCode_2021 code, int count, Vector codes) { if (count > 2) { Log.Writeln_("Неверная конфигурация:" + sapforConfiguration.id + ": " + code.getDescription() + " возможно только один раз."); return false; } //-- if ((count == 1) && codes.size() > 1) { if (!codes.firstElement().equals(code)) { Log.Writeln_("Неверная конфигурация:" + sapforConfiguration.id + ": " + code.getDescription() + " может быть только первой командой!"); return false; } } return true; } //-- //-- public boolean checkConfigurationCommands(SapforConfiguration sapforConfiguration) { //1. получить список всех команд. Vector codes = new Vector<>(); //-- счетчик завершающих команд. LinkedHashMap terminalCodesCount = new LinkedHashMap<>(); for (PassCode_2021 code : Constants.terminalSapforTestingCodes) terminalCodesCount.put(code, new Index()); //-- LinkedHashMap startingCodesCount = new LinkedHashMap<>(); for (PassCode_2021 code : Constants.startingSapforTestingCodes) startingCodesCount.put(code, new Index()); //-- for (SapforConfigurationCommand command : Global.testingServer.db.sapforConfigurationCommands.Data.values()) { if (command.sapforconfiguration_id == sapforConfiguration.id) { codes.add(command.passCode); //--- for (PassCode_2021 t_code : Constants.terminalSapforTestingCodes) { if (command.passCode.equals(t_code)) terminalCodesCount.get(t_code).Inc(); } //--- for (PassCode_2021 s_code : Constants.startingSapforTestingCodes) { if (command.passCode.equals(s_code)) startingCodesCount.get(s_code).Inc(); } } } //-- if (codes.size() == 0) { Log.Writeln_("Пустая конфигурация:" + sapforConfiguration.id); return false; } for (PassCode_2021 t_code : Constants.terminalSapforTestingCodes) { if (!checkTerminalCode(sapforConfiguration, t_code, terminalCodesCount.get(t_code).getValue(), codes )) return false; } //- for (PassCode_2021 s_code : Constants.startingSapforTestingCodes) { if (!checkStartingCode(sapforConfiguration, s_code, startingCodesCount.get(s_code).getValue(), codes )) return false; } //-- return true; } //-- protected boolean checkTestName(Test test) { String name = test.description.toLowerCase(); if (testsNames_lower.contains(name)) { Log.Writeln_("В пакет не могут входить тесты с одинаковыми именами (без учета регистра):" + test.description.toLowerCase()); return false; } testsNames_lower.add(name); return true; } protected boolean checkTestsDescriptions(int groupId, Vector groupTests) { if (groupTests.isEmpty()) { Log.Writeln_("Пустая группа тестов: " + groupId); return false; } for (Test test : groupTests) { if (!checkTestName(test)) return false; else testsByDescriptions.put(test.description, test); } return true; } //-- public StartSelectedSAPFORConfigurations() { super(Global.testingServer, SapforPackage.class); } @Override protected boolean canStart(Object... args) throws Exception { //-- groups = new Vector<>(); tests = new Vector<>(); //-- testsNames_lower = new Vector<>(); testsByDescriptions = new LinkedHashMap<>(); groupsLanguages = new Vector<>(); //-- new_tasks= new Vector<>(); //-- if (!Current.getAccount().CheckRegistered(Log)) { return false; } if (!Current.Check(Log, Current.ServerSapfor)) { return false; } if (!Current.getServerSapfor().state.equals(ServerSapforState.Done)) { Log.Writeln_("Выбранная версия SAPFOR не собрана!"); return false; } //-- configurations = Global.testingServer.db.sapforConfigurations.getCheckedOrCurrent(); if (configurations.isEmpty()) { Log.Writeln_("Не отмечено ни одной конфигурации, или отсутствует текущая конфигурация."); return false; } int max_kernels = 1; for (SapforConfiguration configuration : configurations) { max_kernels = Math.max(configuration.kernels, max_kernels); if (!checkConfigurationCommands(configuration)) return false; //- ConfigurationCache cache = (ConfigurationCache) VisualCaches.GetCache(configuration); //-- groups = cache.getGroups(); tests = cache.getTests(); //-- for (Group group : groups) { //- if (!groupsLanguages.contains(group.language)) groupsLanguages.add(group.language); //- if (groupsLanguages.get(0) != LanguageName.fortran) { Log.Writeln_("Поддерживается пакетный режим только для языка Fortran!"); return false; } if (groupsLanguages.size() > 1) { Log.Writeln_("Запуск тестов на разных языках в рамках одного пакета запрещен!"); return false; } //--- Vector groupTests = new Vector<>(); for (Test test : tests) { if (test.group_id == group.id) groupTests.add(test); } //--- if (!checkTestsDescriptions(group.id,groupTests)) return false; //- } } target = new SapforPackage(Current.getAccount(), Current.getServerSapfor(), max_kernels); //-- testingSet = new SapforTestingSet_json(); testingSet.id = target.package_json.getMaxSetId(); for (Test test : testsByDescriptions.values()) { SapforTest_json test_json = new SapforTest_json(); test_json.id = test.id; test_json.description = test.description; test_json.group_description = Global.testingServer.db.groups.get(test.group_id).description; testingSet.tests.add(test_json); } for (SapforConfiguration configuration : configurations) { //-- SapforConfiguration_json configuration_json = new SapforConfiguration_json(); configuration_json.id = configuration.id; configuration_json.name = configuration.description; configuration_json.flags = configuration.getFlags(); Vector codes = configuration.getPassCodes(); //--- коррекцию кода нельзя вызвать если инклуды есть. в общем случае. if (!codes.firstElement().equals(PassCode_2021.SPF_InsertIncludesPass)) configuration_json.codes.add(PassCode_2021.SPF_CorrectCodeStylePass); //всегда добавляется. //-- configuration_json.codes.addAll(codes); //--->> testingSet.configurations.add(configuration_json); //-->> } new_tasks = target.getActualTestingSetTasks(testingSet); if (new_tasks.size() == 0) { Log.Writeln_("Не сформировано ни одной новой задачи.\n" + "Задачи уже присутствуют в пакете, или не отмечено ни одного теста."); return false; } if (UI.Question("Будет добавлено " + new_tasks.size() + " задач. Продолжить")){ target.saveConfigurationsAsJson(configurations); target.package_json.testingSets.add(testingSet); for (SapforTask task : new_tasks) { task.id = target.package_json.getMaxTaskId(); target.package_json.tasks.add(task); } target.tasksCount += new_tasks.size(); return true; } // return false; } }