1function _test(produce, consume, check)
2	local _from = Stash()
3	local _to = Stash()
4
5	if produce.seq then
6		local _seq = _from:sequence()
7		produce.seq(_seq)
8		_seq:pop()
9	elseif produce.tup then
10		local _tup = _from:tuple()
11		produce.tup(_tup)
12		_tup:pop()
13	end
14
15	_from:read()
16
17	if consume.seq then
18		local _seq = _to:sequence()
19		consume.seq(128, _from, _seq)
20		_seq:pop()
21	elseif consume.tup then
22		local _tup = _to:tuple()
23		consume.tup(_from, _tup)
24		_tup:pop()
25	end
26
27	_to:read()
28
29	if check then
30		check(_to)
31	end
32
33	local _state = Stash()
34
35	if stash then
36		stash(_state)
37	end
38
39	_state:read()
40
41	if apply then
42		apply(_state)
43	end
44
45	_state:write()
46
47	if save then
48		save(_state)
49	end
50
51	_state:read()
52
53	if restore then
54		restore(_state)
55	end
56
57	if once then
58		local n = 128
59		local _seq0 = Stash()
60		local _seq1 = Stash()
61		local _seq2 = Stash()
62		local _seq3 = Stash()
63		local _seq4 = Stash()
64		local _forge0 = Stash()
65		local _forge1 = Stash()
66		local _forge2 = Stash()
67		local _forge3 = Stash()
68		local _forge4 = Stash()
69		_seq0:sequence():pop()
70		_seq0:read()
71		_seq1:sequence():pop()
72		_seq1:read()
73		_seq2:sequence():pop()
74		_seq2:read()
75		_seq3:sequence():pop()
76		_seq3:read()
77		_seq4:sequence():pop()
78		_seq4:read()
79
80		once(n, _seq0, _forge0, _seq1, _forge1, _seq2, _forge2, _seq3, _forge3, _seq4, _forge4)
81	end
82
83	if run then
84		local n = 128
85		local _seq0 = Stash()
86		local _seq1 = Stash()
87		local _seq2 = Stash()
88		local _seq3 = Stash()
89		local _seq4 = Stash()
90		local _forge0 = Stash()
91		local _forge1 = Stash()
92		local _forge2 = Stash()
93		local _forge3 = Stash()
94		local _forge4 = Stash()
95		_seq0:sequence():pop()
96		_seq0:read()
97		_seq1:sequence():pop()
98		_seq1:read()
99		_seq2:sequence():pop()
100		_seq2:read()
101		_seq3:sequence():pop()
102		_seq3:read()
103		_seq4:sequence():pop()
104		_seq4:read()
105
106		run(n, _seq0, _forge0, _seq1, _forge1, _seq2, _forge2, _seq3, _forge3, _seq4, _forge4)
107	end
108end
109
110local function parse(pin)
111	if not pin then return end
112
113	local fin = io.input(pin)
114	if not fin then return end
115
116	local txt = fin:read('*all')
117	fin:close()
118
119	for id, o in string.gmatch(txt, '<pre><code%s*data%-ref%s*=%s*"(.-)"%s*>(.-)</code></pre>') do
120		o = string.gsub(o, '&amp;', '&')
121		o = string.gsub(o, '&lt;', '<')
122		o = string.gsub(o, '&gt;', '>')
123
124		assert(id)
125		assert(o)
126
127		run = nil
128		once = nil
129		stash = nil
130		apply = nil
131		save = nil
132		restore = nil
133
134		stash_sequence = nil
135		stash_tuple = nil
136
137		apply_sequence = nil
138		apply_tuple = nil
139
140		check = nil
141
142		print('[test] ' .. id)
143
144		local chunk = load(o)
145		assert(chunk)
146
147		chunk()
148
149		local _produce = {
150			seq = stash_sequence,
151			tup = stash_tuple
152		}
153
154		local _consume = {
155			seq = apply_sequence,
156			tup = apply_tuple
157		}
158
159		_test(_produce, _consume, check)
160
161		collectgarbage()
162	end
163end
164
165parse('../manual/manual.html.in')
166