public void MoveTrainHorizontally(double trainSpeed) { var random = new Random(123123); for (var i = 0; i < 100; i++) { var world = new World(TileType.GetTileTypes(), new DateTime()); var train = new Train(0, trainSpeed, true, 0); var gridX = random.Next(World.MinGridPosition.X, World.MaxGridPosition.X); var gridY = random.Next(World.MinGridPosition.Y, World.MaxGridPosition.Y); var trackLength = 5; for (var j = 0; j < trackLength; j++) { var tile = world.CreateFromName("railStraight", new Int2(j + gridX, gridY), 0); if (j == 0) { tile = tile.With(data: new TileRail(new[] { train }.ToImmutableList())); } world.AddTile(tile); } var startPos = world.GetTrainPosition(train.Id) ?? new Double2(); world.MoveTrains(new DateTime() + TimeSpan.FromSeconds(1)); var endPos = world.GetTrainPosition(train.Id) ?? new Double2(); Assert.AreEqual(startPos.X + Math.Min(trainSpeed, trackLength), endPos.X, 0.0001); Assert.AreEqual(gridY + 0.5, endPos.Y, 0.0001); } }