Add some expression evaluation tests.

This commit is contained in:
Dianne Skoll
2024-06-04 08:37:19 -04:00
parent 09f043b3de
commit 7a40260f0d
3 changed files with 430 additions and 0 deletions

51
tests/expr.rem Normal file
View File

@@ -0,0 +1,51 @@
debug +sx
set a 1
set a 0&&0
set a 0&&1
set a 1&&0
set a 1&&1
set a 0||0
set a 0||1
set a 1||0
set a 1||1
set a 2, 3
set a iif(0, "foo", 0, "bar", 1, "blech", 0, "quux", 1, "borhy", "wacka")
set a max(2*3, 4+5, min(6*7+8, 7+6*8))
set a max(1,,1)
set a 5%0
set a 5/0
set a -$IntMin
set a $IntMin / -1
set a $IntMin % -1
set a (7+5)*(8+2)/(9-4)
set a "foo" * 5
set a "foo" / 5
set a "foo" * "five"
set a "foo" + "bar"
set a '2024-01-02' + 3
set a 3 + '2024-01-02'
set a 11:33 + 75
set a 75 + 11:33
set a '2024-01-01@11:33' + 1500
set a 1500 + '2024-01-01@11:33'
set a '2024-03-02' - '2024-01-01'
set a 15:00 - 14:44
set a (1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+1))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
set a (1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+1)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))

View File

@@ -548,6 +548,9 @@ EOF
BANNER %
DUMP
EOF
../src/remind ../tests/expr.rem >> ../tests/test.out 2>&1
# Remove references to SysInclude, which is build-specific
grep -F -v '$SysInclude' < ../tests/test.out > ../tests/test.out.1 && mv -f ../tests/test.out.1 ../tests/test.out
cmp -s ../tests/test.out ../tests/test.cmp

View File

