public void BalloonLandedDetection(BalloonState initialState, double altitude, BalloonState expectedState)
        {
            // arrange
            var fakeModuleClient = new FakeModuleClient();

            var telemetryMessage = CreateTelemetryMessage();

            // set gps to indicate rising balloon state
            telemetryMessage.alt = altitude;

            var balloonModule = new WeatherBalloon.BalloonModule.BalloonModule();

            balloonModule.BalloonState = initialState;

            // act
            balloonModule.Receive(telemetryMessage);
            var task = balloonModule.TransmitBalloonMessage(fakeModuleClient);

            // verify
            task.Result.ShouldBe(true);

            // Sent a Balloon message?
            fakeModuleClient.SentMessages.Count.ShouldBe(1);

            // Correct message?
            var rawMessage     = fakeModuleClient.SentMessages[0].Item2;
            var balloonMessage = MessageHelper.ParseMessage <BalloonMessage>(rawMessage);

            balloonMessage.State.ShouldBe(expectedState);
        }
        public void BalloonFallingStateDetection(double climb, double altitude, BalloonState expectedState)
        {
            // arrange
            var fakeModuleClient = new FakeModuleClient();

            var telemetryMessage = CreateTelemetryMessage();

            // set gps to indicate rising balloon state
            telemetryMessage.climb = climb;
            telemetryMessage.alt   = altitude;

            var balloonModule = new WeatherBalloon.BalloonModule.BalloonModule();

            // set the balloon state to Rising, that's the only transition to Falling.
            balloonModule.BalloonState = BalloonState.Rising;


            // act
            balloonModule.Receive(telemetryMessage);
            var task = balloonModule.TransmitBalloonMessage(fakeModuleClient);

            // verify
            task.Result.ShouldBe(true);

            // Sent a Balloon message?
            fakeModuleClient.SentMessages.Count.ShouldBe(1);

            // Sent on correct output?
            fakeModuleClient.SentMessages[0].Item1.ShouldBe(WeatherBalloon.BalloonModule.BalloonModule.BalloonOutputName);

            // Correct message?
            var rawMessage     = fakeModuleClient.SentMessages[0].Item2;
            var balloonMessage = MessageHelper.ParseMessage <BalloonMessage>(rawMessage);

            // balloon location
            balloonMessage.Location.track.ShouldBe(telemetryMessage.track);
            [email protected](telemetryMessage.@long);
            balloonMessage.Location.lat.ShouldBe(telemetryMessage.lat);
            balloonMessage.Location.mode.ShouldBe(telemetryMessage.mode);
            balloonMessage.Location.time.ShouldBe(telemetryMessage.time);
            balloonMessage.Location.speed.ShouldBe(telemetryMessage.speed);
            balloonMessage.Location.climb.ShouldBe(telemetryMessage.climb);
            balloonMessage.Temperature.ShouldBe(telemetryMessage.temp);
            balloonMessage.Pressure.ShouldBe(telemetryMessage.pressure);
            balloonMessage.Humidity.ShouldBe(telemetryMessage.humidity);


            if (expectedState == BalloonState.Rising)
            {
                balloonMessage.AveAscent.ShouldBe(telemetryMessage.climb);
                balloonMessage.AveDescent.ShouldBe(0.0);
            }
            else if (expectedState == BalloonState.Falling)
            {
                balloonMessage.AveAscent.ShouldBe(0.0);
                balloonMessage.AveDescent.ShouldBe(telemetryMessage.climb);
            }

            balloonMessage.State.ShouldBe(expectedState);
        }
        public void ReceiveBalloonMessage()
        {
            // arrange
            var fakeModuleClient = new FakeModuleClient();

            var telemetryMessage = CreateTelemetryMessage();
            var balloonMessage   = CreateBalloonMessage();

            var trackerModule = new WeatherBalloon.TrackerModule.TrackerModule();

            // act
            trackerModule.Receive(telemetryMessage);
            var task = trackerModule.Receive(balloonMessage, fakeModuleClient);

            // verify
            task.Result.ShouldBe(true);

            fakeModuleClient.SentMessages.Count.ShouldBe(2);

            // Sent on correct output?
            fakeModuleClient.SentMessages[0].Item1.ShouldBe(WeatherBalloon.TrackerModule.TrackerModule.TrackerOutputName);

            // Correct message?
            var rawMessage0            = fakeModuleClient.SentMessages[0].Item2;
            var receivedBalloonMessage = MessageHelper.ParseMessage <BalloonMessage>(rawMessage0);

            var rawMessage1            = fakeModuleClient.SentMessages[1].Item2;
            var receivedTrackerMessage = MessageHelper.ParseMessage <TrackerMessage>(rawMessage1);

            // balloon message fields
            receivedBalloonMessage.Location.track.ShouldBe(balloonMessage.Location.track);
            [email protected](balloonMessage.Location.@long);
            receivedBalloonMessage.Location.lat.ShouldBe(balloonMessage.Location.lat);
            receivedBalloonMessage.Location.mode.ShouldBe(balloonMessage.Location.mode);
            receivedBalloonMessage.Location.time.ShouldBe(balloonMessage.Location.time);
            receivedBalloonMessage.Location.speed.ShouldBe(balloonMessage.Location.speed);
            receivedBalloonMessage.Location.climb.ShouldBe(balloonMessage.Location.climb);
            receivedBalloonMessage.State.ShouldBe(balloonMessage.State);
            receivedBalloonMessage.AveAscent.ShouldBe(balloonMessage.AveAscent);
            receivedBalloonMessage.AveDescent.ShouldBe(balloonMessage.AveDescent);
            receivedBalloonMessage.FlightId.ShouldBe(balloonMessage.FlightId);
            receivedBalloonMessage.DeviceName.ShouldBe("Weather Balloon");

            // tracker message fields
            receivedTrackerMessage.Location.track.ShouldBe(telemetryMessage.track);
            [email protected](telemetryMessage.@long);
            receivedTrackerMessage.Location.lat.ShouldBe(telemetryMessage.lat);
            receivedTrackerMessage.Location.mode.ShouldBe(telemetryMessage.mode);
            receivedTrackerMessage.Location.time.ShouldBe(telemetryMessage.time);
            receivedTrackerMessage.Location.speed.ShouldBe(telemetryMessage.speed);
            receivedTrackerMessage.Location.climb.ShouldBe(telemetryMessage.climb);
            receivedTrackerMessage.FlightId.ShouldBe(balloonMessage.FlightId);
        }