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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/mbt-gen.rb +41 -7
  3. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a735505ef6ca3f6784860c7a01aa8abafdcfed996095718d94ed2caeee517c6a
4
- data.tar.gz: 1822f83dfae7c22337e3754fe204955b02861a33f13558034a331092235d2c06
3
+ metadata.gz: b5c54288ab2aa997c537744ff1888959c3b7b44ef923d16af13c09cb96609434
4
+ data.tar.gz: f727661444b8763cbb7e60ba4c371af16af49cd64bb9e0f4e399e01d0c077cd3
5
5
  SHA512:
6
- metadata.gz: 36a74c094e81a175ecc802dcd93f5da64660ff84712672752b95d139f17985945814b6ce84e7910f286c1b2f229cdb8a026b8c42049ef4779f5b36af9c47d465
7
- data.tar.gz: 98307fab8e79ca0df312ff6a6375cc02c103c025e0bde84cc3fbf350e88b1062ffe93603bba0212344d51025ef839602d12e4389ea4f94f31a3c29208cc5f63b
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}) (< #{size_var_for_list(xpath)} #{definition[:model_maxLength]}))) :named filled-objlist-has-positive-size-#{raw_field(xpath)}))")
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
- "default"
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 Integer(model_value[:size], 10) > 0 then
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
- if Integer(model_value[:size], 10) > 0 then
956
- model_value[:size].times do |index|
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
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mbt-gen
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.13.1
4
+ version: 0.0.14.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - FM-enthusiast