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
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, СчетчикВызовов);

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

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