Skip to content
Open
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
Original file line number Diff line number Diff line change
Expand Up @@ -774,16 +774,31 @@

Процедура ВыполнитьПодпискуНаСобытие(Знач ИмяПроцедурыВыполнения, ПараметрыПроцедуры)

Для Каждого ЭлементИндекса Из ИндексПодписчиков Цикл
Для Каждого Подписчик Из ПодписчикиПоПриоритету() Цикл

Подписчик = ЭлементИндекса.Значение;

Подписчик.ВыполнитьПодписку(ИмяПроцедурыВыполнения, ПараметрыПроцедуры);

КонецЦикла;

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

Функция ПодписчикиПоПриоритету()
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Приоритет", Новый ОписаниеТипов("Число"));
Таблица.Колонки.Добавить("Подписчик");
Для Каждого ЭлементИндекса Из ИндексПодписчиков Цикл
Стр = Таблица.Добавить();
Стр.Приоритет = ЭлементИндекса.Значение.Приоритет();
Стр.Подписчик = ЭлементИндекса.Значение;
КонецЦикла;
Таблица.Сортировать("Приоритет Убыв");
Результат = Новый Массив;
Для Каждого Стр Из Таблица Цикл
Результат.Добавить(Стр.Подписчик);
КонецЦикла;
Возврат Результат;
КонецФункции

