GameManagerTests.cs 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. using UnityEngine;
  2. using UnityEngine.TestTools;
  3. using NUnit.Framework;
  4. using System.Collections;
  5. using UnityEditor;
  6. using UnityEditor.SceneManagement;
  7. using UnityEngine.SceneManagement;
  8. public class GameManagerTests {
  9. GameObject gameManagerPrefab;
  10. GameObject asteroidPrefab;
  11. GameObject cameraPrefab;
  12. string asteroidsScenePath;
  13. LoadSceneParameters loadSceneParameters;
  14. [SetUp]
  15. public void Setup()
  16. {
  17. loadSceneParameters = new LoadSceneParameters(LoadSceneMode.Single, LocalPhysicsMode.None);
  18. Object asteroidsScene = ((GameObject)Resources.Load("TestsReferences")).GetComponent<TestsReferences>().asteroidsScene;
  19. asteroidsScenePath = AssetDatabase.GetAssetPath(asteroidsScene);
  20. gameManagerPrefab = ((GameObject)Resources.Load("TestsReferences", typeof(GameObject))).GetComponent<TestsReferences>().gameManagerPrefab;
  21. asteroidPrefab = ((GameObject)Resources.Load("TestsReferences", typeof(GameObject))).GetComponent<TestsReferences>().asteroidPrefab;
  22. cameraPrefab = ((GameObject)Resources.Load("TestsReferences", typeof(GameObject))).GetComponent<TestsReferences>().cameraPrefab;
  23. }
  24. void ClearScene()
  25. {
  26. Transform[] objects = Object.FindObjectsOfType<Transform>();
  27. foreach (Transform obj in objects)
  28. {
  29. if (obj != null)
  30. Object.DestroyImmediate(obj.gameObject);
  31. }
  32. }
  33. [Test]
  34. public void _01_GameManagerPrefabExists()
  35. {
  36. Assert.NotNull(gameManagerPrefab);
  37. }
  38. [Test]
  39. public void _02_GameManagerPrefabHasRequiredComponentScript()
  40. {
  41. Assert.IsNotNull(gameManagerPrefab.GetComponent<GameManager>());
  42. }
  43. [UnityTest]
  44. public IEnumerator _03_GameManagerExistsInScene()
  45. {
  46. EditorSceneManager.LoadSceneInPlayMode(asteroidsScenePath, loadSceneParameters);
  47. yield return null;
  48. Assert.NotNull(Object.FindObjectOfType<GameManager>());
  49. }
  50. [UnityTest]
  51. public IEnumerator _04_GameManagerCanSpawnSpaceshipOnLoad()
  52. {
  53. ClearScene();
  54. Object.Instantiate(gameManagerPrefab).GetComponent<GameManager>();
  55. GameManager.InitializeTestingEnvironment(true, false, false, false, false);
  56. yield return null;
  57. SpaceshipController spaceship = Object.FindObjectOfType<SpaceshipController>();
  58. Assert.IsTrue(spaceship != null);
  59. }
  60. [UnityTest]
  61. public IEnumerator _05_GameManagerRespawnsSpaceshipAfterItHasBeenDestroyed()
  62. {
  63. ClearScene();
  64. Object.Instantiate(gameManagerPrefab).GetComponent<GameManager>();
  65. GameManager.InitializeTestingEnvironment(true, false, false, false, false);
  66. yield return null;
  67. GameObject asteroid = Object.Instantiate(asteroidPrefab, Vector3.zero, Quaternion.identity);
  68. SpaceshipController spaceship = Object.FindObjectOfType<SpaceshipController>();
  69. spaceship.transform.position = Vector2.right * 10;
  70. asteroid.transform.position = spaceship.transform.position;
  71. yield return new WaitForSeconds(0.5f);
  72. Assert.IsTrue(spaceship == null);
  73. yield return new WaitForSeconds(GameManager.SPACESHIP_RESPAWN_DELAY);
  74. spaceship = Object.FindObjectOfType<SpaceshipController>();
  75. Assert.IsTrue(spaceship != null);
  76. }
  77. [UnityTest]
  78. public IEnumerator _06_GameManagerDoesNotRespawnShipAfterThreeDeaths()
  79. {
  80. ClearScene();
  81. GameManager gameManager = Object.Instantiate(gameManagerPrefab).GetComponent<GameManager>();
  82. GameManager.InitializeTestingEnvironment(true, false, false, false, false);
  83. Object.DestroyImmediate(Object.FindObjectOfType<SpaceshipController>());
  84. gameManager.deaths = 2;
  85. gameManager.RespawnShip(0.0f);
  86. yield return new WaitForSeconds(GameManager.SPACESHIP_RESPAWN_DELAY);
  87. SpaceshipController spaceship = Object.FindObjectOfType<SpaceshipController>();
  88. Assert.IsTrue(spaceship != null);
  89. Object.DestroyImmediate(spaceship);
  90. gameManager.RespawnShip(0.0f);
  91. yield return new WaitForSeconds(GameManager.SPACESHIP_RESPAWN_DELAY);
  92. spaceship = Object.FindObjectOfType<SpaceshipController>();
  93. Assert.IsTrue(spaceship == null);
  94. }
  95. [UnityTest]
  96. public IEnumerator _07_GameManagerSpawnsAsteroids()
  97. {
  98. ClearScene();
  99. Object.Instantiate(gameManagerPrefab);
  100. GameManager.InitializeTestingEnvironment(false, true, false, true, false);
  101. yield return null;
  102. AsteroidController[] asteroids = Object.FindObjectsOfType<AsteroidController>();
  103. Assert.IsTrue(asteroids.Length > 0);
  104. }
  105. [UnityTest]
  106. public IEnumerator _08_GameManagerSpawnsAsteroidsOverTime()
  107. {
  108. ClearScene();
  109. GameManager gameManager = Object.Instantiate(gameManagerPrefab).GetComponent<GameManager>();
  110. GameManager.InitializeTestingEnvironment(false, true, false, true, false);
  111. yield return new WaitForSeconds(gameManager.asteroidSpawnDelay + 0.5f);
  112. AsteroidController[] asteroids = Object.FindObjectsOfType<AsteroidController>();
  113. Assert.IsTrue(asteroids.Length > 1);
  114. }
  115. [Test]
  116. public void _09_GameManagerOnlySpawnsAsteroidsOffscreen()
  117. {
  118. ClearScene();
  119. GameManager gameManager = Object.Instantiate(gameManagerPrefab).GetComponent<GameManager>();
  120. GameManager.InitializeTestingEnvironment(false, false, false, false, false);
  121. Object.Instantiate(cameraPrefab);
  122. for (int i = 0; i < 100; i++)
  123. gameManager.SpawnAsteroids();
  124. AsteroidController[] asteroids = Object.FindObjectsOfType<AsteroidController>();
  125. foreach (AsteroidController roid in asteroids)
  126. {
  127. Vector2 positionOnCamera = Camera.main.WorldToViewportPoint(roid.transform.position);
  128. Assert.IsTrue(((positionOnCamera.x >= -0.1f && positionOnCamera.x <= 1.1f) && (positionOnCamera.y <= -0.05f || positionOnCamera.y >= 1.05f)) ||
  129. ((positionOnCamera.x <= -0.05f || positionOnCamera.x >= 1.05f) && (positionOnCamera.y >= -0.1f && positionOnCamera.y <= 1.1f)));
  130. }
  131. }
  132. [Test]
  133. public void _10_GameManagerSpawnsRandomSizeAsteroids()
  134. {
  135. ClearScene();
  136. GameManager gameManager = Object.Instantiate(gameManagerPrefab).GetComponent<GameManager>();
  137. GameManager.InitializeTestingEnvironment(false, false, false, false, false);
  138. bool small = false;
  139. bool medium = false;
  140. bool big = false;
  141. for (int i = 0; i < 100; i++)
  142. gameManager.SpawnAsteroids();
  143. AsteroidController[] asteroids = Object.FindObjectsOfType<AsteroidController>();
  144. foreach (AsteroidController roid in asteroids)
  145. {
  146. if (roid.GetSplitCount() == 2)
  147. small = true;
  148. else if (roid.GetSplitCount() == 1)
  149. medium = true;
  150. else if (roid.GetSplitCount() == 0)
  151. big = true;
  152. if (small && medium && big)
  153. break;
  154. }
  155. Assert.IsTrue(small && medium && big);
  156. }
  157. [UnityTest]
  158. public IEnumerator _11_GameManagerScoreIsIncreasedAfterAsteroidsAreDestroyed()
  159. {
  160. ClearScene();
  161. Object.Instantiate(gameManagerPrefab);
  162. GameManager.InitializeTestingEnvironment(false, false, false, false, false);
  163. yield return null;
  164. AsteroidController asteroid = Object.Instantiate(asteroidPrefab, Vector3.zero, Quaternion.identity).GetComponent<AsteroidController>();
  165. int score = GameManager.score;
  166. asteroid.Split();
  167. Assert.IsTrue(score != GameManager.score);
  168. Assert.IsTrue(GameManager.score == 1000);
  169. yield return null;
  170. score = GameManager.score;
  171. AsteroidController[] asteroids = Object.FindObjectsOfType<AsteroidController>();
  172. foreach(AsteroidController ast in asteroids)
  173. ast.Split();
  174. Assert.IsTrue(score != GameManager.score);
  175. Assert.IsTrue(GameManager.score == 2000);
  176. yield return null;
  177. score = GameManager.score;
  178. asteroids = Object.FindObjectsOfType<AsteroidController>();
  179. foreach (AsteroidController ast in asteroids)
  180. ast.Split();
  181. Assert.IsTrue(score != GameManager.score);
  182. Assert.IsTrue(GameManager.score == 3000);
  183. }
  184. [UnityTest]
  185. public IEnumerator _12_ReachingCertainScoreChangesSpaceshipWeapons()
  186. {
  187. ClearScene();
  188. Object.Instantiate(gameManagerPrefab);
  189. GameManager.InitializeTestingEnvironment(true, false, false, false, false);
  190. yield return null;
  191. for (int i = 0; i < 8; i++)
  192. GameManager.AddToScore(0);
  193. SpaceshipController spaceship = Object.FindObjectOfType<SpaceshipController>();
  194. Assert.IsTrue(spaceship != null);
  195. // Weapon changes to laser upon reaching 8000 points
  196. Assert.IsTrue(spaceship.currentWeapon == SpaceshipController.Weapon.Laser);
  197. }
  198. }