Beispiel #1
0
        public void ToString_ThreeTilesAddes_AlignedTiles()
        {
            var engine = new DominoTileEntity(12, 12, true);
            var game   = new GameEntity(
                Guid.NewGuid(),
                Enumerable.Empty <PlayerEntity>(),
                MexicanTrain.Create(),
                engine,
                new Stack <DominoTileEntity>());

            Games.Add(game.Id, game);

            var playerId = Guid.NewGuid();
            var sut      = new PlayerTrain(engine, playerId);
            var tileOne  = new DominoTileEntity(11, 12);
            var tileTwo  = new DominoTileEntity(10, 11);

            sut.Open();
            sut.AddTile(tileOne, playerId);
            sut.AddTile(tileTwo, playerId);

            var result = sut.ToString();

            Assert.Equal("[12|12], [12|11], [11|10]", result);
        }
Beispiel #2
0
 public void ForceAddTile(DominoTileEntity tile)
 {
     if (head == null && tail == null)
     {
         head = tail = tile;
         return;
     }
     if (head == tail && tile.GetUnlinkedValues().Any(x => x == head.FirstValue))
     {
         tile.Link(head);
         tail = tile;
         return;
     }
     if (head.MatchesUnlinkedValue(tile))
     {
         tile.Link(head);
         head = tile;
         return;
     }
     if (tail.MatchesUnlinkedValue(tile))
     {
         tail.Link(tile);
         tail = tile;
         return;
     }
     throw new ApplicationException($"Illegal move. Head nor tail matches '{tile}'");
 }
Beispiel #3
0
 internal virtual void AddTile(
     PlayerTrain playerTrain,
     DominoTileEntity tile,
     Guid playerId)
 {
     throw new IllegalStateActionException(GetType());
 }
Beispiel #4
0
        public void AddTile_ThreeTiles_FourTilesIncludingEngineExists()
        {
            var engine = new DominoTileEntity(12, 12, true);
            var game   = new GameEntity(
                Guid.NewGuid(),
                Enumerable.Empty <PlayerEntity>(),
                MexicanTrain.Create(),
                engine,
                new Stack <DominoTileEntity>());

            Games.Add(game.Id, game);

            var playerId  = Guid.NewGuid();
            var sut       = new PlayerTrain(engine, playerId);
            var tileOne   = new DominoTileEntity(12, 11);
            var tileTwo   = new DominoTileEntity(11, 10);
            var tileThree = new DominoTileEntity(10, 9);

            sut.Open();
            sut.AddTile(tileOne, playerId);
            sut.AddTile(tileTwo, playerId);
            sut.AddTile(tileThree, playerId);

            Assert.Equal(tileThree, sut.GetTiles().First());
            Assert.True(sut.GetTiles().First().IsLinked(tileTwo));
            Assert.True(sut.GetTiles().Skip(1).First().IsLinked(tileOne));
            Assert.True(sut.GetTiles().Skip(2).First().IsLinked(engine));
            Assert.Equal(4, sut.GetTiles().Count());
        }
Beispiel #5
0
 private IEnumerable <DominoTileEntity> GetTiles(DominoTileEntity tile, List <DominoTileEntity> tiles)
 {
     tiles.Add(tile);
     return(tile != tail
         ? GetTiles(tile.GetLinkedTiles().First(t => !tiles.Contains(t)), tiles)
         : tiles);
 }
Beispiel #6
0
        public void AddTileNonMatchingTile_WhenOpen_ExceptionThrown()
        {
            var engine = new DominoTileEntity(12, 12, true);
            var game   = new GameEntity(
                Guid.NewGuid(),
                Enumerable.Empty <PlayerEntity>(),
                MexicanTrain.Create(),
                engine,
                new Stack <DominoTileEntity>());

            Games.Add(game.Id, game);

            var playerId  = Guid.NewGuid();
            var sut       = new PlayerTrain(engine, playerId);
            var tileOne   = new DominoTileEntity(12, 11);
            var tileTwo   = new DominoTileEntity(11, 10);
            var tileThree = new DominoTileEntity(11, 3);

            sut.AddTile(tileOne, playerId);
            sut.Open();
            sut.AddTile(tileTwo, playerId);
            Action addTile = () => sut.AddTile(tileThree, playerId);

            Assert.ThrowsAny <Exception>(addTile);
        }
