Skip to content

Commit 709e794

Browse files
authored
Merge pull request #56 from Haraj-backend/chore/increase-coverage
Chore: Increase Test Coverage
2 parents 067bc8c + 04cedb3 commit 709e794

File tree

10 files changed

+427
-160
lines changed

10 files changed

+427
-160
lines changed

internal/core/entity/battle.go

+2-9
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package entity
22

33
import (
44
"errors"
5-
"fmt"
65
"math/rand"
76
"time"
87

@@ -27,10 +26,7 @@ func (b *Battle) PartnerAttack() error {
2726
return ErrInvalidState
2827
}
2928
// inflict damage to enemy
30-
damage, err := b.Enemy.InflictDamage(*b.Partner)
31-
if err != nil {
32-
return fmt.Errorf("unable to inflict damage to enemy due: %w", err)
33-
}
29+
damage := b.Enemy.InflictDamage(*b.Partner)
3430
// set enemy last damage
3531
b.LastDamage.Enemy = damage
3632
// set battle state accordingly
@@ -63,10 +59,7 @@ func (b *Battle) EnemyAttack() error {
6359
return ErrInvalidState
6460
}
6561
// inflict damage to partner
66-
damage, err := b.Partner.InflictDamage(*b.Enemy)
67-
if err != nil {
68-
return fmt.Errorf("unable to inflict damage to partner due: %w", err)
69-
}
62+
damage := b.Partner.InflictDamage(*b.Enemy)
7063
// set partner last damage
7164
b.LastDamage.Partner = damage
7265
// set battle state accordingly

internal/core/entity/battle_test.go

+41-14
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,22 @@ package entity_test
22

33
import (
44
"fmt"
5+
"math"
56
"testing"
67
"time"
78

89
"github.com/Haraj-backend/hex-monscape/internal/core/entity"
910
"github.com/Haraj-backend/hex-monscape/internal/core/testutil"
1011
"github.com/google/uuid"
11-
"github.com/stretchr/testify/assert"
12+
"github.com/stretchr/testify/require"
1213
)
1314

1415
func TestNewBattle(t *testing.T) {
1516
// define function for validating battle
1617
validateBattle := func(t *testing.T, battle entity.Battle, cfg entity.BattleConfig) {
17-
assert.NotEmpty(t, battle.GameID, "GameID is empty")
18-
assert.NotEmpty(t, battle.Partner, "Partner is empty")
19-
assert.NotEmpty(t, battle.Enemy, "Enemy is empty")
18+
require.NotEmpty(t, battle.GameID, "GameID is empty")
19+
require.NotEmpty(t, battle.Partner, "Partner is empty")
20+
require.NotEmpty(t, battle.Enemy, "Enemy is empty")
2021
}
2122
// define test cases
2223
testCases := []struct {
@@ -43,7 +44,7 @@ func TestNewBattle(t *testing.T) {
4344
for _, testCase := range testCases {
4445
t.Run(testCase.Name, func(t *testing.T) {
4546
battle, err := entity.NewBattle(testCase.Config)
46-
assert.Equal(t, testCase.IsError, (err != nil), "unexpected error")
47+
require.Equal(t, testCase.IsError, (err != nil), "unexpected error")
4748
if battle == nil {
4849
return
4950
}
@@ -118,14 +119,27 @@ func TestPartnerAttack(t *testing.T) {
118119

119120
battle.State = testCase.State
120121
err := battle.PartnerAttack()
121-
assert.Equal(t, testCase.IsError, (err != nil), "unexpected error")
122+
require.Equal(t, testCase.IsError, (err != nil), "unexpected error")
122123
if !testCase.IsError {
123-
assert.Equal(t, battle.Enemy.BattleStats.Health, testCase.ExpectedEnemyHealth, "enemy health is not valid")
124+
require.Equal(t, battle.Enemy.BattleStats.Health, testCase.ExpectedEnemyHealth, "enemy health is not valid")
124125
}
125126
})
126127
}
127128
}
128129

130+
func TestPartnerAttackWin(t *testing.T) {
131+
battle := initNewBattle()
132+
// set partner attack to very high number so that enemy will be dead
133+
battle.Partner.BattleStats.Attack = math.MaxInt
134+
// set battle state to partner attack
135+
battle.State = entity.StatePartnerTurn
136+
// execute partner attack, enemy should be dead
137+
err := battle.PartnerAttack()
138+
require.NoError(t, err)
139+
// validate battle state
140+
require.Equal(t, entity.StateWin, battle.State)
141+
}
142+
129143
func TestPartnerSurrender(t *testing.T) {
130144
battle := initNewBattle()
131145
// define test cases
@@ -155,9 +169,9 @@ func TestPartnerSurrender(t *testing.T) {
155169
t.Run(testCase.Name, func(t *testing.T) {
156170
battle.State = testCase.State
157171
err := battle.PartnerSurrender()
158-
assert.Equal(t, testCase.IsError, (err != nil), "unexpected error")
172+
require.Equal(t, testCase.IsError, (err != nil), "unexpected error")
159173
if !testCase.IsError {
160-
assert.Equal(t, entity.StateLose, battle.State)
174+
require.Equal(t, entity.StateLose, battle.State)
161175
}
162176
})
163177
}
@@ -235,14 +249,27 @@ func TestEnemyAttack(t *testing.T) {
235249
})
236250
battle.State = testCase.State
237251
err := battle.EnemyAttack()
238-
assert.Equal(t, testCase.IsError, (err != nil), "unexpected error")
252+
require.Equal(t, testCase.IsError, (err != nil), "unexpected error")
239253
if !testCase.IsError {
240-
assert.Equal(t, battle.Partner.BattleStats.Health, testCase.ExpectedPartnerHealth, "partner health is not valid")
254+
require.Equal(t, battle.Partner.BattleStats.Health, testCase.ExpectedPartnerHealth, "partner health is not valid")
241255
}
242256
})
243257
}
244258
}
245259

