/// <summary>
        /// Initializes a new instance of the <see cref="StudentCourseEvaluation" /> class.
        /// </summary>
        /// <param name="student">The student.</param>
        /// <param name="evaluation">The evaluation.</param>
        /// <exception cref="System.ArgumentNullException">if student is null.</exception>
        public StudentCourseEvaluation(Student student, CourseEvaluation evaluation = null)
        {
            if (student == null)
                throw new ArgumentNullException("student");

            this.Student = student;
            this.Evaluation = evaluation ?? new CourseEvaluation();
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="StudentCourseEvaluation" /> class.
        /// </summary>
        /// <param name="student">The student.</param>
        /// <param name="evaluation">The evaluation.</param>
        /// <exception cref="System.ArgumentNullException">if student is null.</exception>
        public StudentCourseEvaluation(Student student, CourseEvaluation evaluation = null)
        {
            if (student == null)
            {
                throw new ArgumentNullException("student");
            }

            this.Student    = student;
            this.Evaluation = evaluation ?? new CourseEvaluation();
        }
        public void TestConstruction()
        {
            var eval = new CourseEvaluation(this.Definition);
            Assert.AreEqual(this.Definition, eval.EvaluationDefinitions);

            Assert.AreEqual(this.Definition.Count, eval.Evaluations.Count);
            for (int i = 0; i < this.Definition.Count; i++)
            {
                Assert.AreEqual(this.Definition[i], eval.Evaluations[i].Definition);
            }
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="StudentCourseEvaluation" /> class.
        /// </summary>
        /// <param name="studentPersonalNumber">The student personal number.</param>
        /// <param name="studentFirstName">First name of the student.</param>
        /// <param name="studentSurname">The student surname.</param>
        /// <param name="evaluation">The evaluation.</param>
        /// <exception cref="System.ArgumentNullException">if studentPersonalNumber, studentFirstName or studentSurname is null.</exception>
        public StudentCourseEvaluation(string studentPersonalNumber, 
            string studentFirstName, string studentSurname, CourseEvaluation evaluation = null)
        {
            if (studentPersonalNumber == null)
                throw new ArgumentNullException("studentPersonalNumber");
            if (studentFirstName == null)
                throw new ArgumentNullException("studentFirstName");
            if (studentSurname == null)
                throw new ArgumentNullException("studentSurname");

            this.Student = new Student(studentPersonalNumber, studentFirstName, studentSurname);
            this.Evaluation = evaluation ?? new CourseEvaluation();
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="StudentCourseEvaluation" /> class.
        /// </summary>
        /// <param name="student">The student.</param>
        /// <param name="evalDefinition">The eval definition.</param>
        /// <exception cref="System.ArgumentNullException">if student is null.</exception>
        public StudentCourseEvaluation(Student student, EvaluationDefinitionCollection evalDefinition)
        {
            if (student == null)
            {
                throw new ArgumentNullException("student");
            }
            if (evalDefinition == null)
            {
                throw new ArgumentNullException("evalDefinition");
            }

            this.Student    = student;
            this.Evaluation = new CourseEvaluation(evalDefinition);
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="StudentCourseEvaluation" /> class.
        /// </summary>
        /// <param name="studentPersonalNumber">The student personal number.</param>
        /// <param name="studentFirstName">First name of the student.</param>
        /// <param name="studentSurname">The student surname.</param>
        /// <param name="evaluation">The evaluation.</param>
        /// <exception cref="System.ArgumentNullException">if studentPersonalNumber, studentFirstName or studentSurname is null.</exception>
        public StudentCourseEvaluation(string studentPersonalNumber,
                                       string studentFirstName, string studentSurname, CourseEvaluation evaluation = null)
        {
            if (studentPersonalNumber == null)
            {
                throw new ArgumentNullException("studentPersonalNumber");
            }
            if (studentFirstName == null)
            {
                throw new ArgumentNullException("studentFirstName");
            }
            if (studentSurname == null)
            {
                throw new ArgumentNullException("studentSurname");
            }

            this.Student    = new Student(studentPersonalNumber, studentFirstName, studentSurname);
            this.Evaluation = evaluation ?? new CourseEvaluation();
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="StudentCourseEvaluation" /> class.
        /// </summary>
        /// <param name="studentPersonalNumber">The student personal number.</param>
        /// <param name="studentFirstName">First name of the student.</param>
        /// <param name="studentSurname">The student surname.</param>
        /// <param name="evalDefinition">The eval definition.</param>
        /// <exception cref="System.ArgumentNullException">if studentPersonalNumber, studentFirstName, studentSurname or evalDefinition is null.</exception>
        public StudentCourseEvaluation(string studentPersonalNumber,
                                       string studentFirstName, string studentSurname, EvaluationDefinitionCollection evalDefinition)
        {
            if (studentPersonalNumber == null)
            {
                throw new ArgumentNullException("studentPersonalNumber");
            }
            if (studentFirstName == null)
            {
                throw new ArgumentNullException("studentFirstName");
            }
            if (studentSurname == null)
            {
                throw new ArgumentNullException("studentSurname");
            }
            if (evalDefinition == null)
            {
                throw new ArgumentNullException("evalDefinition");
            }

            this.Student    = new Student(studentPersonalNumber, studentFirstName, studentSurname);
            this.Evaluation = new CourseEvaluation(evalDefinition);
        }
 public void TestConstructionWithNull()
 {
     var eval = new CourseEvaluation(null);
     Assert.Fail("CourseEvaluation should throw exception if the definition is null");
 }
        public void TestConstructionWithEmptyDefinition()
        {
            var eval = new CourseEvaluation();

            Assert.AreEqual(null, eval.GetTotalPoints());
            Assert.AreEqual(null, eval.GetTotalPointsReason());
        }
        public void TestModyfingDefinition()
        {
            //Add some value
            var eval = new CourseEvaluation(this.Definition);
            eval.Evaluations[0].Value.Points = 11;  //A - 10-20
            eval.Evaluations[1].Value.Points = 11;  //B - 5-10
            eval.Evaluations[1].Value.Reason = "Reason1";
            eval.Evaluations[2].Value.Points = 11;  //C - <=20
            eval.Evaluations[3].Value.Points = 9;   //D - >=10
            eval.Evaluations[3].Value.Reason = "Reason2";
            eval.Evaluations[4].Value.Points = 10;  //E - nothing

            Assert.AreEqual("A [10-20b]: 11b, B [5-10b]: 11b (Reason1), C [max 20b]: 11b, D [min 10b]: 9b (Reason2), E: 10b",
                  eval.GetTotalPointsReason());

            eval.Evaluations[3].Definition.Name = "F";
            Assert.AreEqual("A [10-20b]: 11b, B [5-10b]: 11b (Reason1), C [max 20b]: 11b, F [min 10b]: 9b (Reason2), E: 10b",
                  eval.GetTotalPointsReason());

            this.Definition.Move(4, 3);
            Assert.AreEqual("A [10-20b]: 11b, B [5-10b]: 11b (Reason1), C [max 20b]: 11b, E: 10b, F [min 10b]: 9b (Reason2)",
                  eval.GetTotalPointsReason());

            this.Definition.RemoveAt(1);
            Assert.AreEqual("A [10-20b]: 11b, C [max 20b]: 11b, E: 10b, F [min 10b]: 9b (Reason2)",
                  eval.GetTotalPointsReason());

            this.Definition.Add(new EvaluationDefinition()
                {
                    Name = "G",
                    MaxPoints = 20,
                }
                );
            Assert.AreEqual(5, eval.Evaluations.Count);
            eval.Evaluations[4].Value.Points = 18;  //G - <= 20
            Assert.AreEqual("A [10-20b]: 11b, C [max 20b]: 11b, E: 10b, F [min 10b]: 9b (Reason2), G [max 20b]: 18b",
                  eval.GetTotalPointsReason());

            this.Definition.Insert(1, new EvaluationDefinition()
            {
                Name = "B",
            }
                );
            Assert.AreEqual(6, eval.Evaluations.Count);
            eval.Evaluations[1].Value.Points = 15;  //B - nothing
            Assert.AreEqual("A [10-20b]: 11b, B: 15b, C [max 20b]: 11b, E: 10b, F [min 10b]: 9b (Reason2), G [max 20b]: 18b",
                  eval.GetTotalPointsReason());

            this.Definition[0] = new EvaluationDefinition()
            {
                Name = "AR",
            };

            Assert.AreEqual("AR: 11b, B: 15b, C [max 20b]: 11b, E: 10b, F [min 10b]: 9b (Reason2), G [max 20b]: 18b",
                  eval.GetTotalPointsReason());

            decimal? sum = 11 + 15 + 11 + 10 + 9 + 18;
            Assert.AreEqual(sum, eval.GetTotalPoints());

            this.Definition.Clear();
            Assert.AreEqual(0, eval.Evaluations.Count);
            Assert.AreEqual(null, eval.GetTotalPointsReason());

            this.Definition.Add(new EvaluationDefinition()
            {
                Name = "A",
            }
                );
            Assert.AreEqual(1, eval.Evaluations.Count);
            eval.Evaluations[0].Value.Points = 10;  //A - nothing
            Assert.AreEqual("A: 10b", eval.GetTotalPointsReason());
        }
        public void TestModifyingValues()
        {
            if (this.Definition.Count != 5) {
                Assert.Inconclusive("Test corrupted! Definition is in an unexpected state.");
                return;
            }

            var eval = new CourseEvaluation(this.Definition);

            var col = new List<Evaluation>(eval.GetAllEvaluations());
            Assert.AreEqual(5, col.Count, "GetAllEvaluations [Init].");

            for (int i = 0; i < 5; i++)
            {
                Assert.AreEqual(this.Definition[i], col[i].Definition);
            }

            col = new List<Evaluation>(eval.GetValidEvaluations());
            Assert.AreEqual(0, col.Count, "GetValidEvaluations [Init].");

            col = new List<Evaluation>(eval.GetMissingEvaluations());
            Assert.AreEqual(5, col.Count, "GetMissingEvaluations [Init].");

            for (int i = 0; i < 5; i++)
            {
                Assert.AreEqual(this.Definition[i], col[i].Definition);
            }

            col = new List<Evaluation>(eval.GetHasPassedEvaluations());
            Assert.AreEqual(2, col.Count, "GetHasPassedEvaluations [Init].");

            col = new List<Evaluation>(eval.GetHasFailedEvaluations());
            Assert.AreEqual(3, col.Count, "GetHasFailedEvaluations [Init].");

            Assert.AreEqual(null, eval.GetTotalPoints());
            Assert.AreEqual(null, eval.GetTotalPointsReason());
            Assert.AreEqual("?b", eval.ToString());

            //let us add some value
            eval.Evaluations[0].Value.Points = 11;  //A - 10-20
            eval.Evaluations[1].Value.Points = 11;  //B - 5-10
            eval.Evaluations[2].Value.Points = 11;  //C - <=20
            eval.Evaluations[3].Value.Points = 9;   //D - >=10
                                                    //E -

            col = new List<Evaluation>(eval.GetValidEvaluations());
            Assert.AreEqual(4, col.Count, "GetValidEvaluations [Filled]."); //A-D
            for (int i = 0; i < 4; i++)
            {
                Assert.AreEqual(this.Definition[i], col[i].Definition);
            }

            col = new List<Evaluation>(eval.GetMissingEvaluations());   //E
            Assert.AreEqual(1, col.Count, "GetMissingEvaluations [Filled].");
            Assert.AreEqual(this.Definition[4], col[0].Definition);

            //check HasPassed
            col = new List<Evaluation>(eval.GetHasPassedEvaluations());   //A,B,C,E
            Assert.AreEqual(4, col.Count, "GetHasPassedEvaluations [Filled].");
            for (int i = 0; i < 3; i++)
            {
                Assert.AreEqual(this.Definition[i], col[i].Definition);
            }
            Assert.AreEqual(this.Definition[4], col[3].Definition);

            //check HasFailed
            col = new List<Evaluation>(eval.GetHasFailedEvaluations());   //D
            Assert.AreEqual(1, col.Count, "GetHasFailedEvaluations [Filled].");
            Assert.AreEqual(this.Definition[3], col[0].Definition);

            decimal? dec = 11 + 10 + 11 + 9;
            Assert.AreEqual(dec, eval.GetTotalPoints());

            //add reasons
            eval.Evaluations[1].Value.Reason = "Reason1";
            eval.Evaluations[3].Value.Reason = "Reason2";

            Assert.AreEqual("A [10-20b]: 11b, B [5-10b]: 11b (Reason1), C [max 20b]: 11b, D [min 10b]: 9b (Reason2)",
                  eval.GetTotalPointsReason());

            Assert.AreEqual("41b = A [10-20b]: 11b, B [5-10b]: 11b (Reason1), C [max 20b]: 11b, D [min 10b]: 9b (Reason2)",
                  eval.ToString());
        }