@cardsgame/server-testing
Other Type Aliases
EntityMockingDefinition
Ƭ EntityMockingDefinition: EntityMockingProps
& ChildrenMockingArray
& { selected?
: number
[] ; type?
: string
}
An object describing any possible entity. This is not an Entity in itself.
Example
"D7" card placed with its face down:
{ type: "classicCard", suit: "D", rank: "3", faceUp: false }
Example
Some container with 2 cards, with second one being selected:
{
children: [
{ type: "classicCard", name: "D7" },
{ type: "classicCard", name: "D3" },
],
selected: [1]
}
name: "D7"
is a shorthand. Given this object is of type "classicCard"
,
this object will get populated with 2 new props: rank: "7"
and suit: "D"
StateMockingRecord
Ƭ StateMockingRecord<S
>: StateMockingProps
<S
> & Partial
<{ clients
: string
[] ; players
: Partial
<PlayerDefinition
>[] }>
An object describing an initial root state.
This definition may contain state's props like "isGameStarted"
.
To populate state with entities - use populateState()
Example
Game state at round 10, with 2 players playing.
{
isGameStarted: true,
round: 10,
players: [
{ clientID: CLIENT_ID, name: "Darek" },
{ clientID: "clientB", name: "Pau" },
],
}
Type parameters
Name | Type |
---|---|
S | extends State |
StateMockingTuple
Ƭ StateMockingTuple: [QuerableProps
| undefined
, EntityMockingDefinition
]
Setup Type Aliases
SetupAPI
Ƭ SetupAPI<S
, R
>: Object
Type parameters
Name | Type |
---|---|
S | extends State |
R | extends Room <S > |
Type declaration
Name | Type | Description |
---|---|---|
executeEvent | ExecuteEvent | Test how your Action would modify the game state. |
initState | InitState <S > | Populate your state with initial props (including players & clients). Returns state object for further initial modification. To populate state with entities - prefer to use populateState() |
makeEvent | MakeEvent | - |
makeInteraction | MakeInteraction | Construct interaction event object for use in testEvent() |
populateState | PopulateState <S > | Populates state with new entities. Use AFTER you prepared the base state yourself by using your game's own state preparation functions. |
reset | Reset <S , R > | Resets room and state , using roomConstructor provided earlier with setupServerTesting . To be used with beforeEach() of testing frameworks. Without calling this function, for example populateState(...entitiesMap) might end up populating state object of previous test runs (which is bad!). |
testEvent | TestEvent | Test if given event would pass in gameplay under current conditions. |
SetupOptions
Ƭ SetupOptions<S
, R
>: Object
Type parameters
Name | Type |
---|---|
S | extends State |
R | extends Room <S > |
Type declaration
Name | Type | Description |
---|---|---|
action | ActionDefinition <S > | Used only in testEvent() , don't have to provide if you won't use that function. |
gameEntities? | Record <string , EntityConstructor > | List of custom entities present in your game, if any. Used to figure out entity constructor just by it's type from statePreparation |
roomConstructor? | RoomConstructor <S , R > | Used to construct State automatically and in executeEvent() , don't have to provide if you won't use that function. |
Variables
CLIENT_ID
• Const
CLIENT_ID: "CLIENT"
Client ID with which most of the events will be automatically created. Assign it to the first player in your testing environment.
Other Functions
initState
▸ initState<S
>(state
, statePreparation
): S
Populate your state with initial props (including players & clients).
Returns state
object for further initial modification.
To populate state with entities - prefer to use populateState()
Example
state = initState({
isGameStarted: true,
round: 10,
players: [
{ clientID: "clientA", name: "Darek" },
{ clientID: "clientB", name: "Alan" },
],
})
- Would mark game as already started and set round to 10
- And create 2
Player
entries instate.players
array
Type parameters
Name | Type |
---|---|
S | extends State <Record <string , unknown >, S > |
Parameters
Name | Type |
---|---|
state | S |
statePreparation | StateMockingRecord <S > |
Returns
S
makeEvent
▸ makeEvent<S
>(state
, messageType
, data?
): ServerPlayerMessage
Construct message event object for use in testEvent()
Type parameters
Name | Type |
---|---|
S | extends State <Record <string , unknown >, S > |
Parameters
Name | Type |
---|---|
state | S |
messageType | string |
data? | unknown |
Returns
ServerPlayerMessage
makeInteraction
▸ makeInteraction<S
>(state
, entityQuery
, interaction?
): ServerPlayerMessage
Construct interaction event object for use in testEvent()
Type parameters
Name | Type |
---|---|
S | extends State <Record <string , unknown >, S > |
Parameters
Name | Type | Default value |
---|---|---|
state | S | undefined |
entityQuery | QuerableProps | undefined |
interaction | InteractionType | "tap" |
Returns
ServerPlayerMessage
populateState
▸ populateState<S
>(state
, entitiesMap
, gameEntities?
): S
this function can be run independently of setupServerTesting()
Use AFTER you prepared the base state yourself by using your game's own state preparation functions. Modifies state in-place.
Example
populateState(
state,
[
[ { name: "hand0" }, { children: [{ name: "SK" }], selected: [0] } ]
]
)
- Would find entity named "hand0" (eg. first player's hand)
- Create new card King of Spades
- And finally mark that card selected ([0] in this case assuming it's first and only card in "hand0")
Example
populateState(
state,
[
[ null, { name: "C7" } ]
]
)
- Would add card 7 of Clubs directly on the state/table
- Note
null
-> no query = fallback to root state object
Example
Perform multiple additions in one go:
populateState(
state,
[
[ { name: "hand0" }, { children: [{ name: "SK" }], selected: [0] } ],
[ null, { name: "C7" } ],
[ { type: "pile" }, { children: [{ name: "C2" }, { name: "C3" }, { name: "C4" }] } ]
]
)
Type parameters
Name | Type |
---|---|
S | extends State <Record <string , unknown >, S > |
Parameters
Name | Type | Description |
---|---|---|
state | S | State to populate with new entities |
entitiesMap | StateMockingTuple [] | Tuples of "entity queries" to "entity definitions". Finds an already existing entity and fills it with new data/entities to test. |
gameEntities? | Record <string , EntityConstructor > | optional record of your game's custom entities. |
Returns
S
the same state just for convenience.
testEvent
▸ testEvent<S
>(state
, action
, message
): boolean
Test if given event would pass in gameplay under current conditions.
Type parameters
Name | Type |
---|---|
S | extends State <Record <string , unknown >, S > |
Parameters
Name | Type |
---|---|
state | S |
action | ActionDefinition <S > |
message | ServerPlayerMessage |
Returns
boolean
Setup Functions
setupServerTesting
▸ setupServerTesting<S
, R
>(options
): SetupAPI
<S
, R
>
Type parameters
Name | Type |
---|---|
S | extends State <Record <string , unknown >, S > |
R | extends Room <S , Record <string , unknown >, R > = Room <S , Record <string , unknown >> |
Parameters
Name | Type |
---|---|
options | SetupOptions <S , R > |
Returns
SetupAPI
<S
, R
>
Utility Functions
childrenNamed
▸ childrenNamed(names
): EntityMockingDefinition
Creates EntityMockingDefinition
object
containing children
with objects containing names.
Example
given multiple names
childrenNamed(["D7", "D8", "D9"])
// returns:
{
children: [
{ name: "D7"}, { name: "D8"}, { name: "D9"}
]
}
Example
single string param
childrenNamed("D7")
// returns:
{
children: [{ name: "D7"}]
}
Parameters
Name | Type | Description |
---|---|---|
names | string | string [] | can be single name, will be wrapped in an array anyway |
Returns
objectsNamed
▸ objectsNamed(names
): EntityMockingDefinition
[]
Turns an array of strings into array of objects with name
.
Useful in creating children
prop in EntityMockingDefinition
.
Example
given multiple names
objectsNamed(["D7", "D8", "D9"])
// returns:
[{ name: "D7"}, { name: "D8"}, { name: "D9"}]
Example
single string param
objectsNamed("D7")
// returns:
[{ name: "D7"}]
Parameters
Name | Type | Description |
---|---|---|
names | string | string [] | can be single name, will be wrapped in an array anyway |