nx_decl_townscape_test.nx source
↩ module page · 103 lines · 4191 B
1// nx_decl_townscape_test.nx -- smoke for the fifth declarator.
2//
3// expect_exit: 0
4//
5// license_tier: ORIGINAL
6
7import "nx_syscalls.nx"
8import "nx_types.nx"
9import "nx_tier.nx"
10import "nx_decl_random_environment.nx"
11import "nx_decl_simple_scene.nx"
12import "nx_decl_townscape.nx"
13
14func main() -> nx_int {
15 // ---- T1: kind validity ----------------------------------------
16 if nx_town_kind_is_valid(NX_TOWN_KIND_HAMLET) != 1 { return 1 }
17 if nx_town_kind_is_valid(NX_TOWN_KIND_METROPOLIS) != 1 { return 2 }
18 if nx_town_kind_is_valid(NX_TOWN_KIND_N) != 0 { return 3 }
19 if nx_town_kind_is_valid(-1) != 0 { return 4 }
20
21 // ---- T2: REAL townscape -> scene populated + non-sci-fi kind --
22 let t: *NxTownscape = nx_ts_alloc()
23 nx_decl_townscape(t, NX_RE_MODIFIER_REAL, 7)
24 if t.is_valid != 1 { return 10 }
25 if t.scene.is_valid != 1 { return 11 }
26 if t.kind == NX_TOWN_KIND_OUTPOST { return 12 } // sci-fi only
27 if t.kind == NX_TOWN_KIND_METROPOLIS { return 13 } // sci-fi only
28 if t.building_count <= 0 { return 14 }
29 if t.road_count <= 0 { return 15 }
30 if t.population_log10 < 10 { return 16 }
31 if t.population_log10 > 60 { return 17 }
32
33 // ---- T3: FANTASY townscape -> fantasy kinds only -------------
34 let f: *NxTownscape = nx_ts_alloc()
35 nx_decl_townscape(f, NX_RE_MODIFIER_FANTASY, 7)
36 if f.kind == NX_TOWN_KIND_OUTPOST { return 20 }
37 if f.kind == NX_TOWN_KIND_METROPOLIS { return 21 }
38 if f.scene.env.size_tiles != 512 { return 22 }
39
40 // ---- T4: SCI_FI townscape -> OUTPOST/CITY/METROPOLIS --------
41 let s: *NxTownscape = nx_ts_alloc()
42 nx_decl_townscape(s, NX_RE_MODIFIER_SCI_FI, 7)
43 if s.kind != NX_TOWN_KIND_OUTPOST {
44 if s.kind != NX_TOWN_KIND_CITY {
45 if s.kind != NX_TOWN_KIND_METROPOLIS { return 30 }
46 }
47 }
48 if s.scene.env.size_tiles != 1024 { return 31 }
49
50 // ---- T5: bigger kinds have more buildings + roads ------------
51 if _ts_building_count(NX_TOWN_KIND_CITY) <= _ts_building_count(NX_TOWN_KIND_VILLAGE) { return 40 }
52 if _ts_road_count(NX_TOWN_KIND_CITY) <= _ts_road_count(NX_TOWN_KIND_VILLAGE) { return 41 }
53 if _ts_building_count(NX_TOWN_KIND_METROPOLIS) <= _ts_building_count(NX_TOWN_KIND_CITY) { return 42 }
54
55 // ---- T6: amenity rules ---------------------------------------
56 // Hamlet has no market.
57 let h: *NxTownscape = nx_ts_alloc()
58 nx_decl_townscape(h, NX_RE_MODIFIER_REAL, 0)
59 // (seed-dependent; we check the predicate instead by forcing a known kind)
60 // Just verify the rule indirectly: if kind == HAMLET, market == 0
61 if h.kind == NX_TOWN_KIND_HAMLET {
62 if h.market_present != 0 { return 50 }
63 if h.temple_present != 0 { return 51 }
64 }
65
66 // ---- T7: determinism -----------------------------------------
67 let p: *NxTownscape = nx_ts_alloc()
68 let q: *NxTownscape = nx_ts_alloc()
69 nx_decl_townscape(p, NX_RE_MODIFIER_REAL, 12345)
70 nx_decl_townscape(q, NX_RE_MODIFIER_REAL, 12345)
71 if p.kind != q.kind { return 60 }
72 if p.building_count != q.building_count { return 61 }
73 if p.scene.light_kind != q.scene.light_kind { return 62 }
74
75 // ---- T8: invalid modifier -> is_valid=0 -----------------------
76 let bad: *NxTownscape = nx_ts_alloc()
77 nx_decl_townscape(bad, 999, 0)
78 if bad.is_valid != 0 { return 70 }
79
80 // ---- T9: reflection ------------------------------------------
81 let n: *u8 = nx_town_kind_name(NX_TOWN_KIND_VILLAGE)
82 if (n[0] as i64 & 255) != 86 { return 80 } // 'V'
83
84 // Print debug line composing 3 reflectors.
85 sys_write(1, "modifier=" as *u8, 9)
86 let mn: *u8 = nx_re_modifier_name(t.modifier)
87 var i: i64 = 0
88 while mn[i] != 0 { i = i + 1 }
89 sys_write(1, mn, i)
90 sys_write(1, " kind=" as *u8, 6)
91 let tn: *u8 = nx_town_kind_name(t.kind)
92 var j: i64 = 0
93 while tn[j] != 0 { j = j + 1 }
94 sys_write(1, tn, j)
95 sys_write(1, " light=" as *u8, 7)
96 let ln: *u8 = nx_ss_light_name(t.scene.light_kind)
97 var k: i64 = 0
98 while ln[k] != 0 { k = k + 1 }
99 sys_write(1, ln, k)
100 sys_write(1, "\n" as *u8, 1)
101
102 return 0
103}