Files
unity-application/Assets/Accounts/Tests/PlayMode/PanelCourseProgressTests.cs
2023-05-17 17:36:27 +00:00

169 lines
18 KiB
C#

using NUnit.Framework;
using System.Collections;
using System.IO;
using UnityEditor;
using UnityEngine;
using UnityEngine.TestTools;
using UnityEngine.UI;
/// <summary>
/// Test the PanelCourseProgress class
/// </summary>
[TestFixture]
public class PanelCourseProgressTests
{
/// <summary>
/// Wait time between scene transitions
/// </summary>
private const float WAIT_TIME = 0.2f;
/// <summary>
/// Setup the PanelCourseProgress tests
/// </summary>
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\":1537,\"users\":[{{\"entries\":[],\"username\":\"Tester0\",\"avatarIndex\":0,\"playtime\":0.0,\"minigames\":[],\"courses\":[{course}]}}],\"currentUser\":0,\"currentMinigame\":0,\"currentCourse\":0,\"currentTheme\":0,\"useGPU\":false}}";
File.WriteAllText(path, oneUser);
PersistentDataController.PATH = path;
PersistentDataController.GetInstance().Load();
AssetDatabase.LoadAssetAtPath<UserAvatarList>("Assets/Accounts/ScriptableObjects/UserAvatarList.asset").Awake();
SystemController.GetInstance().SwapScene("Accounts/Scenes/UserProgressScreen");
yield return new WaitForSeconds(WAIT_TIME);
GameObject.FindObjectOfType<UserProgressScreen>().DisplayCourses();
yield return new WaitForSeconds(WAIT_TIME);
}
/// <summary>
/// Setup the PanelCourseProgress tests
/// </summary>
private IEnumerator Setup_PanelCourseProgress_Empty()
{
string path = $"{Application.persistentDataPath}/wesign_unit_test.json";
string oneUser = $"{{\"version\":1537,\"users\":[{{\"entries\":[],\"username\":\"Tester0\",\"avatarIndex\":0,\"playtime\":0.0,\"minigames\":[],\"courses\":[]}}],\"currentUser\":0,\"currentMinigame\":0,\"currentCourse\":0,\"currentTheme\":0,\"useGPU\":false}}";
File.WriteAllText(path, oneUser);
PersistentDataController.PATH = path;
PersistentDataController.GetInstance().Load();
AssetDatabase.LoadAssetAtPath<UserAvatarList>("Assets/Accounts/ScriptableObjects/UserAvatarList.asset").Awake();
SystemController.GetInstance().SwapScene("Accounts/Scenes/UserProgressScreen");
yield return new WaitForSeconds(WAIT_TIME);
GameObject.FindObjectOfType<UserProgressScreen>().DisplayCourses();
yield return new WaitForSeconds(WAIT_TIME);
}
/// <summary>
/// Setup the PanelCourseProgress tests
/// </summary>
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\":1537,\"users\":[{{\"entries\":[],\"username\":\"Tester0\",\"avatarIndex\":0,\"playtime\":0.0,\"minigames\":[],\"courses\":{courses}}}],\"currentUser\":0,\"currentMinigame\":0,\"currentCourse\":0,\"currentTheme\":0,\"useGPU\":false}}";
File.WriteAllText(path, oneUser);
PersistentDataController.PATH = path;
PersistentDataController.GetInstance().Load();
AssetDatabase.LoadAssetAtPath<UserAvatarList>("Assets/Accounts/ScriptableObjects/UserAvatarList.asset").Awake();
SystemController.GetInstance().SwapScene("Accounts/Scenes/UserProgressScreen");
yield return new WaitForSeconds(WAIT_TIME);
GameObject.FindObjectOfType<UserProgressScreen>().DisplayCourses();
yield return new WaitForSeconds(WAIT_TIME);
}
/// <summary>
/// Cleanup after testing
/// </summary>
[TearDown]
public void TearDown_PanelCourseProgress()
{
PersistentDataController.PATH = null;
}
/// <summary>
/// Test whether every item that needs to be assign in the editor, is assigned
/// </summary>
[UnityTest]
public IEnumerator Test_EditorAssignments()
{
yield return Setup_PanelCourseProgress();
var panel = GameObject.FindObjectOfType<PanelCourseProgress>();
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);
}
/// <summary>
/// Test whether the panel is correctly initialized
/// </summary>
[UnityTest]
public IEnumerator Test_Start()
{
yield return Setup_PanelCourseProgress();
var panel = GameObject.FindObjectOfType<PanelCourseProgress>();
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);
}
/// <summary>
/// Test whether the panel is correctly initialized when there is no course progress
/// </summary>
[UnityTest]
public IEnumerator Test_Start_Empty()
{
yield return Setup_PanelCourseProgress_Empty();
var panel = GameObject.FindObjectOfType<PanelCourseProgress>();
Assert.IsFalse(panel.courseInfo.gameObject.activeSelf);
Assert.IsTrue(panel.emptyCourses.gameObject.activeSelf);
}
/// <summary>
/// Test whether we can select a course
/// </summary>
[UnityTest]
public IEnumerator Test_UpdateSelection()
{
yield return Setup_PanelCourseProgress_Multiple();
var panel = GameObject.FindObjectOfType<PanelCourseProgress>();
var courses = GameObject.FindObjectsOfType<CourseProgressCard>();
var currentCourse = courses[0];
currentCourse.selectActivity.Invoke();
yield return new WaitForSeconds(WAIT_TIME);
Assert.AreEqual(new Color(66 / 255f, 158 / 255f, 189 / 255f, 1f), currentCourse.GetComponent<Image>().color);
for (int i = 1; i < courses.Length; i++)
Assert.AreEqual(new Color(159 / 255f, 231 / 255f, 245 / 255f, 120 / 255f), courses[i].GetComponent<Image>().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);
}
}