Процедура ПрисвоитьЗначенияПараметраПроцедуры(НовыеЗначения, // BSLLS:NumberOfParams-off
Перем0 = Неопределено,
Перем1 = Неопределено,
Expand Down
4 changes: 4 additions & 0 deletions tests/fixtures/lib.config
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<package-def>
<class name="СтабПодписчик" file="СтабПодписчик.os"/>
</package-def>
21 changes: 21 additions & 0 deletions tests/fixtures/СтабПодписчик.os
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// Минимальный стаб подписчика для тестирования МенеджерПодписок.
// Реализует интерфейс ИндексПодписчиков: Приоритет() и ВыполнитьПодписку().
// ЖурналВызовов — массив, переданный по ссылке из теста; стаб пишет в него свою метку при каждом вызове.

Перем _Приоритет;
Перем _Метка;
Перем _ЖурналВызовов;

Процедура Инициализировать(Знач Приоритет, Знач Метка, Знач ЖурналВызовов) Экспорт
_Приоритет = Приоритет;
_Метка = Метка;
_ЖурналВызовов = ЖурналВызовов;
КонецПроцедуры

Функция Приоритет() Экспорт
Возврат _Приоритет;
КонецФункции

Процедура ВыполнитьПодписку(ИмяПроцедуры, Параметры) Экспорт
_ЖурналВызовов.Добавить(_Метка);
КонецПроцедуры
144 changes: 144 additions & 0 deletions tests/МенеджерПодписок_сортировка_test.os
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
// Запуск (из корня репозитория):
// oscript -encoding=utf-8 "%ONESCRIPT_LIB%\1testrunner\src\main.os" tests\МенеджерПодписок_сортировка_test.os

#использовать "../src/core/"
#Использовать "./fixtures"
#Использовать asserts
#Использовать logos

Перем Лог;

Функция ПолучитьСписокТестов(Знач Тестирование) Экспорт

ИменаТестов = Новый Массив;
ИменаТестов.Добавить("ТестДолжен_ВызыватьПодписчиковВПорядкеУбыванияПриоритета");
ИменаТестов.Добавить("ТестДолжен_ВызыватьВсехПодписчиков");
ИменаТестов.Добавить("ТестДолжен_ВызыватьТрёхПодписчиковВПравильномПорядке");
ИменаТестов.Добавить("ТестДолжен_КорректноОбрабатыватьОдногоПодписчика");
ИменаТестов.Добавить("ТестДолжен_НеВызыватьЕслиПустойИндекс");

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

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

Процедура ПередЗапускомТестов() Экспорт
Лог = Логирование.ПолучитьЛог("test.менеджер-подписок");
КонецПроцедуры

Процедура ПослеЗапускаТестов() Экспорт
КонецПроцедуры

// ===========================================================================

// А(приоритет=100) должна быть вызвана раньше Б(приоритет=0)
Процедура ТестДолжен_ВызыватьПодписчиковВПорядкеУбыванияПриоритета() Экспорт

Журнал = Новый Массив;

А = Новый СтабПодписчик;
А.Инициализировать(100, "А", Журнал);

Б = Новый СтабПодписчик;
Б.Инициализировать(0, "Б", Журнал);

МенеджерПодписок = Новый МенеджерПодписок;
МенеджерПодписок.УстановитьПодписчиков(СоздатьИндекс("А", А, "Б", Б));
МенеджерПодписок.ПослеКоммита("", "");

Ожидаем.Что(Журнал[0], "Первой вызвана А (приоритет 100)").Равно("А");
Ожидаем.Что(Журнал[1], "Второй вызвана Б (приоритет 0)").Равно("Б");

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

// Все подписчики должны быть вызваны, не только первый
Процедура ТестДолжен_ВызыватьВсехПодписчиков() Экспорт

Журнал = Новый Массив;

А = Новый СтабПодписчик;
А.Инициализировать(100, "А", Журнал);

Б = Новый СтабПодписчик;
Б.Инициализировать(0, "Б", Журнал);

МенеджерПодписок = Новый МенеджерПодписок;
МенеджерПодписок.УстановитьПодписчиков(СоздатьИндекс("А", А, "Б", Б));
МенеджерПодписок.ПослеКоммита("", "");

Ожидаем.Что(Журнал.Количество(), "Вызваны оба подписчика").Равно(2);

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

// Три подписчика с перепутанными приоритетами — порядок по убыванию: В(50), А(10), Б(1)
Процедура ТестДолжен_ВызыватьТрёхПодписчиковВПравильномПорядке() Экспорт

Журнал = Новый Массив;

А = Новый СтабПодписчик;
А.Инициализировать(10, "А", Журнал);

Б = Новый СтабПодписчик;
Б.Инициализировать(1, "Б", Журнал);

В = Новый СтабПодписчик;
В.Инициализировать(50, "В", Журнал);

Индекс = Новый Соответствие;
Индекс.Вставить("А", А);
Индекс.Вставить("Б", Б);
Индекс.Вставить("В", В);

МенеджерПодписок = Новый МенеджерПодписок;
МенеджерПодписок.УстановитьПодписчиков(Индекс);
МенеджерПодписок.ПослеКоммита("", "");

Ожидаем.Что(Журнал.Количество(), "Вызваны все три подписчика").Равно(3);
Ожидаем.Что(Журнал[0], "Первой вызвана В (приоритет 50)").Равно("В");
Ожидаем.Что(Журнал[1], "Второй вызвана А (приоритет 10)").Равно("А");
Ожидаем.Что(Журнал[2], "Третьей вызвана Б (приоритет 1)").Равно("Б");

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

// Один подписчик — должен быть вызван без ошибок
Процедура ТестДолжен_КорректноОбрабатыватьОдногоПодписчика() Экспорт

Журнал = Новый Массив;

А = Новый СтабПодписчик;
А.Инициализировать(42, "А", Журнал);

МенеджерПодписок = Новый МенеджерПодписок;
МенеджерПодписок.УстановитьПодписчиков(СоздатьИндекс("А", А));
МенеджерПодписок.ПослеКоммита("", "");

Ожидаем.Что(Журнал.Количество(), "Единственный подписчик вызван").Равно(1);
Ожидаем.Что(Журнал[0]).Равно("А");

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

// Пустой индекс — никаких вызовов, никаких исключений
Процедура ТестДолжен_НеВызыватьЕслиПустойИндекс() Экспорт

Журнал = Новый Массив;

МенеджерПодписок = Новый МенеджерПодписок;
МенеджерПодписок.УстановитьПодписчиков(Новый Соответствие);
МенеджерПодписок.ПослеКоммита("", "");

Ожидаем.Что(Журнал.Количество(), "Подписчики не вызывались").Равно(0);

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

// ===========================================================================
// Вспомогательные
// ===========================================================================

Функция СоздатьИндекс(Знач К1 = "", Знач В1 = Неопределено,
Знач К2 = "", Знач В2 = Неопределено)
Индекс = Новый Соответствие;
Если Не ПустаяСтрока(К1) Тогда Индекс.Вставить(К1, В1); КонецЕсли;
Если Не ПустаяСтрока(К2) Тогда Индекс.Вставить(К2, В2); КонецЕсли;
Возврат Индекс;
КонецФункции

Лог = Логирование.ПолучитьЛог("test.менеджер-подписок");
Loading