public IEnumerator TestSquaresScoreMismatch()
            {
                int scoreWithMisMatch;
                int scoreWithoutMisMatch;

                // Score for round without mismatch
                InitializeVisuospatialMeasure();
                for (int a = 0; a < 6; a++)
                {
                    VisuospatialSketchpadMeasure.squaresData.Rounds.Add(squareRound);
                }
                VisuospatialSketchpadMeasure.EvaluateSquaresScore();
                scoreWithoutMisMatch = VisuospatialSketchpadMeasure.subScoreSquares.Score;

                // Score for round with mismatch
                InitializeVisuospatialMeasure();
                for (int a = 0; a < 5; a++)
                {
                    VisuospatialSketchpadMeasure.squaresData.Rounds.Add(squareRound);
                }
                // Add one round with mismatch
                VisuospatialSketchpadMeasure.squaresData.Rounds.Add(squareRound_misMatch);
                VisuospatialSketchpadMeasure.EvaluateSquaresScore();
                scoreWithMisMatch = VisuospatialSketchpadMeasure.subScoreSquares.Score;

                yield return(null);

                Assert.IsTrue(scoreWithMisMatch < scoreWithoutMisMatch);
            }
            public IEnumerator NumberOfRoundsCorrectScoreIncrease()
            {
                int score6Squares, score8Squares;

                yield return(null);

                // 6 squares
                InitializeVisuospatialMeasure();
                for (int a = 0; a < 5; a++)
                {
                    VisuospatialSketchpadMeasure.squaresData.Rounds.Add(squareRound);
                }
                VisuospatialSketchpadMeasure.squaresData.Rounds.Add(squareRound_6Squares);
                VisuospatialSketchpadMeasure.EvaluateSquaresScore();
                score6Squares = VisuospatialSketchpadMeasure.subScoreSquares.Score;

                yield return(null);

                // 8 squares
                InitializeVisuospatialMeasure();
                for (int a = 0; a < 5; a++)
                {
                    VisuospatialSketchpadMeasure.squaresData.Rounds.Add(squareRound);
                }
                VisuospatialSketchpadMeasure.squaresData.Rounds.Add(squareRound_8Squares);
                VisuospatialSketchpadMeasure.EvaluateSquaresScore();
                score8Squares = VisuospatialSketchpadMeasure.subScoreSquares.Score;

                Assert.IsTrue(score6Squares < score8Squares, "6 squares score: " + score6Squares + " 8 squares score: " + score8Squares);
            }
            public IEnumerator TestSquaresNumberOfCorrectHighlightedSquaresInLargeNumberOfHighlighted()
            {
                int scoreWithLowNumberOfCorrectSquares;
                int scoreWithHighNumberOfCorrectSquares;

                // Score for round with correct squares, but lower number of squares
                InitializeVisuospatialMeasure();
                for (int a = 0; a < 5; a++)
                {
                    VisuospatialSketchpadMeasure.squaresData.Rounds.Add(squareRound);
                }
                VisuospatialSketchpadMeasure.EvaluateSquaresScore();
                scoreWithLowNumberOfCorrectSquares = VisuospatialSketchpadMeasure.subScoreSquares.Score;

                // Score for round with correct squares, but higher number of squares
                InitializeVisuospatialMeasure();
                for (int a = 0; a < 4; a++)
                {
                    VisuospatialSketchpadMeasure.squaresData.Rounds.Add(squareRound);
                }
                // Add one round with more correct squares
                VisuospatialSketchpadMeasure.squaresData.Rounds.Add(squareRound_moreCorrectSquares);
                VisuospatialSketchpadMeasure.EvaluateSquaresScore();
                scoreWithHighNumberOfCorrectSquares = VisuospatialSketchpadMeasure.subScoreSquares.Score;

                yield return(null);

                Assert.IsTrue(scoreWithLowNumberOfCorrectSquares < scoreWithHighNumberOfCorrectSquares);
            }
            public IEnumerator TestSquaresScoreGap()
            {
                int scoreWithGap;
                int scoreWithoutGap;

                // Score for round without gap
                InitializeVisuospatialMeasure();
                for (int a = 0; a < 6; a++)
                {
                    VisuospatialSketchpadMeasure.squaresData.Rounds.Add(squareRound);
                }
                VisuospatialSketchpadMeasure.EvaluateSquaresScore();
                scoreWithoutGap = VisuospatialSketchpadMeasure.subScoreSquares.Score;

                // Score for round with gap
                InitializeVisuospatialMeasure();
                for (int a = 0; a < 5; a++)
                {
                    VisuospatialSketchpadMeasure.squaresData.Rounds.Add(squareRound);
                }
                // Add one round with gap
                VisuospatialSketchpadMeasure.squaresData.Rounds.Add(squareRound_gap);
                VisuospatialSketchpadMeasure.EvaluateSquaresScore();
                scoreWithGap = VisuospatialSketchpadMeasure.subScoreSquares.Score;

                yield return(null);

                Assert.IsTrue(scoreWithGap < scoreWithoutGap);
            }
            public IEnumerator TestSquaresScoreNumberOfRounds()
            {
                int scoreForLowerNumOfRounds;
                int scoreForHigherNumOfRounds;
                int numOfRoundsInThisTestCase = 2;

                // Score for 1 round
                InitializeVisuospatialMeasure();
                VisuospatialSketchpadMeasure.squaresData.Rounds.Add(squareRound);
                VisuospatialSketchpadMeasure.EvaluateSquaresScore();
                scoreForLowerNumOfRounds = VisuospatialSketchpadMeasure.subScoreSquares.Score;

                // Make sure that the scores for rounds 2 - 8 increase depending on the number of rounds
                for (int j = 2; j < 8; j++)
                {
                    InitializeVisuospatialMeasure();
                    for (int k = 0; k < numOfRoundsInThisTestCase; k++)
                    {
                        VisuospatialSketchpadMeasure.squaresData.Rounds.Add(squareRound);
                    }

                    // Call the EvaluateSquaresScore function
                    VisuospatialSketchpadMeasure.EvaluateSquaresScore();
                    // Get the score
                    scoreForHigherNumOfRounds = VisuospatialSketchpadMeasure.subScoreSquares.Score;
                    yield return(null);

                    // Test that fewer rounds played should result in a lower score
                    Assert.IsTrue(scoreForLowerNumOfRounds <= scoreForHigherNumOfRounds, "Number of rounds: " + numOfRoundsInThisTestCase + " Low rounds score: " + scoreForLowerNumOfRounds + " High rounds score: " + scoreForHigherNumOfRounds);

                    // Set variables for next round comparison
                    scoreForLowerNumOfRounds   = scoreForHigherNumOfRounds;
                    numOfRoundsInThisTestCase += 1;
                }
            }
        //Helper functions start
        //---------------------------------------------------------
        //---------------------------------------------------------

        /// <summary>
        /// MeasureAllGames is called when all games end. It will call methods of
        /// evaluating scores for all abilities.
        /// </summary>
        private static void MeasureAllGames()
        {
            // Measure abilities for Balloons
            // If the game has been played, do the measurement; else don't do the measurement
            if (!notYetPlayBalloons)
            {
                PointingMeasure.EvaluateBalloonsScore();
                SelectiveVisualMeasure.EvaluateBalloonsScore();
                InhibitionMeasure.EvaluateBalloonsScore();
            }

            // Measure abilities for Squares
            // If the game has been played, do the measurement; else don't do the measurement
            if (!notYetPlaySquares)
            {
                SelectiveVisualMeasure.EvaluateSquaresScore();
                VisuospatialSketchpadMeasure.EvaluateSquaresScore();
            }

            // Measure abilities for Catch The Thief
            // If the game has been played, do the measurement; else don't do the measurement
            if (!notYetPlayCTF)
            {
                InhibitionMeasure.EvaluateCTFScore();
                SelectiveVisualMeasure.EvaluateCTFScore();
            }

            // Measure abilities for ImageHit
            // If the game has been played, do the measurement; else don't do the measurement
            if (!notYetPlayImageHit)
            {
                ObjectRecognitionMeasure.EvaluateImageHitScore();
                InhibitionMeasure.EvaluateImageHitScore();
                SelectiveVisualMeasure.EvaluateImageHitScore();
            }

            // Measure abilities for Catch The Ball
            // If the game has been played, do the measurement; else don't do the measurement
            if (!notYetCatchTheBall)
            {
                TimeToContact.EvaluateCatchTheBallScore();
            }

            // Measure abilities for Save One Ball
            // If the game has been played, do the measurement; else don't do the measurement
            if (!notYetSaveOneBall)
            {
                TimeToContact.EvaluateSaveOneBallScore();
            }

            // Measure abilities for Judge The Ball
            // If the game has been played, do the measurement; else don't do the measurement
            if (!notYetJudgeTheBall)
            {
                TimeToContact.EvaluateJudgeTheBallScore();
            }
        }
            public IEnumerator TestMaxScore100()
            {
                int actualScore;

                // Score for round with high number of correct squares
                InitializeVisuospatialMeasure();
                for (int a = 0; a < 7; a++)
                {
                    VisuospatialSketchpadMeasure.squaresData.Rounds.Add(squareRound_moreCorrectSquares);
                }
                VisuospatialSketchpadMeasure.EvaluateSquaresScore();
                actualScore = VisuospatialSketchpadMeasure.subScoreSquares.Score;

                yield return(null);

                Assert.IsTrue(actualScore == 100, "Score: " + actualScore);
            }
            public IEnumerator WHEN_EvaluateSquaresScoreFunctionCalledOnEmptyInput_SquareSubScoreReturnsBaseScore()
            {
                // Initialize the measurement module
                InitializeVisuospatialMeasure();

                // Call the evaluate score function
                VisuospatialSketchpadMeasure.EvaluateSquaresScore();

                yield return(null);

                // SquaresStorage datatype variable to hold the data from the squares mini-game
                SquaresStorage squaresData = Squares.GetGameplayData();

                // Ensure that SubscoreSquares values are correctly set
                Assert.AreEqual(AbilityName.VISUOSPATIAL_SKETCHPAD, VisuospatialSketchpadMeasure.subScoreSquares.AbilityName);
                Assert.AreEqual(GameName.SQUARES, VisuospatialSketchpadMeasure.subScoreSquares.GameName);
                Assert.AreEqual(0, VisuospatialSketchpadMeasure.subScoreSquares.Score);
                Assert.AreEqual(2, VisuospatialSketchpadMeasure.subScoreSquares.Weight);
            }
            public IEnumerator WHEN_GetSubScoreForSquaresCalled_SquareSubScoreIsCorrect()
            {
                int squaresScore = 0;

                // Set the subscoreSquare values in the measurement module
                VisuospatialSketchpadMeasure.subScoreSquares.AbilityName = AbilityName.VISUOSPATIAL_SKETCHPAD;
                VisuospatialSketchpadMeasure.subScoreSquares.GameName    = GameName.SQUARES;
                VisuospatialSketchpadMeasure.subScoreSquares.Score       = squaresScore;
                VisuospatialSketchpadMeasure.subScoreSquares.Weight      = 2;

                // Call the GetSubScoreForSquares function and store the value
                SubscoreStorage actualSubscoreStorage   = VisuospatialSketchpadMeasure.GetSubScoreForSquares();
                SubscoreStorage expectedSubscoreStorage = VisuospatialSketchpadMeasure.subScoreSquares;

                yield return(null);

                // Ensure that the SubscoreStorage returned by the function matches what was set
                Assert.AreEqual(expectedSubscoreStorage.AbilityName, actualSubscoreStorage.AbilityName);
                Assert.AreEqual(expectedSubscoreStorage.GameName, actualSubscoreStorage.GameName);
                Assert.AreEqual(expectedSubscoreStorage.Score, actualSubscoreStorage.Score);
                Assert.AreEqual(expectedSubscoreStorage.Weight, actualSubscoreStorage.Weight);
            }
            public IEnumerator TestSquaresRecallTime()
            {
                int scoreForRecallTime3;
                int scoreForRecallTime3_3;
                int scoreForRecallTime3_6;
                int scoreForRecallTime3_9;
                int scoreForRecallTime4_2;
                int scoreForRecallTime5;

                // Score for round with recall time 3
                InitializeVisuospatialMeasure();
                for (int a = 0; a < 5; a++)
                {
                    VisuospatialSketchpadMeasure.squaresData.Rounds.Add(squareRound);
                }

                VisuospatialSketchpadMeasure.squaresData.Rounds.Add(squareRound_3);
                VisuospatialSketchpadMeasure.EvaluateSquaresScore();
                scoreForRecallTime3 = VisuospatialSketchpadMeasure.subScoreSquares.Score;

                // Score for round with recall time 3.3
                InitializeVisuospatialMeasure();
                for (int a = 0; a < 5; a++)
                {
                    VisuospatialSketchpadMeasure.squaresData.Rounds.Add(squareRound);
                }

                VisuospatialSketchpadMeasure.squaresData.Rounds.Add(squareRound_3_3);
                VisuospatialSketchpadMeasure.EvaluateSquaresScore();
                scoreForRecallTime3_3 = VisuospatialSketchpadMeasure.subScoreSquares.Score;

                // Score for round with recall time 3.6
                InitializeVisuospatialMeasure();
                for (int a = 0; a < 5; a++)
                {
                    VisuospatialSketchpadMeasure.squaresData.Rounds.Add(squareRound);
                }

                VisuospatialSketchpadMeasure.squaresData.Rounds.Add(squareRound_3_6);
                VisuospatialSketchpadMeasure.EvaluateSquaresScore();
                scoreForRecallTime3_6 = VisuospatialSketchpadMeasure.subScoreSquares.Score;

                // Score for round with recall time 3.9
                InitializeVisuospatialMeasure();
                for (int a = 0; a < 5; a++)
                {
                    VisuospatialSketchpadMeasure.squaresData.Rounds.Add(squareRound);
                }

                VisuospatialSketchpadMeasure.squaresData.Rounds.Add(squareRound_3_9);
                VisuospatialSketchpadMeasure.EvaluateSquaresScore();
                scoreForRecallTime3_9 = VisuospatialSketchpadMeasure.subScoreSquares.Score;

                // Score for round with recall time 4.2
                InitializeVisuospatialMeasure();
                for (int a = 0; a < 5; a++)
                {
                    VisuospatialSketchpadMeasure.squaresData.Rounds.Add(squareRound);
                }

                VisuospatialSketchpadMeasure.squaresData.Rounds.Add(squareRound_4_2);
                VisuospatialSketchpadMeasure.EvaluateSquaresScore();
                scoreForRecallTime4_2 = VisuospatialSketchpadMeasure.subScoreSquares.Score;

                // Score for round with recall time 5
                InitializeVisuospatialMeasure();
                for (int a = 0; a < 5; a++)
                {
                    VisuospatialSketchpadMeasure.squaresData.Rounds.Add(squareRound);
                }
                // Add one round with the recall time
                VisuospatialSketchpadMeasure.squaresData.Rounds.Add(squareRound);
                VisuospatialSketchpadMeasure.EvaluateSquaresScore();
                scoreForRecallTime5 = VisuospatialSketchpadMeasure.subScoreSquares.Score;

                yield return(null);

                Assert.IsTrue(scoreForRecallTime3 > scoreForRecallTime3_3, "3 seconds: " + scoreForRecallTime3 + " 3.3 seconds: " + scoreForRecallTime3_3);
                Assert.IsTrue(scoreForRecallTime3_3 > scoreForRecallTime3_6, "3.3 seconds: " + scoreForRecallTime3_3 + " 3.6 seconds: " + scoreForRecallTime3_6);
                Assert.IsTrue(scoreForRecallTime3_6 > scoreForRecallTime3_9, "3.6 seconds: " + scoreForRecallTime3_6 + " 3.9 seconds: " + scoreForRecallTime3_9);
                Assert.IsTrue(scoreForRecallTime3_9 > scoreForRecallTime4_2, "3 seconds: " + scoreForRecallTime3 + ", 3.3 seconds: " + scoreForRecallTime3_3 + ", 3.6 seconds: " + scoreForRecallTime3_6 + ", 3.9 seconds: " + scoreForRecallTime3_9 + ", 4.2 seconds " + scoreForRecallTime4_2 + ", 5 seconds " + scoreForRecallTime5);
                Assert.IsTrue(scoreForRecallTime4_2 > scoreForRecallTime5, "4.2 seconds: " + scoreForRecallTime4_2 + " 5 seconds " + scoreForRecallTime5);
            }
        /// <summary>
        /// UpdateSubScoreSeq is to derive all subscore records and
        /// add these records to the subScoreSeq.
        /// </summary>
        private static void UpdateSubScoreSeq()
        {
            // Update subscores of abilities tested by Balloons and add them to sequence
            // If the game has been played, update the score
            if (!notYetPlayBalloons)
            {
                //get subscore for (Flicking, Balloons)
                SubscoreStorage flicking_balloons = PointingMeasure.GetSubScoreForBalloons();
                //get subscore for (Inhibition, Balloons)
                SubscoreStorage inhibition_balloons = InhibitionMeasure.GetSubScoreForBalloons();
                //get subscore for (Selective Visual, Balloons)
                SubscoreStorage selectiveVisual_balloons = SelectiveVisualMeasure.GetSubScoreForBalloons();

                //add subScore to subScoreSeq
                subScoreSeq.Add(flicking_balloons);
                subScoreSeq.Add(inhibition_balloons);
                subScoreSeq.Add(selectiveVisual_balloons);
            }

            // Update subscores of abilities tested by Squares and add them to sequence
            // If the game has been played, update the score
            if (!notYetPlaySquares)
            {
                //get subscore for (Selective Visual, Squares)
                SubscoreStorage selectiveVisual_squares = SelectiveVisualMeasure.GetSubScoreForSquares();
                //get subscore for (Visuospatial Sketchpad, Squares)
                SubscoreStorage visuospatialSketchpad_squares = VisuospatialSketchpadMeasure.GetSubScoreForSquares();

                //add subScore to subScoreSeq
                subScoreSeq.Add(selectiveVisual_squares);
                subScoreSeq.Add(visuospatialSketchpad_squares);
            }

            // Update subscores of abilities tested by Catch The Thief and add them to sequence
            // If the game has been played, update the score
            if (!notYetPlayCTF)
            {
                //get subscore for (Inhibition, Catch The Thief)
                SubscoreStorage inhibition_ctf = InhibitionMeasure.GetSubScoreForCTF();
                //get subscore for  (Selective Visual, Catch The Thief)
                SubscoreStorage selectiveVisual_ctf = SelectiveVisualMeasure.GetSubScoreForCTF();

                //add subScore to subScoreSeq
                subScoreSeq.Add(inhibition_ctf);
                subScoreSeq.Add(selectiveVisual_ctf);
            }

            // Update subscores of abilities tested by ImageHit and add them to sequence
            // If the game has been played, update the score
            if (!notYetPlayImageHit)
            {
                //get subscore for (Object Recognition, ImageHit)
                SubscoreStorage objectRecognition_imageHit = ObjectRecognitionMeasure.GetSubScoreForImageHit();
                //get subscore for (Inhibition, ImageHit)
                SubscoreStorage inhibition_imageHit = InhibitionMeasure.GetSubScoreForImageHit();
                //get subscore for  (Selective Visual, ImageHit)
                SubscoreStorage selectiveVisual_imageHit = SelectiveVisualMeasure.GetSubScoreForImageHit();

                //add subScore to subScoreSeq
                subScoreSeq.Add(objectRecognition_imageHit);
                subScoreSeq.Add(inhibition_imageHit);
                subScoreSeq.Add(selectiveVisual_imageHit);
            }

            // Update subscores of abilities tested by Catch The Ball and add them to sequence
            // If the game has been played, update the score
            if (!notYetCatchTheBall)
            {
                //get subscore for (Time To Contact, Catch The Ball)
                SubscoreStorage timeToContact_catchTheBall = TimeToContact.GetSubScoreForCatchTheBall();

                //add subScore to subScoreSeq
                subScoreSeq.Add(timeToContact_catchTheBall);
            }

            // Update subscores of abilities tested by Save One Ball and add them to sequence
            // If the game has been played, update the score
            if (!notYetSaveOneBall)
            {
                //get subscore for (Time To Contact, Save One Ball)
                SubscoreStorage timeToContact_saveOneBall = TimeToContact.GetSubScoreForSaveOneBall();

                //add subScore to subScoreSeq
                subScoreSeq.Add(timeToContact_saveOneBall);
            }

            // Update subscores of abilities tested by Judge The Ball and add them to sequence
            // If the game has been played, update the score
            if (!notYetJudgeTheBall)
            {
                //get subscore for (Time To Contact, Judge The Ball)
                SubscoreStorage timeToContact_judgeTheBall = TimeToContact.GetSubScoreForJudgeTheBall();

                //add subScore to subScoreSeq
                subScoreSeq.Add(timeToContact_judgeTheBall);
            }
        }