diff test/call_suite_aggrs/rand-sig.lua @ 485:0c68b3f91367

- renamed suite_aggrs to call_suite_aggrs for consistency (callback version will be called callback_suite_aggrs)
author Tassilo Philipp
date Thu, 17 Mar 2022 15:41:26 +0100
parents test/suite_aggrs/rand-sig.lua@bd8f5da2c74b
children d45c582b5457
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/call_suite_aggrs/rand-sig.lua	Thu Mar 17 15:41:26 2022 +0100
@@ -0,0 +1,101 @@
+require"config"
+
+-- assure aggr chars are present in pairs (can be weighted, though), to avoid
+-- inf loops; closing chars are allowe to appear alone, as they are ignored
+-- without any opening char (does not make a lot of sense, though)
+pairs_op = { '{', '<' } --, '[' }
+pairs_cl = { '}', '>' } --, ']' }
+
+aggr_op_pattern = '[%'..table.concat(pairs_op,'%')..']'
+
+for i = 1, #pairs_op do
+  if string.find(types, '%'..pairs_op[i]) and not string.find(types, '%'..pairs_cl[i]) then
+    types = types..pairs_cl[i]
+  end
+end
+
+rtypes   = "v"..types
+
+function mkaggr(n_nest, maxdepth, o, c)
+  local s = o
+  local nfields = 0
+
+  repeat
+    local t = c
+    if nfields < maxaggrfields then
+	  repeat
+        local id = math.random(#types)
+        t = types:sub(id,id)
+      until t ~= c or nfields >= minaggrfields
+    end
+
+    s_ = mktype(t, n_nest, maxdepth, o)
+	if(#s_ > 0) then
+      nfields = nfields + 1
+	end
+    s = s..s_
+
+    -- member (which cannot be first char) as array? Disallow multidimensional arrays
+    if #s > 1 and t ~= c and s:sub(-1) ~= ']' and math.random(arraydice) == 1 then
+      s = s..'['..math.random(maxarraylen)..']'
+    end
+  until t == c
+
+  return s
+end
+
+function mktype(t, n_nest, maxdepth, aggr_open)
+  -- aggregate opener?
+  local aggr_i = 0
+  for i = 1, #pairs_op do
+    if pairs_op[i] == t then
+      aggr_i = i
+      break
+    end
+  end
+
+  -- ignore new aggregates if above depth limit
+  if aggr_i ~= 0 and t == pairs_op[aggr_i] then
+    if n_nest < maxdepth then
+      return mkaggr(n_nest + 1, maxdepth, pairs_op[aggr_i], pairs_cl[aggr_i])
+    else
+      return ''
+    end
+  end
+
+  -- aggregate closer?
+  for i = 1, #pairs_cl do
+    if pairs_cl[i] == t then
+      aggr_i = i
+      break
+    end
+  end
+
+  -- if closing char, without any open, ignore
+  if aggr_i ~= 0 and (aggr_open == nil or pairs_op[aggr_i] ~= aggr_open) then
+    return ''
+  end
+
+  return t
+end
+
+math.randomseed(seed)
+local id
+local uniq_sigs = { }
+for i = 1, ncases do
+  local l = ''
+  repeat
+    local nargs = math.random(minargs,maxargs)
+    id = math.random(#rtypes)
+    local sig = { mktype(rtypes:sub(id,id), 0, math.random(maxaggrdepth), nil) } -- random depth avoids excessive nesting
+    for j = 1, nargs do
+      id = math.random(#types)
+      sig[#sig+1] = mktype(types:sub(id,id), 0, math.random(maxaggrdepth), nil) -- random depth avoids excessive nesting
+    end
+    l = table.concat(sig)
+    -- reject dupes, sigs without any aggregate (as this is about aggrs after all), and empty ones (if not wanted)
+  until string.match(l, aggr_op_pattern) ~= nil and uniq_sigs[l] == nil
+  uniq_sigs[l] = 1
+  io.write(l.."\n")
+end
+