From b8a2655cf0b24a135d6c8a0158e8870033fb75ee Mon Sep 17 00:00:00 2001 From: sfaqer Date: Wed, 15 Jan 2025 15:50:46 +1000 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=20=D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D1=87=D0=B8=D0=BA=D0=B0=20=D0=BD=D0=B0=20=D0=B2=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BE=D0=B5=20=D1=81=D0=BE=D0=B1=D1=8B=D1=82=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=83=20=D0=BE=D0=B4=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=B8?= =?UTF-8?q?=D1=81=D1=82=D0=BE=D1=87=D0=BD=D0=B8=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DefaultEventProcessor.cs | 22 ++++++++++++++----- tests/events.os | 20 +++++++++++++++++ 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/ScriptEngine.HostedScript/DefaultEventProcessor.cs b/src/ScriptEngine.HostedScript/DefaultEventProcessor.cs index aceb67955..74da39942 100644 --- a/src/ScriptEngine.HostedScript/DefaultEventProcessor.cs +++ b/src/ScriptEngine.HostedScript/DefaultEventProcessor.cs @@ -72,11 +72,15 @@ public void AddHandler( if (!_registeredHandlers.TryGetValue(eventSource, out var handlers)) { handlers = new Dictionary(); - 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( @@ -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); } } @@ -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); } diff --git a/tests/events.os b/tests/events.os index 3c65943c0..7d94060cd 100644 --- a/tests/events.os +++ b/tests/events.os @@ -16,6 +16,7 @@ ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоПодпискаПоОбъектуВидитТолькоЭкспорт"); ВсеТесты.Добавить("ТестДолжен_ПроверитьПодпискуНаСобытиеВВидеВыражения"); ВсеТесты.Добавить("ТестДолжен_ПроверитьПодпискуСОбработчикомВВидеВыражения"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоУИсточникаМожетБытьНесколькоСобытий"); Возврат ВсеТесты; @@ -175,4 +176,23 @@ КонецПроцедуры +Процедура ТестДолжен_ПроверитьЧтоУИсточникаМожетБытьНесколькоСобытий() Экспорт + + Источник = Новый ТестСобытий; + + ДобавитьОбработчик Источник.МоеСобытие, ОбработчикСобытияВнутр; + ДобавитьОбработчик Источник.МоеСобытиеВторое, ОбработчикСобытияВнутр; + + МассивПараметров = Новый Массив; + МассивПараметров.Добавить("П1"); + МассивПараметров.Добавить("П2"); + + Источник.СгенерироватьСобытие("МоеСобытие", МассивПараметров); + юТест.ПроверитьРавенство(1, СчетчикВызовов); + + Источник.СгенерироватьСобытие("МоеСобытиеВторое", МассивПараметров); + юТест.ПроверитьРавенство(2, СчетчикВызовов); + +КонецПроцедуры + ПодключитьСценарий(ТекущийСценарий().Источник, "ТестСобытий"); \ No newline at end of file