Files
metro-puzzle-jp/internal/lang/data_test.go
claude f762f9554e
All checks were successful
release / build-release (push) Successful in 1m34s
M9: navigeringslägen, linjenät och terminal
internal/nav med resources/data/network.json (76 stationer, 11 linjer,
Yamanote som ringlinje). Tåg bedöms från lineId + terminus mot banans
station/to: rätt, fel håll, för långt bort (fler än 12 stationer) eller
ingen trafik; correct räknas ut för nätkopplade banor, 1-4 rätta tåg.
Tågresan visar linjens riktiga stationer. Nya förlustorsaker "Fel håll"
och "För långt bort". Listläge (nästa tåg nere till vänster) och
skyltläge (+50 % poäng) växlas med N på bankartan och sparas; -mode.
Terminalen: biljettautomaten visar linjetavlan på nätbanor. Perronger
P p Q q R r. Bana 006 Ikebukuro med fyra perronger. Banorna 001-005
kopplade till nätet. Skript: waitover och pick calm; poängraden
radbryts; skärmdumpar uppdaterade.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-24 13:07:36 +02:00

107 lines
2.6 KiB
Go

package lang
import (
"os"
"path/filepath"
"strings"
"testing"
"gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/level"
"gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/nav"
"gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/res"
)
func loadDict(t *testing.T) *Dictionary {
t.Helper()
b, err := res.ReadFile("text", "jp-dictionary.json")
if err != nil {
t.Fatal(err)
}
d, err := ParseDictionary(b)
if err != nil {
t.Fatal(err)
}
return d
}
// TestShippedDictionary: ordboken parsar och har rimligt innehåll.
func TestShippedDictionary(t *testing.T) {
d := loadDict(t)
if d.Len() < 20 {
t.Fatalf("bara %d ord", d.Len())
}
for _, w := range d.Words() {
e := d.Lookup(w)
if e.Tier < 1 || e.Tier > 5 {
t.Errorf("%s: tier %d", w, e.Tier)
}
}
}
// TestAllJapaneseInLevelsIsInDictionary: all japanska i banorna (skyltar,
// namn, resmål, linjer) måste gå att slå upp, annars kan skyltsystemet
// aldrig översätta den.
func TestAllJapaneseInLevelsIsInDictionary(t *testing.T) {
d := loadDict(t)
dir, err := res.Path("data", "levels")
if err != nil {
t.Fatal(err)
}
files, _ := filepath.Glob(filepath.Join(dir, "*.json"))
if len(files) == 0 {
t.Fatal("inga banor")
}
for _, f := range files {
b, err := os.ReadFile(f)
if err != nil {
t.Fatal(err)
}
l, err := level.Parse(b)
if err != nil {
t.Fatal(err)
}
check := func(what, s string) {
if s == "" {
t.Errorf("%s: %s saknar japansk text", l.ID, what)
return
}
if u := d.Unknown(s); len(u) > 0 {
t.Errorf("%s: %s %q har japanska som saknas i ordboken: %s", l.ID, what, s, strings.Join(u, ", "))
}
}
check("namn", l.Name["ja"])
check("resmål", l.Destination["ja"])
for i, tr := range l.Trains {
check("tåg "+string(rune('0'+i))+" linje", tr.Line["ja"])
check("tåg "+string(rune('0'+i))+" resmål", tr.Destination["ja"])
}
for _, sg := range l.Signs {
check("skylt", sg.Text["ja"])
}
}
}
// TestNetworkNamesInDictionary: alla stations- och linjenamn i linjenätet
// finns i ordboken, så att tågresans stationer och terminalen går att lära sig.
func TestNetworkNamesInDictionary(t *testing.T) {
d := loadDict(t)
path, err := res.Path("data", "network.json")
if err != nil {
t.Fatal(err)
}
n, err := nav.LoadFile(path)
if err != nil {
t.Fatal(err)
}
for _, s := range n.Stations {
if u := d.Unknown(s.Name["ja"]); len(u) > 0 {
t.Errorf("station %s (%s) saknas i ordboken: %s", s.ID, s.Name["ja"], strings.Join(u, ", "))
}
}
for _, l := range n.Lines {
if u := d.Unknown(l.Name["ja"]); len(u) > 0 {
t.Errorf("linje %s (%s) saknas i ordboken: %s", l.ID, l.Name["ja"], strings.Join(u, ", "))
}
}
}