1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
|
_ Tests for barem4.m4, July 2025, distributed under Creative
_ Commons Share-alike license. -Doug McIlroy
_
_ Usage: m4 barem4.m4 testbarem4.m4
_
_ test(`x',`y') tests whether expressions x and y have identical values.
_ If not, print x != y, otherwise do nothing.
_ Uses the builtin ifelse to compare (nearly) arbitrary strings.
_
define(test,`ifelse($1,$2,`',``$1' != `$2'
')')_
_
_
`t0: here a deliberate error should print just "one != two"'
_
test(`one',`two')_
`From here on test descriptions will be printed.
Some tests will announce expected output. Otherwise
the only test results printed will be errors.'
_
define(`five', succ(four))_
define(`ten', (0,five))_
define(`fifteen', add(five,ten))_
define(`twenty', (0,ten))_
test(`ten',(0,(1,(0,(1,())))))_
_
_
t1: i+j-i = j, 0<=i,j<=10
_
define(`t1', `test(`dim(add($1,$2),$1)',`$2')')_
define(`_t1', `forA(zero,ten,`t1',$1)')_
for(zero,ten, `_t1')_
_
_
t2:(i-j)(i+j) = i^2-j^2, 0<=j<=i<=3
_
define(`t2',_
__`test(`mul(dim($1,$2),add($1,$2))',`dim(square($1),square($2))')')_
define(`_t2', `forA(zero,$1,`t2',$1)')_
for(zero,three,`_t2')_
_
_
t3: (n/d)*d + n%d = n, 0<=n<=15, 1<=d<=20
_
define(`t3', `test(`add(mul(div($1,$2),$2),mod($1,$2))',`$1')')_
define(`t3', `test(mod($1,$2), trim(mod($1,$2)))')_
define(`_t3', `forA(one,twenty,`t3',$1)')_
for(zero,fifteen, `_t3')_
_
_
t4: a^(n-1) = a^n/a, 1<=a<=4, 1<=n<=5
_
define(`t4', `test(`pow($1,dim($2,one))',`div(pow($1,$2),$1)')')_
define(`_t4', `forA(one,five,`t4',$1)')_
for(one,four,`_t4')_
_
_
t5: numeric comparisons 0<=i,j<=5
_
define(`t5',_
__`test(`lt($1,$2)',`not(ge($1,$2))')'_
__`test(`le($1,$2)',`not(gt($1,$2))')'_
__`test(`et($1,$2)',`not(ne($1,$2))')'_
__`test(`lt($1,$2)',`gt($2,$1)')'_
__`test(`le($1,$2)',`ge($2,$1)')'_
__`test(`et($1,$2)',`et($2,$1)')'_
__`test(`ne($1,$2)',`ne($2,$1)')')_
define(`_t5', `forA(zero,five,`t5',$1)')_
for(zero,five,`_t5')_
_
_
t6: octal addition table should be printed in base 2
_
define(`seven', add(three,four))_
define(`table', `for(zero,seven,`row')')_
define(`row', `forA(zero,seven,`cell',$1)newline()')_
define(`cell', `base2(add($1,$2))tab()')_
define(`tab', ` ')_
define(`newline',`
')_
table()_
_
_
`t7: alphanumeric comparisons, map, fold, zip'
_
_ ordered(<c>,<list>) tests whether all characters that precede
_ <c> in a list of characters compare low to <c> and all
_ characters after <c> compare high. if <c> is absent, all
_ characters are deemed to precede it. If <c> is duplicated,
_ the second instance is deemed to come after the first. `ttab'
_ (transition table) tells whether adjacent judgements conform
_ to the specification.
_
switch2of2(`ttab',`$1',`$2')_
case(`ttab_LT_LT', `T')_
case(`ttab_LT_EQ', `T')_
case(`ttab_LT_GT', `F')_
case(`ttab_EQ_LT', `F')_
case(`ttab_EQ_EQ', `F')_
case(`ttab_EQ_GT', `T')_
case(`ttab_GT_LT', `F')_
case(`ttab_GT_EQ', `F')_
case(`ttab_GT_GT', `T')_
_
define(`ordered',_
__`define(`ordcmp', `cmp($'`1,$1)')'_
__`define(`judged', map(`ordcmp',$2))'_
__`foldl(`and',T,zip(`ttab',(LT,judged),judged))')_
_
test(`ordered(`0',`alphabet')',T)_
test(`ordered(`L',`alphabet')',T)_
test(`ordered(`z',`alphabet')',T)_
test(`ordered(2,(3,(2,(3,()))))',F)_
test(`ordered(2,(1,(1,(2,()))))',T)_
test(`ordered(2,(1,(1,(1,()))))',T)_
test(`ordered(2,(1,(2,(2,()))))',F)_
test(`ordered(2,(1,(2,(1,()))))',F)_
_
_
`p1-p5 are same as t1-t5 with zero-padded operands.'
_ Helper functions _t1-_t5 are unchanged
_
define(`pad',`rev((0,(0,rev($1))))')_
_
define(`test', `if(et($1,$2), `', ``$1' != `$2'
')')_
_
_
p1: i+j-i = j, 0<=i,j<=10
_
define(`t1', `test(`dim(add(pad($1),pad($2)),pad($1))',`$2')')_
for(zero,ten, `_t1')_
_
_
p2:(i-j)(i+j) = i^2-j^2, 0<=j<=i<=3
_
define(`t2', `test(`mul(dim(pad($1),$2),add(pad($1),pad($2)))',`dim(square($1),square($2))')')_
for(zero,three,`_t2')_
_
_
p3: (n/d)*d + n%d = n, 0<=n<=15, 1<=d<=20
_
define(`t3', `test(`add(mul(div(pad($1),pad($2)),pad($2)),mod(pad($1),pad($2)))',`$1')')_
for(zero,fifteen, `_t3')_
_
_
p4: a^(n-1) = a^n/a, 1<=a<=4, 1<=n<=5
_
define(`t4', `test(`pow(pad($1),dim(pad($2),one))',`div(pow($1,$2),$1)')')_
for(one,four,`_t4')_
_
_
p5: numeric comparisons 0<=i,j<=5
_
define(`test', `if(eq($1,$2), `', ``$1' != `$2'
')')_
_
define(`t5',_
__`test(`lt($1,pad($2))',`not(ge($1,pad($2)))')'_
__`test(`le($1,pad($2))',`not(gt($1,pad($2)))')'_
__`test(`et($1,pad($2))',`not(ne($1,pad($2)))')'_
__`test(`lt($1,pad($2))',`gt(pad($2),$1)')'_
__`test(`le($1,pad($2))',`ge(pad($2),$1)')'_
__`test(`et($1,pad($2))',`et(pad($2),$1)')'_
__`test(`ne($1,pad($2))',`ne(pad($2),$1)')')_
define(`_t5', `forA(zero,five,`t5',$1)')_
for(zero,five,`_t5')_
|