1
+ const assert = require ( 'assert' ) ;
1
2
const tape = require ( 'tape' ) ;
2
3
const fs = require ( 'fs' ) ;
3
4
const path = require ( 'path' ) ;
@@ -7,7 +8,6 @@ const smtchecker = require('../smtchecker.js');
7
8
const smtsolver = require ( '../smtsolver.js' ) ;
8
9
9
10
var preamble = 'pragma solidity >=0.0;\n// SPDX-License-Identifier: GPL-3.0\n' ;
10
- var pragmaSMT = 'pragma experimental SMTChecker;\n' ;
11
11
12
12
function collectErrors ( solOutput ) {
13
13
if ( solOutput === undefined ) {
@@ -72,10 +72,20 @@ tape('SMTCheckerCallback', function (t) {
72
72
return { error : 'Fake SMT solver error.' } ;
73
73
} ;
74
74
75
+ var pragmaSMT = '' ;
76
+ var settings = { } ;
77
+ // `pragma experimental SMTChecker;` was deprecated in 0.8.4
78
+ if ( ! semver . gt ( solc . semver ( ) , '0.8.3' ) ) {
79
+ pragmaSMT = 'pragma experimental SMTChecker;\n' ;
80
+ } else {
81
+ settings = { modelChecker : { engine : 'all' } } ;
82
+ }
83
+
75
84
var input = { 'a' : { content : preamble + pragmaSMT + 'contract C { function f(uint x) public pure { assert(x > 0); } }' } } ;
76
85
var inputJSON = JSON . stringify ( {
77
86
language : 'Solidity' ,
78
- sources : input
87
+ sources : input ,
88
+ settings : settings
79
89
} ) ;
80
90
81
91
var tests ;
@@ -152,9 +162,20 @@ tape('SMTCheckerCallback', function (t) {
152
162
st . comment ( 'Collecting ' + sources [ i ] + '...' ) ;
153
163
var source = fs . readFileSync ( sources [ i ] , 'utf8' ) ;
154
164
155
- if ( source . includes ( '// SMTEngine' ) ) {
156
- st . skip ( 'Test requires specific SMTChecker engine.' ) ;
157
- continue ;
165
+ var engine ;
166
+ var option = '// SMTEngine: ' ;
167
+ if ( source . includes ( option ) ) {
168
+ let idx = source . indexOf ( option ) ;
169
+ if ( source . indexOf ( option , idx + 1 ) !== - 1 ) {
170
+ st . skip ( 'SMTEngine option given multiple times.' ) ;
171
+ st . end ( ) ;
172
+ return ;
173
+ }
174
+ let re = new RegExp ( option + '(\\w+)' ) ;
175
+ let m = source . match ( re ) ;
176
+ assert ( m !== undefined ) ;
177
+ assert ( m . length >= 2 ) ;
178
+ engine = m [ 1 ] ;
158
179
}
159
180
160
181
var expected = [ ] ;
@@ -169,7 +190,8 @@ tape('SMTCheckerCallback', function (t) {
169
190
tests [ sources [ i ] ] = {
170
191
expectations : expected ,
171
192
solidity : { test : { content : preamble + source } } ,
172
- ignoreCex : source . includes ( '// SMTIgnoreCex: yes' )
193
+ ignoreCex : source . includes ( '// SMTIgnoreCex: yes' ) ,
194
+ engine : engine
173
195
} ;
174
196
}
175
197
@@ -185,10 +207,17 @@ tape('SMTCheckerCallback', function (t) {
185
207
continue ;
186
208
}
187
209
210
+ var settings = { } ;
211
+ // `pragma experimental SMTChecker;` was deprecated in 0.8.4
212
+ if ( semver . gt ( solc . semver ( ) , '0.8.3' ) ) {
213
+ let engine = test . engine !== undefined ? test . engine : 'all' ;
214
+ settings = { modelChecker : { engine : engine } } ;
215
+ }
188
216
var output = JSON . parse ( solc . compile (
189
217
JSON . stringify ( {
190
218
language : 'Solidity' ,
191
- sources : test . solidity
219
+ sources : test . solidity ,
220
+ settings : settings
192
221
} ) ,
193
222
{ smtSolver : smtchecker . smtCallback ( smtsolver . smtSolver ) }
194
223
) ) ;
0 commit comments