Skip to content

Commit 6933fab

Browse files
CaelmBleiddLipen
andauthored
TsTestResolver extended implementation (#250)
--------- Co-authored-by: Konstantin Chukharev <lipen00@gmail.com>
1 parent 0a1cf13 commit 6933fab

File tree

6 files changed

+339
-236
lines changed

6 files changed

+339
-236
lines changed

usvm-ts/src/main/kotlin/org/usvm/api/TsTest.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,26 @@
11
package org.usvm.api
22

33
import org.jacodb.ets.base.EtsStmt
4+
import org.jacodb.ets.model.EtsClass
5+
import org.jacodb.ets.model.EtsField
6+
import org.jacodb.ets.model.EtsMethod
47

58
data class TsTest(
6-
val parameters: List<TsObject>,
9+
val method: EtsMethod,
10+
val before: TsParametersState,
11+
val after: TsParametersState,
712
val returnValue: TsObject,
813
val trace: List<EtsStmt>? = null,
914
)
1015

16+
data class TsParametersState(
17+
val thisInstance: TsObject?,
18+
val parameters: List<TsObject>,
19+
val globals: Map<EtsClass, List<GlobalFieldValue>>,
20+
)
21+
22+
data class GlobalFieldValue(val field: EtsField, val value: TsObject) // TODO is it right?????
23+
1124
open class TsMethodCoverage
1225

1326
object NoCoverage : TsMethodCoverage()

usvm-ts/src/main/kotlin/org/usvm/machine/interpreter/TsInterpreter.kt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,23 @@ class TsInterpreter(
202202
)
203203

204204
val solver = ctx.solver<EtsType>()
205+
206+
val thisInstanceRef = URegisterStackLValue(ctx.addressSort, method.parameters.count()) // TODO check for statics
207+
val thisRef = state.memory.read(thisInstanceRef).asExpr(ctx.addressSort)
208+
209+
state.pathConstraints += with(ctx) {
210+
mkNot(
211+
mkOr(
212+
ctx.mkHeapRefEq(thisRef, ctx.mkTsNullValue()),
213+
ctx.mkHeapRefEq(thisRef, ctx.mkUndefinedValue())
214+
)
215+
)
216+
}
217+
218+
// TODO fix incorrect type streams
219+
// val thisTypeConstraint = state.memory.types.evalTypeEquals(thisRef, EtsClassType(method.enclosingClass))
220+
// state.pathConstraints += thisTypeConstraint
221+
205222
val model = solver.check(state.pathConstraints).ensureSat().model
206223
state.models = listOf(model)
207224

usvm-ts/src/test/kotlin/org/usvm/samples/Null.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,4 @@ class Null : TsMethodTestRunner() {
2525
{ a, r -> a !is TsObject.TsNull && r.number == 2.0 },
2626
)
2727
}
28-
}
28+
}

usvm-ts/src/test/kotlin/org/usvm/util/TSTestResolver.kt

Lines changed: 0 additions & 227 deletions
This file was deleted.

