Mercurial > pub > dyncall > dyncall
annotate test/common/rand-sig.lua @ 494:d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
author | Tassilo Philipp |
---|---|
date | Mon, 21 Mar 2022 16:06:16 +0100 |
parents | |
children | 45ac093ca822 |
rev | line source |
---|---|
494
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
1 -- following knobs control generation: |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
2 |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
3 -- required to be defined by who is using this: |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
4 -- minargs |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
5 -- maxargs |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
6 -- ncases |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
7 -- types |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
8 -- seed |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
9 |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
10 -- optional (when including aggregate generation): |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
11 -- minaggrfields |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
12 -- maxaggrfields |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
13 -- maxarraylen |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
14 -- arraydice |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
15 -- maxaggrdepth |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
16 -- reqaggrinsig |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
17 |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
18 |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
19 -------------------------------- |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
20 |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
21 if maxaggrdepth == nil then |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
22 maxaggrdepth = 3 |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
23 end |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
24 |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
25 |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
26 -- assure aggr chars are present in pairs (can be weighted, though), to avoid |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
27 -- inf loops; closing chars are allowed to appear alone, as they are ignored |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
28 -- without any opening char (does not make a lot of sense, though) |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
29 pairs_op = { '{', '<' } --, '[' } |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
30 pairs_cl = { '}', '>' } --, ']' } |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
31 |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
32 for i = 1, #pairs_op do |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
33 if string.find(types, '%'..pairs_op[i]) and not string.find(types, '%'..pairs_cl[i]) then |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
34 types = types..pairs_cl[i] |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
35 end |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
36 end |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
37 |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
38 |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
39 rtypes = "v"..types |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
40 |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
41 function mkaggr(n_nest, maxdepth, o, c) |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
42 local s = o |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
43 local nfields = 0 |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
44 |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
45 repeat |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
46 local t = c |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
47 if nfields < maxaggrfields then |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
48 repeat |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
49 local id = math.random(#types) |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
50 t = types:sub(id,id) |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
51 until t ~= c or nfields >= minaggrfields |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
52 end |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
53 |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
54 s_ = mktype(t, n_nest, maxdepth, o) |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
55 if(#s_ > 0) then |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
56 nfields = nfields + 1 |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
57 end |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
58 s = s..s_ |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
59 |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
60 -- member (which cannot be first char) as array? Disallow multidimensional arrays @@@STRUCT allow multidim? |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
61 if #s > 1 and t ~= c and s:sub(-1) ~= ']' and math.random(arraydice) == 1 then |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
62 s = s..'['..math.random(maxarraylen)..']' |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
63 end |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
64 until t == c |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
65 |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
66 return s |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
67 end |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
68 |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
69 function mktype(t, n_nest, maxdepth, aggr_open) |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
70 -- aggregate opener? |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
71 local aggr_i = 0 |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
72 for i = 1, #pairs_op do |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
73 if pairs_op[i] == t then |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
74 aggr_i = i |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
75 break |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
76 end |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
77 end |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
78 |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
79 -- ignore new aggregates if above depth limit |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
80 if aggr_i ~= 0 and t == pairs_op[aggr_i] then |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
81 if n_nest < maxdepth then |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
82 return mkaggr(n_nest + 1, maxdepth, pairs_op[aggr_i], pairs_cl[aggr_i]) |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
83 else |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
84 return '' |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
85 end |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
86 end |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
87 |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
88 -- aggregate closer? |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
89 for i = 1, #pairs_cl do |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
90 if pairs_cl[i] == t then |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
91 aggr_i = i |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
92 break |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
93 end |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
94 end |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
95 |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
96 -- if closing char, without any open, ignore |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
97 if aggr_i ~= 0 and (aggr_open == nil or pairs_op[aggr_i] ~= aggr_open) then |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
98 return '' |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
99 end |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
100 |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
101 return t |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
102 end |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
103 |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
104 -- pattern matching aggregate start chars |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
105 local aggr_op_pattern = '[%'..table.concat(pairs_op,'%')..']' |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
106 |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
107 math.randomseed(seed) |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
108 local id |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
109 local uniq_sigs = { } |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
110 for i = 1, ncases do |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
111 local l = '' |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
112 repeat |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
113 local nargs = math.random(minargs,maxargs) |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
114 id = math.random(#rtypes) |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
115 local sig = { mktype(rtypes:sub(id,id), 0, math.random(maxaggrdepth), nil) } -- random depth avoids excessive nesting |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
116 for j = 1, nargs do |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
117 id = math.random(#types) |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
118 sig[#sig+1] = mktype(types:sub(id,id), 0, math.random(maxaggrdepth), nil) -- random depth avoids excessive nesting |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
119 end |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
120 l = table.concat(sig) |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
121 -- reject dupes, sigs without any aggregate (as this is about aggrs after all), and empty ones (if not wanted) |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
122 until (reqaggrinsig ~= true or string.match(l, aggr_op_pattern) ~= nil) and uniq_sigs[l] == nil |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
123 uniq_sigs[l] = 1 |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
124 io.write(l.."\n") |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
125 end |
d45c582b5457
- sharing sig generator between call_suite and call_suite_aggrs tests
Tassilo Philipp
parents:
diff
changeset
|
126 |