diff --git a/.idea/workspace.xml b/.idea/workspace.xml index ba6a21c8..891d860f 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -8,8 +8,6 @@ - - diff --git a/src/SapforTestingSystem/SapforTask/SapforTask.java b/src/SapforTestingSystem/SapforTask/SapforTask.java index e55b57fd..f5eef484 100644 --- a/src/SapforTestingSystem/SapforTask/SapforTask.java +++ b/src/SapforTestingSystem/SapforTask/SapforTask.java @@ -6,7 +6,10 @@ import GlobalData.Tasks.TaskState; import SapforTestingSystem.Json.SapforVersion_json; import com.google.gson.annotations.Expose; import com.sun.org.glassfish.gmbal.Description; +import org.apache.commons.io.FileUtils; +import java.io.File; +import java.nio.charset.Charset; import java.util.List; import java.util.Vector; public class SapforTask extends DBObject { @@ -81,10 +84,48 @@ public class SapforTask extends DBObject { } return String.join("→", versionsLines); } + public static boolean compareVersionsFiles(SapforVersion_json version1, SapforVersion_json version2, List files) throws Exception { + for (String fileName : files) { + File file1 = new File(version1.version, fileName); + if (!file1.exists()) return false; + File file2 = new File(version2.version, fileName); + if (!file2.exists()) return false; + String text1 = FileUtils.readFileToString(file1, Charset.defaultCharset()); + String text2 = FileUtils.readFileToString(file2, Charset.defaultCharset()); + if (!text1.equals(text2)) + return false; + } + return true; + } //должны совпасть им теста, флаги, и коды public boolean isComparable(SapforTask task) throws Exception { return test_description.equalsIgnoreCase(task.test_description) && flags.equalsIgnoreCase(task.flags) && codes.equalsIgnoreCase(task.codes); } + public boolean Compare(SapforTask task, Vector comparisonLog) throws Exception { + //1. сравнить списки файлов. без учета порядка. + if (files.size() != task.files.size()) + return false; + for (String file1 : files) { + if (!task.files.contains(file1)) { + return false; + } + } + //2. сравнить состояния. + if (!state.equals(task.state)) + return false; + //3. сравнить цепочки версий (?) + if (!getVersionsChain().equalsIgnoreCase(task.getVersionsChain())) + return false; + //4. сравнить версии. уже знаем что порядок преобразований идентичен и набор файлов одинаков. + // первая всегда исходная. поэтому не берется. + for (int i = 1; i < versions.size(); ++i) { + SapforVersion_json version1 = versions.get(i); + SapforVersion_json version2 = task.versions.get(i); + //-- + if (!compareVersionsFiles(version1, version2, files)) return false; + } + return false; + } } diff --git a/src/TestingSystem/TestingServer.java b/src/TestingSystem/TestingServer.java index e3ca4ddb..8cf9e4c2 100644 --- a/src/TestingSystem/TestingServer.java +++ b/src/TestingSystem/TestingServer.java @@ -314,30 +314,47 @@ public class TestingServer extends RepositoryServer { return (SapforTasksResults_json) Utils.jsonFromFile( results_file, SapforTasksResults_json.class); } - public String CompareSapforPackages(SapforTasksPackage package1, SapforTasksPackage package2) throws Exception { - String res = ""; + + + + //надо в другое место. + public Vector CompareSapforPackages(SapforTasksPackage package1, SapforTasksPackage package2) throws Exception { + Vector comparisonLog = new Vector<>(); // чтобы сравнивать. должен быть идентичный список тестов. (без учета последовательности) // идентичный набор проходов (с учетом последовательности) //идентичный набор флагов (?) без учета последовательности. // то есть должны отличаться только тестируемые версии САПФОР. SapforTasksResults_json results1_json = getSapforPackageResults(package1); SapforTasksResults_json results2_json = getSapforPackageResults(package2); - if (results1_json.tasks.size()!=results2_json.tasks.size()) - throw new RepositoryRefuseException("В пакетах разное число задач."); + if (results1_json.tasks.size() != results2_json.tasks.size()) { + comparisonLog.add("Количество задач в пакетах не совпадает."); + comparisonLog.add(package1.id + ": " + results1_json.tasks.size() + "/" + package2.id + ": " + results2_json.tasks.size()); + return comparisonLog; + } //подходит если все задачи из первого пакета содержатся во втором, и размер одинаковый. + Vector sortedTasks2 = new Vector<>(); for (SapforTask task1 : results1_json.tasks) { //на boolean match = false; - for (SapforTask task2: results2_json.tasks){ + for (SapforTask task2 : results2_json.tasks) { if (task1.isComparable(task2)) { match = true; + sortedTasks2.add(task2); break; } } - if (!match) - throw new RepositoryRefuseException("Задачи в пакетах не совпадают!"); + if (!match) { + comparisonLog.add("Найдена не совпадающая задача."); + return comparisonLog; + } } - return ""; + + for (SapforTask task1: results1_json.tasks){ + for (SapforTask task2: sortedTasks2){ + task1.Compare(task2, comparisonLog); + } + } + return comparisonLog; } @Override protected void Session() throws Exception {