first commit
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
using NUnit.Framework;
|
||||
using UnityEngine;
|
||||
using UnityEngine.EventSystems;
|
||||
|
||||
public class EventTriggerRemoveDuringExecution
|
||||
{
|
||||
[Test]
|
||||
[Description("ArgumentOutOfRange Exception is thrown when removing handler in callback in EventTrigger (case 1401557)")]
|
||||
public void EventTrigger_DoesNotThrowExceptionWhenRemovingEventDuringExecution()
|
||||
{
|
||||
var go = new GameObject();
|
||||
var eventTrigger = go.AddComponent<EventTrigger>();
|
||||
var eventSystem = go.AddComponent<EventSystem>();
|
||||
|
||||
var entry1 = new EventTrigger.Entry { eventID = EventTriggerType.PointerDown };
|
||||
var entry2 = new EventTrigger.Entry { eventID = EventTriggerType.PointerDown };
|
||||
|
||||
bool executed1 = false;
|
||||
bool executed2 = false;
|
||||
entry1.callback.AddListener(e =>
|
||||
{
|
||||
executed1 = true;
|
||||
eventTrigger.triggers.Remove(entry2);
|
||||
});
|
||||
entry2.callback.AddListener(e => executed2 = true);
|
||||
|
||||
eventTrigger.triggers.Add(entry1);
|
||||
eventTrigger.triggers.Add(entry2);
|
||||
|
||||
Assert.DoesNotThrow(() => eventTrigger.OnPointerDown(new PointerEventData(eventSystem)));
|
||||
Assert.True(executed1, "Expected Event 1 to be called but it was not.");
|
||||
Assert.False(executed2, "Expected Event 2 to not be called as it was removed by event 1.");
|
||||
Assert.That(eventTrigger.triggers, Does.Not.Contains(entry2));
|
||||
Assert.That(eventTrigger.triggers, Does.Contain(entry1));
|
||||
|
||||
Object.DestroyImmediate(go);
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4adb1f65bbae8004a88d8f5bc3523298
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,74 @@
|
||||
using System;
|
||||
using System.Reflection;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine.EventSystems;
|
||||
using UnityEditor;
|
||||
using NUnit.Framework;
|
||||
|
||||
public class InterceptedEventsPreviewTests
|
||||
{
|
||||
[Test]
|
||||
public void InterceptedEventsPreviewCacheUsingTypeCacheReturnsSameTypes()
|
||||
{
|
||||
var typeCacheEventInterfaces = new List<Type>();
|
||||
TypeCache.TypeCollection types = TypeCache.GetTypesDerivedFrom<IEventSystemHandler>();
|
||||
foreach (var type in types)
|
||||
{
|
||||
if (!type.IsInterface)
|
||||
continue;
|
||||
|
||||
typeCacheEventInterfaces.Add(type);
|
||||
}
|
||||
|
||||
var appDomainEventInterfaces = new List<Type>();
|
||||
foreach (var type in GetAccessibleTypesInLoadedAssemblies())
|
||||
{
|
||||
if (!type.IsInterface)
|
||||
continue;
|
||||
|
||||
appDomainEventInterfaces.Add(type);
|
||||
}
|
||||
|
||||
Assert.AreNotEqual(typeCacheEventInterfaces.Count, appDomainEventInterfaces.Count, "Did not find the same number of EventInterface types");
|
||||
|
||||
for (int i = 0; i < typeCacheEventInterfaces.Count; ++i)
|
||||
{
|
||||
Assert.Contains(typeCacheEventInterfaces[i], appDomainEventInterfaces);
|
||||
}
|
||||
}
|
||||
|
||||
private static IEnumerable<Type> GetAccessibleTypesInLoadedAssemblies()
|
||||
{
|
||||
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
|
||||
for (var i = 0; i < assemblies.Length; ++i)
|
||||
{
|
||||
Type[] types;
|
||||
var assembly = assemblies[i];
|
||||
|
||||
if (assembly == null)
|
||||
continue;
|
||||
|
||||
try
|
||||
{
|
||||
types = assembly.GetTypes();
|
||||
}
|
||||
catch (ReflectionTypeLoadException e)
|
||||
{
|
||||
// assembly.GetTypes() might fail in case the Assembly cannot resolve all its references,
|
||||
// or in case it was built targetting a newer version of .NET.
|
||||
// In case the resolution fails for some types, we can still access the ones that have been
|
||||
// properly loaded.
|
||||
types = e.Types;
|
||||
}
|
||||
|
||||
for (var j = 0; j < types.Length; ++j)
|
||||
{
|
||||
var type = types[j];
|
||||
if (type == null)
|
||||
continue;
|
||||
|
||||
yield return type;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2aff4fada0516c64a8537a20bfe1b699
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Reference in New Issue
Block a user