AsteroidTests.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. using UnityEngine;
  2. using UnityEngine.TestTools;
  3. using NUnit.Framework;
  4. using System.Collections;
  5. public class AsteroidTests
  6. {
  7. GameObject asteroidPrefab;
  8. [SetUp]
  9. public void Setup()
  10. {
  11. GameManager.InitializeTestingEnvironment(false, false, false, false, false);
  12. asteroidPrefab = ((GameObject)Resources.Load("TestsReferences", typeof(GameObject))).GetComponent<TestsReferences>().asteroidPrefab;
  13. }
  14. void ClearScene()
  15. {
  16. Transform[] objects = Object.FindObjectsOfType<Transform>();
  17. foreach (Transform obj in objects)
  18. {
  19. if (obj != null)
  20. Object.DestroyImmediate(obj.gameObject);
  21. }
  22. }
  23. [Test]
  24. public void _01_AsteroidPrefabExists()
  25. {
  26. Assert.NotNull(asteroidPrefab);
  27. }
  28. [Test]
  29. public void _02_AsteroidPrefabCanBeInstantiated()
  30. {
  31. ClearScene();
  32. GameObject asteroid = (GameObject)Object.Instantiate(asteroidPrefab);
  33. asteroid.name = "Asteroid";
  34. Assert.NotNull(GameObject.Find("Asteroid"));
  35. }
  36. [Test]
  37. public void _03_AsteroidPrefabHasRequiredComponentTransform()
  38. {
  39. Assert.IsNotNull(asteroidPrefab.GetComponent<Transform>());
  40. }
  41. [Test]
  42. public void _04_AsteroidPrefabHasRequiredComponentCollider()
  43. {
  44. Assert.IsNotNull(asteroidPrefab.GetComponent<CircleCollider2D>());
  45. }
  46. [Test]
  47. public void _05_AsteroidPrefabHasRequiredComponentControllerScript()
  48. {
  49. Assert.IsNotNull(asteroidPrefab.GetComponent<AsteroidController>());
  50. Assert.IsNotNull(asteroidPrefab.GetComponent<AsteroidController>().asteroidExplosion); // Checking if script component has required references
  51. }
  52. [UnityTest]
  53. public IEnumerator _06_AsteroidGameobjectIsDestroyedOnSplit()
  54. {
  55. ClearScene();
  56. GameObject asteroid = (GameObject)Object.Instantiate(asteroidPrefab, Vector3.zero, Quaternion.identity);
  57. asteroid.GetComponent<AsteroidController>().Split();
  58. yield return null;
  59. Assert.IsTrue(asteroid == null, "Base asteroid was not destroyed on Split");
  60. }
  61. [Test]
  62. public void _07_AsteroidSplitCountCanBeChanged()
  63. {
  64. ClearScene();
  65. AsteroidController asteroid = Object.Instantiate(asteroidPrefab, Vector3.zero, Quaternion.identity).GetComponent<AsteroidController>();
  66. asteroid.SetSplitCount(2);
  67. Assert.IsTrue(asteroid.GetSplitCount() == 2);
  68. }
  69. [UnityTest]
  70. public IEnumerator _08_AsteroidCanSplitIntoTwo()
  71. {
  72. ClearScene();
  73. GameObject asteroid = (GameObject)Object.Instantiate(asteroidPrefab, Vector3.zero, Quaternion.identity);
  74. asteroid.GetComponent<AsteroidController>().Split(); // Split base asteroid
  75. yield return null;
  76. AsteroidController[] asteroids = Object.FindObjectsOfType<AsteroidController>(); // Find all asteroids in the scene
  77. Assert.IsTrue(asteroids.Length == 2); // There should be 2 asteroids in the scene now
  78. }
  79. [UnityTest]
  80. public IEnumerator _09_AsteroidCanSplitTwice()
  81. {
  82. ClearScene();
  83. GameObject asteroid = (GameObject)Object.Instantiate(asteroidPrefab, Vector3.zero, Quaternion.identity);
  84. asteroid.GetComponent<AsteroidController>().Split(); // Split base asteroid
  85. yield return null;
  86. AsteroidController[] asteroids = Object.FindObjectsOfType<AsteroidController>(); // Find all asteroids in the scene
  87. foreach(AsteroidController childAsteroid in asteroids)
  88. childAsteroid.Split(); // Split found asteroids
  89. yield return null;
  90. asteroids = Object.FindObjectsOfType<AsteroidController>(); // Find all asteroids in the scene
  91. Assert.IsTrue(asteroids.Length == 4); // There should be 4 asteroids in the scene now
  92. }
  93. [UnityTest]
  94. // It takes three hits to destroy an asteroid from base size, after 3 hits the asteroid should not split anymore
  95. public IEnumerator _10_AsteroidCannotSplitThreeTimes()
  96. {
  97. ClearScene();
  98. GameObject asteroid = (GameObject)Object.Instantiate(asteroidPrefab, Vector3.zero, Quaternion.identity);
  99. asteroid.GetComponent<AsteroidController>().Split(); // Split base asteroid
  100. yield return null;
  101. AsteroidController[] asteroids = Object.FindObjectsOfType<AsteroidController>(); // Find all asteroids in the scene
  102. foreach (AsteroidController childAsteroid in asteroids)
  103. childAsteroid.Split(); // Split found asteroids
  104. yield return null;
  105. asteroids = Object.FindObjectsOfType<AsteroidController>(); // Find all asteroids in the scene
  106. foreach (AsteroidController childAsteroid in asteroids)
  107. childAsteroid.Split(); // Split found asteroids
  108. yield return null;
  109. asteroids = Object.FindObjectsOfType<AsteroidController>(); // Find all asteroids in the scene
  110. Assert.IsTrue(asteroids.Length == 0); // There should be no asteroids left in the scene
  111. }
  112. [UnityTest]
  113. // Splitting the asteroid should spawn 2 asteroids at half scale of the split asteroid
  114. public IEnumerator _11_AsteroidScaleIsCutInHalfOnSplit()
  115. {
  116. ClearScene();
  117. GameObject asteroid = (GameObject)Object.Instantiate(asteroidPrefab, Vector3.zero, Quaternion.identity);
  118. asteroid.GetComponent<AsteroidController>().Split(); // Split base asteroid
  119. yield return null;
  120. AsteroidController[] asteroids = Object.FindObjectsOfType<AsteroidController>(); // Find all asteroids in the scene
  121. foreach (AsteroidController childAsteroid in asteroids)
  122. Assert.IsTrue(childAsteroid.transform.localScale == new Vector3(0.5f, 0.5f, 0.5f));
  123. }
  124. [Test]
  125. public void _12_AsteroidCanMove()
  126. {
  127. ClearScene();
  128. AsteroidController asteroid = Object.Instantiate(asteroidPrefab, Vector3.zero, Quaternion.identity).GetComponent<AsteroidController>();
  129. asteroid.Move();
  130. Assert.IsTrue(asteroid.transform.position != Vector3.zero);
  131. }
  132. [Test]
  133. public void _13_AsteroidDirectionCanBeChanged()
  134. {
  135. ClearScene();
  136. AsteroidController asteroid = Object.Instantiate(asteroidPrefab, Vector3.zero, Quaternion.identity).GetComponent<AsteroidController>();
  137. asteroid.SetDirection(Vector2.up);
  138. Assert.IsTrue(asteroid.GetDirection() == Vector2.up);
  139. }
  140. [UnityTest]
  141. public IEnumerator _14_AsteroidMovesAccordingToItsDirectionVector()
  142. {
  143. ClearScene();
  144. AsteroidController asteroid = Object.Instantiate(asteroidPrefab, Vector3.zero, Quaternion.identity).GetComponent<AsteroidController>();
  145. asteroid.SetDirection(Vector2.up);
  146. Assert.IsTrue(asteroid.GetDirection() == Vector2.up);
  147. float t = 0.5f;
  148. while (t > 0.0f)
  149. {
  150. t -= Time.deltaTime;
  151. yield return null;
  152. }
  153. Assert.IsTrue(asteroid.transform.position.x == 0.0f && asteroid.transform.position.y > 0.0f);
  154. }
  155. [UnityTest]
  156. public IEnumerator _15_AsteroidIsDestroyedWhenOffscreen()
  157. {
  158. ClearScene();
  159. AsteroidController asteroid = Object.Instantiate(asteroidPrefab, Vector3.right * 100, Quaternion.identity).GetComponent<AsteroidController>();
  160. yield return null;
  161. Assert.IsTrue(asteroid == null, "Asteroid was not destroyed when off screen");
  162. }
  163. [Test]
  164. public void _16_AsteroidPrefabHasRequiredVisual()
  165. {
  166. Transform visualChild = asteroidPrefab.transform.GetChild(0);
  167. Assert.IsTrue(visualChild.name == "Visual");
  168. Assert.IsNotNull(visualChild);
  169. Assert.IsNotNull(visualChild.GetComponent<MeshRenderer>());
  170. Assert.IsNotNull(visualChild.GetComponent<MeshRenderer>().sharedMaterials[0]);
  171. Assert.IsNotNull(visualChild.GetComponent<MeshFilter>());
  172. Assert.IsNotNull(visualChild.GetComponent<MeshFilter>().sharedMesh);
  173. }
  174. [Test]
  175. public void _17_AsteroidPrefabHasRequiredComponentRigidbody()
  176. {
  177. Assert.IsNotNull(asteroidPrefab.GetComponent<Rigidbody2D>());
  178. Assert.IsTrue(asteroidPrefab.GetComponent<Rigidbody2D>().isKinematic);
  179. Assert.IsTrue(asteroidPrefab.GetComponent<Rigidbody2D>().collisionDetectionMode == CollisionDetectionMode2D.Continuous);
  180. Assert.IsTrue(asteroidPrefab.GetComponent<Rigidbody2D>().interpolation == RigidbodyInterpolation2D.Interpolate);
  181. }
  182. [UnityTest]
  183. public IEnumerator _18_AsteroidStartsWithARandomRotation()
  184. {
  185. ClearScene();
  186. AsteroidController asteroid1 = Object.Instantiate(asteroidPrefab, Vector3.zero, Quaternion.identity).GetComponent<AsteroidController>();
  187. AsteroidController asteroid2 = Object.Instantiate(asteroidPrefab, Vector3.zero, Quaternion.identity).GetComponent<AsteroidController>();
  188. AsteroidController asteroid3 = Object.Instantiate(asteroidPrefab, Vector3.zero, Quaternion.identity).GetComponent<AsteroidController>();
  189. yield return null;
  190. Assert.IsTrue(asteroid1.transform.rotation != asteroid2.transform.rotation && asteroid1.transform.rotation != asteroid3.transform.rotation && asteroid2.transform.rotation != asteroid3.transform.rotation);
  191. }
  192. [UnityTest]
  193. public IEnumerator _19_AsteroidSpawnsExplosionWhenDestroyed()
  194. {
  195. ClearScene();
  196. GameObject asteroid = (GameObject)Object.Instantiate(asteroidPrefab, Vector3.zero, Quaternion.identity);
  197. asteroid.GetComponent<AsteroidController>().Split();
  198. yield return null;
  199. Assert.IsTrue(asteroid == null);
  200. GameObject explosion = GameObject.Find("ExplosionRegular(Clone)");
  201. Assert.NotNull(explosion);
  202. }
  203. [UnityTest]
  204. public IEnumerator _20_AsteroidDoesntMoveDuringPause()
  205. {
  206. ClearScene();
  207. AsteroidController asteroid = Object.Instantiate(asteroidPrefab, Vector3.zero, Quaternion.identity).GetComponent<AsteroidController>();
  208. asteroid.SetDirection(Vector2.up);
  209. Vector3 startPosition = asteroid.transform.position;
  210. GameManager.IsPaused = true;
  211. for(int i = 0; i < 20; i++)
  212. yield return null;
  213. Assert.IsTrue(asteroid.transform.position == startPosition);
  214. }
  215. }