Skip to content

Commit

Permalink
🧪 characteristic_array_for_citizen_category_[citizen category]_should…
Browse files Browse the repository at this point in the history
…_be_[expected array]
  • Loading branch information
carloscasalar committed Nov 17, 2024
1 parent 997906a commit 3f4ea95
Show file tree
Hide file tree
Showing 6 changed files with 153 additions and 12 deletions.
13 changes: 7 additions & 6 deletions pkg/generator/character.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package generator

type Character struct {
FirstName string
Surname string
Role Role
Category CitizenCategory
Experience Experience
Skills []string
FirstName string
Surname string
Role Role
Category CitizenCategory
Experience Experience
Skills []string
Characteristics map[Characteristic]int
}
53 changes: 53 additions & 0 deletions pkg/generator/characteristic_auto.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 13 additions & 0 deletions pkg/generator/charasteristic.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package generator

//go:generate enumer -type=Characteristic -output=characteristic_auto.go
type Characteristic int

const (
STR Characteristic = iota // Strength
DEX // Dexterity
END // Endurance
INT // Intelligence
EDU // Education
SOC // Social Standing
)
17 changes: 17 additions & 0 deletions pkg/generator/citizen_category.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,26 @@
package generator

import "github.com/carloscasalar/traveller-npc-generator/internal/npc"

//go:generate enumer -type=CitizenCategory -output=citizen_category_auto.go -trimprefix=Category -transform=snake

type CitizenCategory int

func (i CitizenCategory) toNpcCitizenCategory() npc.CitizenCategory {
switch i {
case CategoryBelowAverage:
return npc.CategoryBelowAverage
case CategoryAverage:
return npc.CategoryAverage
case CategoryAboveAverage:
return npc.CategoryAboveAverage
case CategoryExceptional:
return npc.CategoryExceptional
default:
return npc.CitizenCategory(i)
}
}

const (
CategoryBelowAverage CitizenCategory = iota
CategoryAverage
Expand Down
30 changes: 24 additions & 6 deletions pkg/generator/npc_generator.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package generator

import (
"github.com/carloscasalar/traveller-npc-generator/internal/npc"
)

//go:generate gonstructor -type=NpcGenerator -constructorTypes=builder -init=init -propagateInitFuncReturns -output=npc_generator_auto.go
type NpcGenerator struct {
nameGenerator NameGenerator
Expand All @@ -14,14 +18,17 @@ func (g *NpcGenerator) Generate(request GenerateCharacterRequest) (*Character, e
role := request.role.toNpcRole()
experience := request.experience.toNpcExperience()
skills := role.Skills(experience)
category := request.category.toNpcCitizenCategory()
characteristic := role.RandomCharacteristic(category)

return &Character{
FirstName: firstName,
Surname: surname,
Role: request.role,
Category: request.category,
Experience: request.experience,
Skills: skills,
FirstName: firstName,
Surname: surname,
Role: request.role,
Category: request.category,
Experience: request.experience,
Skills: skills,
Characteristics: toCharacteristics(characteristic),
}, nil
}

Expand All @@ -36,3 +43,14 @@ func (g *NpcGenerator) init() error {
g.nameGenerator = nameGenerator
return nil
}

func toCharacteristics(characteristic map[npc.Characteristic]int) map[Characteristic]int {
return map[Characteristic]int{
STR: characteristic[npc.STR],
DEX: characteristic[npc.DEX],
END: characteristic[npc.END],
INT: characteristic[npc.INT],
EDU: characteristic[npc.EDU],
SOC: characteristic[npc.SOC],
}
}
39 changes: 39 additions & 0 deletions pkg/generator/npc_generator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package generator_test
import (
"fmt"
"github.com/stretchr/testify/require"
"slices"
"testing"

"github.com/carloscasalar/traveller-npc-generator/pkg/generator"
Expand Down Expand Up @@ -87,6 +88,30 @@ func Test_number_of_skills_generated_for(t *testing.T) {
}
}

func Test_characteristic_array_for_citizen_category(t *testing.T) {
allCategories := generator.CitizenCategoryValues()
expectedCharacteristicArray := map[generator.CitizenCategory][]int{
generator.CategoryBelowAverage: {8, 7, 6, 6, 5, 4},
generator.CategoryAverage: {9, 8, 7, 7, 6, 5},
generator.CategoryAboveAverage: {10, 9, 8, 8, 7, 6},
generator.CategoryExceptional: {11, 10, 9, 9, 8, 7},
}

for _, category := range allCategories {
t.Run(fmt.Sprintf("%v should be %v", category, expectedCharacteristicArray[category]), func(t *testing.T) {
request := generator.NewGenerateCharacterRequestBuilder().
Category(category).
Build()

npcGenerator, _ := newGenerator()
character, err := npcGenerator.Generate(*request)

require.NoError(t, err)
assert.Equal(t, expectedCharacteristicArray[category], getSortedArray(character.Characteristics))
})
}
}

func Test_when_category_is_invalid_it_returns_error(t *testing.T) {
nonValidCategory := generator.CitizenCategory(99)
request := generator.NewGenerateCharacterRequestBuilder().
Expand Down Expand Up @@ -139,6 +164,20 @@ func Test_when_gender_is_invalid_it_returns_error(t *testing.T) {
assert.Equal(t, "invalid gender", err.Error())
}

func getSortedArray(characteristics map[generator.Characteristic]int) []int {
charArray := []int{
characteristics[generator.STR],
characteristics[generator.DEX],
characteristics[generator.END],
characteristics[generator.INT],
characteristics[generator.EDU],
characteristics[generator.SOC],
}
slices.Sort(charArray)
slices.Reverse(charArray)
return charArray
}

func exceptionalRecruitDiplomatRequest() *generator.GenerateCharacterRequest {
return generator.NewGenerateCharacterRequestBuilder().
Category(generator.CategoryExceptional).
Expand Down

0 comments on commit 3f4ea95

Please sign in to comment.