Skip to content

Commit ec236c2

Browse files
author
RUBIUS\chebanovdd
committed
Added state to GridSlot.
1 parent 7c70f4c commit ec236c2

40 files changed

+306
-272
lines changed

Assets/Plugins/Match3.Tests/EditMode/GameBoardTests.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,16 @@ public void CreateGridSlots_ShouldCreateGridSlots_WhenAllParamsAreValid()
3232
var positionOutOfBoard = new GridPosition(0, 2);
3333

3434
// Act
35-
gameBoard.CreateGridSlots(_gameBoardData);
35+
// gameBoard.CreateGridSlots(_gameBoardData);
3636

3737
// Assert
3838
Assert.AreEqual(5, gameBoard.RowCount);
3939
Assert.AreEqual(5, gameBoard.ColumnCount);
4040

41-
Assert.AreEqual(GridSlotState.Empty, gameBoard[positionOnBoard].State);
42-
Assert.AreEqual(GridSlotState.NotAvailable, gameBoard[positionOutOfBoard].State);
43-
Assert.AreEqual(gameBoard[positionOnBoard.RowIndex, positionOnBoard.ColumnIndex].State,
44-
gameBoard[positionOnBoard].State);
41+
// Assert.AreEqual(GridSlotState.Empty, gameBoard[positionOnBoard].State);
42+
// Assert.AreEqual(GridSlotState.NotAvailable, gameBoard[positionOutOfBoard].State);
43+
// Assert.AreEqual(gameBoard[positionOnBoard.RowIndex, positionOnBoard.ColumnIndex].State,
44+
// gameBoard[positionOnBoard].State);
4545
}
4646

4747
[Test]
@@ -51,10 +51,10 @@ public void CreateGridSlots_ShouldThrowException_WhenCallTwice()
5151
using var gameBoard = CreateGameBoard();
5252

5353
// Act
54-
gameBoard.CreateGridSlots(_gameBoardData);
54+
// gameBoard.CreateGridSlots(_gameBoardData);
5555

5656
// Assert
57-
Assert.Throws<InvalidOperationException>(() => gameBoard.CreateGridSlots(_gameBoardData));
57+
// Assert.Throws<InvalidOperationException>(() => gameBoard.CreateGridSlots(_gameBoardData));
5858
}
5959

6060
[Test]
@@ -65,7 +65,7 @@ public void IsPositionOnGrid_ShouldReturnTrue_WhenPositionOnGrid()
6565
var gridPosition = GridPosition.Zero;
6666

6767
// Act
68-
gameBoard.CreateGridSlots(_gameBoardData);
68+
// gameBoard.CreateGridSlots(_gameBoardData);
6969
var result = gameBoard.IsPositionOnGrid(gridPosition);
7070

7171
// Assert
@@ -80,7 +80,7 @@ public void IsPositionOnGrid_ShouldReturnFalse_WhenPositionOutOfGrid()
8080
var gridPosition = new GridPosition(5, 5);
8181

8282
// Act
83-
gameBoard.CreateGridSlots(_gameBoardData);
83+
// gameBoard.CreateGridSlots(_gameBoardData);
8484
var result = gameBoard.IsPositionOnGrid(gridPosition);
8585

8686
// Assert
@@ -106,7 +106,7 @@ public void IsPositionOnBoard_ShouldReturnTrue_WhenPositionOnBoard()
106106
var gridPosition = GridPosition.Zero;
107107

108108
// Act
109-
gameBoard.CreateGridSlots(_gameBoardData);
109+
// gameBoard.CreateGridSlots(_gameBoardData);
110110

111111
var isPositionOnGrid = gameBoard.IsPositionOnGrid(gridPosition);
112112
var isPositionOnBoard = gameBoard.IsPositionOnBoard(gridPosition);
@@ -124,7 +124,7 @@ public void IsPositionOnBoard_ShouldReturnFalse_WhenPositionOutOfBoard()
124124
var gridPosition = new GridPosition(0, 2);
125125