260+
func TestEnemyAttackWin(t *testing.T) {
261+
battle := initNewBattle()
262+
// set enemy attack to very high number so that partner will be dead
263+
battle.Enemy.BattleStats.Attack = math.MaxInt
264+
// set battle state to enemy attack
265+
battle.State = entity.StateEnemyTurn
266+
// execute enemy attack, partner should be dead
267+
err := battle.EnemyAttack()
268+
require.NoError(t, err)
269+
// validate battle state
270+
require.Equal(t, entity.StateLose, battle.State)
271+
}
272+
246273
func TestIsEnded(t *testing.T) {
247274
battle := initNewBattle()
248275
// define test cases
@@ -283,7 +310,7 @@ func TestIsEnded(t *testing.T) {
283310
t.Run(testCase.Name, func(t *testing.T) {
284311
battle.State = testCase.State
285312
actual := battle.IsEnded()
286-
assert.Equal(t, testCase.Expected, actual, "unexpected dead")
313+
require.Equal(t, testCase.Expected, actual, "unexpected dead")
287314
})
288315
}
289316
}
@@ -383,9 +410,9 @@ func TestDecideTurn(t *testing.T) {
383410
})
384411
battle.State = testCase.State
385412
state, err := battle.DecideTurn()
386-
assert.Equal(t, testCase.IsError, (err != nil), "unexpected error")
413+
require.Equal(t, testCase.IsError, (err != nil), "unexpected error")
387414
if !testCase.IsError {
388-
assert.Equal(t, testCase.ExpectedState, state, "expected state is not valid")
415+
require.Equal(t, testCase.ExpectedState, state, "expected state is not valid")
389416
}
390417
})
391418
}

internal/core/entity/monster.go

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package entity
22

3-
const minDamage = 5
3+
const MinDamage = 5
44

