private void _TestTargeting(TCTestJig tj)
        {
            TimeSpan ts = tj.TempCtrl.TimeNeededToReachTargetTemp();

            _Debug.WriteLine("Mixture temp   = " + tj.Mixture.Temperature);
            _Debug.WriteLine("Setpoint temp  = " + tj.TempCtrl.TCSetpoint);
            _Debug.WriteLine("Source temp    = " + tj.TempCtrl.TCSrcTemperature);
            _Debug.WriteLine("Ambient temp   = " + tj.TempCtrl.AmbientTemperature);
            _Debug.WriteLine("TCSys Delta T  = " + tj.TempCtrl.TCSrcDelta);
            _Debug.WriteLine("RampRate       = " + (tj.TempCtrl.TCTemperatureRampRate.DegreesKelvin / tj.TempCtrl.TCTemperatureRampRate.PerTimePeriod.TotalMinutes) + " degrees per minute.");
            _Debug.WriteLine("TCSys Mode     = " + tj.TempCtrl.TCMode);
            _Debug.WriteLine("TCSys is " + (tj.TempCtrl.TCEnabled?"enabled.":"disabled."));
            string driveString = tj.TempCtrl.TCEnabled?"be driven to":"drift to";

            _Debug.WriteLine("Time needed for mixture to " + driveString + " a target temperature of " + tj.TempCtrl.TCSetpoint + " is " + ts);

            _Debug.WriteLine("At time 00:00:00, " + tj.Mixture);
            tj.TempCtrl.ImposeEffectsOfDuration(ts);
            _Debug.WriteLine("At time " + ts + ", " + tj.Mixture);

            if (!tj.TempCtrl.TCEnabled)
            {
                Assert.IsTrue(tj.MixTempWithinTolerance, "In tolerance at the specified time.");
            }

            if (tj.TempCtrl.TCEnabled)
            {
                tj.TempCtrl.ImposeEffectsOfDuration(ts);
                _Debug.WriteLine("At twice the time " + ts + ", " + tj.Mixture);

                Assert.IsTrue(tj.MixTempWithinTolerance, "Still in tolerance at twice the specified time (Temperature Control is enabled.)");
            }
        }
        public void TestReplicateFailAfterTurningOffTCEnabled()
        {
            _Debug.WriteLine("\r\nTesting what happens when temperature control is turned off, but ambient cannot drive achievement of the setpoint.");

            TCTestJig tj;
            TimeSpan  ts;
            bool      fail = false;

            foreach (TemperatureControllerMode tcMode in Enum.GetValues(typeof(TemperatureControllerMode)))
            {
                // Set specific pre-conditions.
                tj = new TCTestJig(5.0, 34.0, 20.0, 10.0, 5.0, 01.0, tcMode, true);

                // Make sure they're achievable with TC on.
                ts = tj.TempCtrl.TimeNeededToReachTargetTemp();

                // Turn TC off.
                tj.TempCtrl.TCEnabled = false;

                try {
                    ts = tj.TempCtrl.TimeNeededToReachTargetTemp();
                    Console.WriteLine("Success: No error generated when TCMode is {0}.", tcMode);
                } catch (TemperatureController.IncalculableTimeToSetpointException) {
                    fail = true;
                    Console.WriteLine("FAIL: Error generated when TCMode is {0}.", tcMode);
                }
            }

            _Debug.Assert(!fail);
        }
        public void TestTCConstTRampRateKlendathu()
        {
            _Debug.WriteLine("\r\nTesting temperature drive up from constant RampRate.");
            //                           SRC  MIX  AMB  SET  RMP ERR  MODE       ENBL
            TCTestJig tj = new TCTestJig(17.0, 17.0, 34.0, 35.0, 5.0, 00.0, CONST_RAMP, true);

            _TestTargeting(tj);
        }
        public void TestTCConstTSrcTargetingLevel()
        {
            _Debug.WriteLine("\r\nTesting temperature drive up from constant TSrc.");
            //                           SRC  MIX  AMB  SET  RMP ERR  MODE       ENBL
            TCTestJig tj = new TCTestJig(60.0, 20.0, 34.0, 60.0, 5.0, 01.0, CONST_TSRC, true);

            _TestTargeting(tj);
        }
        public void TestTCConstDeltaTargetingUp2()
        {
            _Debug.WriteLine("\r\nTesting temperature drive up from constant delta.");
            //                           SRC  MIX  AMB  SET  RMP ERR  MODE       ENBL
            TCTestJig tj = new TCTestJig(60.0, 25.0, 34.0, 65.0, 5.0, 01.0, CONST_DLTA, true);

            _TestTargeting(tj);
        }
        public void TestTCDriftUp()
        {
            _Debug.WriteLine("\r\nTesting temperature updrift due to ambient.");
            //                           SRC  MIX  AMB  SET  RMP ERR  MODE       ENBL
            TCTestJig tj = new TCTestJig(90.0, 34.0, 70.0, 44.0, 5.0, 01.0, CONST_DLTA, false);

            _TestTargeting(tj);
        }
        public void TestTCConstTRampRateTargetingDown()
        {
            _Debug.WriteLine("\r\nTesting temperature drive down from constant RampRate.");
            //                           SRC  MIX  AMB  SET  RMP ERR  MODE       ENBL
            TCTestJig tj = new TCTestJig(20.0, 70.0, 34.0, 50.0, 5.0, 01.0, CONST_RAMP, true);

            _TestTargeting(tj);
        }
        public void TestUnderShootWhileOn()
        {
            _Debug.WriteLine("\r\nTesting what happens when temperature undershoots the setpoint.");
            //                           SRC  MIX  AMB  SET  RMP ERR  MODE       ENBL
            TCTestJig tj = new TCTestJig(20.0, 34.0, 20.0, 30.0, 5.0, 01.0, CONST_DLTA, true);

            TimeSpan ts = tj.TempCtrl.TimeNeededToReachTargetTemp();

            _Debug.Write("We need " + ts + " to reach setpoint. We will drive the system for ");
            ts += TimeSpan.FromSeconds(ts.TotalSeconds * .25);
            _Debug.WriteLine(ts);

            _Debug.WriteLine(tj.Mixture.ToString());
            tj.TempCtrl.ImposeEffectsOfDuration(ts);
            _Debug.WriteLine(tj.Mixture.ToString());

            _Debug.Assert(true == tj.MixTempWithinTolerance, "");
        }