code wiki / (root) / nx_macro_v6_test.nx

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}