Skip to content

Commit 7585d31

Browse files
authored
Merge pull request EvilBeaver#1490 from sfaqer/bugfix/multiEventNameBySource
Исправлена ошибка при регистрации обработчика на второе событие у одного источника
2 parents 985c65d + b8a2655 commit 7585d31

File tree

2 files changed

+37
-5
lines changed

2 files changed

+37
-5
lines changed

src/ScriptEngine.HostedScript/DefaultEventProcessor.cs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,15 @@ public void AddHandler(
7272
if (!_registeredHandlers.TryGetValue(eventSource, out var handlers))
7373
{
7474
handlers = new Dictionary<string, HandlersList>();
75-
handlers[eventName] = new HandlersList();
7675
_registeredHandlers[eventSource] = handlers;
7776
}
7877

79-
handlers[eventName].Add(handlerScript, handlerMethod);
78+
if (!handlers.TryGetValue(eventName, out var handlersList)) {
79+
handlersList = new HandlersList();
80+
handlers[eventName] = handlersList;
81+
}
82+
83+
handlersList.Add(handlerScript, handlerMethod);
8084
}
8185

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

91-
if (_registeredHandlers.TryGetValue(eventSource, out var handlers))
95+
if (!_registeredHandlers.TryGetValue(eventSource, out var handlers))
9296
{
93-
handlers[eventName].Remove(handlerScript, handlerMethod);
97+
return;
98+
}
99+
100+
if (handlers.TryGetValue(eventName, out var handlersList)) {
101+
handlersList.Remove(handlerScript, handlerMethod);
94102
}
95103
}
96104

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

102-
foreach (var handler in handlers[eventName])
110+
if (!handlers.TryGetValue(eventName, out var handlersList)) {
111+
return;
112+
}
113+
114+
foreach (var handler in handlersList)
103115
{
104116
handler.Method(eventArgs);
105117
}

tests/events.os

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоПодпискаПоОбъектуВидитТолькоЭкспорт");
1717
ВсеТесты.Добавить("ТестДолжен_ПроверитьПодпискуНаСобытиеВВидеВыражения");
1818
ВсеТесты.Добавить("ТестДолжен_ПроверитьПодпискуСОбработчикомВВидеВыражения");
19+
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоУИсточникаМожетБытьНесколькоСобытий");
1920

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

@@ -175,4 +176,23 @@
175176

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

179+
Процедура ТестДолжен_ПроверитьЧтоУИсточникаМожетБытьНесколькоСобытий() Экспорт
180+
181+
Источник = Новый ТестСобытий;
182+
183+
ДобавитьОбработчик Источник.МоеСобытие, ОбработчикСобытияВнутр;
184+
ДобавитьОбработчик Источник.МоеСобытиеВторое, ОбработчикСобытияВнутр;
185+
186+
МассивПараметров = Новый Массив;
187+
МассивПараметров.Добавить("П1");
188+
МассивПараметров.Добавить("П2");
189+
190+
Источник.СгенерироватьСобытие("МоеСобытие", МассивПараметров);
191+
юТест.ПроверитьРавенство(1, СчетчикВызовов);
192+
193+
Источник.СгенерироватьСобытие("МоеСобытиеВторое", МассивПараметров);
194+
юТест.ПроверитьРавенство(2, СчетчикВызовов);
195+
196+
КонецПроцедуры
197+
178198
ПодключитьСценарий(ТекущийСценарий().Источник, "ТестСобытий");

0 commit comments

Comments
 (0)