@@ -11969,3 +11969,379 @@ Remind: '-i' option: Missing '=' sign
Variable Value
No reminders.
Parsed expression: 1
=> 1
Parsed expression: 0&&0
=> (&& 0 0)
0 && ? => 0
Parsed expression: 0&&1
=> (&& 0 1)
0 && ? => 0
Parsed expression: 1&&0
=> (&& 1 0)
1 && 0 => 0
Parsed expression: 1&&1
=> (&& 1 1)
1 && 1 => 1
Parsed expression: 0||0
=> (|| 0 0)
0 || 0 => 0
Parsed expression: 0||1
=> (|| 0 1)
0 || 1 => 1
Parsed expression: 1||0
=> (|| 1 0)
1 || ? => 1
Parsed expression: 1||1
=> (|| 1 1)
1 || ? => 1
Parsed expression: 2
=> 2
Unparsed: , 3
../tests/expr.rem(15): Expecting end-of-line
Parsed expression: iif(0, "foo", 0, "bar", 1, "blech", 0, "quux", 1, "borhy", "wacka")
=> (Iif 0 "foo" 0 "bar" 1 "blech" 0 "quux" 1 "borhy" "wacka")
iif(0, ?, 0, ?, 1, "blech", ?, ?, ?, ?, ?) => "blech"
Parsed expression: max(2*3, 4+5, min(6*7+8, 7+6*8))
=> (Max (* 2 3) (+ 4 5) (Min (+ (* 6 7) 8) (+ 7 (* 6 8))))
2 * 3 => 6
4 + 5 => 9
6 * 7 => 42
42 + 8 => 50
6 * 8 => 48
7 + 48 => 55
min(50, 55) => 50
max(6, 9, 50) => 50
../tests/expr.rem(21): Illegal character `,'
Parsed expression: max(1,
=> Error: Illegal character
Unparsed: ,1)
max(1,,1)
^-- here
Parsed expression: 5%0
=> (% 5 0)
5 % 0 => Division by zero
../tests/expr.rem(23): `%': Division by zero
Parsed expression: 5/0
=> (/ 5 0)
5 / 0 => Division by zero
../tests/expr.rem(25): `/': Division by zero
Parsed expression: -$IntMin
=> (- $IntMin)
$IntMin => -2147483648
- -2147483648 => -2147483648
Parsed expression: $IntMin / -1
=> (/ $IntMin -1)
$IntMin => -2147483648
-2147483648 / -1 => Number too high
../tests/expr.rem(29): `/': Number too high
Parsed expression: $IntMin % -1
=> (% $IntMin -1)
$IntMin => -2147483648
-2147483648 % -1 => Number too high
../tests/expr.rem(30): `%': Number too high
Parsed expression: (7+5)*(8+2)/(9-4)
=> (/ (* (+ 7 5) (+ 8 2)) (- 9 4))
7 + 5 => 12
8 + 2 => 10
12 * 10 => 120
9 - 4 => 5
120 / 5 => 24
Parsed expression: "foo" * 5
=> (* "foo" 5)
"foo" * 5 => "foofoofoofoofoo"
Parsed expression: "foo" / 5
=> (/ "foo" 5)
"foo" / 5 => Type mismatch
../tests/expr.rem(35): `/': Type mismatch
Parsed expression: "foo" * "five"
=> (* "foo" "five")
"foo" * "five" => Type mismatch
../tests/expr.rem(36): `*': Type mismatch
Parsed expression: "foo" + "bar"
=> (+ "foo" "bar")
"foo" + "bar" => "foobar"
Parsed expression: '2024-01-02' + 3
=> (+ 2024-01-02 3)
2024-01-02 + 3 => 2024-01-05
Parsed expression: 3 + '2024-01-02'
=> (+ 3 2024-01-02)
3 + 2024-01-02 => 2024-01-05
Parsed expression: 11:33 + 75
=> (+ 11:33 75)
11:33 + 75 => 12:48
Parsed expression: 75 + 11:33
=> (+ 75 11:33)
75 + 11:33 => 12:48
Parsed expression: '2024-01-01@11:33' + 1500
=> (+ 2024-01-01@11:33 1500)
2024-01-01@11:33 + 1500 => 2024-01-02@12:33
Parsed expression: 1500 + '2024-01-01@11:33'
=> (+ 1500 2024-01-01@11:33)
1500 + 2024-01-01@11:33 => 2024-01-02@12:33
Parsed expression: '2024-03-02' - '2024-01-01'
=> (- 2024-03-02 2024-01-01)
2024-03-02 - 2024-01-01 => 61
Parsed expression: 15:00 - 14:44
=> (- 15:00 14:44)
15:00 - 14:44 => 16
Parsed expression: (1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(
=> Error: Expression too complex
Unparsed: 1+1))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
../tests/expr.rem(49): Expression too complex
Parsed expression: (1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+1)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
=> (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 (+ 1 1)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
1 + 1 => 2
1 + 2 => 3
1 + 3 => 4
1 + 4 => 5
1 + 5 => 6
1 + 6 => 7
1 + 7 => 8
1 + 8 => 9
1 + 9 => 10
1 + 10 => 11
1 + 11 => 12
1 + 12 => 13
1 + 13 => 14
1 + 14 => 15
1 + 15 => 16
1 + 16 => 17
1 + 17 => 18
1 + 18 => 19
1 + 19 => 20
1 + 20 => 21
1 + 21 => 22
1 + 22 => 23
1 + 23 => 24
1 + 24 => 25
1 + 25 => 26
1 + 26 => 27
1 + 27 => 28
1 + 28 => 29
1 + 29 => 30
1 + 30 => 31
1 + 31 => 32
1 + 32 => 33
1 + 33 => 34
1 + 34 => 35
1 + 35 => 36
1 + 36 => 37
1 + 37 => 38
1 + 38 => 39
1 + 39 => 40
1 + 40 => 41
1 + 41 => 42
1 + 42 => 43
1 + 43 => 44
1 + 44 => 45
1 + 45 => 46
1 + 46 => 47
1 + 47 => 48
1 + 48 => 49
1 + 49 => 50
1 + 50 => 51
1 + 51 => 52
1 + 52 => 53
1 + 53 => 54
1 + 54 => 55
1 + 55 => 56
1 + 56 => 57
1 + 57 => 58
1 + 58 => 59
1 + 59 => 60
1 + 60 => 61
1 + 61 => 62
1 + 62 => 63
1 + 63 => 64
1 + 64 => 65
1 + 65 => 66
1 + 66 => 67
1 + 67 => 68
1 + 68 => 69
1 + 69 => 70
1 + 70 => 71
1 + 71 => 72
1 + 72 => 73
1 + 73 => 74
1 + 74 => 75
1 + 75 => 76
1 + 76 => 77
1 + 77 => 78
1 + 78 => 79
1 + 79 => 80
1 + 80 => 81
1 + 81 => 82
1 + 82 => 83
1 + 83 => 84
1 + 84 => 85
1 + 85 => 86
1 + 86 => 87
1 + 87 => 88
1 + 88 => 89
1 + 89 => 90
1 + 90 => 91
1 + 91 => 92
1 + 92 => 93
1 + 93 => 94
1 + 94 => 95
1 + 95 => 96
1 + 96 => 97
1 + 97 => 98
1 + 98 => 99
1 + 99 => 100
1 + 100 => 101
1 + 101 => 102
1 + 102 => 103
1 + 103 => 104
1 + 104 => 105
1 + 105 => 106
1 + 106 => 107
1 + 107 => 108
1 + 108 => 109
1 + 109 => 110
1 + 110 => 111
1 + 111 => 112
1 + 112 => 113
1 + 113 => 114
1 + 114 => 115
1 + 115 => 116
1 + 116 => 117
1 + 117 => 118
1 + 118 => 119
1 + 119 => 120
1 + 120 => 121
1 + 121 => 122
1 + 122 => 123
1 + 123 => 124
1 + 124 => 125
1 + 125 => 126
1 + 126 => 127
1 + 127 => 128
1 + 128 => 129
1 + 129 => 130
1 + 130 => 131
1 + 131 => 132
1 + 132 => 133
1 + 133 => 134
1 + 134 => 135
1 + 135 => 136
1 + 136 => 137
1 + 137 => 138
1 + 138 => 139
1 + 139 => 140
1 + 140 => 141
1 + 141 => 142
1 + 142 => 143
1 + 143 => 144
1 + 144 => 145
1 + 145 => 146
1 + 146 => 147
1 + 147 => 148
1 + 148 => 149
1 + 149 => 150
1 + 150 => 151
1 + 151 => 152
1 + 152 => 153
1 + 153 => 154
1 + 154 => 155
1 + 155 => 156
1 + 156 => 157
1 + 157 => 158
1 + 158 => 159
1 + 159 => 160
1 + 160 => 161
1 + 161 => 162
1 + 162 => 163
1 + 163 => 164
1 + 164 => 165
1 + 165 => 166
1 + 166 => 167
1 + 167 => 168
1 + 168 => 169
1 + 169 => 170
1 + 170 => 171
1 + 171 => 172
1 + 172 => 173
1 + 173 => 174
1 + 174 => 175
1 + 175 => 176
1 + 176 => 177
1 + 177 => 178
1 + 178 => 179
1 + 179 => 180
1 + 180 => 181
1 + 181 => 182
1 + 182 => 183
1 + 183 => 184
1 + 184 => 185
1 + 185 => 186
1 + 186 => 187
1 + 187 => 188
1 + 188 => 189
1 + 189 => 190
1 + 190 => 191
1 + 191 => 192
1 + 192 => 193
1 + 193 => 194
1 + 194 => 195
1 + 195 => 196
1 + 196 => 197
1 + 197 => 198
1 + 198 => 199
1 + 199 => 200
1 + 200 => 201
1 + 201 => 202
1 + 202 => 203
1 + 203 => 204
1 + 204 => 205
1 + 205 => 206
1 + 206 => 207
1 + 207 => 208
1 + 208 => 209
1 + 209 => 210
1 + 210 => 211
1 + 211 => 212
1 + 212 => 213
1 + 213 => 214
1 + 214 => 215
1 + 215 => 216
1 + 216 => 217
1 + 217 => 218
1 + 218 => 219
1 + 219 => 220
1 + 220 => 221
1 + 221 => 222
1 + 222 => 223
1 + 223 => 224
1 + 224 => 225
1 + 225 => 226
1 + 226 => 227
1 + 227 => 228
1 + 228 => 229
1 + 229 => 230
1 + 230 => 231
1 + 231 => 232
1 + 232 => 233
1 + 233 => 234
1 + 234 => 235
1 + 235 => 236
1 + 236 => 237
1 + 237 => 238
1 + 238 => 239
1 + 239 => 240
1 + 240 => 241
1 + 241 => 242
1 + 242 => 243
1 + 243 => 244
1 + 244 => 245
1 + 245 => 246
1 + 246 => 247
1 + 247 => 248
1 + 248 => 249
1 + 249 => 250
No reminders.
Expression nodes allocated: 512
Expression nodes high-water: 499
Expression nodes leaked: 0
Parse level high-water: 2001