Class skillls/list splitting
This commit is contained in:
@@ -516,6 +516,31 @@ providers:
|
||||
}
|
||||
}
|
||||
|
||||
func TestWikiDataProvidersRejectInvalidColumnProviderConfig(t *testing.T) {
|
||||
root := t.TempDir()
|
||||
dataPath := filepath.Join(root, "data.yaml")
|
||||
writeFile(t, dataPath, `
|
||||
providers:
|
||||
ClassSkills:
|
||||
source: class_skills
|
||||
BrokenColumns:
|
||||
source: columns
|
||||
provider: ClassSkills
|
||||
columns: 0
|
||||
items_per_column: 2
|
||||
`+"\n")
|
||||
|
||||
_, err := loadWikiDataProviders(dataPath)
|
||||
if err == nil {
|
||||
t.Fatal("expected invalid column provider config")
|
||||
}
|
||||
for _, expected := range []string{"data.yaml", "BrokenColumns", "columns"} {
|
||||
if !strings.Contains(err.Error(), expected) {
|
||||
t.Fatalf("expected error to contain %q, got %v", expected, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestWikiTemplateEachBlockRendersClassSkillsAsIndividualListItems(t *testing.T) {
|
||||
ctx := &wikiContext{
|
||||
wikiDataProviders: map[string]wikiDataProviderDefinition{
|
||||
@@ -576,6 +601,139 @@ func TestWikiTemplateEachBlockRendersClassSkillsAsIndividualListItems(t *testing
|
||||
}
|
||||
}
|
||||
|
||||
func TestWikiTemplateColumnProviderRendersNestedItemsAndForcedEmptyColumns(t *testing.T) {
|
||||
ctx := &wikiContext{
|
||||
wikiDataProviders: map[string]wikiDataProviderDefinition{
|
||||
"ClassSkills": {
|
||||
Source: "class_skills",
|
||||
},
|
||||
"ClassSkillColumns": {
|
||||
Source: "columns",
|
||||
Provider: "ClassSkills",
|
||||
Columns: 3,
|
||||
ItemsPerColumn: 2,
|
||||
ForceColumns: true,
|
||||
},
|
||||
},
|
||||
classSkillTables: map[string]wikiTable{
|
||||
"classes/skills:fighter": {
|
||||
Rows: []map[string]any{
|
||||
{"SkillIndex": "1", "ClassSkill": "1"},
|
||||
{"SkillIndex": "2", "ClassSkill": "1"},
|
||||
{"SkillIndex": "3", "ClassSkill": "1"},
|
||||
},
|
||||
},
|
||||
},
|
||||
skillIDToKey: map[int]string{
|
||||
1: "skills:athletics",
|
||||
2: "skills:parry",
|
||||
3: "skills:ride",
|
||||
},
|
||||
skillRows: map[string]map[string]any{
|
||||
"skills:athletics": {"Name": "Athletics"},
|
||||
"skills:parry": {"Name": "Parry"},
|
||||
"skills:ride": {"Name": "Ride"},
|
||||
},
|
||||
}
|
||||
page := wikiTemplatePage{
|
||||
PageID: "classes:fighter",
|
||||
Category: "classes",
|
||||
Key: "classes:fighter",
|
||||
Title: "Fighter",
|
||||
Row: map[string]any{
|
||||
"SkillsTable": map[string]any{"table": "classes/skills:fighter"},
|
||||
},
|
||||
}
|
||||
|
||||
template := `<div class="wiki-list-columns wiki-list-columns--3">
|
||||
{{#each ClassSkillColumns}}
|
||||
<ul data-index="{{Index}}" data-count="{{Count}}" class="wiki-list wiki-class-skills">
|
||||
{{#each Items}}
|
||||
<li>{{SkillKey|link:SkillName|wiki}}</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
{{/each}}
|
||||
</div>`
|
||||
|
||||
got, err := ctx.renderWikiTemplateString("classes.html", template, page)
|
||||
if err != nil {
|
||||
t.Fatalf("render template: %v", err)
|
||||
}
|
||||
for _, want := range []string{
|
||||
`<ul data-index="1" data-count="2" class="wiki-list wiki-class-skills">`,
|
||||
`<li>[[Skills/Athletics|Athletics]]</li>`,
|
||||
`<li>[[Skills/Parry|Parry]]</li>`,
|
||||
`<ul data-index="2" data-count="1" class="wiki-list wiki-class-skills">`,
|
||||
`<li>[[Skills/Ride|Ride]]</li>`,
|
||||
`<ul data-index="3" data-count="0" class="wiki-list wiki-class-skills">`,
|
||||
} {
|
||||
if !strings.Contains(got, want) {
|
||||
t.Fatalf("expected rendered output to contain %q:\n%s", want, got)
|
||||
}
|
||||
}
|
||||
if gotCount := strings.Count(got, `<ul data-index=`); gotCount != 3 {
|
||||
t.Fatalf("expected exactly 3 forced columns, got %d:\n%s", gotCount, got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestWikiTemplateColumnProviderAddsOverflowColumnsBeyondConfiguredCount(t *testing.T) {
|
||||
ctx := &wikiContext{
|
||||
wikiDataProviders: map[string]wikiDataProviderDefinition{
|
||||
"ClassSkills": {
|
||||
Source: "class_skills",
|
||||
},
|
||||
"ClassSkillColumns": {
|
||||
Source: "columns",
|
||||
Provider: "ClassSkills",
|
||||
Columns: 2,
|
||||
ItemsPerColumn: 2,
|
||||
},
|
||||
},
|
||||
classSkillTables: map[string]wikiTable{
|
||||
"classes/skills:fighter": {
|
||||
Rows: []map[string]any{
|
||||
{"SkillIndex": "1", "ClassSkill": "1"},
|
||||
{"SkillIndex": "2", "ClassSkill": "1"},
|
||||
{"SkillIndex": "3", "ClassSkill": "1"},
|
||||
{"SkillIndex": "4", "ClassSkill": "1"},
|
||||
{"SkillIndex": "5", "ClassSkill": "1"},
|
||||
},
|
||||
},
|
||||
},
|
||||
skillIDToKey: map[int]string{
|
||||
1: "skills:athletics",
|
||||
2: "skills:parry",
|
||||
3: "skills:ride",
|
||||
4: "skills:survival",
|
||||
5: "skills:heal",
|
||||
},
|
||||
skillRows: map[string]map[string]any{
|
||||
"skills:athletics": {"Name": "Athletics"},
|
||||
"skills:parry": {"Name": "Parry"},
|
||||
"skills:ride": {"Name": "Ride"},
|
||||
"skills:survival": {"Name": "Survival"},
|
||||
"skills:heal": {"Name": "Heal"},
|
||||
},
|
||||
}
|
||||
page := wikiTemplatePage{
|
||||
PageID: "classes:fighter",
|
||||
Category: "classes",
|
||||
Key: "classes:fighter",
|
||||
Title: "Fighter",
|
||||
Row: map[string]any{
|
||||
"SkillsTable": map[string]any{"table": "classes/skills:fighter"},
|
||||
},
|
||||
}
|
||||
|
||||
got, err := ctx.renderWikiTemplateString("classes.html", `{{#each ClassSkillColumns}}[{{Index}}:{{Count}}]{{/each}}`, page)
|
||||
if err != nil {
|
||||
t.Fatalf("render template: %v", err)
|
||||
}
|
||||
if got != "[1:2][2:2][3:1]" {
|
||||
t.Fatalf("expected overflow column after configured columns, got %q", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestWikiTemplateListFilterRendersSliceAsListItems(t *testing.T) {
|
||||
ctx := &wikiContext{}
|
||||
page := wikiTemplatePage{
|
||||
|
||||
Reference in New Issue
Block a user