SpaceshipTests.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. using UnityEngine;
  2. using UnityEngine.TestTools;
  3. using NUnit.Framework;
  4. using System.Collections;
  5. public class SpaceshipTests {
  6. GameObject spaceshipPrefab;
  7. GameObject asteroidPrefab;
  8. GameObject cameraPrefab;
  9. [SetUp]
  10. public void Setup()
  11. {
  12. GameManager.InitializeTestingEnvironment(false, false, true, false, false);
  13. spaceshipPrefab = ((GameObject)Resources.Load("TestsReferences", typeof(GameObject))).GetComponent<TestsReferences>().spaceshipPrefab;
  14. asteroidPrefab = ((GameObject)Resources.Load("TestsReferences", typeof(GameObject))).GetComponent<TestsReferences>().asteroidPrefab;
  15. cameraPrefab = ((GameObject)Resources.Load("TestsReferences", typeof(GameObject))).GetComponent<TestsReferences>().cameraPrefab;
  16. }
  17. void ClearScene()
  18. {
  19. Transform[] objects = Object.FindObjectsOfType<Transform>();
  20. foreach (Transform obj in objects)
  21. {
  22. if (obj != null)
  23. Object.DestroyImmediate(obj.gameObject);
  24. }
  25. }
  26. [Test]
  27. public void _01_SpaceshipPrefabExists() {
  28. Assert.NotNull(spaceshipPrefab);
  29. }
  30. [Test]
  31. public void _02_SpaceshipPrefabCanBeInstantiated()
  32. {
  33. ClearScene();
  34. GameObject spaceship = (GameObject)Object.Instantiate(spaceshipPrefab);
  35. spaceship.name = "Spaceship";
  36. Assert.NotNull(GameObject.Find("Spaceship"));
  37. }
  38. [Test]
  39. public void _03_SpaceshipPrefabHasRequiredComponentTransform()
  40. {
  41. Assert.IsNotNull(spaceshipPrefab.GetComponent<Transform>());
  42. }
  43. [Test]
  44. public void _04_SpaceshipPrefabHasRequiredComponentCollider()
  45. {
  46. Assert.IsNotNull(spaceshipPrefab.GetComponent<PolygonCollider2D>());
  47. }
  48. [Test]
  49. public void _05_SpaceshipPrefabHasRequiredComponentControllerScript()
  50. {
  51. Assert.IsNotNull(spaceshipPrefab.GetComponent<SpaceshipController>());
  52. // Checking if script component has required references
  53. Assert.IsNotNull(spaceshipPrefab.GetComponent<SpaceshipController>().spaceshipDebris);
  54. Assert.IsNotNull(spaceshipPrefab.GetComponent<SpaceshipController>().weaponList);
  55. }
  56. [Test]
  57. public void _06_SpaceshipPrefabHasRequiredVisual()
  58. {
  59. Transform visualChild = spaceshipPrefab.transform.GetChild(0);
  60. Assert.IsTrue(visualChild.name == "Visual");
  61. Assert.IsNotNull(visualChild);
  62. Assert.IsNotNull(visualChild.GetComponent<MeshRenderer>());
  63. Assert.IsNotNull(visualChild.GetComponent<MeshRenderer>().sharedMaterials[0]);
  64. Assert.IsNotNull(visualChild.GetComponent<MeshRenderer>().sharedMaterials[1]);
  65. Assert.IsNotNull(visualChild.GetComponent<MeshFilter>());
  66. Assert.IsNotNull(visualChild.GetComponent<MeshFilter>().sharedMesh);
  67. }
  68. [Test]
  69. public void _07_SpaceshipPrefabHasRequiredComponentRigidbody()
  70. {
  71. Assert.IsNotNull(spaceshipPrefab.GetComponent<Rigidbody2D>());
  72. Assert.IsTrue(spaceshipPrefab.GetComponent<Rigidbody2D>().isKinematic);
  73. Assert.IsTrue(spaceshipPrefab.GetComponent<Rigidbody2D>().collisionDetectionMode == CollisionDetectionMode2D.Continuous);
  74. Assert.IsTrue(spaceshipPrefab.GetComponent<Rigidbody2D>().interpolation == RigidbodyInterpolation2D.Interpolate);
  75. }
  76. [UnityTest]
  77. public IEnumerator _08_SpaceshipIsDestroyedOnCollisionWithAsteroid()
  78. {
  79. ClearScene();
  80. GameObject spaceship = Object.Instantiate(spaceshipPrefab, Vector3.zero, Quaternion.identity);
  81. Object.Instantiate(asteroidPrefab, Vector3.zero, Quaternion.identity);
  82. yield return new WaitForFixedUpdate();
  83. yield return null;
  84. Assert.IsTrue(spaceship == null);
  85. }
  86. [UnityTest]
  87. public IEnumerator _09_SpaceshipTriggersAsteroidSplit()
  88. {
  89. ClearScene();
  90. Object.Instantiate(spaceshipPrefab, Vector3.zero, Quaternion.identity);
  91. Object.Instantiate(asteroidPrefab, Vector3.zero, Quaternion.identity);
  92. yield return new WaitForFixedUpdate();
  93. yield return null;
  94. AsteroidController[] asteroids = Object.FindObjectsOfType<AsteroidController>();
  95. Assert.IsTrue(asteroids.Length > 1);
  96. }
  97. [Test]
  98. public void _10_SpaceshipCanMove()
  99. {
  100. ClearScene();
  101. SpaceshipController spaceship = Object.Instantiate(spaceshipPrefab, Vector3.zero, Quaternion.identity).GetComponent<SpaceshipController>();
  102. spaceship.direction = Vector2.up;
  103. spaceship.Move();
  104. Assert.IsTrue(spaceship.transform.position != Vector3.zero);
  105. }
  106. [UnityTest]
  107. public IEnumerator _11_SpaceshipRotationCanBeChanged()
  108. {
  109. ClearScene();
  110. SpaceshipController spaceship = Object.Instantiate(spaceshipPrefab, Vector3.zero, Quaternion.identity).GetComponent<SpaceshipController>();
  111. spaceship.transform.eulerAngles = new Vector3(0.0f, 0.0f, 180.0f);
  112. float startingRotation = spaceship.transform.eulerAngles.z;
  113. spaceship.Turn(1.0f); // Turn right
  114. yield return null;
  115. Assert.IsTrue(spaceship.transform.eulerAngles.z < startingRotation);
  116. startingRotation = spaceship.transform.eulerAngles.z;
  117. spaceship.Turn(-1.0f); // Turn left
  118. yield return null;
  119. Assert.IsTrue(spaceship.transform.eulerAngles.z > startingRotation);
  120. }
  121. [Test]
  122. public void _12_SpaceshipMovesAccordingToItsDirectionVector()
  123. {
  124. ClearScene();
  125. SpaceshipController spaceship = Object.Instantiate(spaceshipPrefab, Vector3.zero, Quaternion.Euler(0.0f, 0.0f, 0.0f)).GetComponent<SpaceshipController>();
  126. spaceship.Thrust(1.0f);
  127. spaceship.Move();
  128. Assert.IsTrue(spaceship.transform.position.y >= 0.0f && spaceship.transform.position.x == 0.0f);
  129. }
  130. [UnityTest]
  131. public IEnumerator _13_SpaceshipIsWarpedToTheOtherSideOfTheScreenAfterMovingOffscreen()
  132. {
  133. ClearScene();
  134. Object.Instantiate(cameraPrefab);
  135. SpaceshipController spaceship = Object.Instantiate(spaceshipPrefab, Vector2.right * 100.0f, Quaternion.identity).GetComponent<SpaceshipController>();
  136. yield return null;
  137. Assert.IsTrue(spaceship.transform.position.x < 0.0f);
  138. spaceship.transform.position = Vector2.left * 100.0f;
  139. yield return null;
  140. Assert.IsTrue(spaceship.transform.position.x > 0.0f);
  141. spaceship.transform.position = Vector2.up * 100.0f;
  142. yield return null;
  143. Assert.IsTrue(spaceship.transform.position.y < 0.0f);
  144. spaceship.transform.position = Vector2.down * 100.0f;
  145. yield return null;
  146. Assert.IsTrue(spaceship.transform.position.y > 0.0f);
  147. }
  148. [Test]
  149. public void _14_SpaceshipCanFireProjectiles()
  150. {
  151. ClearScene();
  152. SpaceshipController spaceship = Object.Instantiate(spaceshipPrefab, Vector3.zero, Quaternion.Euler(0.0f, 0.0f, 0.0f)).GetComponent<SpaceshipController>();
  153. spaceship.Shoot();
  154. ProjectileController projectile = Object.FindObjectOfType<ProjectileController>();
  155. Assert.IsTrue(projectile != null);
  156. }
  157. [UnityTest]
  158. public IEnumerator _15_SpaceshipSpawnsDebrisWhenDestroyed()
  159. {
  160. ClearScene();
  161. GameObject spaceship = Object.Instantiate(spaceshipPrefab, Vector3.zero, Quaternion.identity);
  162. Object.Instantiate(asteroidPrefab, Vector3.zero, Quaternion.identity);
  163. yield return new WaitForFixedUpdate();
  164. yield return null;
  165. Assert.IsTrue(spaceship == null);
  166. DebrisController[] objects = Object.FindObjectsOfType<DebrisController>();
  167. Assert.IsTrue(objects.Length > 0);
  168. }
  169. [UnityTest]
  170. public IEnumerator _16_SpaceshipEngineEmitsParticles()
  171. {
  172. ClearScene();
  173. GameObject spaceship = Object.Instantiate(spaceshipPrefab, Vector3.zero, Quaternion.identity);
  174. Assert.IsTrue(spaceship.transform.GetChild(0).GetChild(0) != null);
  175. Assert.IsTrue(spaceship.transform.GetChild(0).GetChild(0).GetComponent<EngineTrail>() != null);
  176. ParticleSystem ps = spaceship.transform.GetChild(0).GetChild(0).GetComponent<ParticleSystem>();
  177. Assert.IsTrue(ps != null);
  178. Assert.IsTrue(ps.particleCount == 0);
  179. yield return null;
  180. Assert.IsTrue(ps.particleCount > 0);
  181. }
  182. [UnityTest]
  183. public IEnumerator _17_SpaceshipEngineParticlesAreClearedAfterWarp()
  184. {
  185. ClearScene();
  186. Object.Instantiate(cameraPrefab);
  187. GameObject spaceship = Object.Instantiate(spaceshipPrefab, Vector3.zero, Quaternion.identity);
  188. ParticleSystem ps = spaceship.transform.GetChild(0).GetChild(0).GetComponent<ParticleSystem>();
  189. yield return null; // Wait for particles to spawn
  190. spaceship.transform.position = Vector2.left * 100.0f;
  191. yield return null;
  192. Assert.IsTrue(ps.particleCount == 0);
  193. }
  194. [UnityTest]
  195. public IEnumerator _18_SpaceshipDoesntMoveDuringPause()
  196. {
  197. ClearScene();
  198. SpaceshipController spaceship = Object.Instantiate(spaceshipPrefab, Vector3.zero, Quaternion.identity).GetComponent<SpaceshipController>();
  199. spaceship.direction = Vector2.up;
  200. Vector3 startPosition = spaceship.transform.position;
  201. GameManager.IsPaused = true;
  202. for (int i = 0; i < 20; i++)
  203. yield return null;
  204. Assert.IsTrue(spaceship.transform.position == startPosition);
  205. }
  206. [Test]
  207. public void _19_SpaceshipPrefabHasRequiredComponentAnimator()
  208. {
  209. Assert.IsNotNull(spaceshipPrefab.transform.GetChild(0).GetComponent<Animator>());
  210. Assert.IsNotNull(spaceshipPrefab.transform.GetChild(0).GetComponent<Animator>().runtimeAnimatorController != null);
  211. Assert.IsTrue(spaceshipPrefab.transform.GetChild(0).GetComponent<Animator>().runtimeAnimatorController.name == "ShipAnimator");
  212. Assert.IsTrue(spaceshipPrefab.transform.GetChild(0).GetComponent<Animator>().cullingMode == AnimatorCullingMode.AlwaysAnimate);
  213. Assert.IsTrue(spaceshipPrefab.transform.GetChild(0).GetComponent<Animator>().updateMode == AnimatorUpdateMode.Normal);
  214. }
  215. [UnityTest]
  216. public IEnumerator _20_SpaceshipAnimatorPlaysSpawnAnimationOnSpawn()
  217. {
  218. ClearScene();
  219. Animator animator = Object.Instantiate(spaceshipPrefab, Vector3.zero, Quaternion.identity).transform.GetChild(0).GetComponent<Animator>();
  220. yield return null;
  221. Assert.IsNotNull(animator);
  222. Assert.IsTrue(animator.GetCurrentAnimatorStateInfo(0).IsName("SpaceshipSpawn"));
  223. while (animator.GetCurrentAnimatorStateInfo(0).normalizedTime <= 1.0f)
  224. {
  225. yield return null;
  226. }
  227. Assert.IsTrue(animator.transform.localScale == Vector3.one);
  228. }
  229. [Test]
  230. public void _21_SpaceshipWeaponListContainsData()
  231. {
  232. WeaponList weaponList = spaceshipPrefab.GetComponent<SpaceshipController>().weaponList;
  233. Assert.IsNotNull(weaponList);
  234. Assert.IsTrue(weaponList.weapons.Count == 2);
  235. foreach(WeaponList.Weapon weapon in weaponList.weapons)
  236. {
  237. Assert.IsTrue(weapon.weaponName.Length != 0);
  238. Assert.IsNotNull(weapon.weaponPrefab);
  239. }
  240. }
  241. }