Beispiel #7
0
        public void GetTiles_ThreeTilesInTrain_CorrectTilesReceived()
        {
            var engine = new DominoTileEntity(12, 12, true);
            var game   = new GameEntity(
                Guid.NewGuid(),
                Enumerable.Empty <PlayerEntity>(),
                MexicanTrain.Create(),
                engine,
                new Stack <DominoTileEntity>());

            Games.Add(game.Id, game);

            var playerId = Guid.NewGuid();
            var sut      = new PlayerTrain(engine, playerId);
            var tileOne  = new DominoTileEntity(12, 11);
            var tileTwo  = new DominoTileEntity(11, 10);

            sut.Open();
            sut.AddTile(tileOne, playerId);
            sut.AddTile(tileTwo, playerId);

            var result = sut.GetTiles();

            Assert.Equal(tileTwo, result.First());
            Assert.Equal(tileOne, result.Skip(1).First());
            Assert.Equal(engine, result.Skip(2).First());
        }
Beispiel #8
0
        internal ICollection <DominoTileEntity> Create(short engineValue)
        {
            var    tiles            = new OrderedHashSet <DominoTileEntity>();
            ushort secondValueStart = 0;

            for (ushort firstIndex = 0; firstIndex <= 12; firstIndex++)
            {
                for (ushort secondIndex = secondValueStart; secondIndex <= 12; secondIndex++)
                {
                    tiles.Add(new DominoTileEntity(firstIndex, secondIndex, firstIndex == secondIndex && firstIndex == engineValue));
                }
                secondValueStart++;
            }

            Random randomizer      = new Random();
            var    randomizedTiles = new DominoTileEntity[tiles.Count()];

            tiles.CopyTo(randomizedTiles);
            var n = randomizedTiles.Count();

            while (n > 1)
            {
                n--;
                var k     = randomizer.Next(n + 1);
                var value = randomizedTiles[k];
                randomizedTiles[k] = randomizedTiles[n];
                randomizedTiles[n] = value;
            }
            return(new OrderedHashSet <DominoTileEntity>(randomizedTiles));
        }
Beispiel #9
0
 protected void AddTile(
     PlayerTrain playerTrain,
     DominoTileEntity tile)
 {
     tile.Link(playerTrain.head);
     playerTrain.head = tile;
 }
Beispiel #10
0
        public void GetUnlinkedValues_InUnlinkedState_CorrectUnlinkedValue()
        {
            var tileOne = new DominoTileEntity(2, 1);

            Assert.Equal(2, tileOne.GetUnlinkedValues().Count());
            Assert.True(tileOne.GetUnlinkedValues().Any(v => v == 1));
            Assert.True(tileOne.GetUnlinkedValues().Any(v => v == 2));
        }
Beispiel #11
0
        public void IsMatch_TwoValuesMatches_True()
        {
            var tileOne = new DominoTileEntity(1, 10);
            var tileTwo = new DominoTileEntity(1, 1);

            var result = tileOne.IsMatch(tileTwo);

            Assert.True(result);
        }
Beispiel #12
0
        public void Link_DoubleWithTileOnEachSide_CorrectSequence()
        {
            var tile1 = new DominoTileEntity(11, 0);
            var tile2 = new DominoTileEntity(0, 0);
            var tile3 = new DominoTileEntity(0, 4);

            tile1.Link(tile2);
            tile2.Link(tile3);
        }
Beispiel #13
0
        public void IsMatch_NoMatchingValue_False()
        {
            var tileOne = new DominoTileEntity(1, 10);
            var tileTwo = new DominoTileEntity(2, 9);

            var result = tileOne.IsMatch(tileTwo);

            Assert.False(result);
        }
