public void T4_trains_are_created_by_companies_and_have_a_unique_name()
        {
            ICity    s = CityFactory.CreateCity("Paris");
            ICompany c = s.AddCompany("SNCF");

            Action a = () => c.AddTrain(null);

            a.ShouldThrow <ArgumentException>();


            ITrain p1 = c.AddTrain("train1");

            p1.Company.Should().BeSameAs(c);
            p1.Name.Should().BeEquivalentTo("train1");
            p1.Assignment.Should().BeNull();
            Action a1 = () => c.AddTrain("train1");

            a1.ShouldThrow <ArgumentException>();


            ITrain p2 = c.AddTrain("train2");

            p2.Company.Should().BeSameAs(c);
            p2.Name.Should().BeEquivalentTo("train2");
            p2.Assignment.Should().BeNull();
            Action a2 = () => c.AddTrain("train2");

            a2.ShouldThrow <ArgumentException>();

            p1.GetType().GetProperty("Name").GetSetMethod().Should().BeNull("Train.Name must NOT be writeable.");
            p1.GetType().GetProperty("Assignment").GetSetMethod().Should().BeNull("Train.Assignment must NOT be writeable.");
            p1.GetType().GetProperty("City").GetSetMethod().Should().BeNull("Train.City must NOT be writeable.");
            p1.GetType().GetConstructors(BindingFlags.Instance | BindingFlags.Public).Should().BeEmpty("Train must not expose any public constructors.");
        }
        /// <summary>
        /// Perform an update.
        /// </summary>
        public void Update()
        {
            long now     = Environment.TickCount;
            long elapsed = (long)TimeSpan.FromTicks(now - lastUpdate).TotalSeconds;

            if (task == null)
            {
                this.task = this.cloud.BeginTask(train.GetType().Name);
            }

            this.iteration++;

            if (elapsed > 10)
            {
                this.lastUpdate = now;
                StringBuilder status = new StringBuilder();
                status.Append("Iteration #");
                status.Append(Format.FormatInteger(this.iteration));
                status.Append(" - Error: ");
                status.Append(Format.FormatPercent(train.Error));
                this.task.SetStatus(status.ToString());
            }
        }