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