SW 중심대학 OSS GIT 서버 박건태, 이승준, 고기완, 이준호 새로운 배포
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

154 lines
5.2 KiB

4 years ago
  1. using System.Collections.Generic;
  2. using NUnit.Framework;
  3. using UnityEngine.XR.ARSubsystems;
  4. #if UNITY_2019_3_OR_NEWER
  5. using LegacyMeshId = UnityEngine.XR.MeshId;
  6. #else
  7. using LegacyMeshId = UnityEngine.Experimental.XR.TrackableId;
  8. using MeshInfo = UnityEngine.Experimental.XR.MeshInfo;
  9. using MeshChangeState = UnityEngine.Experimental.XR.MeshChangeState;
  10. #endif
  11. namespace UnityEngine.XR.ARFoundation
  12. {
  13. [TestFixture]
  14. public class MeshQueueTestFixture
  15. {
  16. [Test]
  17. public void HighPriorityItemsTakePrecedence()
  18. {
  19. var emptyDict = new Dictionary<LegacyMeshId, MeshInfo>();
  20. var queue = new MeshQueue();
  21. for (int i = 0; i < 100; ++i)
  22. {
  23. queue.EnqueueUnique(new MeshInfo
  24. {
  25. MeshId = GetRandomMeshId(),
  26. ChangeState = MeshChangeState.Added,
  27. PriorityHint = Random.Range(0, 100)
  28. });
  29. }
  30. int? lastPriorityHint = null;
  31. while (queue.count > 0)
  32. {
  33. bool dequeued = queue.TryDequeue(emptyDict, out MeshInfo meshInfo);
  34. Assert.That(dequeued, "Could not dequeue even with an empty dictionary");
  35. if (lastPriorityHint.HasValue)
  36. {
  37. Assert.That(meshInfo.PriorityHint <= lastPriorityHint.Value);
  38. }
  39. lastPriorityHint = meshInfo.PriorityHint;
  40. }
  41. }
  42. [Test]
  43. public void AddedMeshesTakePrecedence()
  44. {
  45. var emptyDict = new Dictionary<LegacyMeshId, MeshInfo>();
  46. var queue = new MeshQueue();
  47. for (int i = 0; i < 100; ++i)
  48. {
  49. queue.EnqueueUnique(new MeshInfo
  50. {
  51. MeshId = GetRandomMeshId(),
  52. ChangeState = (Random.Range(0f, 1f) < .5f || i == 0) ? MeshChangeState.Added : MeshChangeState.Updated,
  53. PriorityHint = Random.Range(0, 100)
  54. });
  55. }
  56. MeshChangeState? lastChangeState = null;
  57. while (queue.count > 0)
  58. {
  59. bool dequeued = queue.TryDequeue(emptyDict, out MeshInfo meshInfo);
  60. Assert.That(dequeued, "Could not dequeue even with an empty dictionary");
  61. if (lastChangeState.HasValue)
  62. {
  63. Assert.That((meshInfo.ChangeState == lastChangeState.Value) || (meshInfo.ChangeState == MeshChangeState.Updated && lastChangeState.Value == MeshChangeState.Added),
  64. "All added meshes did not come first");
  65. }
  66. lastChangeState = meshInfo.ChangeState;
  67. }
  68. }
  69. [Test]
  70. public void GeneratingMeshesAreNotDequeued()
  71. {
  72. var generating = new Dictionary<LegacyMeshId, MeshInfo>();
  73. var queue = new MeshQueue();
  74. for (int i = 0; i < 100; ++i)
  75. {
  76. var meshId = GetRandomMeshId();
  77. var meshInfo = new MeshInfo
  78. {
  79. MeshId = meshId,
  80. ChangeState = MeshChangeState.Added,
  81. PriorityHint = Random.Range(0, 100)
  82. };
  83. queue.EnqueueUnique(meshInfo);
  84. if (Random.Range(0f, 1f) < .5f)
  85. {
  86. generating[meshId] = meshInfo;
  87. }
  88. }
  89. while (generating.Count < queue.count)
  90. {
  91. bool result = queue.TryDequeue(generating, out MeshInfo meshInfo);
  92. Assert.That(result, "Could not dequeue a mesh info even though there are more items to dequeue.");
  93. Assert.That(!generating.ContainsKey(meshInfo.MeshId), "Should not dequeue a mesh info while it is generating.");
  94. }
  95. }
  96. [Test]
  97. public void QueueIsUnique()
  98. {
  99. var generating = new Dictionary<LegacyMeshId, MeshInfo>();
  100. var queue = new MeshQueue();
  101. var uniqueMeshIds = new List<LegacyMeshId>();
  102. for (int i = 0; i < 100; ++i)
  103. {
  104. LegacyMeshId meshId;
  105. if (i == 0 || Random.Range(0f, 1f) < .5f)
  106. {
  107. meshId = MakeMeshId((ulong)i, (ulong)i);
  108. uniqueMeshIds.Add(meshId);
  109. }
  110. else
  111. {
  112. meshId = uniqueMeshIds[Random.Range(0, uniqueMeshIds.Count - 1)];
  113. }
  114. var meshInfo = new MeshInfo
  115. {
  116. MeshId = meshId,
  117. ChangeState = MeshChangeState.Added,
  118. PriorityHint = Random.Range(0, 100)
  119. };
  120. queue.EnqueueUnique(meshInfo);
  121. Assert.That(uniqueMeshIds.Count == queue.count);
  122. }
  123. }
  124. LegacyMeshId MakeMeshId(ulong a, ulong b)
  125. {
  126. return ARMeshManager.GetLegacyMeshId(new TrackableId(a, b));
  127. }
  128. LegacyMeshId GetRandomMeshId()
  129. {
  130. return MakeMeshId(
  131. (ulong)Random.Range(0, int.MaxValue),
  132. (ulong)Random.Range(0, int.MaxValue));
  133. }
  134. }
  135. }