public Task Clash()
            {
                var rocketId        = RocketId.From(2);
                var landingPosition = LandingPosition.From(new Position(5, 5));

                return(_landingTrajectoryVerifier.VerifyPosition(rocketId, landingPosition));
            }
            public async Task GlobalSetup()
            {
                var rocketId        = RocketId.From(1);
                var landingPosition = LandingPosition.From(new Position(5, 5));

                await _landingTrajectoryVerifier.VerifyPosition(rocketId, landingPosition);
            }
 /// <summary>
 /// Initializes LandingTrajectoryVerifier instance with default IDateTimeProvider implementation.
 /// </summary>
 /// <param name="leftTopPosition">Top left corner of landing area rectangle.</param>
 /// <param name="rightBottomPosition">Bottom right corner of landing area rectangle.</param>
 /// <returns></returns>
 public static LandingTrajectoryVerifier Initialize(LandingPosition leftTopPosition, LandingPosition rightBottomPosition)
 {
     return(Initialize(
                leftTopPosition,
                rightBottomPosition,
                new DateTimeProvider()));
 }
            public Task LandOutsideOfPlatform()
            {
                var rocketId        = RocketId.From(1);
                var landingPosition = LandingPosition.From(new Position(1, 1));

                return(_landingTrajectoryVerifier.VerifyPosition(rocketId, landingPosition));
            }
Beispiel #5
0
        public async Task VerifyPosition_ShouldDetectClash_WhenMultipleRocketsAreLanding(
            int rocket1Id, int rocket2Id, int x1, int y1, int x2, int y2, string expectedOutput)
        {
            await _sut.VerifyPosition(RocketId.From(rocket1Id), LandingPosition.From(new Position(x1, y1)));

            var result = await _sut.VerifyPosition(RocketId.From(rocket2Id), LandingPosition.From(new Position(x2, y2)));

            result.Should().Be(expectedOutput);
        }
 /// <summary>
 /// Initializes LandingTrajectoryVerifier instance.
 /// </summary>
 /// <param name="leftTopPosition">Top left corner of landing area rectangle.</param>
 /// <param name="rightBottomPosition">Bottom right corner of landing area rectangle.</param>
 /// <param name="dateTimeProvider">IDateTimeProvider implementation to be used.</param>
 /// <returns></returns>
 public static LandingTrajectoryVerifier Initialize(LandingPosition leftTopPosition, LandingPosition rightBottomPosition, IDateTimeProvider dateTimeProvider)
 {
     return(new LandingTrajectoryVerifier(
                dateTimeProvider,
                leftTopPosition,
                rightBottomPosition,
                new LandingCheckConsumer(new LandingCheckStorage()),
                new LandingCheckChannel()));
 }
        private bool IsOutOfPlatform(LandingPosition position)
        {
            var isRightOfPlatform  = position.Value.X > _rightBottomPosition.Value.X;
            var isLeftOfPlatform   = position.Value.X < _leftTopPosition.Value.X;
            var isAboveThePlatform = position.Value.Y > _rightBottomPosition.Value.Y;
            var isBelowThePlatform = position.Value.Y < _leftTopPosition.Value.Y;

            return(isRightOfPlatform || isLeftOfPlatform || isAboveThePlatform || isBelowThePlatform);
        }
Beispiel #8
0
        public async Task VerifyPosition_ShouldDetectClashBasedOnLatestLandingCheck_WhenMultipleRocketsAreLanding(
            int x1, int y1, int x2, int y2, int x3, int y3, string expectedOutput)
        {
            await _sut.VerifyPosition(RocketId.From(1), LandingPosition.From(new Position(x1, y1)));

            await _sut.VerifyPosition(RocketId.From(1), LandingPosition.From(new Position(x2, y2)));

            var result = await _sut.VerifyPosition(RocketId.From(2), LandingPosition.From(new Position(x3, y3)));

            result.Should().Be(expectedOutput);
        }
        private static bool IsClashWithPrevious(LandingPosition position, LandingPosition potentialClashPosition)
        {
            if (potentialClashPosition is null)
            {
                return(false);
            }

            var distanceX = potentialClashPosition.Value.X - position.Value.X;
            var distanceY = potentialClashPosition.Value.Y - position.Value.Y;

            return(ClashX(distanceX) && ClashY(distanceY));
        }
        private LandingTrajectoryVerifier(
            IDateTimeProvider dateTimeProvider,
            LandingPosition leftTopPosition,
            LandingPosition rightBottomPosition,
            LandingCheckConsumer landingCheckConsumer,
            LandingCheckChannel landingCheckChannel)
        {
            _dateTimeProvider    = dateTimeProvider;
            _leftTopPosition     = leftTopPosition;
            _rightBottomPosition = rightBottomPosition;
            _landingCheckChannel = landingCheckChannel;

            landingCheckConsumer?.Consume(_landingCheckChannel.GetChannel());
        }
