Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 76 additions & 0 deletions src/core/Модули/Версии.os
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,82 @@
Возврат СравнитьВерсии(СтрокаВерсия1, СтрокаВерсия2) >= 0;
КонецФункции

// Сортирует массив версий (возр или убыв)
//
// Параметры:
// ВходящиеДанные - массив данных с типом Версия / Строковое представление версии
// ПорядокСортировки - строка, принимает значение "ВОЗР" или "УБЫВ"
Процедура СортироватьВерсии(ВходящиеДанные, ПорядокСортировки = "ВОЗР") Экспорт

Массив = ВходящиеДанные;

КоличествоЭлементовВМассиве = Массив.Количество();
Если КоличествоЭлементовВМассиве > 0 Тогда
БыстраяСортировка(Массив, 0, КоличествоЭлементовВМассиве - 1, ПорядокСортировки);
КонецЕсли;

ВходящиеДанные = Массив;

КонецПроцедуры

Процедура БыстраяСортировка(МассивДанных, ЛевоеЗначение, ПравоеЗначение, Знач ПорядокСортировки = "ВОЗР")

ПорядокСортировки = вРег(ПорядокСортировки);

ЛевоеЗначениеФиксированное = ЛевоеЗначение; //левая граница
ПравоеЗначениеФиксированное = ПравоеЗначение; // правая граница
ОпорноеЗначение = МассивДанных[ЛевоеЗначение]; // значение опоры

// пока границы не сомкнутся
Пока ЛевоеЗначение < ПравоеЗначение Цикл

// двигаем правую границу до значения, больше(меньше) опорного
Пока ?(ПорядокСортировки = "ВОЗР",
ВерсияБольшеИлиРавны(МассивДанных[ПравоеЗначение], ОпорноеЗначение),
ВерсияМеньшеИлиРавны(МассивДанных[ПравоеЗначение], ОпорноеЗначение)) И ЛевоеЗначение < ПравоеЗначение Цикл

ПравоеЗначение = ПравоеЗначение - 1;

КонецЦикла;

Если ЛевоеЗначение <> ПравоеЗначение Тогда // если границы не сомкнулись
МассивДанных[ЛевоеЗначение] = МассивДанных[ПравоеЗначение]; // перемещаем правое на левое
ЛевоеЗначение = ЛевоеЗначение + 1; // сдвигаем вправо
КонецЕсли;

// двигаем левую границу до значения, меньше(больше) опорного
Пока ?(ПорядокСортировки = "ВОЗР",
ВерсияМеньшеИлиРавны(МассивДанных[ЛевоеЗначение], ОпорноеЗначение),
ВерсияБольшеИлиРавны(МассивДанных[ЛевоеЗначение], ОпорноеЗначение)) И ЛевоеЗначение < ПравоеЗначение Цикл

ЛевоеЗначение = ЛевоеЗначение + 1;

КонецЦикла;

// если границы не сомкнулись
Если ЛевоеЗначение <> ПравоеЗначение Тогда
МассивДанных[ПравоеЗначение] = МассивДанных[ЛевоеЗначение]; // перемещаем левое на правое
ПравоеЗначение = ПравоеЗначение - 1; // сдвигаем вправо
КонецЕсли;

КонецЦикла;

// фиксируем
МассивДанных[ЛевоеЗначение] = ОпорноеЗначение;
ОпорноеЗначение = ЛевоеЗначение;
ЛевоеЗначение = ЛевоеЗначениеФиксированное;
ПравоеЗначение = ПравоеЗначениеФиксированное;

// рекурсивно сортируем две части массива
Если ЛевоеЗначение < ОпорноеЗначение Тогда
БыстраяСортировка(МассивДанных, ЛевоеЗначение, ОпорноеЗначение - 1, ПорядокСортировки);
КонецЕсли;
Если ПравоеЗначение > ОпорноеЗначение Тогда
БыстраяСортировка(МассивДанных, ОпорноеЗначение + 1, ПравоеЗначение, ПорядокСортировки);
КонецЕсли;

КонецПроцедуры

Функция ПрочитатьВерсию(Знач СтрокаВерсии)

КлассВерсия = Новый Версия(СтрокаВерсии);
Expand Down
58 changes: 58 additions & 0 deletions tests/Версии_test.os
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
// ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингОпций");
// ИменаТестов.Добавить("ТестДолжен_ПроверитьПарсингМассивовОпций");

ИменаТестов.Добавить("ТестДолженПроверитьСортировкуВерсий");

Возврат ИменаТестов;

КонецФункции
Expand Down Expand Up @@ -140,6 +142,62 @@

КонецПроцедуры

Процедура ТестДолженПроверитьСортировкуВерсий() Экспорт

ЭталонСортировкиПоВозрастанию = СтрРазделить("1.0.0 1.3.0 1.4.0 1.5.0 1.9.0 1.20.0", " ");
ЭталонСортировкиПоУбыванию = СтрРазделить("1.20.0 1.9.0 1.5.0 1.4.0 1.3.0 1.0.0", " ");

МассивДанныхПроверки = СтрРазделить("1.0.0 1.4.0 1.20.0 1.3.0 1.9.0 1.5.0", " ");
Версии.СортироватьВерсии(МассивДанныхПроверки, "ВОЗР");
Утверждения.Проверить(
ПроверитьРавенствоМассивов(МассивДанныхПроверки, ЭталонСортировкиПоВозрастанию),
"Результат должен совпадать с ожиданиями.");

МассивДанныхПроверки = СтрРазделить("1.0.0 1.4.0 1.20.0 1.3.0 1.9.0 1.5.0", " ");
Версии.СортироватьВерсии(МассивДанныхПроверки, "УБЫВ");
Утверждения.Проверить(
ПроверитьРавенствоМассивов(МассивДанныхПроверки, ЭталонСортировкиПоУбыванию),
"Результат должен совпадать с ожиданиями.");

КонецПроцедуры

Функция МассивВерсийВСтроку(МассивДанных)

Результат = "";

Для Каждого ЭлементМассива Из МассивДанных Цикл

Значение = ?(ТипЗнч(ЭлементМассива) = Тип("Версия"), ЭлементМассива.ВСтроку(), ЭлементМассива);
Результат = Результат + ?(ПустаяСтрока(Результат), "", " ") + Значение;

КонецЦикла;

Возврат Результат;

КонецФункции

Функция ПроверитьРавенствоМассивов(Массив1, Массив2)

Если Не (ТипЗнч(Массив1) = Тип("Массив") И ТипЗнч(Массив2) = Тип("Массив")) Тогда
Возврат Ложь;
КонецЕсли;

Если Не Массив1.Количество() = Массив2.Количество() Тогда
Возврат Ложь;
КонецЕсли;

Для Индекс = 0 По Массив1.Количество() - 1 Цикл

Если Не Массив1[Индекс] = Массив2[Индекс] Тогда
Возврат Ложь;
КонецЕсли;

КонецЦикла;

Возврат Истина;

КонецФункции

Функция ТестовыйСлучай(Знач ВерсииПроверки, Знач Диапазон, Знач Результат)

Тест = Новый Структура;
Expand Down