Infrastructure: Switch testing over to Autotest.
[mLib] / struct / t / sym-gtest.py
CommitLineData
7cf5c72a
MW
1#! /usr/bin/python
2### -*-python-*-
3###
4### Generate input script and expected output for hash tables.
5
6import sys as SYS
7import random as R
8
9###--------------------------------------------------------------------------
10### Command-line parsing.
11
12SYS.argv[0:1] = []
13def arg(default = None):
14 if len(SYS.argv):
15 r = SYS.argv[0]
16 SYS.argv[0:1] = []
17 return r
18 else:
19 return default
20
21R.seed(None)
22SEED = int(arg(str(R.randrange(0, 1 << 32))), 0)
23R.seed(SEED)
24
25LINES = int(arg(1000))
26
27###--------------------------------------------------------------------------
28### Word list.
29
30def word():
31 def char(): return 'abcdefghijklmnopqrstuvwxyz'[R.randrange(0, 26)]
32 word = char() + char() + char()
33 while R.randrange(0, 6) != 0: word += char()
34 return word
35
36## for i in ['/usr/share/dict/words', '/usr/dict/words']:
37## try:
38## WORDS = [line[:-1] for line in open(i)]
39## raise Exception
40## except:
41## pass
42## else:
43## def word():
44## return WORDS[R.randrange(0, len(WORDS))]
45## break
46
47###--------------------------------------------------------------------------
48### Initialization.
49
50SERIAL = 1
51MAP = {}
52
53SCRIPT = open('sym.script', 'w')
54WIN = open('expout', 'w')
55
56###--------------------------------------------------------------------------
57### Utility functions.
58
59OPS = []
60def op(weight):
61 """
62 Operation decorator. Add the following function to the operations table,
63 with the given probability WEIGHT. This works as follows: if TOTAL is the
64 total of all the WEIGHTs, then this operation has a probability of
65 WEIGHT/TOTAL of being selected.
66 """
67 def _(cls):
68 OPS.append((weight, cls))
69 return cls
70 return _
71
72def serial():
73 """Return the next number in a simple sequence."""
74 global SERIAL
75 SERIAL += 1
76 return SERIAL - 1
77
78###--------------------------------------------------------------------------
79### The actual operations.
80
81@op(10)
82def op_set():
83 w = word()
84 n = serial()
85 SCRIPT.write('set %s %d\n' % (w, n))
86 MAP[w] = n
87
88@op(10)
89def op_get():
90 w = word()
91 try:
92 WIN.write('%d\n' % MAP[w])
93 except KeyError:
94 if R.randrange(8): return
95 WIN.write('*MISSING*\n')
96 SCRIPT.write('get %s\n' % (w))
97
98@op(10)
99def op_del():
100 w = word()
101 try:
102 del MAP[w]
103 except KeyError:
104 if R.randrange(8): return
105 WIN.write('*MISSING*\n')
106 SCRIPT.write('del %s\n' % (w))
107
108@op(4)
109def op_count():
110 SCRIPT.write('count\n')
111 WIN.write('%d\n' % len(MAP))
112
113@op(1)
114def op_show():
115 SCRIPT.write('show\n')
116 if not MAP:
117 WIN.write('*EMPTY*\n')
118 else:
119 kk = MAP.keys()
120 kk.sort()
121 WIN.write(' '.join(['%s:%d' % (k, MAP[k]) for k in kk]) + '\n')
122
123###--------------------------------------------------------------------------
124### Generate the output.
125
126OPTAB = []
127for p, func in OPS:
128 OPTAB += [func] * p
129for i in xrange(LINES):
130 OPTAB[R.randrange(0, len(OPTAB))]()
131op_show()
132
133SCRIPT.close()
134WIN.close()
135open('sym.seed', 'w').write('sym-gtest seed = %08x\n' % SEED)
136
137###----- That's all, folks --------------------------------------------------