nx_macro_v6_test.nx source
↩ module page · 116 lines · 3679 B
1// nx_macro_v6_test.nx -- exercise @if(expr) + @else + @elif.
2
3import "nx_kernel_v2.nx"
4
5@macro VERSION 7
6@macro FEATURE_FAST 1
7// FEATURE_SLOW NOT defined.
8
9// ===== T1: @if with macro-comparison =====
10@if(VERSION >= 5)
11func has_modern_version() -> nx_int { return 1 }
12@endif
13
14@if(VERSION < 5)
15func has_modern_version() -> nx_int { return BROKEN_LEGACY }
16@endif
17
18// ===== T2: arithmetic in expression =====
19@if(VERSION * 2 == 14)
20func version_doubled_eq_14() -> nx_int { return 1 }
21@endif
22
23// ===== T3: logical AND =====
24@if(VERSION >= 5 && VERSION < 10)
25func version_in_range() -> nx_int { return 1 }
26@endif
27
28// ===== T4: logical OR with undefined macro (treated as 0) =====
29@if(UNDEFINED_FLAG || VERSION == 7)
30func or_short_circuit() -> nx_int { return 1 }
31@endif
32
33// ===== T5: defined() builtin =====
34@if(defined(FEATURE_FAST))
35func has_fast() -> nx_int { return 1 }
36@endif
37
38@if(defined(FEATURE_SLOW))
39func has_slow() -> nx_int { return BROKEN_NO_SLOW }
40@endif
41
42// ===== T6: !defined() =====
43@if(!defined(FEATURE_SLOW))
44func slow_not_defined() -> nx_int { return 1 }
45@endif
46
47// ===== T7: @else =====
48@if(VERSION > 100)
49func else_path() -> nx_int { return BROKEN_GT_100 }
50@else
51func else_path() -> nx_int { return 7 }
52@endif
53
54// ===== T8: @elif chain =====
55@if(VERSION == 1)
56func elif_chain() -> nx_int { return BROKEN_V1 }
57@elif(VERSION == 7)
58func elif_chain() -> nx_int { return 7 }
59@elif(VERSION == 8)
60func elif_chain() -> nx_int { return BROKEN_V8 }
61@else
62func elif_chain() -> nx_int { return BROKEN_ELSE }
63@endif
64
65// ===== T9: nested @if =====
66@if(VERSION >= 5)
67 @if(FEATURE_FAST)
68 func nested_kept() -> nx_int { return 1 }
69 @endif
70@endif
71
72// ===== T10: parens + complex expression =====
73@if((VERSION + 3) * 2 == 20)
74func paren_arithmetic() -> nx_int { return 1 }
75@endif
76
77// ===== Tests =====
78func main() -> nx_exit {
79 println("=== nx_macro_v6 -- @if(expr) / @else / @elif smoke ===" as *u8)
80
81 if has_modern_version() != 1 { println("T1 FAIL" as *u8); return 1 }
82 println("T1 if_macro_cmp PASS @if(VERSION >= 5) where VERSION = 7" as *u8)
83
84 if version_doubled_eq_14() != 1 { println("T2 FAIL" as *u8); return 2 }
85 println("T2 if_arithmetic PASS @if(VERSION * 2 == 14)" as *u8)
86
87 if version_in_range() != 1 { println("T3 FAIL" as *u8); return 3 }
88 println("T3 if_and PASS @if(VERSION >= 5 && VERSION < 10)" as *u8)
89
90 if or_short_circuit() != 1 { println("T4 FAIL" as *u8); return 4 }
91 println("T4 if_or PASS @if(UNDEFINED || VERSION == 7) -- undef = 0" as *u8)
92
93 if has_fast() != 1 { println("T5 FAIL" as *u8); return 5 }
94 println("T5 defined PASS @if(defined(FEATURE_FAST))" as *u8)
95
96 if slow_not_defined() != 1 { println("T6 FAIL" as *u8); return 6 }
97 println("T6 not_defined PASS @if(!defined(FEATURE_SLOW))" as *u8)
98
99 if else_path() != 7 { println("T7 FAIL" as *u8); return 7 }
100 println("T7 else PASS @if false -> @else kept -> 7" as *u8)
101
102 if elif_chain() != 7 { println("T8 FAIL" as *u8); return 8 }
103 println("T8 elif_chain PASS @if/@elif/@elif/@else picked the right branch" as *u8)
104
105 if nested_kept() != 1 { println("T9 FAIL" as *u8); return 9 }
106 println("T9 nested PASS nested @if + @if both kept" as *u8)
107
108 if paren_arithmetic() != 1 { println("T10 FAIL" as *u8); return 10 }
109 println("T10 paren_arith PASS @if((VERSION + 3) * 2 == 20)" as *u8)
110
111 println("" as *u8)
112 println("=== Drop-block proof ===" as *u8)
113 println("4 conditionally-dropped blocks contained BROKEN_* identifiers." as *u8)
114 println("Successful compile proves @if correctly dropped each one." as *u8)
115 return 0
116}