55
type Monster struct {
66
ID string
@@ -21,10 +21,11 @@ func (p Monster) IsDead() bool {
2121

2222
// InflictDamage is used for inflicting damage to self based
2323
// on given enemy. Returned the damage amount.
24-
func (p *Monster) InflictDamage(enemy Monster) (int, error) {
25-
dmg := max(enemy.BattleStats.Attack-p.BattleStats.Defense, minDamage)
24+
func (p *Monster) InflictDamage(enemy Monster) int {
25+
dmg := max(enemy.BattleStats.Attack-p.BattleStats.Defense, MinDamage)
2626
p.BattleStats.Health -= dmg
27-
return dmg, nil
27+
28+
return dmg
2829
}
2930

3031
type BattleStats struct {

internal/core/entity/monster_test.go

+73-22
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ package entity_test
33
import (
44
"fmt"
55
"testing"
6-
"time"
76

87
"github.com/Haraj-backend/hex-monscape/internal/core/entity"
8+
"github.com/Haraj-backend/hex-monscape/internal/core/testutil"
99
"github.com/google/uuid"
10-
"github.com/stretchr/testify/assert"
10+
"github.com/stretchr/testify/require"
1111
)
1212

1313
func TestIsDead(t *testing.T) {
@@ -21,47 +21,47 @@ func TestIsDead(t *testing.T) {
2121
Name: "Monster is Not Dead",
2222
Monster: entity.Monster{
2323
ID: uuid.NewString(),
24-
Name: fmt.Sprintf("monster_%v", time.Now().Unix()),
24+
Name: generateMonsterName(false),
2525
BattleStats: entity.BattleStats{
2626
Health: 100,
2727
MaxHealth: 100,
2828
Attack: 100,
2929
Defense: 100,
3030
Speed: 100,
3131
},
32-
AvatarURL: fmt.Sprintf("https://example.com/%v", time.Now().Unix()),
32+
AvatarURL: generateAvatarURL(),
3333
},
3434
Expected: false,
3535
},
3636
{
3737
Name: "Monster Has 0 Health",
3838
Monster: entity.Monster{
3939
ID: uuid.NewString(),
40-
Name: fmt.Sprintf("monster_%v", time.Now().Unix()),
40+
Name: generateMonsterName(false),
4141
BattleStats: entity.BattleStats{
4242
Health: 0,
4343
MaxHealth: 100,
4444
Attack: 100,
4545
Defense: 100,
4646
Speed: 100,
4747
},
48-
AvatarURL: fmt.Sprintf("https://example.com/%v", time.Now().Unix()),
48+
AvatarURL: generateAvatarURL(),
4949
},
5050
Expected: true,
5151
},
5252
{
5353
Name: "Monster Has Negative Health",
5454
Monster: entity.Monster{
5555
ID: uuid.NewString(),
56-
Name: fmt.Sprintf("monster_%v", time.Now().Unix()),
56+
Name: generateMonsterName(false),
5757
BattleStats: entity.BattleStats{
5858
Health: -100,
5959
MaxHealth: 100,
6060
Attack: 100,
6161
Defense: 100,
6262
Speed: 100,
6363
},
64-
AvatarURL: fmt.Sprintf("https://example.com/%v", time.Now().Unix()),
64+
AvatarURL: generateAvatarURL(),
6565
},
6666
Expected: true,
6767
},
@@ -71,7 +71,7 @@ func TestIsDead(t *testing.T) {
7171
for _, testCase := range testCases {
7272
t.Run(testCase.Name, func(t *testing.T) {
7373
actual := testCase.Monster.IsDead()
74-
assert.Equal(t, testCase.Expected, actual, "unexpected dead")
74+
require.Equal(t, testCase.Expected, actual, "unexpected dead")
7575
})
7676
}
7777
}
@@ -88,68 +88,119 @@ func TestInflictDamage(t *testing.T) {
8888
Name: "Monster Get Zero Damage",
8989
Monster: entity.Monster{
9090
ID: uuid.NewString(),
91-
Name: fmt.Sprintf("monster_%v", time.Now().Unix()),
91+
Name: generateMonsterName(false),
9292
BattleStats: entity.BattleStats{
9393
Health: 100,
9494
MaxHealth: 100,
9595
Attack: 100,
9696
Defense: 0,
9797
Speed: 100,
9898
},
99-
AvatarURL: fmt.Sprintf("https://example.com/%v", time.Now().Unix()),
99+
AvatarURL: generateAvatarURL(),
100100
},
101101
Enemy: entity.Monster{
102102
ID: uuid.NewString(),
103-
Name: fmt.Sprintf("enemy_%v", time.Now().Unix()),
103+
Name: generateMonsterName(true),
104104
BattleStats: entity.BattleStats{
105105
Health: 100,
106106
MaxHealth: 100,
107107
Attack: 100,
108108
Defense: 100,
109109
Speed: 100,
110110
},
111-
AvatarURL: fmt.Sprintf("https://example.com/%v", time.Now().Unix()),
111+
AvatarURL: generateAvatarURL(),
112112
},
113113
ExpectedHealthAmount: 0,
114114
},
115115
{
116116
Name: "Monster Get 50 Damage",
117117
Monster: entity.Monster{
118118
ID: uuid.NewString(),
119-
Name: fmt.Sprintf("monster_%v", time.Now().Unix()),
119+
Name: generateMonsterName(false),
120120
BattleStats: entity.BattleStats{
121121
Health: 100,
122122
MaxHealth: 100,
123123
Attack: 100,
124124
Defense: 50,
125125
Speed: 100,
126126
},
127-
AvatarURL: fmt.Sprintf("https://example.com/%v", time.Now().Unix()),
127+
AvatarURL: generateAvatarURL(),
128128
},
129129
Enemy: entity.Monster{
130130
ID: uuid.NewString(),
131-
Name: fmt.Sprintf("enemy_%v", time.Now().Unix()),
131+
Name: generateMonsterName(true),
132132
BattleStats: entity.BattleStats{
133133
Health: 100,
134134
MaxHealth: 100,
135135
Attack: 100,
136136
Defense: 100,
137137
Speed: 100,
138138
},
139-
AvatarURL: fmt.Sprintf("https://example.com/%v", time.Now().Unix()),
139+
AvatarURL: generateAvatarURL(),
140140
},
141141
ExpectedHealthAmount: 50,
142142
},
143+
{
144+
Name: "Enemy Attack is Lower Than Monster Defense",
145+
Monster: entity.Monster{
146+
ID: uuid.NewString(),
147+
Name: generateMonsterName(false),
148+
BattleStats: entity.BattleStats{
149+
Health: 100,
150+
MaxHealth: 100,
151+
Attack: 100,
152+
Defense: 100,
153+
Speed: 100,
154+
},
155+
AvatarURL: generateAvatarURL(),
156+
},
157+
Enemy: entity.Monster{
158+
ID: uuid.NewString(),
159+
Name: generateMonsterName(true),
160+
BattleStats: entity.BattleStats{
161+
Health: 100,
162+
MaxHealth: 100,
163+
Attack: 10,
164+
Defense: 100,
165+
Speed: 100,
166+
},
167+
AvatarURL: generateAvatarURL(),
168+
},
169+
ExpectedHealthAmount: 100 - entity.MinDamage,
170+
},
143171
}
144172

145173
// execute test cases
146174
for _, testCase := range testCases {
147175
t.Run(testCase.Name, func(t *testing.T) {
148-
_, err := testCase.Monster.InflictDamage(testCase.Enemy)
149-
if err != nil {
150-
t.Errorf("unable to inflict damage, due: %v", err)
151-
}
152-
assert.Equal(t, testCase.ExpectedHealthAmount, testCase.Monster.BattleStats.Health, "unexpected health amount")
176+
testCase.Monster.InflictDamage(testCase.Enemy)
177+
require.Equal(t, testCase.ExpectedHealthAmount, testCase.Monster.BattleStats.Health, "unexpected health amount")
153178
})
154179
}
155180
}
181+
182+
func TestResetBattleStats(t *testing.T) {
183+
// create new monster
184+
m := testutil.NewTestMonster()
185+
186+
// set the monster health to 0
187+
m.BattleStats.Health = 0
188+
189+
// reset the battle stats
190+
m.ResetBattleStats()
191+
192+
// the monster health should be equal to max health
193+
require.Equal(t, m.BattleStats.MaxHealth, m.BattleStats.Health, "unexpected health amount")
194+
}
195+
196+
func generateMonsterName(isEnemy bool) string {
197+
prefix := "monster"
198+
if isEnemy {
199+
prefix = "enemy"
200+
}
201+
return fmt.Sprintf("%v_%v", prefix, uuid.NewString())
202+
}
203+
204+
func generateAvatarURL() string {
205+
return fmt.Sprintf("https://example.com/%v.jpg", uuid.NewString())
206+
}

0 commit comments

Comments
 (0)