mirror of
https://github.com/prosolis/gogobee.git
synced 2026-07-15 16:42:41 +00:00
T3 zone, fourth authored graph. Shape: two stacked 3-way forks (great_hall, upper_hall). The player picks twice in a row from a wide menu — distinct from the binary forks in G8a/b and the parallel Y-trees in G8c. Completes lock-kind coverage by G8d: this is the first authored use of LockLevelMin (tower_observatory gated at L7). With Perception (DC 14 study, DC 15 hidden_oratory), StatCheck INT (library), and LockNone, all four non-trivial lock kinds now appear in shipping zones. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
72 lines
2.0 KiB
Go
72 lines
2.0 KiB
Go
package plugin
|
|
|
|
import "testing"
|
|
|
|
func TestManorBlackspireGraph_Registered(t *testing.T) {
|
|
g, ok := zoneGraphRegistry[ZoneManorBlackspire]
|
|
if !ok {
|
|
t.Fatal("zoneManorBlackspireGraph not registered")
|
|
}
|
|
if g.Entry != "manor_blackspire.entry" {
|
|
t.Errorf("entry node = %q", g.Entry)
|
|
}
|
|
if len(g.Nodes) != 11 {
|
|
t.Errorf("nodes = %d, want 11", len(g.Nodes))
|
|
}
|
|
}
|
|
|
|
// TestManorBlackspireGraph_TwoStackedThreeWayForks captures the design
|
|
// shape: both great_hall and upper_hall expose three options.
|
|
func TestManorBlackspireGraph_TwoStackedThreeWayForks(t *testing.T) {
|
|
g := zoneManorBlackspireGraph()
|
|
for _, hub := range []string{
|
|
"manor_blackspire.great_hall",
|
|
"manor_blackspire.upper_hall",
|
|
} {
|
|
outs := g.outgoingEdges(hub)
|
|
if len(outs) != 3 {
|
|
t.Errorf("%s outgoing = %d, want 3", hub, len(outs))
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestManorBlackspireGraph_AllSpokesReachBoss(t *testing.T) {
|
|
g := zoneManorBlackspireGraph()
|
|
for _, leaf := range []string{
|
|
"manor_blackspire.master_bedroom",
|
|
"manor_blackspire.tower_observatory",
|
|
"manor_blackspire.hidden_oratory",
|
|
"manor_blackspire.portrait_gallery",
|
|
"manor_blackspire.study",
|
|
"manor_blackspire.library",
|
|
} {
|
|
if !reachable(g, leaf, "manor_blackspire.boss") {
|
|
t.Errorf("%s unreachable to boss", leaf)
|
|
}
|
|
}
|
|
}
|
|
|
|
// TestManorBlackspireGraph_LockLevelMinFirstUse verifies this zone is
|
|
// the first to author LockLevelMin, completing lock-kind coverage
|
|
// (Perception, StatCheck, LevelMin, LockNone) by G8d.
|
|
func TestManorBlackspireGraph_LockLevelMinFirstUse(t *testing.T) {
|
|
g := zoneManorBlackspireGraph()
|
|
var levelMinEdge *ZoneEdge
|
|
for _, outs := range g.Edges {
|
|
for i := range outs {
|
|
if outs[i].Lock == LockLevelMin {
|
|
levelMinEdge = &outs[i]
|
|
}
|
|
}
|
|
}
|
|
if levelMinEdge == nil {
|
|
t.Fatal("expected at least one LockLevelMin edge")
|
|
}
|
|
if min := lockDataInt(levelMinEdge.LockData, "min_level", 0); min < 7 {
|
|
t.Errorf("min_level = %d, want >= 7 (T3 zone)", min)
|
|
}
|
|
if levelMinEdge.Hint == "" {
|
|
t.Error("level-gated edge missing hint")
|
|
}
|
|
}
|