Beispiel #14
0
        public void Flipping_IdRemainsSame()
        {
            var tile    = new DominoTileEntity(1, 10);
            var tileTwo = new DominoTileEntity(1, 10);

            tileTwo.Flip();

            Assert.Equal(tile.Id, tileTwo.Id);
        }
Beispiel #15
0
        public void Flipping_IsSameTile()
        {
            var tile    = new DominoTileEntity(1, 10);
            var tileTwo = new DominoTileEntity(1, 10);

            tileTwo.Flip();

            Assert.Equal(tile, tileTwo);
        }
Beispiel #16
0
        public void AddTile_FirstTileInTrain_CorrectTileExists()
        {
            var sut  = MexicanTrain.Create();
            var tile = new DominoTileEntity(1, 2);

            sut.AddTile(tile, Guid.NewGuid());

            Assert.Equal(1, sut.GetTiles().Count());
        }
Beispiel #17
0
        public void MakeMove_PlayerWithTurnPutsTileOnMexicanTrain_MexicanTrainHasNewTile()
        {
            var playedTile = new DominoTileEntity(11, 12);
            var sut        = CreateGame(playedTile);

            sut.MakeMove(sut.Players.First().Id, playedTile.Id, sut.MexicanTrain.Id);

            Assert.Equal(playedTile, sut.MexicanTrain.GetTiles().First());
        }
Beispiel #18
0
 public PlayerTrain(
     DominoTileEntity engineTile,
     Guid ownerId)
 {
     Id              = Guid.NewGuid();
     head            = engineTile;
     this.engineTile = engineTile;
     this.ownerId    = ownerId;
     state           = new ClosedPlayerTrainState();
 }
Beispiel #19
0
        public void MakeMove_WithTileMatchingPlayersTrain_PlayersTrainHasNewTileAndTurnIsPassad()
        {
            var playedTile = new DominoTileEntity(11, 12);
            var sut        = CreateGame(playedTile);

            sut.MakeMove(sut.Players.First().Id, playedTile.Id, sut.Players.First().Train.Id);

            Assert.Equal(playedTile, sut.Players.First().Train.GetTiles().First());
            Assert.Equal("WaitingForTurnPlayerState", sut.Players.First().GetStateType().Name);
            Assert.Equal("HasTurnPlayerState", sut.Players.Skip(1).First().GetStateType().Name);
        }
Beispiel #20
0
        public void ToString_MatchesOnLeftButUnaligned_AlignedAsMatchingTiles()
        {
            var sut   = MexicanTrain.Create();
            var tile1 = new DominoTileEntity(2, 1);
            var tile2 = new DominoTileEntity(2, 10);

            sut.AddTile(tile1, Guid.NewGuid());
            sut.AddTile(tile2, Guid.NewGuid());

            Assert.Equal("[10|2], [2|1]", sut.ToString());
        }
Beispiel #21
0
        public void AddTile_OpeningAndClosingDouble_CorrectTilesOnTrain()
        {
            var sut   = MexicanTrain.Create();
            var tile1 = new DominoTileEntity(11, 0);
            var tile2 = new DominoTileEntity(0, 0);
            var tile3 = new DominoTileEntity(0, 4);

            sut.AddTile(tile1, Guid.NewGuid());
            sut.AddTile(tile2, Guid.NewGuid());
            sut.AddTile(tile3, Guid.NewGuid());
        }
Beispiel #22
0
        public void AddTile_MissmatchingTile_ThrowsException()
        {
            var sut   = MexicanTrain.Create();
            var tile1 = new DominoTileEntity(1, 2);
            var tile2 = new DominoTileEntity(4, 5);

            sut.AddTile(tile1, Guid.NewGuid());
            Action action = () => sut.AddTile(tile2, Guid.NewGuid());

            Assert.Throws <ApplicationException>(action);
        }
