public void SidewalkTileCollisionBug()
        {
            var world = new World(_tileTypes, new DateTime());

            world.AddTile("sidewalk", new Int2());
            world.AddTile("redHouse", new Int2(1, 0));

            Assert.AreEqual(2, world.TileCount);
        }
        public void StackOverflowTest2()
        {
            var world = new World(TileType.GetTileTypes(), new DateTime());

            world.AddTile(
                new Tile(
                    new TileBaseData(5, new Int2(40, 13), 2),
                    new TileRail(new[] { new Train(0.98829291305018363, 4, true, 3) }.ToImmutableList())));

            world.AddTile(new Tile(new TileBaseData(6, new Int2(40, 16), 3), new TileRailFork(ImmutableList <Train> .Empty, true)));

            world.MoveTrains(new DateTime() + TimeSpan.FromMilliseconds(100));
        }
        public void StackOverflowTest()
        {
            var world = new World(TileType.GetTileTypes(), new DateTime());

            world.AddTile(
                new Tile(
                    new TileBaseData(world.TileTypes.FindIndex(item => item.CodeName == "railTurn"), new Int2(40, 25), 3),
                    new TileRail(new[] { new Train(0.99785386021710187, 4, true, 3) }.ToImmutableList())));

            world.AddTile("railSplitRight", new Int2(43, 22), 1);

            world.AddTile(new Tile(new TileBaseData(6, new Int2(43, 25), 1), new TileRailFork(ImmutableList <Train> .Empty, true)));

            world.MoveTrains(new DateTime() + TimeSpan.FromMilliseconds(100));
        }
        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);
            }
        }
        public void ClickingOnDepotSendsOutTrain()
        {
            var world = new World(TileType.GetTileTypes(), new DateTime());

            var depot = world.CreateFromName("depot", new Int2(), 2);

            world.AddTile(depot);
            world.AddTile(world.CreateFromName("railStraight", new Int2(6, 1), 0));

            Assert.IsTrue(world.ClickTile(depot.BaseData));
            var expected = new[]
            {
                depot.With(data: new TileDepot(new[] { new Train(1, World.TrainSpeed, false, 0) }.ToImmutableList(), false))
            };

            Assert.AreEqual(expected, world.RailTiles);
        }
        public void TrainFlipsTurnFork()
        {
            var world = new World(TileType.GetTileTypes(), new DateTime());

            var depot = world.CreateFromName("depot", new Int2(), 2);

            world.AddTile(depot);
            var rail = world.CreateFromName("railSplitLeft", new Int2(5, 1), 1);

            world.AddTile(rail);

            world.ClickTile(depot.BaseData);

            world.MoveTrains(new DateTime() + TimeSpan.FromSeconds(3));

            var expected = new[]
            {
                rail.With(data: new TileRailFork(new[] { new Train(0, World.TrainSpeed, false, 0) }.ToImmutableList(), true))
            };

            Assert.AreEqual(expected, world.RailTiles);
        }
        public void TrainTurn(bool turnUp)
        {
            var world = new World(TileType.GetTileTypes(), new DateTime());

            var depot = world.CreateFromName("depot", new Int2(), 2);

            world.AddTile(depot);
            var rail = world.CreateFromName("railTurn", new Int2(5, turnUp ? -1 : 1), turnUp ? 0 : 1);

            world.AddTile(rail);

            world.ClickTile(depot.BaseData);

            world.MoveTrains(new DateTime() + TimeSpan.FromSeconds(3));

            var expected = new[]
            {
                rail.With(data: new TileRail(new[] { new Train(turnUp ? 1 : 0, World.TrainSpeed, turnUp, 0) }.ToImmutableList()))
            };

            Assert.AreEqual(expected, world.RailTiles);
        }
        public void AddAndGetTile(int tileX, int tileY, int superGridX, int superGridY, bool tileInRegion)
        {
            var world = new World(_tileTypes, new DateTime());

            world.AddTile("redHouse", new Int2(tileX, tileY), 0);

            var result = world.GetRegion(new Int2(superGridX, superGridY));

            var expected = tileInRegion
                ? new[] { world.CreateFromName("redHouse", new Int2(tileX, tileY), 0) }
                : new Tile[0];

            Assert.AreEqual(expected, result);
        }
        public void RemoveTest()
        {
            var world = new World(_tileTypes, new DateTime());

            var seed    = 123123;
            var random0 = new Random(seed);

            for (int i = 0; i < 10000; i++)
            {
                var tile = RandomTile(random0, World.MinGridPosition, World.MaxGridPosition);
                world.AddTile(tile);
            }

            var random1 = new Random(seed);

            for (int i = 0; i < 10000; i++)
            {
                var tile = RandomTile(random1, World.MinGridPosition, World.MaxGridPosition);
                world.Remove(tile.BaseData);
            }

            Assert.AreEqual(0, world.TileCount);
        }