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)); }
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); }
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()); }
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); }
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); }
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>(); }
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); }
private Task RunLandingCheck(RocketId rocketId, LandingPosition landingPosition, string expectedOutput) { return(_sut.VerifyPosition(rocketId, landingPosition) .ContinueWith(task => task.Result.Should().BeEquivalentTo(expectedOutput))); }
public void SetResult(LandingPosition landingPosition) { _taskCompletionSource.SetResult(landingPosition); }