public void TimeDurationTerminator_IsComplete()
        {
            TimeSpan         timeLimit = new TimeSpan(0, 1, 0);
            GeneticAlgorithm algorithm = GetAlgorithm(timeLimit);

            TimeDurationTerminator terminator = new TimeDurationTerminator {
                TimeLimit = timeLimit
            };

            terminator.Initialize(algorithm);

            // "Start" the algorithm to trigger the start time
            PrivateObject algorithmAccessor = new PrivateObject(algorithm, new PrivateType(typeof(GeneticAlgorithm)));

            algorithmAccessor.Invoke("OnAlgorithmStarting");

            Assert.False(terminator.IsComplete(), "Time limit has not been reached.");

            // Make the start time earlier than it really was to simulate passed time.
            PrivateObject accessor = new PrivateObject(terminator);

            accessor.SetField("timeStarted", DateTime.Now - new TimeSpan(0, 1, 1));

            Assert.True(terminator.IsComplete(), "Time limit has been reached.");
        }
        public void TimeDurationTerminator_Serialization()
        {
            TimeDurationTerminator terminator = new TimeDurationTerminator
            {
                TimeLimit = new TimeSpan(123)
            };

            PrivateObject privObj = new PrivateObject(terminator);
            DateTime      now     = DateTime.Now;

            privObj.SetField("timeStarted", now);

            TimeDurationTerminator result = (TimeDurationTerminator)SerializationHelper.TestSerialization(terminator, new Type[0]);

            Assert.Equal(terminator.TimeLimit, result.TimeLimit);
            PrivateObject resultPrivObj = new PrivateObject(result);

            Assert.Equal(now, resultPrivObj.GetField("timeStarted"));
        }