All checks were successful
release / build-release (push) Successful in 1m34s
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>
107 lines
2.6 KiB
Go
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, ", "))
|
|
}
|
|
}
|
|
}
|