1+ # Basic Supposition.jl tests to ensure nested streams can be read and written to.
2+
3+ using Supposition: Data, @composed , @check , event!, produce!
4+
5+ include (" ../test/codecdoubleframe.jl" )
6+
7+ const TS_kwarg = @composed (
8+ bufsize= Data. Integers (1 , 2 ^ 10 ),
9+ stop_on_end= Data. Booleans (),
10+ sharedbuf= Data. Booleans (),
11+ ) -> (
12+ if sharedbuf
13+ # default sharedbuf
14+ (;bufsize, stop_on_end)
15+ else
16+ # sharedbuf = false
17+ (;bufsize, stop_on_end, sharedbuf)
18+ end
19+ )
20+
21+ const datas = Data. Vectors (Data. Integers {UInt8} ())
22+ const noopcodecs = Data. Vectors (Data. Just (Noop); max_size= 3 )
23+
24+ function codecwrap (child)
25+ map (child) do x
26+ DataType[
27+ DoubleFrameEncoder;
28+ x;
29+ DoubleFrameDecoder;
30+ ]
31+ end | map (Data. Vectors (child; min_size= 2 , max_size= 2 )) do x
32+ reduce (vcat, x)
33+ end
34+ end
35+
36+ # possible vector of codec types that when read from
37+ # should be equivalent to a Noop.
38+ # Every encoder is balanced with a decoder.
39+ const codecs = Data. Recursive (noopcodecs, codecwrap; max_layers= 4 )
40+
41+ function prepare_kws (codecs)
42+ # res will be a nicely printed summary of the layers of the stream.
43+ res = []
44+ for codec in codecs
45+ kw = Data. produce! (TS_kwarg)
46+ push! (res, (codec, kw))
47+ end
48+ res
49+ end
50+
51+ const read_codecs_kws = map (prepare_kws, codecs)
52+
53+ function wrap_stream (codecs_kws, io:: IO ):: IO
54+ event! (" IOBuffer:" , nothing )
55+ foldl (codecs_kws; init= io) do stream, (codec, kw)
56+ event! (" codec:" , (codec, kw))
57+ TranscodingStream (codec (), stream; kw... )
58+ end
59+ end
60+
61+ @check function read_byte_data (
62+ kws= read_codecs_kws,
63+ data= datas,
64+ )
65+ stream = wrap_stream (kws, IOBuffer (data))
66+ for i in eachindex (data)
67+ read (stream, UInt8) == data[i] || return false
68+ end
69+ eof (stream)
70+ end
71+ @check function read_data (
72+ kws= read_codecs_kws,
73+ data= datas,
74+ )
75+ stream = wrap_stream (kws, IOBuffer (data))
76+ read (stream) == data || return false
77+ eof (stream)
78+ end
79+
80+ # flush all nested streams and return final data
81+ function take_all (stream)
82+ if stream isa Base. GenericIOBuffer
83+ take! (stream)
84+ else
85+ write (stream, TranscodingStreams. TOKEN_END)
86+ flush (stream)
87+ take_all (stream. stream)
88+ end
89+ end
90+
91+ const write_codecs_kws = map (reverse, read_codecs_kws)
92+
93+ @check function write_data (
94+ kws= write_codecs_kws,
95+ data= datas,
96+ )
97+ stream = wrap_stream (kws, IOBuffer ())
98+ write (stream, data) == length (data) || return false
99+ take_all (stream) == data
100+ end
101+ @check function write_byte_data (
102+ kws= write_codecs_kws,
103+ data= datas,
104+ )
105+ stream = wrap_stream (kws, IOBuffer ())
106+ for i in 1 : length (data)
107+ write (stream, data[i]) == 1 || return false
108+ end
109+ take_all (stream) == data
110+ end
0 commit comments