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); }
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}'"); }
internal virtual void AddTile( PlayerTrain playerTrain, DominoTileEntity tile, Guid playerId) { throw new IllegalStateActionException(GetType()); }
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()); }
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); }
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); }
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()); }
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)); }
protected void AddTile( PlayerTrain playerTrain, DominoTileEntity tile) { tile.Link(playerTrain.head); playerTrain.head = tile; }
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)); }
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); }
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); }
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); }
public void Flipping_IdRemainsSame() { var tile = new DominoTileEntity(1, 10); var tileTwo = new DominoTileEntity(1, 10); tileTwo.Flip(); Assert.Equal(tile.Id, tileTwo.Id); }
public void Flipping_IsSameTile() { var tile = new DominoTileEntity(1, 10); var tileTwo = new DominoTileEntity(1, 10); tileTwo.Flip(); Assert.Equal(tile, tileTwo); }
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()); }
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()); }
public PlayerTrain( DominoTileEntity engineTile, Guid ownerId) { Id = Guid.NewGuid(); head = engineTile; this.engineTile = engineTile; this.ownerId = ownerId; state = new ClosedPlayerTrainState(); }
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); }
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()); }
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()); }
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); }
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()); }
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); }
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); }
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()); }
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()); }
internal override void AddTile( PlayerTrain playerTrain, DominoTileEntity tile, Guid playerId) { base.AddTile( playerTrain, tile); if (playerId == playerTrain.ownerId) { playerTrain.state = new ClosedPlayerTrainState();; } }
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); }
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()); }