func TestTileGraph(t *testing.T) { tg := internal.NewTileGraph(4, 4, false) if tg == nil || tg.String() != "▀▀▀▀\n▀▀▀▀\n▀▀▀▀\n▀▀▀▀" { t.Fatal("Tile graph not generated correctly") } tg.SetPassability(0, 1, true) if tg == nil || tg.String() != "▀ ▀▀\n▀▀▀▀\n▀▀▀▀\n▀▀▀▀" { t.Fatal("Passability set incorrectly") } tg.SetPassability(0, 1, false) if tg == nil || tg.String() != "▀▀▀▀\n▀▀▀▀\n▀▀▀▀\n▀▀▀▀" { t.Fatal("Passability set incorrectly") } tg.SetPassability(0, 1, true) if tg == nil || tg.String() != "▀ ▀▀\n▀▀▀▀\n▀▀▀▀\n▀▀▀▀" { t.Fatal("Passability set incorrectly") } tg.SetPassability(0, 2, true) if tg == nil || tg.String() != "▀ ▀\n▀▀▀▀\n▀▀▀▀\n▀▀▀▀" { t.Fatal("Passability set incorrectly") } tg.SetPassability(1, 2, true) if tg == nil || tg.String() != "▀ ▀\n▀▀ ▀\n▀▀▀▀\n▀▀▀▀" { t.Fatal("Passability set incorrectly") } tg.SetPassability(2, 2, true) if tg == nil || tg.String() != "▀ ▀\n▀▀ ▀\n▀▀ ▀\n▀▀▀▀" { t.Fatal("Passability set incorrectly") } tg.SetPassability(3, 2, true) if tg == nil || tg.String() != "▀ ▀\n▀▀ ▀\n▀▀ ▀\n▀▀ ▀" { t.Fatal("Passability set incorrectly") } if tg2, err := internal.NewTileGraphFrom("▀ ▀\n▀▀ ▀\n▀▀ ▀\n▀▀ ▀"); err != nil { t.Error("Tile graph errored on interpreting valid template string\n▀ ▀\n▀▀ ▀\n▀▀ ▀\n▀▀ ▀") } else if tg2.String() != "▀ ▀\n▀▀ ▀\n▀▀ ▀\n▀▀ ▀" { t.Error("Tile graph failed to generate properly with input string\n▀ ▀\n▀▀ ▀\n▀▀ ▀\n▀▀ ▀") } if tg.CoordsToID(0, 0) != 0 { t.Error("Coords to ID fails on 0,0") } else if tg.CoordsToID(3, 3) != 15 { t.Error("Coords to ID fails on 3,3") } else if tg.CoordsToID(0, 3) != 3 { t.Error("Coords to ID fails on 0,3") } else if tg.CoordsToID(3, 0) != 12 { t.Error("Coords to ID fails on 3,0") } if r, c := tg.IDToCoords(0); r != 0 || c != 0 { t.Error("ID to Coords fails on 0,0") } else if r, c := tg.IDToCoords(15); r != 3 || c != 3 { t.Error("ID to Coords fails on 3,3") } else if r, c := tg.IDToCoords(3); r != 0 || c != 3 { t.Error("ID to Coords fails on 0,3") } else if r, c := tg.IDToCoords(12); r != 3 || c != 0 { t.Error("ID to Coords fails on 3,0") } if succ := tg.From(concrete.Node(0)); succ != nil || len(succ) != 0 { t.Error("Successors for impassable tile not 0") } if succ := tg.From(concrete.Node(2)); succ == nil || len(succ) != 2 { t.Error("Incorrect number of successors for (0,2)") } else { for _, s := range succ { if s.ID() != 1 && s.ID() != 6 { t.Error("Successor for (0,2) neither (0,1) nor (1,2)") } } } if tg.Degree(concrete.Node(2)) != 4 { t.Error("Degree returns incorrect number for (0,2)") } if tg.Degree(concrete.Node(1)) != 2 { t.Error("Degree returns incorrect number for (0,2)") } if tg.Degree(concrete.Node(0)) != 0 { t.Error("Degree returns incorrect number for impassable tile (0,0)") } }
"▀▀ ▀\n" + "▀▀ ▀\n" + "▀▀ ▀", ) if err != nil { panic("bad test graph") } return tg }(), s: 1, t: 14, wantPath: []int{1, 2, 6, 10, 14}, }, { name: "small open graph", g: internal.NewTileGraph(3, 3, true), s: 0, t: 8, }, { name: "large open graph", g: internal.NewTileGraph(1000, 1000, true), s: 0, t: 999*1000 + 999, }, { name: "no path", g: func() graph.Graph { tg := internal.NewTileGraph(5, 5, true) // Create a complete "wall" across the middle row.