SolidCraftSmokeTest.kt
src/jvmMain/kotlin/afield/geometry/solid/solidcraft/SolidCraftSmokeTest.kt · 49 lines
package afield.geometry.solid.solidcraft
import kotlin.math.abs
object SolidCraftSmokeTest
Run with ./gradlew smokeSolidCraft after opting into the native build.
@JvmStatic fun main(args: Array<String>)
body — 42 lines, from line 7
@JvmStatic fun main(args: Array<String>) {
check(SolidCraftLibrary.isAvailable) { SolidCraftLibrary.describe() }
SolidCraftDesign.openBundledExample().use { design ->
val before = design.summary()
val bodies = before.getJSONArray("bodies")
check(bodies.length() == 1) { "expected one evaluated body: $before" }
val initialVolume = bodies.getJSONObject(0).getDouble("volume")
check(initialVolume > 0.0)
val initialMesh = design.mesh(tolerance = 0.1)
check(initialMesh.positions.isNotEmpty() && initialMesh.indices.isNotEmpty())
check(initialMesh.faceIds.size == initialMesh.indices.size / 3)
check(initialMesh.toTriMesh().triangleCount == initialMesh.faceIds.size)
design.setParameter("width", "50 mm")
val after = design.summary()
val editedVolume = after.getJSONArray("bodies").getJSONObject(0).getDouble("volume")
check(abs(editedVolume - initialVolume) > 1.0) {
"width edit had no geometric effect: $initialVolume -> $editedVolume"
}
check(design.mesh(tolerance = 0.1).indices.isNotEmpty())
val step = design.exportStep()
check(step.size > 100 && String(step, Charsets.UTF_8).contains("ISO-10303-21"))
val stl = design.exportStl()
check(stl.size > 84)
val saved = design.saveDesign()
SolidCraftDesign.open(saved).use { reopened ->
val reopenedVolume = reopened.summary().getJSONArray("bodies").getJSONObject(0).getDouble("volume")
check(abs(reopenedVolume - editedVolume) < 1e-6)
}
val failure = runCatching { design.setParameter("width", "invalid_expression") }.exceptionOrNull()
check(failure != null) { "invalid parameter unexpectedly succeeded" }
val retainedVolume = design.summary().getJSONArray("bodies").getJSONObject(0).getDouble("volume")
check(abs(retainedVolume - editedVolume) < 1e-6) { "failed edit changed the live model" }
println("SolidCraft FFM smoke passed: volume $initialVolume -> $editedVolume, ${initialMesh.faceIds.size} triangles, ${step.size} STEP bytes")
}
SolidCraftBuilderSmokeTest.main(args)
}
}