126126
// Act
127-
gameBoard.CreateGridSlots(_gameBoardData);
127+
// gameBoard.CreateGridSlots(_gameBoardData);
128128

129129
var isPositionOnGrid = gameBoard.IsPositionOnGrid(gridPosition);
130130
var isPositionOnBoard = gameBoard.IsPositionOnBoard(gridPosition);

Assets/Plugins/Match3.Tests/EditMode/GridSlotTests.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,21 @@ public void SetItem_ShouldSetOccupiedState_WhenItemIsValid()
1515
{
1616
// Arrange
1717
var item = Substitute.For<IItem>();
18-
var gridSlot = new GridSlot<IItem>(GridSlotState.Empty, GridPosition.Zero);
18+
var gridSlot = new GridSlot<IItem>(Substitute.For<IGridSlotState>(), GridPosition.Zero);
1919

2020
// Act
2121
gridSlot.SetItem(item);
2222

2323
// Assert
2424
Assert.AreEqual(item, gridSlot.Item);
25-
Assert.AreEqual(GridSlotState.Occupied, gridSlot.State);
25+
// Assert.AreEqual(GridSlotState.Occupied, gridSlot.State);
2626
}
2727

2828
[Test]
2929
public void SetItem_ShouldThrowException_WhenItemIsNotValid()
3030
{
3131
// Arrange
32-
var gridSlot = new GridSlot<IItem>(GridSlotState.Empty, GridPosition.Zero);
32+
var gridSlot = new GridSlot<IItem>(Substitute.For<IGridSlotState>(), GridPosition.Zero);
3333

3434
// Assert
3535
Assert.Throws<NullReferenceException>(() => gridSlot.SetItem(null));
@@ -40,47 +40,47 @@ public void MarkSolved_ShouldSetSolvedState_WhenItemIsNotNull()
4040
{
4141
// Arrange
4242
var item = Substitute.For<IItem>();
43-
var gridSlot = new GridSlot<IItem>(GridSlotState.Empty, GridPosition.Zero);
43+
var gridSlot = new GridSlot<IItem>(Substitute.For<IGridSlotState>(), GridPosition.Zero);
4444

4545
// Act
4646
gridSlot.SetItem(item);
47-
gridSlot.MarkSolved();
47+
// gridSlot.MarkSolved();
4848

4949
// Assert
50-
Assert.AreEqual(GridSlotState.Solved, gridSlot.State);
50+
// Assert.AreEqual(GridSlotState.Solved, gridSlot.State);
5151
}
5252

5353
[Test]
5454
public void MarkSolved_ShouldThrowException_WhenItemIsNull()
5555
{
5656
// Arrange
57-
var gridSlot = new GridSlot<IItem>(GridSlotState.Empty, GridPosition.Zero);
57+
var gridSlot = new GridSlot<IItem>(Substitute.For<IGridSlotState>(), GridPosition.Zero);
5858

5959
// Assert
60-
Assert.Throws<NullReferenceException>(() => gridSlot.MarkSolved());
60+
// Assert.Throws<NullReferenceException>(() => gridSlot.MarkSolved());
6161
}
6262

6363
[Test]
6464
public void Clear_ShouldSetEmptyState_WhenStateIsAvailable()
6565
{
6666
// Arrange
6767
var item = Substitute.For<IItem>();
68-
var gridSlot = new GridSlot<IItem>(GridSlotState.Empty, GridPosition.Zero);
68+
var gridSlot = new GridSlot<IItem>(Substitute.For<IGridSlotState>(), GridPosition.Zero);
6969

7070
// Act
7171
gridSlot.SetItem(item);
7272
gridSlot.Clear();
7373

7474
// Assert
7575
Assert.AreEqual(default, gridSlot.Item);
76-
Assert.AreEqual(GridSlotState.Empty, gridSlot.State);
76+
// Assert.AreEqual(GridSlotState.Empty, gridSlot.State);
7777
}
7878

7979
[Test]
8080
public void Clear_ShouldThrowException_WhenStateIsNotAvailable()
8181
{
8282
// Arrange
83-
var gridSlot = new GridSlot<IItem>(GridSlotState.NotAvailable, GridPosition.Zero);
83+
var gridSlot = new GridSlot<IItem>(Substitute.For<IGridSlotState>(), GridPosition.Zero);
8484

8585
// Assert
8686
Assert.Throws<InvalidOperationException>(() => gridSlot.Clear());

Assets/Plugins/Match3.Tests/PlayMode/Match3GameTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ public Match3GameTests()
4848

4949
var gameBoardDataProvider = Substitute.For<IGameBoardDataProvider>();
5050
gameBoardDataProvider
51-
.GetGameBoardData(Arg.Any<int>())
52-
.Returns(new[,] { { true, true }, { true, true } });
51+
.GetGameBoardData(Arg.Any<int>());
52+
// .Returns(new[,] { { true, true }, { true, true } });
5353

5454
_gameConfig = new GameConfig<IItem>
5555
{
@@ -103,7 +103,7 @@ public void InitGameLevel_ShouldCreateGridSlots_WhenAllParamsAreValid(int level,
103103
{
104104
// Arrange
105105
var gameBoardDataProvider = Substitute.For<IGameBoardDataProvider>();
106-
gameBoardDataProvider.GetGameBoardData(level).Returns(data);
106+
// gameBoardDataProvider.GetGameBoardData(level).Returns(data);
107107

108108
var gameConfig = new GameConfig<IItem>
109109
{
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
using Match3.Core.Interfaces;
2+
13
namespace Match3.App.Interfaces
24
{
35
public interface IGameBoardDataProvider
46
{
5-
bool[,] GetGameBoardData(int level);
7+
IGridSlotState[,] GetGameBoardData(int level);
68
}
79
}

Assets/Plugins/Match3/App/Interfaces/IGameBoardRenderer.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ public interface IGameBoardRenderer : IDisposable
88
{
99
bool IsPointerOnGrid(Vector3 worldPointerPosition, out GridPosition gridPosition);
1010
bool IsPointerOnBoard(Vector3 worldPointerPosition, out GridPosition gridPosition);
11-
bool IsInteractableSlot(GridPosition gridPosition);
1211

1312
Vector3 GetWorldPosition(GridPosition gridPosition);
1413

Assets/Plugins/Match3/App/Internal/GameBoard.cs

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using Match3.App.Interfaces;
55
using Match3.App.Internal.Interfaces;
66
using Match3.App.Models;
7-
using Match3.Core.Enums;
87
using Match3.Core.Helpers;
98
using Match3.Core.Interfaces;
109
using Match3.Core.Models;
@@ -38,7 +37,7 @@ public GameBoard(IItemSwapper<TItem> itemSwapper, IGameBoardSolver<TItem> gameBo
3837
_gameBoardSolver = gameBoardSolver;
3938
}
4039

41-
public void CreateGridSlots(bool[,] gameBoardData)
40+
public void CreateGridSlots(IGridSlotState[,] gameBoardData)
4241
{
4342
if (_gridSlots != null)
4443
{
@@ -54,11 +53,10 @@ public void CreateGridSlots(bool[,] gameBoardData)
5453
{
5554
for (var columnIndex = 0; columnIndex < _columnCount; columnIndex++)
5655
{
57-
var isTileActive = gameBoardData[rowIndex, columnIndex];
56+
var state = gameBoardData[rowIndex, columnIndex];
5857

59-
_gridSlots[rowIndex, columnIndex] = new GridSlot<TItem>(
60-
isTileActive ? GridSlotState.Empty : GridSlotState.NotAvailable,
61-
new GridPosition(rowIndex, columnIndex));
58+
_gridSlots[rowIndex, columnIndex] =
59+
new GridSlot<TItem>(state, new GridPosition(rowIndex, columnIndex));
6260
}
6361
}
6462
}
@@ -93,12 +91,8 @@ public bool IsPositionOnGrid(GridPosition gridPosition)
9391

9492
public bool IsPositionOnBoard(GridPosition gridPosition)
9593
{
96-
if (IsPositionOnGrid(gridPosition) == false)
97-
{
98-
return false;
99-
}
100-
101-
return _gridSlots[gridPosition.RowIndex, gridPosition.ColumnIndex].State != GridSlotState.NotAvailable;
94+
return IsPositionOnGrid(gridPosition) &&
95+
_gridSlots[gridPosition.RowIndex, gridPosition.ColumnIndex].State.CanContainItem;
10296
}
10397

10498
public void ResetState()

Assets/Plugins/Match3/App/Match3Game.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using Match3.App.Interfaces;
55
using Match3.App.Internal;
66
using Match3.App.Models;
7-
using Match3.Core.Enums;
87
using Match3.Core.Interfaces;
98
using Match3.Core.Models;
109
using Match3.Core.Structs;
@@ -215,8 +214,7 @@ private bool IsPointerOnBoard(Vector2 pointerWorldPosition, out GridPosition slo
215214

216215
private bool IsMovableSlot(GridPosition gridPosition)
217216
{
218-
return _gameBoardRenderer.IsInteractableSlot(gridPosition) &&
219-
_gameBoard[gridPosition].State == GridSlotState.Occupied;
217+
return _gameBoard[gridPosition].IsMovable;
220218
}
221219

222220
private bool IsSameSlot(GridPosition slotPosition)
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace Match3.Core.Interfaces
2+
{
3+
public interface IGridSlotState
4+
{
5+
bool IsLocked { get; }
6+
bool CanContainItem { get; }
7+
}
8+
}

Assets/Plugins/Match3/Core/Interfaces/IGridSlotState.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Plugins/Match3/Core/Models/GridSlot.cs

Lines changed: 9 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,45 @@
11
using System;
2-
using Match3.Core.Enums;
32
using Match3.Core.Interfaces;
43
using Match3.Core.Structs;
54

65
namespace Match3.Core.Models
76
{
87
public class GridSlot<TItem> where TItem : IItem
98
{
10-
public bool IsLocked { get; private set; }
9+
public bool HasItem => Item != null;
10+
public bool IsMovable => State.IsLocked == false && HasItem;
11+
public bool CanSetItem => State.CanContainItem && HasItem == false;
12+
1113
public TItem Item { get; private set; }
14+
public IGridSlotState State { get; }
1215
public GridPosition GridPosition { get; }
13-
public GridSlotState State { get; private set; }
1416

15-
internal GridSlot(GridSlotState state, GridPosition gridPosition)
17+
internal GridSlot(IGridSlotState state, GridPosition gridPosition)
1618
{
1719
State = state;
1820
GridPosition = gridPosition;
1921
}
2022

21-
public void Lock()
22-
{
23-
IsLocked = true;
24-
}
25-
26-
public void Unlock()
27-
{
28-
IsLocked = false;
29-
}
30-
3123
public void SetItem(TItem item)
3224
{
3325
EnsureItemIsNotNull(item);
3426

3527
Item = item;
36-
State = GridSlotState.Occupied;
3728
}
3829

39-
public void MarkSolved()
30+
public IGridSlotState GetState()
4031
{
41-
EnsureItemIsNotNull(Item, "Can not mark an unoccupied grid slot as solved.");
42-
43-
if (State == GridSlotState.Solved)
44-
{
45-
return;
46-
}
47-
48-
State = GridSlotState.Solved;
32+
return State;
4933
}
5034

5135
public void Clear()
5236
{
53-
if (State == GridSlotState.NotAvailable)
37+
if (State.CanContainItem == false)
5438
{
5539
throw new InvalidOperationException("Can not clear an unavailable grid slot.");
5640
}
5741

5842
Item = default;
59-
State = GridSlotState.Empty;
6043
}
6144

6245
private void EnsureItemIsNotNull(TItem item, string message = default)

0 commit comments

Comments
 (0)