Beispiel #23
0
        public void Link_TilesOnEachSide_NoUnlinkedValues()
        {
            var tileOne   = new DominoTileEntity(1, 2);
            var tileTwo   = new DominoTileEntity(2, 3);
            var tileThree = new DominoTileEntity(1, 4);

            tileOne.Link(tileTwo);
            tileOne.Link(tileThree);

            Assert.Equal(0, tileOne.GetUnlinkedValues().Count());
        }
Beispiel #24
0
        public void MakeMove_PlayerWithTurnPutsTileOnClosedPlayerTrain_Exception()
        {
            var playedTile = new DominoTileEntity(11, 12);
            var sut        = CreateGame(playedTile);

            Action makeMove = () => sut.MakeMove(
                sut.Players.First().Id,
                playedTile.Id,
                sut.Players.Skip(1).First().Train.Id);

            Assert.ThrowsAny <Exception>(makeMove);
        }
Beispiel #25
0
        public void Link_WhenHalfLinkedToUnorderedTile_TilesAreFlippedSoValuesAlign()
        {
            var engine    = new DominoTileEntity(7, 7, isEngine: true);
            var tileTwo   = new DominoTileEntity(2, 7);
            var tileThree = new DominoTileEntity(9, 2);

            tileTwo.Link(engine);
            tileThree.Link(tileTwo);

            Assert.Equal(7, tileTwo.FirstValue);
            Assert.Equal(2, tileThree.FirstValue);
        }
Beispiel #26
0
        public void Link_EngineWithMatching_CorrectLink()
        {
            var engine = new DominoTileEntity(12, 12, true);
            var tile   = new DominoTileEntity(12, 11);

            tile.Link(engine);

            Assert.Equal(engine, tile.GetLinkedTiles().First());
            Assert.Equal("HalfLinkedState", tile.GetStateType().Name);
            Assert.Equal(1, tile.GetUnlinkedValues().Count());
            Assert.Equal(11, tile.GetUnlinkedValues().First());
        }
Beispiel #27
0
        public void ToString_ThreeMatchingNonAlignedTiles_AlignedAsMatchingTiles()
        {
            var sut   = MexicanTrain.Create();
            var tile1 = new DominoTileEntity(2, 1);
            var tile2 = new DominoTileEntity(3, 2);
            var tile3 = new DominoTileEntity(3, 4);

            sut.AddTile(tile1, Guid.NewGuid());
            sut.AddTile(tile2, Guid.NewGuid());
            sut.AddTile(tile3, Guid.NewGuid());

            Assert.Equal("[4|3], [3|2], [2|1]", sut.ToString());
        }
Beispiel #28
0
 internal override void AddTile(
     PlayerTrain playerTrain,
     DominoTileEntity tile,
     Guid playerId)
 {
     base.AddTile(
         playerTrain,
         tile);
     if (playerId == playerTrain.ownerId)
     {
         playerTrain.state = new ClosedPlayerTrainState();;
     }
 }
Beispiel #29
0
        public void MakeMove_WithDoubleOnMexTrain_TurnIsNotPassed()
        {
            var playedTile = new DominoTileEntity(11, 11);
            var sut        = CreateGame(playedTile);

            sut.MakeMove(
                sut.Players.First().Id,
                playedTile.Id,
                sut.MexicanTrain.Id);

            Assert.Equal("HasTurnPlayerState", sut.Players.First().GetStateType().Name);
            Assert.Equal("WaitingForTurnPlayerState", sut.Players.Skip(1).First().GetStateType().Name);
        }
Beispiel #30
0
        public void ToString_ThreeMatchingNonAlignedTilesFromBothSides_AlignedAsMatchingTiles()
        {
            var sut   = MexicanTrain.Create();
            var tile1 = new DominoTileEntity(1, 2);
            var tile2 = new DominoTileEntity(2, 3);
            var tile3 = new DominoTileEntity(1, 11);

            sut.AddTile(tile1, Guid.NewGuid());
            sut.AddTile(tile2, Guid.NewGuid());
            sut.AddTile(tile3, Guid.NewGuid());

            Assert.Equal("[11|1], [1|2], [2|3]", sut.ToString());
        }