Beispiel #11
0
        public LandingTrajectoryVerifierTests()
        {
            var dateTimeProviderMock = new Mock <IDateTimeProvider>();

            dateTimeProviderMock
            .SetupSequence(dateTimeProvider => dateTimeProvider.DateTimeUtcNow)
            .Returns(new DateTime(2020, 01, 01))
            .Returns(new DateTime(2020, 01, 02))
            .Returns(new DateTime(2020, 01, 03))
            .Returns(new DateTime(2020, 01, 04))
            .Returns(new DateTime(2020, 01, 05))
            .Returns(new DateTime(2020, 01, 06));

            _sut = LandingTrajectoryVerifier.Initialize(
                LandingPosition.From(new Position(5, 5)),
                LandingPosition.From(new Position(15, 15)),
                dateTimeProviderMock.Object);
        }
Beispiel #12
0
        public async Task VerifyPosition_ShouldProvideCorrectOutput_WhenMultipleRocketsAreLandingInParallel()
        {
            var(rocketId0, landingPosition0) = (RocketId.From(1), LandingPosition.From(new Position(12, 12)));
            var(rocketId1, landingPosition1) = (RocketId.From(1), LandingPosition.From(new Position(5, 5)));
            var(rocketId2, landingPosition2) = (RocketId.From(2), LandingPosition.From(new Position(6, 6)));
            var(rocketId3, landingPosition3) = (RocketId.From(3), LandingPosition.From(new Position(9, 9)));
            var(rocketId4, landingPosition4) = (RocketId.From(4), LandingPosition.From(new Position(8, 8)));
            var(rocketId5, landingPosition5) = (RocketId.From(5), LandingPosition.From(new Position(15, 15)));

            await Task.WhenAll(
                RunLandingCheck(rocketId0, landingPosition0, OutputMessages.OkForLanding),
                RunLandingCheck(rocketId1, landingPosition1, OutputMessages.OkForLanding),
                RunLandingCheck(rocketId2, landingPosition2, OutputMessages.Clash),
                RunLandingCheck(rocketId3, landingPosition3, OutputMessages.OkForLanding),
                RunLandingCheck(rocketId4, landingPosition4, OutputMessages.Clash),
                RunLandingCheck(rocketId5, landingPosition5, OutputMessages.OkForLanding)
                );
        }
        /// <summary>
        /// Verifies if given landing position is eligible for landing.
        /// </summary>
        /// <param name="rocketId">Rocket identifier.</param>
        /// <param name="position">Potential landing position to check.</param>
        /// <returns></returns>
        public async Task <string> VerifyPosition(RocketId rocketId, LandingPosition position)
        {
            if (IsOutOfPlatform(position))
            {
                return(OutputMessages.OutOfPlatform);
            }

            var landingCheck = new LandingCheck(rocketId, position, _dateTimeProvider.DateTimeUtcNow);

            var landingCheckRequest = new LandingCheckRequest(landingCheck);

            await _landingCheckChannel.WriteAsync(landingCheckRequest);

            var potentialClashPosition = await landingCheckRequest.GetResultAsync();

            return(IsClashWithPrevious(position, potentialClashPosition)
                ? OutputMessages.Clash
                : OutputMessages.OkForLanding);
        }
Beispiel #14
0
        public void VerifyPosition_ShouldThrow_WhenProvidedOutOfLandingAreaLandingPosition(int x, int y)
        {
            Func <Task> action = async() => await _sut.VerifyPosition(RocketId.From(1), LandingPosition.From(new Position(x, y)));

            action.Should().Throw <LandingPositionOutsideLandingAreaException>();
        }
Beispiel #15
0
        public async Task VerifyPosition_ShouldDetectPlatform_WhenProvidedValidLandingPosition(int x, int y, string expectedOutput)
        {
            var result = await _sut.VerifyPosition(RocketId.From(1), LandingPosition.From(new Position(x, y)));

            result.Should().Be(expectedOutput);
        }
Beispiel #16
0
 private Task RunLandingCheck(RocketId rocketId, LandingPosition landingPosition, string expectedOutput)
 {
     return(_sut.VerifyPosition(rocketId, landingPosition)
            .ContinueWith(task => task.Result.Should().BeEquivalentTo(expectedOutput)));
 }
Beispiel #17
0
 public void SetResult(LandingPosition landingPosition)
 {
     _taskCompletionSource.SetResult(landingPosition);
 }