usvm-ts/src/test/kotlin/org/usvm/util/TSMethodTestRunner.kt renamed to usvm-ts/src/test/kotlin/org/usvm/util/TsMethodTestRunner.kt

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ abstract class TsMethodTestRunner : TestRunner<TsTest, EtsMethod, EtsType?, TsMe
5454
analysisResultsNumberMatcher = ignoreNumberOfAnalysisResults,
5555
analysisResultsMatchers = analysisResultMatchers,
5656
invariants = invariants,
57-
extractValuesToCheck = { r -> r.parameters + r.returnValue },
57+
extractValuesToCheck = { r -> r.before.parameters + r.returnValue },
5858
expectedTypesForExtractedValues = arrayOf(typeTransformer(R::class)),
5959
checkMode = CheckMode.MATCH_PROPERTIES,
6060
coverageChecker = coverageChecker
@@ -72,7 +72,7 @@ abstract class TsMethodTestRunner : TestRunner<TsTest, EtsMethod, EtsType?, TsMe
7272
analysisResultsNumberMatcher = ignoreNumberOfAnalysisResults,
7373
analysisResultsMatchers = analysisResultMatchers,
7474
invariants = invariants,
75-
extractValuesToCheck = { r -> r.parameters + r.returnValue },
75+
extractValuesToCheck = { r -> r.before.parameters + r.returnValue },
7676
expectedTypesForExtractedValues = arrayOf(typeTransformer(T::class), typeTransformer(R::class)),
7777
checkMode = CheckMode.MATCH_PROPERTIES,
7878
coverageChecker = coverageChecker
@@ -90,7 +90,7 @@ abstract class TsMethodTestRunner : TestRunner<TsTest, EtsMethod, EtsType?, TsMe
9090
analysisResultsNumberMatcher = ignoreNumberOfAnalysisResults,
9191
analysisResultsMatchers = analysisResultMatchers,
9292
invariants = invariants,
93-
extractValuesToCheck = { r -> r.parameters + r.returnValue },
93+
extractValuesToCheck = { r -> r.before.parameters + r.returnValue },
9494
expectedTypesForExtractedValues = arrayOf(
9595
typeTransformer(T1::class), typeTransformer(T2::class), typeTransformer(R::class)
9696
),
@@ -110,7 +110,7 @@ abstract class TsMethodTestRunner : TestRunner<TsTest, EtsMethod, EtsType?, TsMe
110110
analysisResultsNumberMatcher = ignoreNumberOfAnalysisResults,
111111
analysisResultsMatchers = analysisResultMatchers,
112112
invariants = invariants,
113-
extractValuesToCheck = { r -> r.parameters + r.returnValue },
113+
extractValuesToCheck = { r -> r.before.parameters + r.returnValue },
114114
expectedTypesForExtractedValues = arrayOf(
115115
typeTransformer(T1::class),
116116
typeTransformer(T2::class),
@@ -133,7 +133,7 @@ abstract class TsMethodTestRunner : TestRunner<TsTest, EtsMethod, EtsType?, TsMe
133133
analysisResultsNumberMatcher = ignoreNumberOfAnalysisResults,
134134
analysisResultsMatchers = analysisResultMatchers,
135135
invariants = invariants,
136-
extractValuesToCheck = { r -> r.parameters + r.returnValue },
136+
extractValuesToCheck = { r -> r.before.parameters + r.returnValue },
137137
expectedTypesForExtractedValues = arrayOf(
138138
typeTransformer(T1::class),
139139
typeTransformer(T2::class),
@@ -173,6 +173,7 @@ abstract class TsMethodTestRunner : TestRunner<TsTest, EtsMethod, EtsType?, TsMe
173173
val signature = EtsClassSignature(it.toString(), EtsFileSignature.DEFAULT)
174174
EtsClassType(signature)
175175
}
176+
176177
TsObject.TsString::class -> EtsStringType
177178
TsObject.TsNumber::class -> EtsNumberType
178179
TsObject.TsNumber.Double::class -> EtsNumberType
@@ -188,6 +189,7 @@ abstract class TsMethodTestRunner : TestRunner<TsTest, EtsMethod, EtsType?, TsMe
188189
val signature = EtsClassSignature("Exception", EtsFileSignature.DEFAULT)
189190
EtsClassType(signature)
190191
}
192+
191193
else -> error("Unsupported type: $klass")
192194
}
193195
}
@@ -196,8 +198,8 @@ abstract class TsMethodTestRunner : TestRunner<TsTest, EtsMethod, EtsType?, TsMe
196198
TsMachine(scene, options).use { machine ->
197199
val states = machine.analyze(listOf(method))
198200
states.map { state ->
199-
val resolver = TsTestResolver(state)
200-
resolver.resolve(method)
201+
val resolver = TsTestResolver()
202+
resolver.resolve(method, state)
201203
}
202204
}
203205
}

0 commit comments

Comments
 (0)