Skip to content

Commit

Permalink
Merge pull request #1490 from sfaqer/bugfix/multiEventNameBySource
Browse files Browse the repository at this point in the history
Исправлена ошибка при регистрации обработчика на второе событие у одного источника
  • Loading branch information
EvilBeaver authored Jan 16, 2025
2 parents 985c65d + b8a2655 commit 7585d31
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 5 deletions.
22 changes: 17 additions & 5 deletions src/ScriptEngine.HostedScript/DefaultEventProcessor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -72,11 +72,15 @@ public void AddHandler(
if (!_registeredHandlers.TryGetValue(eventSource, out var handlers))
{
handlers = new Dictionary<string, HandlersList>();
handlers[eventName] = new HandlersList();
_registeredHandlers[eventSource] = handlers;
}

handlers[eventName].Add(handlerScript, handlerMethod);
if (!handlers.TryGetValue(eventName, out var handlersList)) {
handlersList = new HandlersList();
handlers[eventName] = handlersList;
}

handlersList.Add(handlerScript, handlerMethod);
}

public void RemoveHandler(
Expand All @@ -88,9 +92,13 @@ public void RemoveHandler(
if (!(handlerTarget is ScriptDrivenObject handlerScript))
throw RuntimeException.InvalidArgumentType("handlerTarget");

if (_registeredHandlers.TryGetValue(eventSource, out var handlers))
if (!_registeredHandlers.TryGetValue(eventSource, out var handlers))
{
handlers[eventName].Remove(handlerScript, handlerMethod);
return;
}

if (handlers.TryGetValue(eventName, out var handlersList)) {
handlersList.Remove(handlerScript, handlerMethod);
}
}

Expand All @@ -99,7 +107,11 @@ public void HandleEvent(IRuntimeContextInstance eventSource, string eventName, I
if (!_registeredHandlers.TryGetValue(eventSource, out var handlers))
return;

foreach (var handler in handlers[eventName])
if (!handlers.TryGetValue(eventName, out var handlersList)) {
return;
}

foreach (var handler in handlersList)
{
handler.Method(eventArgs);
}
Expand Down
20 changes: 20 additions & 0 deletions tests/events.os
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоПодпискаПоОбъектуВидитТолькоЭкспорт");
ВсеТесты.Добавить("ТестДолжен_ПроверитьПодпискуНаСобытиеВВидеВыражения");
ВсеТесты.Добавить("ТестДолжен_ПроверитьПодпискуСОбработчикомВВидеВыражения");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоУИсточникаМожетБытьНесколькоСобытий");

Возврат ВсеТесты;

Expand Down Expand Up @@ -175,4 +176,23 @@

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

Процедура ТестДолжен_ПроверитьЧтоУИсточникаМожетБытьНесколькоСобытий() Экспорт

Источник = Новый ТестСобытий;

ДобавитьОбработчик Источник.МоеСобытие, ОбработчикСобытияВнутр;
ДобавитьОбработчик Источник.МоеСобытиеВторое, ОбработчикСобытияВнутр;

МассивПараметров = Новый Массив;
МассивПараметров.Добавить("П1");
МассивПараметров.Добавить("П2");

Источник.СгенерироватьСобытие("МоеСобытие", МассивПараметров);
юТест.ПроверитьРавенство(1, СчетчикВызовов);

Источник.СгенерироватьСобытие("МоеСобытиеВторое", МассивПараметров);
юТест.ПроверитьРавенство(2, СчетчикВызовов);

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

ПодключитьСценарий(ТекущийСценарий().Источник, "ТестСобытий");

0 comments on commit 7585d31

Please sign in to comment.