using NUnit.Framework; using System.Collections; using System.IO; using System.Linq; using UnityEditor; using UnityEngine; using UnityEngine.TestTools; using UnityEngine.UI; /// /// Test the ChangeUserScreen class /// [TestFixture] public class ChangeUserScreenTests { /// /// Wait time between scene transitions /// private const float WAIT_TIME = 0.2f; /// /// The default current user when dealing with multiple users /// private const int currentUser = 2; /// /// Setup the tests for a single user /// private IEnumerator Setup_ChangeUserScreen_SingleUser(string startScreen = "Accounts/Scenes/ChangeUserScreen") { string path = $"{Application.persistentDataPath}/wesign_unit_test.json"; string oneUser = "{\"version\":1027,\"users\":[{\"entries\":[],\"username\":\"Tester0\",\"avatarIndex\":0,\"playtime\":0.0,\"minigames\":[],\"courses\":[]}],\"currentUser\":0,\"currentMinigame\":0,\"currentCourse\":0,\"currentTheme\":0}"; File.WriteAllText(path, oneUser); PersistentDataController.PATH = path; PersistentDataController.GetInstance().Load(); AssetDatabase.LoadAssetAtPath("Assets/Accounts/ScriptableObjects/UserAvatarList.asset").Awake(); SystemController.GetInstance().SwapScene(startScreen); yield return new WaitForSeconds(WAIT_TIME); } /// /// Setup the tests for a multiple users /// private IEnumerator Setup_ChangeUserScreen_MultipleUsers(string startScreen = "Accounts/Scenes/ChangeUserScreen") { string path = $"{Application.persistentDataPath}/wesign_unit_test.json"; string users = ""; for (int i = 0; i < 5; i++) { users += $"{{\"entries\":[],\"username\":\"Tester{i}\",\"avatarIndex\":{i},\"playtime\":0.0,\"minigames\":[],\"courses\":[]}}"; if (i < 4) users += ","; } const int currentUser = 2; string fiveUsers = $"{{\"version\":1027,\"users\":[{users}],\"currentUser\":{currentUser},\"currentMinigame\":0,\"currentCourse\":0,\"currentTheme\":0}}"; File.WriteAllText(path, fiveUsers); PersistentDataController.PATH = path; PersistentDataController.GetInstance().Load(); AssetDatabase.LoadAssetAtPath("Assets/Accounts/ScriptableObjects/UserAvatarList.asset").Awake(); SystemController.GetInstance().SwapScene(startScreen); yield return new WaitForSeconds(WAIT_TIME); } /// /// Cleanup after testing /// [TearDown] public void TearDown_ChangeUserScreen() { PersistentDataController.PATH = null; } /// /// Test whether every item that needs to be assign in the editor, is assigned /// [UnityTest] public IEnumerator Test_EditorAssignments() { yield return Setup_ChangeUserScreen_SingleUser(); var changeUserController = GameObject.FindObjectOfType(); Assert.IsNotNull(changeUserController); Assert.IsNotNull(changeUserController.userPrefab); Assert.IsNotNull(changeUserController.usersContainer); Assert.IsNotNull(changeUserController.error); } /// /// Test whether the screen is correctly initialized (one user) /// [UnityTest] public IEnumerator Test_Start_SingleUser() { yield return Setup_ChangeUserScreen_SingleUser(); var changeUserController = GameObject.FindObjectOfType(); Assert.IsFalse(changeUserController.error.activeSelf); } /// /// Test whether the users is correctly displayed (one user) /// [UnityTest] public IEnumerator Test_DisplayUsers_SingleUser() { yield return Setup_ChangeUserScreen_SingleUser(); // The content of the usercard is tested in the `UserCardTests`-script // Here, we only check the amount of users Assert.AreEqual(1, UserList.GetUsers().Count); var cards = GameObject.FindObjectsOfType().ToList(); Assert.AreEqual(1, cards.Count); Assert.AreEqual(new Color(66 / 255f, 158 / 255f, 189 / 255f, 1f), cards[0].gameObject.GetComponent().color); } /// /// Test whether the users are correctly displayed (mulitple users) /// [UnityTest] public IEnumerator Test_DisplayUsers_MultipleUsers() { yield return Setup_ChangeUserScreen_MultipleUsers(); // The content of the usercard is tested in the `UserCardTests`-script // Here, we only check the amount of users and whether the correct one is selected Assert.AreEqual(UserList.GetCurrentUser().GetUsername(), UserList.GetUserByIndex(currentUser).GetUsername()); var cards = GameObject.FindObjectsOfType().ToList(); Assert.AreEqual(UserList.GetUsers().Count, cards.Count); for (int i = 0; i < cards.Count; i++) { Color expected = i == currentUser ? new Color(66 / 255f, 158 / 255f, 189 / 255f, 1f) : Color.gray; Assert.AreEqual(expected, cards[i].gameObject.GetComponent().color); } } /// /// Test whether selecting a new user before the current one updates the display correctly /// [UnityTest] public IEnumerator Test_UpdateSelection_BeforeCurrentUser() { yield return Setup_ChangeUserScreen_MultipleUsers(); var cards = GameObject.FindObjectsOfType().ToList(); // Before update for (int i = 0; i < cards.Count; i++) { Color expected = i == currentUser ? new Color(66 / 255f, 158 / 255f, 189 / 255f, 1f) : Color.gray; Assert.AreEqual(expected, cards[i].gameObject.GetComponent().color); } // Update const int newUser = 1; cards[newUser].selectUser.Invoke(); // After update for (int i = 0; i < cards.Count; i++) { Color expected = i == newUser ? new Color(66 / 255f, 158 / 255f, 189 / 255f, 1f) : Color.gray; Assert.AreEqual(expected, cards[i].gameObject.GetComponent().color); } } /// /// Test whether selecting the current user for update the display will change nothing /// [UnityTest] public IEnumerator Test_UpdateSelection_CurrentUser() { yield return Setup_ChangeUserScreen_MultipleUsers(); var cards = GameObject.FindObjectsOfType().ToList(); // Before update for (int i = 0; i < cards.Count; i++) { Color expected = i == currentUser ? new Color(66 / 255f, 158 / 255f, 189 / 255f, 1f) : Color.gray; Assert.AreEqual(expected, cards[i].gameObject.GetComponent().color); } // Update cards[currentUser].selectUser.Invoke(); // After update for (int i = 0; i < cards.Count; i++) { Color expected = i == currentUser ? new Color(66 / 255f, 158 / 255f, 189 / 255f, 1f) : Color.gray; Assert.AreEqual(expected, cards[i].gameObject.GetComponent().color); } } /// /// Test whether selecting a new user after the current one updates the display correctly /// [UnityTest] public IEnumerator Test_UpdateSelection_AfterCurrentUser() { yield return Setup_ChangeUserScreen_MultipleUsers(); var cards = GameObject.FindObjectsOfType().ToList(); // Before update for (int i = 0; i < cards.Count; i++) { Color expected = i == currentUser ? new Color(66 / 255f, 158 / 255f, 189 / 255f, 1f) : Color.gray; Assert.AreEqual(expected, cards[i].gameObject.GetComponent().color); } // Update const int newUser = 3; cards[newUser].selectUser.Invoke(); // After update for (int i = 0; i < cards.Count; i++) { Color expected = i == newUser ? new Color(66 / 255f, 158 / 255f, 189 / 255f, 1f) : Color.gray; Assert.AreEqual(expected, cards[i].gameObject.GetComponent().color); } } /// /// Test IChooseYou callback /// [UnityTest] public IEnumerator Test_IChooseYou() { yield return Setup_ChangeUserScreen_SingleUser("Common/Scenes/MainMenuScreen"); SystemController.GetInstance().LoadNextScene("Accounts/Scenes/ChangeUserScreen"); yield return new WaitForSeconds(WAIT_TIME); var changeUserController = GameObject.FindObjectOfType(); changeUserController.IChooseYou(); yield return new WaitForSeconds(WAIT_TIME); Assert.AreEqual(SystemController.GetSceneIndex("Common/Scenes/MainMenuScreen"), SystemController.GetInstance().currentScene); } /// /// Test the GotoUserCreation callback /// [UnityTest] public IEnumerator Test_GotoUserCreation() { yield return Setup_ChangeUserScreen_SingleUser(); var changeUserController = GameObject.FindObjectOfType(); changeUserController.GotoUserCreation(); yield return new WaitForSeconds(WAIT_TIME); var userCreationController = GameObject.FindObjectOfType(); Assert.IsNotNull(userCreationController); } /// /// Test the user cards DeleteUser callback /// [UnityTest] public IEnumerator Test_UserCardDeleteUser_BeforeCurrentUser() { yield return Setup_ChangeUserScreen_MultipleUsers(); // Before update var oldCards = GameObject.FindObjectsOfType().ToList(); for (int i = 0; i < oldCards.Count; i++) { Color expected = i == currentUser ? new Color(66 / 255f, 158 / 255f, 189 / 255f, 1f) : Color.gray; Assert.AreEqual(expected, oldCards[i].gameObject.GetComponent().color); } // Update oldCards[1].DeleteUser(); var changeUserController = GameObject.FindObjectOfType(); Assert.IsFalse(changeUserController.error.activeSelf); yield return new WaitForSeconds(WAIT_TIME); // After update var newCards = GameObject.FindObjectsOfType().ToList(); Assert.AreEqual(oldCards.Count - 1, newCards.Count); for (int i = 0; i < newCards.Count; i++) { Color expected = i == (currentUser - 1) ? new Color(66 / 255f, 158 / 255f, 189 / 255f, 1f) : Color.gray; Assert.AreEqual(expected, newCards[i].gameObject.GetComponent().color); } } /// /// Test the user cards DeleteUser callback /// [UnityTest] public IEnumerator Test_UserCardDeleteUser_CurrentUser() { yield return Setup_ChangeUserScreen_MultipleUsers(); // Before update var oldCards = GameObject.FindObjectsOfType().ToList(); for (int i = 0; i < oldCards.Count; i++) { Color expected = i == currentUser ? new Color(66 / 255f, 158 / 255f, 189 / 255f, 1f) : Color.gray; Assert.AreEqual(expected, oldCards[i].gameObject.GetComponent().color); } // Update oldCards[currentUser].DeleteUser(); var changeUserController = GameObject.FindObjectOfType(); Assert.IsFalse(changeUserController.error.activeSelf); yield return new WaitForSeconds(WAIT_TIME); // After update var newCards = GameObject.FindObjectsOfType().ToList(); Assert.AreEqual(oldCards.Count - 1, newCards.Count); for (int i = 0; i < newCards.Count; i++) { Color expected = i == currentUser ? new Color(66 / 255f, 158 / 255f, 189 / 255f, 1f) : Color.gray; Assert.AreEqual(expected, newCards[i].gameObject.GetComponent().color); } } /// /// Test the user cards DeleteUser callback /// [UnityTest] public IEnumerator Test_UserCardDeleteUser_AfterCurrentUser() { yield return Setup_ChangeUserScreen_MultipleUsers(); // Before update var oldCards = GameObject.FindObjectsOfType().ToList(); for (int i = 0; i < oldCards.Count; i++) { Color expected = i == currentUser ? new Color(66 / 255f, 158 / 255f, 189 / 255f, 1f) : Color.gray; Assert.AreEqual(expected, oldCards[i].gameObject.GetComponent().color); } // Update oldCards[3].DeleteUser(); var changeUserController = GameObject.FindObjectOfType(); Assert.IsFalse(changeUserController.error.activeSelf); yield return new WaitForSeconds(WAIT_TIME); // After update var newCards = GameObject.FindObjectsOfType().ToList(); Assert.AreEqual(oldCards.Count - 1, newCards.Count); for (int i = 0; i < newCards.Count; i++) { Color expected = i == currentUser ? new Color(66 / 255f, 158 / 255f, 189 / 255f, 1f) : Color.gray; Assert.AreEqual(expected, newCards[i].gameObject.GetComponent().color); } } /// /// Test the user cards DeleteUser callback /// [UnityTest] public IEnumerator Test_UserCardDeleteUser_Invalid() { yield return Setup_ChangeUserScreen_SingleUser(); // Before update var oldCards = GameObject.FindObjectsOfType().ToList(); Assert.AreEqual(1, oldCards.Count); Assert.AreEqual(new Color(66 / 255f, 158 / 255f, 189 / 255f, 1f), oldCards[0].gameObject.GetComponent().color); // Update oldCards[0].DeleteUser(); var changeUserController = GameObject.FindObjectOfType(); Assert.IsTrue(changeUserController.error.activeSelf); // After update var newCards = GameObject.FindObjectsOfType().ToList(); Assert.AreEqual(1, newCards.Count); Assert.AreEqual(new Color(66 / 255f, 158 / 255f, 189 / 255f, 1f), newCards[0].gameObject.GetComponent().color); } }