using NUnit.Framework; using System; using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; /// /// Test the UserList class /// [TestFixture] public class UserListTest { /// /// Create a new path so the existing users.json file will not be overwritten /// private static string PATH = $"{Application.persistentDataPath}/unit_test_users.json"; /// /// NUnit test magic (for skipping the setup) /// public const string SKIP_SETUP = "SKIP_SETUP"; /// /// Reference to the userlist to be tested /// private UserList userList; /// /// Helper variable for quick user creation /// private string username = "u5erNam3"; /// /// Helper variable for quick user creation /// private Sprite avatar = Sprite.Create( Texture2D.blackTexture, new Rect(0, 0, Texture2D.blackTexture.width, Texture2D.blackTexture.height), new Vector2(0.5f, 0.5f) ); /// /// Setup the tests /// [SetUp] public void Setup_UserList() { // Check whether the current test needs to skip the setup ArrayList cat = TestContext.CurrentContext.Test.Properties["_CATEGORIES"] as ArrayList; bool skip = cat != null && cat.Contains(SKIP_SETUP); if (!skip) { // The actual setup code UserList.PATH = UserListTest.PATH; userList = ScriptableObject.CreateInstance(); } } /// /// Test whether the UserList.PATH is correctly set /// [Test] [Category(SKIP_SETUP)] public void Test_UserList_OnEnable() { UserList.PATH = null; userList = ScriptableObject.CreateInstance(); Assert.AreEqual($"{Application.persistentDataPath}/users.json", UserList.PATH); } /// /// Test for creation of a new UserList /// [Test] public void Test_New_UserList() { Assert.IsNotNull(userList); Assert.Zero(userList.GetUsers().Count); } /// /// Test for creation of new user (without adding the user to the list) /// [Test] public void Test_UserList_CreateNewUser() { User user = userList.CreateNewUser(username, avatar); Assert.IsNotNull(user); Assert.Zero(userList.GetUsers().Count); Assert.AreEqual(username, user.username); Assert.AreEqual(avatar, user.avatar); } /// /// Test for creating a new user and adding the user to the list /// public void Test_UserList_CreateAndAddNewUser() { Assert.AreEqual(-1, userList.GetCurrentUserIndex()); User user = userList.CreateAndAddNewUser(username, avatar); Assert.IsNotNull(user); Assert.AreEqual(1, userList.GetUsers().Count); Assert.AreEqual(user, userList.GetUsers()[0]); Assert.Zero(userList.GetCurrentUserIndex()); } /// /// Test whether an existing user can be found by its username /// [Test] public void Test_UserList_GetUserByUsername_Valid() { User u = userList.CreateAndAddNewUser(username, avatar); User v = userList.GetUserByUsername(username); Assert.AreEqual(u, v); } /// /// Test whether a non-existing user can not be found /// [Test] public void Test_UserList_GetUserByUsername_Null() { User user = userList.GetUserByUsername("not-a-user"); Assert.IsNull(user); } /// /// Test whether the correct current user is returned /// [Test] public void Test_UserList_GetCurrentUser() { User u = userList.CreateAndAddNewUser($"{username}_{'u'}", avatar); User v = userList.CreateAndAddNewUser($"{username}_{'v'}", avatar); User w = userList.CreateAndAddNewUser($"{username}_{'w'}", avatar); userList.ChangeCurrentUser(2); User W = userList.GetCurrentUser(); Assert.AreEqual(w, W); } /// /// Test whether a null user is returned when the userlist is empty /// [Test] public void Test_UserList_GetCurrent_Empty() { User user = userList.GetCurrentUser(); Assert.IsNull(user); } /// /// Test whether the correct index is returned for the current user /// [Test] public void Test_UserList_GetCurrentUserIndex() { User u = userList.CreateAndAddNewUser($"{username}_{'u'}", avatar); User v = userList.CreateAndAddNewUser($"{username}_{'v'}", avatar); User w = userList.CreateAndAddNewUser($"{username}_{'w'}", avatar); userList.ChangeCurrentUser(2); int idx = userList.GetCurrentUserIndex(); Assert.AreEqual(2, idx); } /// /// Test whether a bad index is returned when the userlist is empty /// [Test] public void Test_UserList_GetCurrentUserIndex_Empty() { Assert.AreEqual(-1, userList.GetCurrentUserIndex()); } /// /// Test whether the current user (referenced by index) is correctly changed /// [Test] public void Test_UserList_ChangeCurrentUser_ValidIndex() { User u = userList.CreateAndAddNewUser($"{username}_{'u'}", avatar); User v = userList.CreateAndAddNewUser($"{username}_{'v'}", avatar); User w = userList.CreateAndAddNewUser($"{username}_{'w'}", avatar); userList.ChangeCurrentUser(2); User W = userList.GetCurrentUser(); Assert.AreEqual(w, W); } /// /// Test whether the current user is not changed when a bad index is given /// [Test] public void Test_UserList_ChangeCurrentUser_InvalidIndex() { User u = userList.CreateAndAddNewUser($"{username}_{'u'}", avatar); User v = userList.CreateAndAddNewUser($"{username}_{'v'}", avatar); User w = userList.CreateAndAddNewUser($"{username}_{'w'}", avatar); Assert.Throws(delegate { userList.ChangeCurrentUser(-1); }); Assert.Throws(delegate { userList.ChangeCurrentUser(5); }); } /// /// Test whether the current user is not changed when a bad index is given /// [Test] public void Test_UserList_ChangeCurrentUser_IndexEmpty() { Assert.Throws(delegate { userList.ChangeCurrentUser(0); }); } /// /// Test whether the current user is correctly changed /// [Test] public void Test_UserList_ChangeCurrentUser_ValidUser() { User u = userList.CreateAndAddNewUser($"{username}_{'u'}", avatar); User v = userList.CreateAndAddNewUser($"{username}_{'v'}", avatar); User w = userList.CreateAndAddNewUser($"{username}_{'w'}", avatar); userList.ChangeCurrentUser(v); User V = userList.GetCurrentUser(); Assert.AreEqual(v, V); } /// /// Test whether the current user is not changed when a non-existing user is given /// [Test] public void Test_UserList_ChangeCurrentUser_InvalidUser() { User u = userList.CreateAndAddNewUser($"{username}_{'u'}", avatar); User v = userList.CreateNewUser($"{username}_{'v'}", avatar); Assert.Throws(delegate { userList.ChangeCurrentUser(v); }); } /// /// Test whether the current user is not changed when a null user is given /// [Test] public void Test_UserList_ChangeCurrentUser_NullUser() { Assert.Throws(delegate { userList.ChangeCurrentUser(null); }); } /// /// Test whether deleting a existing user (referenced by index) will correctly be removed /// [Test] public void Test_UserList_DeleteUser_ValidIndex() { User u = userList.CreateAndAddNewUser($"{username}_{'u'}", avatar); User v = userList.CreateAndAddNewUser($"{username}_{'v'}", avatar); User w = userList.CreateAndAddNewUser($"{username}_{'w'}", avatar); Assert.IsTrue(userList.DeleteUser(1)); } /// /// Test whether deleting a non-existing user (referenced by wrong index) will fail /// [Test] public void Test_UserList_DeleteUser_InValidIndex() { User u = userList.CreateAndAddNewUser($"{username}_{'u'}", avatar); User v = userList.CreateAndAddNewUser($"{username}_{'v'}", avatar); User w = userList.CreateAndAddNewUser($"{username}_{'w'}", avatar); Assert.IsFalse(userList.DeleteUser(-1)); Assert.IsFalse(userList.DeleteUser(5)); } /// /// Test whether deleting any user from an empty userlist will fail /// [Test] public void Test_UserList_DeleteUser_IndexEmpty() { Assert.IsFalse(userList.DeleteUser(0)); } /// /// Test whether deleting an existing user will correctly remove the user and set the currentUserIndex correctly /// [Test] public void Test_UserList_DeleteUser_LastValid() { User u = userList.CreateAndAddNewUser($"{username}_{'u'}", avatar); User v = userList.CreateAndAddNewUser($"{username}_{'v'}", avatar); User w = userList.CreateAndAddNewUser($"{username}_{'w'}", avatar); userList.ChangeCurrentUser(2); Assert.AreEqual(3, userList.GetUsers().Count); Assert.AreEqual(2, userList.GetCurrentUserIndex()); Assert.IsTrue(userList.DeleteUser(w)); Assert.AreEqual(2, userList.GetUsers().Count); Assert.AreEqual(1, userList.GetCurrentUserIndex()); } /// /// Test whether deleting an existing user will remove the user correctly /// /// This will change the currentUserIndex to point to another user [Test] public void Test_UserList_DeleteUser_FirstValid() { User u = userList.CreateAndAddNewUser($"{username}_{'u'}", avatar); User v = userList.CreateAndAddNewUser($"{username}_{'v'}", avatar); User w = userList.CreateAndAddNewUser($"{username}_{'w'}", avatar); userList.ChangeCurrentUser(0); Assert.AreEqual(3, userList.GetUsers().Count); Assert.AreEqual(0, userList.GetCurrentUserIndex()); Assert.IsTrue(userList.DeleteUser(u)); Assert.AreEqual(2, userList.GetUsers().Count); Assert.AreEqual(0, userList.GetCurrentUserIndex()); } /// /// Test whether deleting a non-existing user will not affect the userlist /// [Test] public void Test_UserList_DeleteUser_Invalid() { User u = userList.CreateAndAddNewUser($"{username}_{'u'}", avatar); User v = userList.CreateNewUser($"{username}_{'v'}", avatar); Assert.AreEqual(1, userList.GetUsers().Count); Assert.IsFalse(userList.DeleteUser(v)); Assert.AreEqual(1, userList.GetUsers().Count); } /// /// Test whether calling the DeleteUser function on an empty list will not affect the userlist /// [Test] public void Test_UserList_DeleteUser_Empty() { User user = userList.CreateNewUser(username, avatar); Assert.Zero(userList.GetUsers().Count); Assert.IsFalse(userList.DeleteUser(user)); Assert.Zero(userList.GetUsers().Count); } /// /// Test whether a savefile is correctly constructed when no savefile is present /// [Test] public void Test_UserList_Save_New() { if (File.Exists(PATH)) { File.Delete(PATH); } List u = new List(); for (int i = 0; i < 5; i++) { u.Add(userList.CreateAndAddNewUser($"{username}_{i}", avatar)); } userList.ChangeCurrentUser(3); userList.Save(); FileAssert.Exists(PATH); string content = File.ReadAllText(PATH); int id = avatar.GetInstanceID(); string expected = $"{{\"currentUserIndex\":3,\"storedUsers\":[{{\"username\":\"u5erNam3_0\",\"avatar\":{{\"instanceID\":{id}}},\"playtime\":0.0,\"courses\":[],\"minigames\":[]}},{{\"username\":\"u5erNam3_1\",\"avatar\":{{\"instanceID\":{id}}},\"playtime\":0.0,\"courses\":[],\"minigames\":[]}},{{\"username\":\"u5erNam3_2\",\"avatar\":{{\"instanceID\":{id}}},\"playtime\":0.0,\"courses\":[],\"minigames\":[]}},{{\"username\":\"u5erNam3_3\",\"avatar\":{{\"instanceID\":{id}}},\"playtime\":0.0,\"courses\":[],\"minigames\":[]}},{{\"username\":\"u5erNam3_4\",\"avatar\":{{\"instanceID\":{id}}},\"playtime\":0.0,\"courses\":[],\"minigames\":[]}}]}}"; Assert.AreEqual(expected, content); } /// /// Test whether a savefile is correctly constructed when a savefile already exists /// [Test] public void Test_UserList_Save_Existing() { if (!File.Exists(PATH)) { File.CreateText(PATH).Close(); File.WriteAllText(PATH, "https://www.youtube.com/watch?v=dQw4w9WgXcQ"); } List u = new List(); for (int i = 0; i < 5; i++) { u.Add(userList.CreateAndAddNewUser($"{username}_{i}", avatar)); } userList.ChangeCurrentUser(3); userList.Save(); FileAssert.Exists(PATH); string content = File.ReadAllText(PATH); int id = avatar.GetInstanceID(); string expected = $"{{\"currentUserIndex\":3,\"storedUsers\":[{{\"username\":\"u5erNam3_0\",\"avatar\":{{\"instanceID\":{id}}},\"playtime\":0.0,\"courses\":[],\"minigames\":[]}},{{\"username\":\"u5erNam3_1\",\"avatar\":{{\"instanceID\":{id}}},\"playtime\":0.0,\"courses\":[],\"minigames\":[]}},{{\"username\":\"u5erNam3_2\",\"avatar\":{{\"instanceID\":{id}}},\"playtime\":0.0,\"courses\":[],\"minigames\":[]}},{{\"username\":\"u5erNam3_3\",\"avatar\":{{\"instanceID\":{id}}},\"playtime\":0.0,\"courses\":[],\"minigames\":[]}},{{\"username\":\"u5erNam3_4\",\"avatar\":{{\"instanceID\":{id}}},\"playtime\":0.0,\"courses\":[],\"minigames\":[]}}]}}"; Assert.AreEqual(expected, content); } /// /// Test whether a save file is correctly constructed from an empty userlist /// [Test] public void Test_UserList_Save_Empty() { userList.Save(); FileAssert.Exists(PATH); string content = File.ReadAllText(PATH); string expected = "{\"currentUserIndex\":-1,\"storedUsers\":[]}"; Assert.AreEqual(expected, content); } /// /// Test whether a userlist (containing some users) is correrctly loaded /// [Test] public void Test_UserList_Load() { List u = new List(); for (int i = 0; i < 5; i++) { u.Add(userList.CreateAndAddNewUser($"{username}_{i}", avatar)); } userList.ChangeCurrentUser(3); userList.Save(); userList.Load(); Assert.AreEqual(userList.GetUsers().Count, u.Count); Assert.AreEqual(userList.GetCurrentUserIndex(), 3); List v = userList.GetUsers(); for (int i = 0; i < 5; i++) { Assert.AreEqual(u[i].username, v[i].username); Assert.AreEqual(u[i].avatar, v[i].avatar); } } /// /// Test whether an empty userlist is correctly loaded /// [Test] public void Test_UserList_Load_Empty() { userList.Save(); userList.Load(); Assert.Zero(userList.GetUsers().Count); Assert.AreEqual(-1, userList.GetCurrentUserIndex()); } /// /// Test if the user save file is not found, a new one will be created and an empty userlist will be loaded /// [Test] public void Test_UserList_Load_NotFound() { List u = new List(); for (int i = 0; i < 5; i++) { u.Add(userList.CreateAndAddNewUser($"{username}_{i}", avatar)); } userList.ChangeCurrentUser(3); userList.Save(); File.Delete(PATH); userList.Load(); Assert.Zero(userList.GetUsers().Count); } }