Skip to content

Commit 55da8d9

Browse files
authored
Activating tests, adding diffSimulationResults (OpenModelica#112)
- Tests for `ModelicaSystem` and `API` added to `runtests.jl`. - Added API function `diffSimulationResults` to `OMJulia.API`. - Added error handling for `API.loadModel`. - Bumped version of OMJulia to v0.3.0.
1 parent f9f1d76 commit 55da8d9

File tree

7 files changed

+116
-43
lines changed

7 files changed

+116
-43
lines changed

Project.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "OMJulia"
22
uuid = "0f4fe800-344e-11e9-2949-fb537ad918e1"
33
authors = ["Martin Sjölund <[email protected]>", "Arunkumar Palanisamy <[email protected]>"]
4-
version = "0.2.2"
4+
version = "0.3.0"
55

66
[deps]
77
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"

docs/Manifest.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
julia_version = "1.9.1"
44
manifest_format = "2.0"
5-
project_hash = "d7be50ff01e3cc91c96d7b9f8edaa162fd007a28"
5+
project_hash = "ff4eb59ea758b735f7ededf0323b4b573c479c73"
66

77
[[deps.ANSIColoredPrinters]]
88
git-tree-sha1 = "574baf8110975760d391c710b6341da1afa48d8c"
@@ -368,7 +368,7 @@ version = "1.2.0"
368368
deps = ["DataFrames", "DataStructures", "LightXML", "Random", "ZMQ"]
369369
path = ".."
370370
uuid = "0f4fe800-344e-11e9-2949-fb537ad918e1"
371-
version = "0.2.2"
371+
version = "0.3.0"
372372

373373
[[deps.Observables]]
374374
git-tree-sha1 = "6862738f9796b3edc1c09d0890afce4eca9e7e93"

docs/Project.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@ PlotlyJS = "f0f68f2c-4968-5e81-91da-67840de0976a"
88

99
[compat]
1010
Documenter = "^0.27"
11-
OMJulia = "^0.2.1"
11+
OMJulia = "^0.3.0"

src/api.jl

+83-30
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ module API
6262

6363
if isnothing(errorString) && !isnothing(omc)
6464
errorString = strip(OMJulia.sendExpression(omc, "getErrorString()"))
65+
elseif isnothing(errorString)
66+
errorString = ""
6567
end
6668
return new(msg, errorString)
6769
end
@@ -82,16 +84,25 @@ module API
8284
return replace(formattedString, "\\" => "/")
8385
end
8486

85-
function makeVectorString(args)
86-
if length(args) == 0
87+
"""
88+
modelicaString(vec)
89+
90+
Wrappes array in brackets and for each elemetn add quotes and replaces Windows style path seperation `\\` with `/`.
91+
"""
92+
function modelicaString(vec::Vector{String})
93+
return "{" .* join(modelicaString.(vec), ", ") .* "}"
94+
end
95+
96+
"""
97+
makeVectorString(vec)
98+
99+
Add quotes around each string element.
100+
"""
101+
function makeVectorString(vec::Vector{String})
102+
if length(vec) == 0
87103
return "\"\""
88104
end
89-
s = []
90-
for item in args
91-
args = join(["\"", item , "\""])
92-
push!(s, args)
93-
end
94-
return join(s, ", ")
105+
return join("\"" .* vec .* "\"", ", ")
95106
end
96107

97108
"""
@@ -104,7 +115,7 @@ module API
104115
Load file `fileName` (*.mo) and merge it with the loaded AST.
105116
See [OpenModelica scripting API `loadFile`](https://openmodelica.org/doc/OpenModelicaUsersGuide/latest/scripting_api.html#loadfile).
106117
"""
107-
function loadFile(omc,
118+
function loadFile(omc::OMJulia.OMCSession,
108119
fileName::String;
109120
encoding::String = "",
110121
uses::Bool = true,
@@ -132,15 +143,21 @@ module API
132143
133144
See [OpenModelica scripting API `loadModel`](https://openmodelica.org/doc/OpenModelicaUsersGuide/latest/scripting_api.html#loadmodel).
134145
"""
135-
function loadModel(omc,
146+
function loadModel(omc::OMJulia.OMCSession,
136147
className::String;
137148
priorityVersion::Vector{String} = String[],
138149
notify::Bool = false,
139150
languageStandard::String = "",
140151
requireExactVersion::Bool = false
141152
)
142153
exp = join(["loadModel", "(", "className", "=", className, ",", "priorityVersion", "=", "{", makeVectorString(priorityVersion), "}", ",", "notify", "=", notify,",", "languageStandard", "=", modelicaString(languageStandard), ",", "requireExactVersion", "=", requireExactVersion,")"])
143-
return OMJulia.sendExpression(omc, exp)
154+
155+
success = OMJulia.sendExpression(omc, exp)
156+
157+
if !success
158+
throw(ScriptingError(omc, msg = "Failed to load model $(className)."))
159+
end
160+
return success
144161
end
145162

146163
"""
@@ -161,7 +178,7 @@ module API
161178
162179
See [OpenModelica scripting API `simulate`](https://openmodelica.org/doc/OpenModelicaUsersGuide/latest/scripting_api.html#simulate).
163180
"""
164-
function simulate(omc,
181+
function simulate(omc::OMJulia.OMCSession,
165182
className::String;
166183
startTime::Float64 = 0.0,
167184
stopTime::Union{Float64, Nothing} = nothing,
@@ -222,7 +239,7 @@ module API
222239
223240
See [OpenModelica scripting API `buildModel`](https://openmodelica.org/doc/OpenModelicaUsersGuide/latest/scripting_api.html#buildmodel).
224241
"""
225-
function buildModel(omc,
242+
function buildModel(omc::OMJulia.OMCSession,
226243
className::String;
227244
startTime::Float64 = 0.0,
228245
stopTime::Float64 = 1.0,
@@ -255,7 +272,7 @@ module API
255272
256273
See [OpenModelica scripting API `getClassNames`](https://openmodelica.org/doc/OpenModelicaUsersGuide/latest/scripting_api.html#getclassnames).
257274
"""
258-
function getClassNames(omc;
275+
function getClassNames(omc::OMJulia.OMCSession;
259276
class_::String = "",
260277
recursive::Bool = false,
261278
qualified::Bool = false,
@@ -272,11 +289,7 @@ module API
272289

273290
exp = "getClassNames($args)"
274291

275-
try
276-
return OMJulia.sendExpression(omc, exp)
277-
finally
278-
return OMJulia.sendExpression(omc, exp, parsed=false)
279-
end
292+
return OMJulia.sendExpression(omc, exp)
280293
end
281294

282295
"""
@@ -288,7 +301,7 @@ module API
288301
289302
See [OpenModelica scripting API `readSimulationResult`](https://openmodelica.org/doc/OpenModelicaUsersGuide/latest/scripting_api.html#readsimulationresult).
290303
"""
291-
function readSimulationResult(omc,
304+
function readSimulationResult(omc::OMJulia.OMCSession,
292305
filename::String,
293306
variables::Vector{String} = String[],
294307
size::Int64 = 0
@@ -305,7 +318,7 @@ module API
305318
306319
See [OpenModelica scripting API `readSimulationResultSize`](https://openmodelica.org/doc/OpenModelicaUsersGuide/latest/scripting_api.html#readsimulationresultsize).
307320
"""
308-
function readSimulationResultSize(omc,
321+
function readSimulationResultSize(omc::OMJulia.OMCSession,
309322
fileName::String
310323
)
311324

@@ -322,7 +335,7 @@ module API
322335
323336
See [OpenModelica scripting API `readSimulationResultVars`](https://openmodelica.org/doc/OpenModelicaUsersGuide/latest/scripting_api.html#readsimulationresultvars).
324337
"""
325-
function readSimulationResultVars(omc,
338+
function readSimulationResultVars(omc::OMJulia.OMCSession,
326339
fileName::String;
327340
readParameters::Bool = true,
328341
openmodelicaStyle::Bool = false
@@ -342,7 +355,7 @@ module API
342355
343356
See [OpenModelica scripting API `closeSimulationResultFile`](https://openmodelica.org/doc/OpenModelicaUsersGuide/latest/scripting_api.html#closesimulationresultfile).
344357
"""
345-
function closeSimulationResultFile(omc)
358+
function closeSimulationResultFile(omc::OMJulia.OMCSession)
346359
return OMJulia.sendExpression(omc, "closeSimulationResultFile()")
347360
end
348361

@@ -353,7 +366,7 @@ module API
353366
354367
See [OpenModelica scripting API `setCommandLineOptions`](https://openmodelica.org/doc/OpenModelicaUsersGuide/latest/scripting_api.html#setcommandlineoptions).
355368
"""
356-
function setCommandLineOptions(omc,
369+
function setCommandLineOptions(omc::OMJulia.OMCSession,
357370
option::String
358371
)
359372

@@ -374,7 +387,7 @@ module API
374387
375388
See [OpenModelica scripting API `cd`](https://openmodelica.org/doc/OpenModelicaUsersGuide/latest/scripting_api.html#cd).
376389
"""
377-
function cd(omc,
390+
function cd(omc::OMJulia.OMCSession,
378391
newWorkingDirectory::String = "";
379392
)
380393

@@ -392,7 +405,7 @@ module API
392405
393406
See [OpenModelica scripting API `linearize`](https://openmodelica.org/doc/OpenModelicaUsersGuide/latest/scripting_api.html#linearize).
394407
"""
395-
function linearize(omc,
408+
function linearize(omc::OMJulia.OMCSession,
396409
className::String;
397410
startTime::Float64 = 0.0,
398411
stopTime::Float64 = 1.0,
@@ -425,7 +438,7 @@ module API
425438
426439
See [OpenModelica scripting API `buildModelFMU`](https://openmodelica.org/doc/OpenModelicaUsersGuide/latest/scripting_api.html#buildmodelfmu).
427440
"""
428-
function buildModelFMU(omc,
441+
function buildModelFMU(omc::OMJulia.OMCSession,
429442
className::String;
430443
version::String = "2.0",
431444
fmuType::String = "me",
@@ -450,7 +463,7 @@ module API
450463
451464
See [OpenModelica scripting API `getErrorString`](https://openmodelica.org/doc/OpenModelicaUsersGuide/latest/scripting_api.html#geterrorstring).
452465
"""
453-
function getErrorString(omc;
466+
function getErrorString(omc::OMJulia.OMCSession;
454467
warningsAsErrors::Bool = false
455468
)
456469

@@ -465,7 +478,7 @@ module API
465478
466479
See [OpenModelica scripting API `getVersion`](https://openmodelica.org/doc/OpenModelicaUsersGuide/latest/scripting_api.html#getversion).
467480
"""
468-
function getVersion(omc)
481+
function getVersion(omc::OMJulia.OMCSession)
469482
exp = join(["getVersion()"])
470483
return OMJulia.sendExpression(omc, exp)
471484
end
@@ -477,8 +490,48 @@ module API
477490
478491
See [OpenModelica scripting API `getInstallationDirectoryPath`](https://openmodelica.org/doc/OpenModelicaUsersGuide/latest/scripting_api.html#getinstallationdirectorypath).
479492
"""
480-
function getInstallationDirectoryPath(omc)
493+
function getInstallationDirectoryPath(omc::OMJulia.OMCSession)
481494
exp = join(["getInstallationDirectoryPath()"])
482495
return OMJulia.sendExpression(omc, exp)
483496
end
497+
498+
"""
499+
diffSimulationResults(omc, actualFile, expectedFile, diffPrefix;
500+
relTol = 1e-3,
501+
relTolDiffMinMax = 1e-4,
502+
rangeDelta = 0.002,
503+
vars = String[],
504+
keepEqualResults = false)
505+
506+
Compares simulation results.
507+
508+
See [OpenModelica scripting API `diffSimulationResults`](https://openmodelica.org/doc/OpenModelicaUsersGuide/latest/scripting_api.html#diffsimulationresults).
509+
"""
510+
function diffSimulationResults(omc::OMJulia.OMCSession,
511+
actualFile::String,
512+
expectedFile::String,
513+
diffPrefix::String;
514+
relTol::Float64 = 1e-3,
515+
relTolDiffMinMax::Float64 = 1e-4,
516+
rangeDelta::Float64 = 0.002,
517+
vars::Vector{String} = String[],
518+
keepEqualResults::Bool = false)
519+
520+
exp = "diffSimulationResults($(modelicaString(actualFile)),
521+
$(modelicaString(expectedFile)),
522+
$(modelicaString(diffPrefix)),
523+
relTol=$relTol,
524+
relTolDiffMinMax=$relTolDiffMinMax,
525+
rangeDelta=$rangeDelta,
526+
vars=$(modelicaString(vars)),
527+
keepEqualResults=$keepEqualResults)"
528+
@debug "$exp"
529+
ret = OMJulia.sendExpression(omc, exp)
530+
531+
if isnothing(ret)
532+
return (true, String[])
533+
else
534+
return (ret[1], convert(Vector{String}, ret[2]))
535+
end
536+
end
484537
end

test/Project.toml

+3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
[deps]
2+
CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b"
3+
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
4+
OMJulia = "0f4fe800-344e-11e9-2949-fb537ad918e1"
25
SafeTestsets = "1bc83da4-3b8d-516f-aca4-4fe02f6d838f"
36
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"

test/apiTest.jl

+24-9
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ CONDITIONS OF OSMC-PL.
2727
=#
2828

2929
using Test
30+
using CSV
31+
using DataFrames
3032
import OMJulia
3133

3234
@testset "API" begin
@@ -38,11 +40,12 @@ import OMJulia
3840
end
3941

4042
omc = OMJulia.OMCSession()
41-
@test OMJulia.API.loadFile(omc, "../docs/testmodels/BouncingBall.mo")
43+
@test OMJulia.API.loadFile(omc, joinpath(@__DIR__, "../docs/testmodels/BouncingBall.mo"))
4244

4345
# Enter non-existing directory
44-
@test_throws OMJulia.ScriptingError
45-
OMJulia.API.cd(omc, "this/is/not/a/valid/directory/I/hope/otherwise/our/test/does/some/wild/stuff")
46+
@test_throws OMJulia.API.ScriptingError throw(OMJulia.API.ScriptingError(msg = "Test error message."))
47+
@test_throws OMJulia.API.ScriptingError throw(OMJulia.API.ScriptingError(omc, msg = "Test error message."))
48+
@test_throws OMJulia.API.ScriptingError OMJulia.API.cd(omc, "this/is/not/a/valid/directory/I/hope/otherwise/our/test/does/some/wild/stuff")
4649

4750
dir = OMJulia.API.cd(omc, workdir)
4851
result2 = OMJulia.API.buildModel(omc, "BouncingBall")
@@ -57,18 +60,30 @@ import OMJulia
5760
vars = OMJulia.API.readSimulationResultVars(omc, resultfile)
5861
@test var = "h" in vars
5962

60-
simres = OMJulia.API.readSimulationResult(omc, resultfile, ["h"])
61-
@test simres[1][1] == 1.0
63+
simres = OMJulia.API.readSimulationResult(omc, resultfile, ["time", "h", "v"])
64+
@test simres[2][1] == 1.0
65+
66+
df = DataFrame(:time => simres[1], :h => simres[2], :v => simres[3])
67+
expectedFile = joinpath(workdir, "BouncingBall_ref.csv")
68+
wrongExpectedFile = joinpath(workdir, "BouncingBall_wrong.csv")
69+
CSV.write(expectedFile, df)
70+
df2 = copy(df)
71+
df2[:,2] .= df2[:,2] .* 0.01
72+
CSV.write(wrongExpectedFile, df2)
73+
74+
@test (true, String[]) == OMJulia.API.diffSimulationResults(omc, resultfile, expectedFile, "diff"; vars=String[])
75+
@test (true, String[]) == OMJulia.API.diffSimulationResults(omc, resultfile, expectedFile, "diff"; vars=["h", "v"])
76+
@test (false, ["h"]) == OMJulia.API.diffSimulationResults(omc, resultfile, wrongExpectedFile, "diff"; vars=["h", "v"])
6277

6378
fmu = joinpath(workdir, "BouncingBall.fmu")
6479
OMJulia.API.buildModelFMU(omc, "BouncingBall")
6580
@test isfile(fmu)
6681

67-
result3 = OMJulia.API.setCommandLineOptions(omc, "--generateSymbolicLinearization")
68-
@test result3 == true
82+
@test OMJulia.API.setCommandLineOptions(omc, "--generateSymbolicLinearization")
83+
84+
@test OMJulia.API.loadFile(omc, joinpath(@__DIR__, "../docs/testmodels/ModSeborgCSTRorg.mo"))
6985

70-
classNames = OMJulia.API.getClassNames()
71-
@test classNames == [:BouncingBall]
86+
@test [:BouncingBall, :ModSeborgCSTRorg] == sort(OMJulia.API.getClassNames(omc))
7287

7388
OMJulia.quit(omc)
7489
end

test/runtests.jl

+2
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,6 @@ using Test
3232
@testset "OMJulia" begin
3333
@safetestset "Parsing" begin include("parserTest.jl") end
3434
@safetestset "OMCSession" begin include("omcTest.jl") end
35+
@safetestset "ModelicaSystem" begin include("modelicaSystemTest.jl") end
36+
@safetestset "API" begin include("apiTest.jl") end
3537
end

0 commit comments

Comments
 (0)