mbt-gen 0.0.13.1 → 0.0.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/mbt-gen.rb +41 -7
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b5c54288ab2aa997c537744ff1888959c3b7b44ef923d16af13c09cb96609434
|
|
4
|
+
data.tar.gz: f727661444b8763cbb7e60ba4c371af16af49cd64bb9e0f4e399e01d0c077cd3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5eb552c215e7e9b97db03dadb8964454c5720c41be7272da5ddb5a2409aeec593a84716581d27fbdda1921a6675935d5df1e8ee800532dfac290d22c945b9d68
|
|
7
|
+
data.tar.gz: 6b169b1aa47ca5ae869bb1985839e77545e50a1f087a78ef0dd00c58d688c324dae41645aca6d573a1b51949ebb6de8c3d076582240a18460955de42bf3eb6de
|
data/lib/mbt-gen.rb
CHANGED
|
@@ -182,6 +182,10 @@ def maxLength_contraint_for_expr(expr, maxLength)
|
|
|
182
182
|
"(<= (str.len #{expr}) #{maxLength})"
|
|
183
183
|
end
|
|
184
184
|
|
|
185
|
+
def minLength_contraint_for_expr(expr, minLength)
|
|
186
|
+
"(>= (str.len #{expr}) #{minLength})"
|
|
187
|
+
end
|
|
188
|
+
|
|
185
189
|
def oneOf_contraint_for_expr(expr, values)
|
|
186
190
|
list = values.map do |val|
|
|
187
191
|
"(= #{expr} \"#{val}\")"
|
|
@@ -246,7 +250,6 @@ def translate_field_def_to_SMTLIB_constraints(progress, solver, fielddef, xpath,
|
|
|
246
250
|
solver.associateAssertionIDWith(assertionID, info)
|
|
247
251
|
solver.to_solver(progress, "(assert (! (=> #{varname}-filled #{regex_constraint_for_expr("#{varname}-value", fielddef[:regex])}) :named #{assertionID}))")
|
|
248
252
|
end
|
|
249
|
-
# TODO: minLength?
|
|
250
253
|
if fielddef[:maxLength] then
|
|
251
254
|
assertionID = "maxLength-#{varname}"
|
|
252
255
|
info = {
|
|
@@ -259,6 +262,18 @@ def translate_field_def_to_SMTLIB_constraints(progress, solver, fielddef, xpath,
|
|
|
259
262
|
solver.associateAssertionIDWith(assertionID, info)
|
|
260
263
|
solver.to_solver(progress, "(assert (! (=> #{varname}-filled #{maxLength_contraint_for_expr("#{varname}-value", fielddef[:maxLength])}) :named #{assertionID}))")
|
|
261
264
|
end
|
|
265
|
+
if fielddef[:minLength] then
|
|
266
|
+
assertionID = "minLength-#{varname}"
|
|
267
|
+
info = {
|
|
268
|
+
:assertion_type => :constraint,
|
|
269
|
+
:xpath => xpath,
|
|
270
|
+
:datatype => :string,
|
|
271
|
+
:value => fielddef[:minLength],
|
|
272
|
+
:constraint_type => :minLength
|
|
273
|
+
}
|
|
274
|
+
solver.associateAssertionIDWith(assertionID, info)
|
|
275
|
+
solver.to_solver(progress, "(assert (! (=> #{varname}-filled #{minLength_contraint_for_expr("#{varname}-value", fielddef[:minLength])}) :named #{assertionID}))")
|
|
276
|
+
end
|
|
262
277
|
if fielddef[:from_list] then
|
|
263
278
|
assertionID = "oneOf-#{varname}"
|
|
264
279
|
list_filename = "#{LISTS_DIR}/#{fielddef[:from_list]}"
|
|
@@ -310,12 +325,16 @@ def translate_list_def_to_SMTLIB_constraints(progress, solver, fielddef, varname
|
|
|
310
325
|
solver.to_solver(progress, "(assert (! (=> (< #{i} #{varname}-size) #{regex_constraint_for_expr("#{varname}-index-#{i}-value", fielddef[:regex])}) :named list-regex-#{varname}-index-#{i}))")
|
|
311
326
|
end
|
|
312
327
|
end
|
|
313
|
-
# TODO: minLength?
|
|
314
328
|
if fielddef[:maxLength] then
|
|
315
329
|
fielddef[:model_maxLength].times do |i|
|
|
316
330
|
solver.to_solver(progress, "(assert (! (=> (< #{i} #{varname}-size) #{maxLength_contraint_for_expr("#{varname}-index-#{i}-value", fielddef[:maxLength])}) :named list-maxLength-#{varname}-index-#{i}))")
|
|
317
331
|
end
|
|
318
332
|
end
|
|
333
|
+
if fielddef[:minLength] then
|
|
334
|
+
fielddef[:model_maxLength].times do |i|
|
|
335
|
+
solver.to_solver(progress, "(assert (! (=> (< #{i} #{varname}-size) #{minLength_contraint_for_expr("#{varname}-index-#{i}-value", fielddef[:minLength])}) :named list-minLength-#{varname}-index-#{i}))")
|
|
336
|
+
end
|
|
337
|
+
end
|
|
319
338
|
when :enum
|
|
320
339
|
fielddef[:model_maxLength].times do |i|
|
|
321
340
|
solver.to_solver(progress, "(assert (! (=> (< #{i} #{varname}-size) #{enum_constraint_for_expr("#{varname}-index-#{i}-value", fielddef[:values])}) :named list-enum-#{varname}-index-#{i}))")
|
|
@@ -412,7 +431,7 @@ def translate_substructure_to_SMTLIB(progress, solver, struct, hash = {})
|
|
|
412
431
|
solver.to_solver(progress, "(assert (! (=> (not #{filled_var_for_field(xpath)}) (= #{size_var_for_list(xpath)} 0)) :named empty-objlist-has-zero-size-#{raw_field(xpath)}))")
|
|
413
432
|
solver.to_solver(progress, "(assert (! (=> (= #{size_var_for_list(xpath)} 0) (not #{filled_var_for_field(xpath)})) :named objlist-has-zero-size-implies-empty-objlist-#{raw_field(xpath)}))")
|
|
414
433
|
minSize = 0
|
|
415
|
-
solver.to_solver(progress, "(assert (! (=> #{filled_var_for_field(xpath)} (and (> #{size_var_for_list(xpath)} #{minSize}) (
|
|
434
|
+
solver.to_solver(progress, "(assert (! (=> #{filled_var_for_field(xpath)} (and (> #{size_var_for_list(xpath)} #{minSize}) (<= #{size_var_for_list(xpath)} #{definition[:model_maxLength]}))) :named filled-objlist-has-positive-size-#{raw_field(xpath)}))")
|
|
416
435
|
solver.to_solver(progress, "(assert (! (=> (> #{size_var_for_list(xpath)} 0) #{filled_var_for_field(xpath)}) :named objlist-has-positive-size-implies-filled-objlist-#{raw_field(xpath)}))")
|
|
417
436
|
definition[:model_maxLength].times do |i|
|
|
418
437
|
ext_xpath = "#{xpath}/#{i}"
|
|
@@ -847,7 +866,11 @@ def pick_solver_value_for_field(field_desc)
|
|
|
847
866
|
if field_desc[:maxLength] then
|
|
848
867
|
"a" * field_desc[:maxLength]
|
|
849
868
|
else
|
|
850
|
-
|
|
869
|
+
if field_desc[:minLength] then
|
|
870
|
+
"a" * field_desc[:minLength]
|
|
871
|
+
else
|
|
872
|
+
"default"
|
|
873
|
+
end
|
|
851
874
|
end
|
|
852
875
|
elsif field_desc[:datatype] == :enum then
|
|
853
876
|
field_desc[:values].first.to_s
|
|
@@ -918,6 +941,16 @@ def build_document_from_model(progress, struct, model)
|
|
|
918
941
|
return doc
|
|
919
942
|
end
|
|
920
943
|
|
|
944
|
+
def model_value_to_int(model_value)
|
|
945
|
+
if model_value.is_a?(Integer) then
|
|
946
|
+
model_value
|
|
947
|
+
else if model_value.is_a?(String) then
|
|
948
|
+
Integer(model_value, 10)
|
|
949
|
+
else
|
|
950
|
+
raise RuntimeError.new("Don't know how to cast this model value into an int: #{model_value.inspect}")
|
|
951
|
+
end
|
|
952
|
+
end
|
|
953
|
+
|
|
921
954
|
def add_model_struct_to_doc(progress, struct, doc, model, prefix = nil)
|
|
922
955
|
struct.each do |key, value|
|
|
923
956
|
next if key == :validation_rules || key == :predicates || key == :parent_link || key == :struct_xpath_prefix || key == :additional_smtlib
|
|
@@ -941,7 +974,7 @@ def add_model_struct_to_doc(progress, struct, doc, model, prefix = nil)
|
|
|
941
974
|
node = node.first
|
|
942
975
|
end
|
|
943
976
|
xpath_element = value[:xpath_element]
|
|
944
|
-
if
|
|
977
|
+
if model_value_to_int(model_value[:size]) > 0 then
|
|
945
978
|
model_value[:value].slice(0, Integer(model_value[:size], 10)).each do |mvalue|
|
|
946
979
|
node.add_child("<#{xpath_element}>#{solver_value_to_string(mvalue)}</#{xpath_element}>")
|
|
947
980
|
end
|
|
@@ -952,8 +985,9 @@ def add_model_struct_to_doc(progress, struct, doc, model, prefix = nil)
|
|
|
952
985
|
node = node.first
|
|
953
986
|
end
|
|
954
987
|
xpath_element = value[:xpath_element]
|
|
955
|
-
|
|
956
|
-
|
|
988
|
+
size = model_value_to_int(model_value[:size])
|
|
989
|
+
if size > 0 then
|
|
990
|
+
size.times do |index|
|
|
957
991
|
cnode = node.add_child("<#{xpath_element}></#{xpath_element}>")
|
|
958
992
|
if cnode.is_a?(Nokogiri::XML::NodeSet) then
|
|
959
993
|
cnode = cnode.first
|