using NUnit.Framework; using System.Collections; using System.IO; using UnityEditor; using UnityEngine; using UnityEngine.TestTools; using UnityEngine.UI; /// /// Test the PanelCourseProgress class /// [TestFixture] public class PanelCourseProgressTests { /// /// Wait time between scene transitions /// private const float WAIT_TIME = 0.2f; /// /// Setup the PanelCourseProgress tests /// private IEnumerator Setup_PanelCourseProgress() { string path = $"{Application.persistentDataPath}/wesign_unit_test.json"; string course = "{\"entries\":[],\"courseIndex\":0,\"progress\":0.03846153989434242,\"completedLearnables\":1,\"inUseLearnables\":7,\"totalLearnables\":26,\"learnables\":[{\"entries\":[],\"index\":0,\"inUse\":true,\"name\":\"A\",\"progress\":3.0},{\"entries\":[],\"index\":1,\"inUse\":true,\"name\":\"B\",\"progress\":4.5},{\"entries\":[],\"index\":2,\"inUse\":true,\"name\":\"C\",\"progress\":1.5},{\"entries\":[],\"index\":3,\"inUse\":true,\"name\":\"D\",\"progress\":1.5},{\"entries\":[],\"index\":4,\"inUse\":true,\"name\":\"E\",\"progress\":1.5},{\"entries\":[],\"index\":5,\"inUse\":true,\"name\":\"F\",\"progress\":1.5},{\"entries\":[],\"index\":6,\"inUse\":true,\"name\":\"G\",\"progress\":0.0},{\"entries\":[],\"index\":7,\"inUse\":false,\"name\":\"H\",\"progress\":0.0},{\"entries\":[],\"index\":8,\"inUse\":false,\"name\":\"I\",\"progress\":0.0},{\"entries\":[],\"index\":9,\"inUse\":false,\"name\":\"J\",\"progress\":0.0},{\"entries\":[],\"index\":10,\"inUse\":false,\"name\":\"K\",\"progress\":0.0},{\"entries\":[],\"index\":11,\"inUse\":false,\"name\":\"L\",\"progress\":0.0},{\"entries\":[],\"index\":12,\"inUse\":false,\"name\":\"M\",\"progress\":0.0},{\"entries\":[],\"index\":13,\"inUse\":false,\"name\":\"N\",\"progress\":0.0},{\"entries\":[],\"index\":14,\"inUse\":false,\"name\":\"O\",\"progress\":0.0},{\"entries\":[],\"index\":15,\"inUse\":false,\"name\":\"P\",\"progress\":0.0},{\"entries\":[],\"index\":16,\"inUse\":false,\"name\":\"Q\",\"progress\":0.0},{\"entries\":[],\"index\":17,\"inUse\":false,\"name\":\"R\",\"progress\":0.0},{\"entries\":[],\"index\":18,\"inUse\":false,\"name\":\"S\",\"progress\":0.0},{\"entries\":[],\"index\":19,\"inUse\":false,\"name\":\"T\",\"progress\":0.0},{\"entries\":[],\"index\":20,\"inUse\":false,\"name\":\"U\",\"progress\":0.0},{\"entries\":[],\"index\":21,\"inUse\":false,\"name\":\"V\",\"progress\":0.0},{\"entries\":[],\"index\":22,\"inUse\":false,\"name\":\"W\",\"progress\":0.0},{\"entries\":[],\"index\":23,\"inUse\":false,\"name\":\"X\",\"progress\":0.0},{\"entries\":[],\"index\":24,\"inUse\":false,\"name\":\"Y\",\"progress\":0.0},{\"entries\":[],\"index\":25,\"inUse\":false,\"name\":\"Z\",\"progress\":0.0}]}"; string oneUser = $"{{\"version\":1027,\"users\":[{{\"entries\":[],\"username\":\"Tester0\",\"avatarIndex\":0,\"playtime\":0.0,\"minigames\":[],\"courses\":[{course}]}}],\"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("Accounts/Scenes/UserProgressScreen"); yield return new WaitForSeconds(WAIT_TIME); GameObject.FindObjectOfType().DisplayCourses(); yield return new WaitForSeconds(WAIT_TIME); } /// /// Setup the PanelCourseProgress tests /// private IEnumerator Setup_PanelCourseProgress_Empty() { 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("Accounts/Scenes/UserProgressScreen"); yield return new WaitForSeconds(WAIT_TIME); GameObject.FindObjectOfType().DisplayCourses(); yield return new WaitForSeconds(WAIT_TIME); } /// /// Setup the PanelCourseProgress tests /// private IEnumerator Setup_PanelCourseProgress_Multiple() { string path = $"{Application.persistentDataPath}/wesign_unit_test.json"; string courses = "[{\"entries\":[],\"courseIndex\":1,\"progress\":-1.0,\"completedLearnables\":0,\"inUseLearnables\":1,\"totalLearnables\":15,\"learnables\":[{\"entries\":[],\"index\":0,\"inUse\":true,\"name\":\"Tot ziens\",\"progress\":0.0},{\"entries\":[],\"index\":1,\"inUse\":false,\"name\":\"Saluut\",\"progress\":0.0},{\"entries\":[],\"index\":2,\"inUse\":false,\"name\":\"Goedemorgen\",\"progress\":0.0},{\"entries\":[],\"index\":3,\"inUse\":false,\"name\":\"Goedemiddag\",\"progress\":0.0},{\"entries\":[],\"index\":4,\"inUse\":false,\"name\":\"Goed\",\"progress\":0.0},{\"entries\":[],\"index\":5,\"inUse\":false,\"name\":\"Slecht\",\"progress\":0.0},{\"entries\":[],\"index\":6,\"inUse\":false,\"name\":\"Ja\",\"progress\":0.0},{\"entries\":[],\"index\":7,\"inUse\":false,\"name\":\"Links\",\"progress\":0.0},{\"entries\":[],\"index\":8,\"inUse\":false,\"name\":\"Rechts\",\"progress\":0.0},{\"entries\":[],\"index\":9,\"inUse\":false,\"name\":\"Bedanken\",\"progress\":0.0},{\"entries\":[],\"index\":10,\"inUse\":false,\"name\":\"Sorry\",\"progress\":0.0},{\"entries\":[],\"index\":11,\"inUse\":false,\"name\":\"Goedenacht\",\"progress\":0.0},{\"entries\":[],\"index\":12,\"inUse\":false,\"name\":\"Smakelijk\",\"progress\":0.0},{\"entries\":[],\"index\":13,\"inUse\":false,\"name\":\"Goedenavond\",\"progress\":0.0},{\"entries\":[],\"index\":14,\"inUse\":false,\"name\":\"Nee\",\"progress\":0.0}]},{\"entries\":[],\"courseIndex\":0,\"progress\":0.07692307978868485,\"completedLearnables\":2,\"inUseLearnables\":8,\"totalLearnables\":26,\"learnables\":[{\"entries\":[],\"index\":0,\"inUse\":true,\"name\":\"A\",\"progress\":1.5},{\"entries\":[],\"index\":1,\"inUse\":true,\"name\":\"B\",\"progress\":3.0},{\"entries\":[],\"index\":2,\"inUse\":true,\"name\":\"C\",\"progress\":4.5},{\"entries\":[],\"index\":3,\"inUse\":true,\"name\":\"D\",\"progress\":0.0},{\"entries\":[],\"index\":4,\"inUse\":true,\"name\":\"E\",\"progress\":4.5},{\"entries\":[],\"index\":5,\"inUse\":true,\"name\":\"F\",\"progress\":1.5},{\"entries\":[],\"index\":6,\"inUse\":true,\"name\":\"G\",\"progress\":3.0},{\"entries\":[],\"index\":7,\"inUse\":true,\"name\":\"H\",\"progress\":1.5},{\"entries\":[],\"index\":8,\"inUse\":false,\"name\":\"I\",\"progress\":0.0},{\"entries\":[],\"index\":9,\"inUse\":false,\"name\":\"J\",\"progress\":0.0},{\"entries\":[],\"index\":10,\"inUse\":false,\"name\":\"K\",\"progress\":0.0},{\"entries\":[],\"index\":11,\"inUse\":false,\"name\":\"L\",\"progress\":0.0},{\"entries\":[],\"index\":12,\"inUse\":false,\"name\":\"M\",\"progress\":0.0},{\"entries\":[],\"index\":13,\"inUse\":false,\"name\":\"N\",\"progress\":0.0},{\"entries\":[],\"index\":14,\"inUse\":false,\"name\":\"O\",\"progress\":0.0},{\"entries\":[],\"index\":15,\"inUse\":false,\"name\":\"P\",\"progress\":0.0},{\"entries\":[],\"index\":16,\"inUse\":false,\"name\":\"Q\",\"progress\":0.0},{\"entries\":[],\"index\":17,\"inUse\":false,\"name\":\"R\",\"progress\":0.0},{\"entries\":[],\"index\":18,\"inUse\":false,\"name\":\"S\",\"progress\":0.0},{\"entries\":[],\"index\":19,\"inUse\":false,\"name\":\"T\",\"progress\":0.0},{\"entries\":[],\"index\":20,\"inUse\":false,\"name\":\"U\",\"progress\":0.0},{\"entries\":[],\"index\":21,\"inUse\":false,\"name\":\"V\",\"progress\":0.0},{\"entries\":[],\"index\":22,\"inUse\":false,\"name\":\"W\",\"progress\":0.0},{\"entries\":[],\"index\":23,\"inUse\":false,\"name\":\"X\",\"progress\":0.0},{\"entries\":[],\"index\":24,\"inUse\":false,\"name\":\"Y\",\"progress\":0.0},{\"entries\":[],\"index\":25,\"inUse\":false,\"name\":\"Z\",\"progress\":0.0}]},{\"entries\":[],\"courseIndex\":3,\"progress\":0.04545454680919647,\"completedLearnables\":1,\"inUseLearnables\":7,\"totalLearnables\":22,\"learnables\":[{\"entries\":[],\"index\":0,\"inUse\":true,\"name\":\"Aardappel\",\"progress\":4.5},{\"entries\":[],\"index\":1,\"inUse\":true,\"name\":\"Aardbei\",\"progress\":1.5},{\"entries\":[],\"index\":2,\"inUse\":true,\"name\":\"Ajuin\",\"progress\":1.5},{\"entries\":[],\"index\":3,\"inUse\":true,\"name\":\"Appel\",\"progress\":1.5},{\"entries\":[],\"index\":4,\"inUse\":true,\"name\":\"Appelsien\",\"progress\":3.0},{\"entries\":[],\"index\":5,\"inUse\":true,\"name\":\"Banaan\",\"progress\":3.0},{\"entries\":[],\"index\":6,\"inUse\":true,\"name\":\"Bessen\",\"progress\":0.0},{\"entries\":[],\"index\":7,\"inUse\":false,\"name\":\"Bloemkool\",\"progress\":0.0},{\"entries\":[],\"index\":8,\"inUse\":false,\"name\":\"Bonen\",\"progress\":0.0},{\"entries\":[],\"index\":9,\"inUse\":false,\"name\":\"Broccoli\",\"progress\":0.0},{\"entries\":[],\"index\":10,\"inUse\":false,\"name\":\"Champignon\",\"progress\":0.0},{\"entries\":[],\"index\":11,\"inUse\":false,\"name\":\"Erwt\",\"progress\":0.0},{\"entries\":[],\"index\":12,\"inUse\":false,\"name\":\"Kers\",\"progress\":0.0},{\"entries\":[],\"index\":13,\"inUse\":false,\"name\":\"Kiwi\",\"progress\":0.0},{\"entries\":[],\"index\":14,\"inUse\":false,\"name\":\"Komkommer\",\"progress\":0.0},{\"entries\":[],\"index\":15,\"inUse\":false,\"name\":\"Meloen\",\"progress\":0.0},{\"entries\":[],\"index\":16,\"inUse\":false,\"name\":\"Peer\",\"progress\":0.0},{\"entries\":[],\"index\":17,\"inUse\":false,\"name\":\"Perzik\",\"progress\":0.0},{\"entries\":[],\"index\":18,\"inUse\":false,\"name\":\"Pompoen\",\"progress\":0.0},{\"entries\":[],\"index\":19,\"inUse\":false,\"name\":\"Prei\",\"progress\":0.0},{\"entries\":[],\"index\":20,\"inUse\":false,\"name\":\"Tomaat\",\"progress\":0.0},{\"entries\":[],\"index\":21,\"inUse\":false,\"name\":\"Wortel\",\"progress\":0.0}]},{\"entries\":[],\"courseIndex\":2,\"progress\":-1.0,\"completedLearnables\":0,\"inUseLearnables\":4,\"totalLearnables\":22,\"learnables\":[{\"entries\":[],\"index\":0,\"inUse\":true,\"name\":\"Walvis\",\"progress\":0.0},{\"entries\":[],\"index\":1,\"inUse\":true,\"name\":\"Konijn\",\"progress\":0.0},{\"entries\":[],\"index\":2,\"inUse\":true,\"name\":\"Giraf\",\"progress\":0.0},{\"entries\":[],\"index\":3,\"inUse\":true,\"name\":\"Vis\",\"progress\":0.0},{\"entries\":[],\"index\":4,\"inUse\":false,\"name\":\"Schildpad\",\"progress\":0.0},{\"entries\":[],\"index\":5,\"inUse\":false,\"name\":\"Lama\",\"progress\":0.0},{\"entries\":[],\"index\":6,\"inUse\":false,\"name\":\"Dolfijn\",\"progress\":0.0},{\"entries\":[],\"index\":7,\"inUse\":false,\"name\":\"Haai\",\"progress\":0.0},{\"entries\":[],\"index\":8,\"inUse\":false,\"name\":\"Kangoeroe\",\"progress\":0.0},{\"entries\":[],\"index\":9,\"inUse\":false,\"name\":\"Kat\",\"progress\":0.0},{\"entries\":[],\"index\":10,\"inUse\":false,\"name\":\"Hond\",\"progress\":0.0},{\"entries\":[],\"index\":11,\"inUse\":false,\"name\":\"Kip\",\"progress\":0.0},{\"entries\":[],\"index\":12,\"inUse\":false,\"name\":\"Leeuw\",\"progress\":0.0},{\"entries\":[],\"index\":13,\"inUse\":false,\"name\":\"Olifant\",\"progress\":0.0},{\"entries\":[],\"index\":14,\"inUse\":false,\"name\":\"Paard\",\"progress\":0.0},{\"entries\":[],\"index\":15,\"inUse\":false,\"name\":\"Panda\",\"progress\":0.0},{\"entries\":[],\"index\":16,\"inUse\":false,\"name\":\"Papegaai\",\"progress\":0.0},{\"entries\":[],\"index\":17,\"inUse\":false,\"name\":\"Ram\",\"progress\":0.0},{\"entries\":[],\"index\":18,\"inUse\":false,\"name\":\"Tijger\",\"progress\":0.0},{\"entries\":[],\"index\":19,\"inUse\":false,\"name\":\"Varken\",\"progress\":0.0},{\"entries\":[],\"index\":20,\"inUse\":false,\"name\":\"Vos\",\"progress\":0.0},{\"entries\":[],\"index\":21,\"inUse\":false,\"name\":\"Zebra\",\"progress\":0.0}]},{\"entries\":[],\"courseIndex\":6,\"progress\":-1.0,\"completedLearnables\":0,\"inUseLearnables\":4,\"totalLearnables\":16,\"learnables\":[{\"entries\":[],\"index\":0,\"inUse\":true,\"name\":\"Broer\",\"progress\":0.0},{\"entries\":[],\"index\":1,\"inUse\":true,\"name\":\"Dochter\",\"progress\":0.0},{\"entries\":[],\"index\":2,\"inUse\":true,\"name\":\"Echtgenoot\",\"progress\":0.0},{\"entries\":[],\"index\":3,\"inUse\":true,\"name\":\"Familie\",\"progress\":0.0},{\"entries\":[],\"index\":4,\"inUse\":false,\"name\":\"Generatie\",\"progress\":0.0},{\"entries\":[],\"index\":5,\"inUse\":false,\"name\":\"Gezin\",\"progress\":0.0},{\"entries\":[],\"index\":6,\"inUse\":false,\"name\":\"Kind\",\"progress\":0.0},{\"entries\":[],\"index\":7,\"inUse\":false,\"name\":\"Moeder\",\"progress\":0.0},{\"entries\":[],\"index\":8,\"inUse\":false,\"name\":\"Neef\",\"progress\":0.0},{\"entries\":[],\"index\":9,\"inUse\":false,\"name\":\"Nicht\",\"progress\":0.0},{\"entries\":[],\"index\":10,\"inUse\":false,\"name\":\"Oom\",\"progress\":0.0},{\"entries\":[],\"index\":11,\"inUse\":false,\"name\":\"Ouders\",\"progress\":0.0},{\"entries\":[],\"index\":12,\"inUse\":false,\"name\":\"Tante\",\"progress\":0.0},{\"entries\":[],\"index\":13,\"inUse\":false,\"name\":\"Vader\",\"progress\":0.0},{\"entries\":[],\"index\":14,\"inUse\":false,\"name\":\"Zoon\",\"progress\":0.0},{\"entries\":[],\"index\":15,\"inUse\":false,\"name\":\"Zus\",\"progress\":0.0}]}]"; string oneUser = $"{{\"version\":1027,\"users\":[{{\"entries\":[],\"username\":\"Tester0\",\"avatarIndex\":0,\"playtime\":0.0,\"minigames\":[],\"courses\":{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("Accounts/Scenes/UserProgressScreen"); yield return new WaitForSeconds(WAIT_TIME); GameObject.FindObjectOfType().DisplayCourses(); yield return new WaitForSeconds(WAIT_TIME); } /// /// Cleanup after testing /// [TearDown] public void TearDown_PanelCourseProgress() { 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_PanelCourseProgress(); var panel = GameObject.FindObjectOfType(); Assert.IsNotNull(panel); Assert.IsNotNull(panel.courseList); Assert.IsNotNull(panel.courseCardPrefab); Assert.IsNotNull(panel.coursesContainer); Assert.IsNotNull(panel.courseInfo); Assert.IsNotNull(panel.emptyCourses); Assert.IsNotNull(panel.courseTitle); Assert.IsNotNull(panel.learnableCardPrefab); Assert.IsNotNull(panel.learnablesContainer); Assert.IsNotNull(panel.progressBar); } [UnityTest] public IEnumerator Test_Start() { yield return Setup_PanelCourseProgress(); var panel = GameObject.FindObjectOfType(); Assert.IsTrue(panel.courseInfo.gameObject.activeSelf); Assert.IsFalse(panel.emptyCourses.gameObject.activeSelf); var course = panel.courseList.GetCourseByIndex(CourseIndex.FINGERSPELLING); var progress = UserList.GetCurrentUser().GetCourseProgress(CourseIndex.FINGERSPELLING); Assert.AreEqual(course.title, panel.courseTitle.text); Assert.AreEqual(progress.progress, panel.progressBar.fillAmount); Assert.AreEqual(course.theme.learnables.Count, panel.learnablesContainer.childCount); } [UnityTest] public IEnumerator Test_Start_Empty() { yield return Setup_PanelCourseProgress_Empty(); var panel = GameObject.FindObjectOfType(); Assert.IsFalse(panel.courseInfo.gameObject.activeSelf); Assert.IsTrue(panel.emptyCourses.gameObject.activeSelf); } /// /// Test whether we can select a course /// [UnityTest] public IEnumerator Test_UpdateSelection() { yield return Setup_PanelCourseProgress_Multiple(); var panel = GameObject.FindObjectOfType(); var courses = GameObject.FindObjectsOfType(); var currentCourse = courses[0]; currentCourse.selectActivity.Invoke(); yield return new WaitForSeconds(WAIT_TIME); Assert.AreEqual(Color.blue, currentCourse.GetComponent().color); for (int i = 1; i < courses.Length; i++) Assert.AreEqual(Color.gray, courses[i].GetComponent().color); Assert.AreEqual(currentCourse.title.text, panel.courseTitle.text); Assert.AreEqual(0.0f, panel.progressBar.fillAmount); Assert.AreEqual(currentCourse.courseProgress.learnables.Count, panel.learnablesContainer.childCount); } }