public void t5_pupils_firstname_and_lastname_must_be_not_null_and_longer_than_2_characters(string firstName, string lastName)
        {
            School    s = new School("Evariste Galois");
            Classroom c = s.AddClassRoom("C");

            Assert.Throws <ArgumentException>(() => c.AddPupil(firstName, lastName));
        }
        public void t4_pupils_are_created_by_classrooms_and_have_a_unique_firstname_and_lastname()
        {
            School    s = new School("Evariste Galois");
            Classroom c = s.AddClassRoom("C");

            Pupil p1 = c.AddPupil("Jean-Paul", "Sartre");

            Assert.That(p1.Classroom, Is.SameAs(c));
            Assert.That(p1.FirstName, Is.EqualTo("Jean-Paul"));
            Assert.That(p1.LastName, Is.EqualTo("Sartre"));
            Assert.Throws <ArgumentException>(() => c.AddPupil("Jean-Paul", "Sartre"));

            Pupil p2 = c.AddPupil("Jean-Paul", "Deux");

            Assert.That(p2.Classroom, Is.SameAs(c));
            Assert.That(p2.FirstName, Is.EqualTo("Jean-Paul"));
            Assert.That(p2.LastName, Is.EqualTo("Deux"));
            Assert.Throws <ArgumentException>(() => c.AddPupil("Jean-Paul", "Deux"));

            Assert.That(typeof(Pupil).GetProperty("FirstName").GetSetMethod(), Is.Null, "Pupil.FirstName must NOT be writeable.");
            Assert.That(typeof(Pupil).GetProperty("LastName").GetSetMethod(), Is.Null, "Pupil.FirstName must NOT be writeable.");
            Assert.That(typeof(Pupil).GetConstructors(BindingFlags.Instance | BindingFlags.Public), Is.Empty, "Pupil must not expose any public constructors.");
        }
        public void t2_pupils_can_be_found_by_name()
        {
            School    s = new School("Evariste Galois");
            Classroom c = s.AddClassRoom("CE1");

            Pupil albert = c.AddPupil("Albert", "Einstein");

            Assert.That(c.FindPupil("Albert", "Einstein"), Is.SameAs(albert));
            Assert.That(c.FindPupil("Max", "Planck"), Is.Null);

            Pupil max = c.AddPupil("Max", "Planck");

            Assert.That(c.FindPupil("Albert", "Einstein"), Is.SameAs(albert));
            Assert.That(c.FindPupil("Max", "Planck"), Is.SameAs(max));
            Assert.That(c.FindPupil("Enrico", "Fermi"), Is.Null);

            Pupil enrico = c.AddPupil("Enrico", "Fermi");
            Pupil paul   = c.AddPupil("Paul", "Langevin");
            Pupil nikola = c.AddPupil("Nikola", "Tesla");

            Assert.That(c.FindPupil("Albert", "Einstein"), Is.SameAs(albert));
            Assert.That(c.FindPupil("Max", "Planck"), Is.SameAs(max));
            Assert.That(c.FindPupil("Enrico", "Fermi"), Is.SameAs(enrico));
            Assert.That(c.FindPupil("Paul", "Langevin"), Is.SameAs(paul));
            Assert.That(c.FindPupil("Nikola", "Tesla"), Is.SameAs(nikola));

            var randomNames = Enumerable.Range(0, 20)
                              .Select(i => new  {
                LastName  = String.Format("n°{0} - {1}", i, Guid.NewGuid().ToString()),
                FirstName = Guid.NewGuid().ToString()
            })
                              .ToArray();
            var pupils = randomNames.Select(n => c.AddPupil(n.FirstName, n.LastName)).ToArray();

            CollectionAssert.AreEqual(pupils, randomNames.Select(n => c.FindPupil(n.FirstName, n.LastName)));
        }