using NUnit.Framework; using System.Collections; using System.IO; using UnityEditor; using UnityEngine; using UnityEngine.TestTools; public class JustSignControllerTests { /// /// Setup for testing Just Sign /// /// [UnitySetUp] public IEnumerator SetupFunction() { string path = $"{Application.persistentDataPath}/wesign_unit_test.json"; string oneUser = $"{{\"version\":1027,\"users\":[{{\"entries\":[],\"username\":\"TEST\",\"avatarIndex\":0,\"playtime\":0.0,\"minigames\":[],\"courses\":[]}}],\"currentUser\":0,\"currentMinigame\":0,\"currentCourse\":0,\"currentTheme\":0}}"; File.WriteAllText(path, oneUser); PersistentDataController.GetInstance().Load(); AssetDatabase.LoadAssetAtPath("Assets/Accounts/ScriptableObjects/UserAvatarList.asset").Awake(); // Go to the minigame-selection scene to make sure that the minigameIndex is set correctly SystemController.GetInstance().LoadNextScene("Common/Scenes/ListMinigamesScreen"); yield return new WaitForSeconds(0.2f); ListMinigamesScreen minigameScreen = GameObject.FindObjectOfType(); minigameScreen.minigameList.SetCurrentMinigame(MinigameIndex.JUST_SIGN); SystemController.GetInstance().LoadNextScene("JustSign/Scenes/JustSignGame"); yield return new WaitForSeconds(0.2f); // Fetch the SignPredictor and deactivate it, this stops the basic game-loop from happening var signPredictor = GameObject.FindObjectOfType(); GameObject signPredictorController = signPredictor.gameObject; signPredictorController.SetActive(false); yield return new WaitForSeconds(0.2f); } /// /// Tests a sign that is done too quickly, i.e., feedback during game and scoreboard after /// /// [UnityTest] public IEnumerator EarlyScoreTest() { JustSignController justSignController = GameObject.FindObjectOfType(); yield return new WaitForSeconds(5.0f); string currentSign = justSignController.GetFirstSign(); justSignController.ProcessMostProbableSign(1.0f, currentSign); yield return new WaitForSeconds(0.2f); Assert.AreEqual("Te vroeg! \n -3", justSignController.timingFeedback.text); Assert.AreEqual(-3, justSignController.CalculateScore()); Assert.AreEqual("Score: -3", justSignController.scoreDisplay.text); justSignController.ActivateEnd(true); yield return new WaitForSeconds(0.2f); JustSignGameEndedPanel justSignGameEndedPanel = GameObject.FindObjectOfType(); Assert.NotNull(justSignGameEndedPanel); Assert.AreEqual("0", justSignGameEndedPanel.perfectSignsText.text); Assert.AreEqual("0", justSignGameEndedPanel.goodSignsText.text); Assert.AreEqual("0", justSignGameEndedPanel.mehSignsText.text); Assert.AreEqual("1", justSignGameEndedPanel.terribleSignsText.text); Assert.AreEqual("0", justSignGameEndedPanel.notFoundSignsText.text); Assert.AreEqual("Score: -3", justSignGameEndedPanel.scoreText.text); string gpmText = (60f / 64).ToString("#") + " GPM"; Assert.AreEqual(gpmText, justSignGameEndedPanel.gpmText.text); } /// /// Tests a sign that is done too late, i.e., feedback during game and scoreboard after /// /// [UnityTest] public IEnumerator TooLateScoreTest() { JustSignController justSignController = GameObject.FindObjectOfType(); yield return new WaitForSeconds(23.0f); Assert.AreEqual("Te laat! \n -5", justSignController.timingFeedback.text); Assert.AreEqual(-5, justSignController.CalculateScore()); Assert.AreEqual("Score: -5", justSignController.scoreDisplay.text); justSignController.ActivateEnd(true); yield return new WaitForSeconds(0.2f); JustSignGameEndedPanel justSignGameEndedPanel = GameObject.FindObjectOfType(); Assert.NotNull(justSignGameEndedPanel); Assert.AreEqual("0", justSignGameEndedPanel.perfectSignsText.text); Assert.AreEqual("0", justSignGameEndedPanel.goodSignsText.text); Assert.AreEqual("0", justSignGameEndedPanel.mehSignsText.text); Assert.AreEqual("0", justSignGameEndedPanel.terribleSignsText.text); Assert.AreEqual("1", justSignGameEndedPanel.notFoundSignsText.text); Assert.AreEqual("Score: -5", justSignGameEndedPanel.scoreText.text); string gpmText = (0).ToString("#") + " GPM"; Assert.AreEqual(gpmText, justSignGameEndedPanel.gpmText.text); } /// /// Tests a sign that is done in the meh-zone, i.e., feedback during game and scoreboard after /// /// [UnityTest] public IEnumerator MehScoreTest() { JustSignController justSignController = GameObject.FindObjectOfType(); yield return new WaitForSeconds(14.5f); string currentSign = justSignController.GetFirstSign(); justSignController.ProcessMostProbableSign(1.0f, currentSign); yield return new WaitForSeconds(0.2f); Assert.AreEqual("Bijna... \n +10", justSignController.timingFeedback.text); Assert.AreEqual(10, justSignController.CalculateScore()); Assert.AreEqual("Score: 10", justSignController.scoreDisplay.text); justSignController.ActivateEnd(true); yield return new WaitForSeconds(0.2f); JustSignGameEndedPanel justSignGameEndedPanel = GameObject.FindObjectOfType(); Assert.NotNull(justSignGameEndedPanel); Assert.AreEqual("0", justSignGameEndedPanel.perfectSignsText.text); Assert.AreEqual("0", justSignGameEndedPanel.goodSignsText.text); Assert.AreEqual("1", justSignGameEndedPanel.mehSignsText.text); Assert.AreEqual("0", justSignGameEndedPanel.terribleSignsText.text); Assert.AreEqual("0", justSignGameEndedPanel.notFoundSignsText.text); Assert.AreEqual("Score: 10", justSignGameEndedPanel.scoreText.text); string gpmText = (60f / 64).ToString("#") + " GPM"; Assert.AreEqual(gpmText, justSignGameEndedPanel.gpmText.text); } /// /// Tests a sign that is done in the good-zone, i.e., feedback during game and scoreboard after /// /// [UnityTest] public IEnumerator GoodScoreTest() { JustSignController justSignController = GameObject.FindObjectOfType(); yield return new WaitForSeconds(17.5f); string currentSign = justSignController.GetFirstSign(); justSignController.ProcessMostProbableSign(1.0f, currentSign); yield return new WaitForSeconds(0.2f); Assert.AreEqual("Goed \n +20", justSignController.timingFeedback.text); Assert.AreEqual(20, justSignController.CalculateScore()); Assert.AreEqual("Score: 20", justSignController.scoreDisplay.text); justSignController.ActivateEnd(true); yield return new WaitForSeconds(0.2f); JustSignGameEndedPanel justSignGameEndedPanel = GameObject.FindObjectOfType(); Assert.NotNull(justSignGameEndedPanel); Assert.AreEqual("0", justSignGameEndedPanel.perfectSignsText.text); Assert.AreEqual("1", justSignGameEndedPanel.goodSignsText.text); Assert.AreEqual("0", justSignGameEndedPanel.mehSignsText.text); Assert.AreEqual("0", justSignGameEndedPanel.terribleSignsText.text); Assert.AreEqual("0", justSignGameEndedPanel.notFoundSignsText.text); Assert.AreEqual("Score: 20", justSignGameEndedPanel.scoreText.text); string gpmText = (60f / 64).ToString("#") + " GPM"; Assert.AreEqual(gpmText, justSignGameEndedPanel.gpmText.text); } /// /// Tests a sign that is done in the perfect-zone, i.e., feedback during game and scoreboard after /// /// [UnityTest] public IEnumerator PerfectScoreTest() { JustSignController justSignController = GameObject.FindObjectOfType(); yield return new WaitForSeconds(19.0f); string currentSign = justSignController.GetFirstSign(); justSignController.ProcessMostProbableSign(1.0f, currentSign); yield return new WaitForSeconds(0.2f); Assert.AreEqual("Perfect! \n +50", justSignController.timingFeedback.text); Assert.AreEqual(50, justSignController.CalculateScore()); Assert.AreEqual("Score: 50", justSignController.scoreDisplay.text); justSignController.ActivateEnd(true); yield return new WaitForSeconds(0.2f); JustSignGameEndedPanel justSignGameEndedPanel = GameObject.FindObjectOfType(); Assert.NotNull(justSignGameEndedPanel); Assert.AreEqual("1", justSignGameEndedPanel.perfectSignsText.text); Assert.AreEqual("0", justSignGameEndedPanel.goodSignsText.text); Assert.AreEqual("0", justSignGameEndedPanel.mehSignsText.text); Assert.AreEqual("0", justSignGameEndedPanel.terribleSignsText.text); Assert.AreEqual("0", justSignGameEndedPanel.notFoundSignsText.text); Assert.AreEqual("Score: 50", justSignGameEndedPanel.scoreText.text); string gpmText = (60f / 64).ToString("#") + " GPM"; Assert.AreEqual(gpmText, justSignGameEndedPanel.gpmText.text); } /// /// Tests the entire game, i.e., feedback during game and scoreboard after /// /// [UnityTest] public IEnumerator WalkthroughTest() { JustSignController justSignController = GameObject.FindObjectOfType(); yield return new WaitForSeconds(10.0f); string currentSign = justSignController.GetFirstSign(); justSignController.ProcessMostProbableSign(1.0f, currentSign); Assert.AreEqual(justSignController.CalculateScore(), -3); yield return new WaitForSeconds(10.0f); currentSign = justSignController.GetFirstSign(); justSignController.ProcessMostProbableSign(1.0f, currentSign); Assert.AreEqual(justSignController.CalculateScore(), 7); yield return new WaitForSeconds(6.0f); currentSign = justSignController.GetFirstSign(); justSignController.ProcessMostProbableSign(1.0f, currentSign); Assert.AreEqual(justSignController.CalculateScore(), 27); yield return new WaitForSeconds(6.0f); currentSign = justSignController.GetFirstSign(); justSignController.ProcessMostProbableSign(1.0f, currentSign); Assert.AreEqual(justSignController.CalculateScore(), 77); yield return new WaitForSeconds(10.0f); Assert.AreEqual(justSignController.CalculateScore(), 72); justSignController.ActivateEnd(true); yield return new WaitForSeconds(0.2f); JustSignGameEndedPanel justSignGameEndedPanel = GameObject.FindObjectOfType(); Assert.NotNull(justSignGameEndedPanel); Assert.AreEqual("1", justSignGameEndedPanel.perfectSignsText.text); Assert.AreEqual("1", justSignGameEndedPanel.goodSignsText.text); Assert.AreEqual("1", justSignGameEndedPanel.mehSignsText.text); Assert.AreEqual("1", justSignGameEndedPanel.terribleSignsText.text); Assert.AreEqual("1", justSignGameEndedPanel.notFoundSignsText.text); Assert.AreEqual("Score: 72", justSignGameEndedPanel.scoreText.text); string gpmText = (60f * 4/ 64).ToString("#") + " GPM"; Assert.AreEqual(gpmText, justSignGameEndedPanel.gpmText.text); } /// /// Tests if the game ends when the song does /// /// [UnityTest] public IEnumerator SongEndTest() { JustSignController justSignController = GameObject.FindObjectOfType(); yield return new WaitForSeconds(0.2f); Song song = justSignController.songList.songs[justSignController.songList.currentSongIndex]; song.duration = 1; yield return new WaitForSeconds(1.2f); JustSignGameEndedPanel justSignGameEndedPanel = GameObject.FindObjectOfType(); Assert.NotNull(justSignGameEndedPanel); Assert.AreEqual("0", justSignGameEndedPanel.perfectSignsText.text); Assert.AreEqual("0", justSignGameEndedPanel.goodSignsText.text); Assert.AreEqual("0", justSignGameEndedPanel.mehSignsText.text); Assert.AreEqual("0", justSignGameEndedPanel.terribleSignsText.text); Assert.AreEqual("0", justSignGameEndedPanel.notFoundSignsText.text); Assert.AreEqual("Score: 0", justSignGameEndedPanel.scoreText.text); string gpmText = (0).ToString("#") + " GPM"; Assert.AreEqual(gpmText, justSignGameEndedPanel.gpmText.text); } /// /// Tests the feedback in the game /// /// [UnityTest] public IEnumerator FeedbackTest() { JustSignController justSignController = GameObject.FindObjectOfType(); yield return new WaitForSeconds(5.0f); string currentSign = justSignController.GetFirstSign(); float threshold = justSignController.GetThreshold(currentSign); justSignController.ProcessMostProbableSign(0.9f * threshold, currentSign); yield return new WaitForSeconds(0.2f); Assert.Null(justSignController.GetFirstSign()); Assert.AreEqual($"Herkent '{currentSign}'", justSignController.feedbackText.text); Assert.AreEqual(new Color(0x8b / 255.0f, 0xd4 / 255.0f, 0x5e / 255.0f), justSignController.feedbackText.color); yield return new WaitForSeconds(5.0f); currentSign = justSignController.GetFirstSign(); threshold = justSignController.GetThreshold(currentSign); justSignController.ProcessMostProbableSign(1.2f * threshold, currentSign); yield return new WaitForSeconds(0.2f); Assert.AreEqual($"Lijkt op '{currentSign}'", justSignController.feedbackText.text); Assert.AreEqual(new Color(0xf2 / 255.0f, 0x7f / 255.0f, 0x0c / 255.0f), justSignController.feedbackText.color); justSignController.ProcessMostProbableSign(3.0f * threshold, currentSign); yield return new WaitForSeconds(0.2f); Assert.AreEqual("Detecteren...", justSignController.feedbackText.text); Assert.AreEqual(new Color(0xf5 / 255.0f, 0x49 / 255.0f, 0x3d / 255.0f), justSignController.feedbackText.color); } /// /// Cleanup after testing /// [TearDown] public void TearDown_JustSignTests() { PersistentDataController.PATH = null; } }