您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

185 行
6.9 KiB

using NUnit.Framework;
using System;
using Unity.Entities;
//@TODO: We should really design systems / jobs / exceptions / errors
// so that an error in one system does not affect the next system.
// Right now failure to set dependencies correctly in one system affects other code,
// this makes the error messages significantly less useful...
// So need to redo all tests accordingly
namespace Unity.Entities.Tests
{
public class SafetyTests : ECSTestsFixture
{
[Test]
public void RemoveEntityComponentThrows()
{
var entity = m_Manager.CreateEntity(typeof(EcsTestData));
Assert.Throws<ArgumentException>(() => { m_Manager.RemoveComponent(entity, typeof(Entity)); });
Assert.IsTrue(m_Manager.HasComponent<EcsTestData>(entity));
}
[Test]
public void ComponentArrayChunkSliceOutOfBoundsThrowsException()
{
for (int i = 0;i<10;i++)
m_Manager.CreateEntity(typeof(EcsTestData), typeof(EcsTestData2));
var group = m_Manager.CreateComponentGroup(typeof(EcsTestData));
var testData = group.GetComponentDataArray<EcsTestData>();
Assert.AreEqual(0, testData.GetChunkArray(5, 0).Length);
Assert.AreEqual(10, testData.GetChunkArray(0, 10).Length);
Assert.Throws<IndexOutOfRangeException>(() => { testData.GetChunkArray(-1, 1); });
Assert.Throws<IndexOutOfRangeException>(() => { testData.GetChunkArray(5, 6); });
Assert.Throws<IndexOutOfRangeException>(() => { testData.GetChunkArray(10, 1); });
}
[Test]
public void ReadOnlyComponentDataArray()
{
var group = m_Manager.CreateComponentGroup(typeof(EcsTestData2), ComponentType.ReadOnly(typeof(EcsTestData)));
var entity = m_Manager.CreateEntity(typeof(EcsTestData), typeof(EcsTestData2));
m_Manager.SetComponentData(entity, new EcsTestData(42));
// EcsTestData is read only
var arr = group.GetComponentDataArray<EcsTestData>();
Assert.AreEqual(1, arr.Length);
Assert.AreEqual(42, arr[0].value);
Assert.Throws<System.InvalidOperationException>(() => { arr[0] = new EcsTestData(0); });
// EcsTestData2 can be written to
var arr2 = group.GetComponentDataArray<EcsTestData2>();
Assert.AreEqual(1, arr2.Length);
arr2[0] = new EcsTestData2(55);
Assert.AreEqual(55, arr2[0].value0);
}
[Test]
public void AccessComponentArrayAfterCreationThrowsException()
{
CreateEntityWithDefaultData(0);
var group = m_Manager.CreateComponentGroup(typeof(EcsTestData));
var arr = group.GetComponentDataArray<EcsTestData>();
CreateEntityWithDefaultData(1);
Assert.Throws<InvalidOperationException>(() => { var value = arr[0]; });
}
[Test]
public void CreateEntityInvalidatesArray()
{
CreateEntityWithDefaultData(0);
var group = m_Manager.CreateComponentGroup(typeof(EcsTestData));
var arr = group.GetComponentDataArray<EcsTestData>();
CreateEntityWithDefaultData(1);
Assert.Throws<InvalidOperationException>(() => { var value = arr[0]; });
}
[Test]
public void GetSetComponentThrowsIfNotExist()
{
var entity = m_Manager.CreateEntity(typeof(EcsTestData));
var destroyedEntity = m_Manager.CreateEntity(typeof(EcsTestData));
m_Manager.DestroyEntity(destroyedEntity);
Assert.Throws<System.ArgumentException>(() => { m_Manager.SetComponentData(entity, new EcsTestData2()); });
Assert.Throws<System.ArgumentException>(() => { m_Manager.SetComponentData(destroyedEntity, new EcsTestData2()); });
Assert.Throws<System.ArgumentException>(() => { m_Manager.GetComponentData<EcsTestData2>(entity); });
Assert.Throws<System.ArgumentException>(() => { m_Manager.GetComponentData<EcsTestData2>(destroyedEntity); });
}
[Test]
public void ComponentDataArrayFromEntityThrowsIfNotExist()
{
var entity = m_Manager.CreateEntity(typeof(EcsTestData));
var destroyedEntity = m_Manager.CreateEntity(typeof(EcsTestData));
m_Manager.DestroyEntity(destroyedEntity);
var data = EmptySystem.GetComponentDataFromEntity<EcsTestData2>();
Assert.Throws<System.ArgumentException>(() => { data[entity] = new EcsTestData2(); });
Assert.Throws<System.ArgumentException>(() => { data[destroyedEntity] = new EcsTestData2(); });
Assert.Throws<System.ArgumentException>(() => { var p = data[entity]; });
Assert.Throws<System.ArgumentException>(() => { var p = data[destroyedEntity]; });
}
[Test]
public void AddComponentTwiceThrows()
{
var entity = m_Manager.CreateEntity();
m_Manager.AddComponentData(entity, new EcsTestData(1));
Assert.Throws<System.ArgumentException>(() => { m_Manager.AddComponentData(entity, new EcsTestData(1)); });
}
[Test]
public void AddRemoveComponentOnDestroyedEntityThrows()
{
var destroyedEntity = m_Manager.CreateEntity();
m_Manager.DestroyEntity(destroyedEntity);
Assert.Throws<System.ArgumentException>(() => { m_Manager.AddComponentData(destroyedEntity, new EcsTestData(1)); });
Assert.Throws<System.ArgumentException>(() => { m_Manager.RemoveComponent<EcsTestData>(destroyedEntity); });
}
[Test]
public void RemoveComponentOnEntityWithoutComponent()
{
var entity = m_Manager.CreateEntity();
Assert.Throws<System.ArgumentException>(() => { m_Manager.RemoveComponent<EcsTestData>(entity); });
}
[Test]
public void CreateDestroyEmptyEntity()
{
var entity = m_Manager.CreateEntity();
Assert.IsTrue(m_Manager.Exists(entity));
m_Manager.DestroyEntity(entity);
Assert.IsFalse(m_Manager.Exists(entity));
}
[Test]
public void CreateEntityWithNullTypeThrows()
{
Assert.Throws<System.NullReferenceException>(() => m_Manager.CreateEntity(null));
}
[Test]
public void CreateEntityWithOneNullTypeThrows()
{
Assert.Throws<System.ArgumentException>(() => m_Manager.CreateEntity(null, typeof(EcsTestData)));
}
unsafe struct BigComponentData1 : IComponentData
{
public fixed int BigArray[10000];
}
unsafe struct BigComponentData2 : IComponentData
{
public fixed float BigArray[10000];
}
[Test]
public void CreateTooBigArchetypeThrows()
{
Assert.Throws<System.ArgumentException>(() =>
{
m_Manager.CreateArchetype(typeof(BigComponentData1), typeof(BigComponentData2));
});
}
}
}