private bool TestMovement_PositiveGrade(List<string> messages)
        {
            bool result = true;

            Block oldStart = startBlock;
            startBlock = new Block(0, StateEnum.Healthy, 0, 0, 0.01, new[] { 0, 0 }, 100000, DirEnum.East, new[] { "" }, 0, 0, 0, "Red", 70);
            blocks[0] = startBlock;
            Train train = new Train(0, startBlock, _environment);

            train.ChangeMovement(200);
            train.updateMovement(); // should be less than 0.5

            if (train.CurrentAcceleration >= 0.5) // error
            {
                string error = train.ToString() + " did not lose any acceleration due to slope.";
                messages.Add(error);
                result = false;
            }

            // reset
            blocks[0] = oldStart;
            startBlock = oldStart;

            return result;
        }
        private bool TestMovement_NoGrade(List<string> messages)
        {
            Train train = new Train(0, startBlock, _environment);

            train.ChangeMovement(200); // defaults to 0.5 because of zero grade
            train.updateMovement();

            if (train.CurrentAcceleration != 0.5) // error
            {
                string error = train.ToString() + " acceleration did not default to 0.5.";
                messages.Add(error);
                return false;
            }
            return true;
        }
        private bool TestMovement_NegativeGrade(List<string> messages)
        {
            bool result = true;

            Block oldStart = startBlock;
            startBlock = new Block(0, StateEnum.Healthy, 0, 0, -0.01, new[] { 0, 0 }, 100000, DirEnum.East, new[] { "" }, 0, 0, 0, "Red", 70);
            blocks[0] = startBlock;
            Train train = new Train(1, startBlock, _environment);

            train.ChangeMovement(200);

            // allow 10 iterations of update movement
            for (int i = 0; i < 8; i++)
            {
                train.updateMovement();
            }

            train.EmergencyBrake();
            train.updateMovement(); // should be greater than -2.73

            if (train.CurrentAcceleration == -2.73) // error
            {
                string error = train.ToString() + " did not gain any acceleration due to slope.";
                messages.Add(error);
                result = false;
            }

            // reset
            blocks[0] = oldStart;
            startBlock = oldStart;

            return result;
        }
        private bool TestEngineFailureMovement(List<string> messages)
        {
            bool result = true;

            Train train = new Train(0, startBlock, _environment);
            train.EngineFailure = true;
            if (train.ChangeMovement(200)) // error, changed movement during engine failure
            {
                string error = train.ToString() + " applied power during engine failure.";
                messages.Add(error);
                result = false;
            }

            if (train.ChangeMovement(-200)) // error, able to brake during engine failure
            {
                string error = train.ToString() + " applied brake during engine failure.";
                messages.Add(error);
                result = false;
            }

            train.EngineFailure = false; // reset

            return result;
        }
        private bool TestEmergencyBrake(List<string> messages)
        {
            Train train = new Train(0, startBlock, _environment);

            train.ChangeMovement(200);

            // allow 10 iterations of update movement
            for (int i = 0; i < 10; i++)
            {
                train.updateMovement();
            }

            train.EmergencyBrake();
            train.updateMovement();

            if (train.CurrentAcceleration != -2.73) // error
            {
                string error = train.ToString() + " emergency brake did not set maximum deceleration correctly.";
                messages.Add(error);
                return false;
            }
            return true;
        }
        private bool TestBrakeFailureMovement(List<string> messages)
        {
            bool result = true;

            Train train = new Train(0, startBlock, _environment);
            train.BrakeFailure = true;
            if (train.ChangeMovement(-200)) // error, braked during brake failure
            {
                string error = train.ToString() + " applied brakes during brake failure.";
                messages.Add(error);
                result = false;
            }

            if (!train.ChangeMovement(200)) // error, unable to supply power during brake failure
            {
                string error = train.ToString() + " was not able to accelerate during brake failure.";
                messages.Add(error);
                result = false;
            }

            train.BrakeFailure = false; // reset

            return result;
        }