1
+ use std;
2
+
3
+ // These tests used to be separate files, but I wanted to refactor all
4
+ // the common code.
5
+
6
+ import std:: ebml;
7
+ import io:: writer;
8
+ import std:: prettyprint:: serializer;
9
+ import std:: ebml:: serializer;
10
+ import std:: ebml:: deserializer;
11
+
12
+ fn test_ser_and_deser < A > ( a1 : A ,
13
+ expected : str ,
14
+ ebml_ser_fn : fn ( ebml:: writer , A ) ,
15
+ ebml_deser_fn : fn ( ebml:: ebml_deserializer ) -> A ,
16
+ io_ser_fn : fn ( io:: writer , A ) ) {
17
+
18
+ // check the pretty printer:
19
+ io_ser_fn ( io:: stdout ( ) , a1) ;
20
+ let s = io:: with_str_writer { |w| io_ser_fn ( w, a1) } ;
21
+ #debug[ "s == %?" , s] ;
22
+ assert s == expected;
23
+
24
+ // check the EBML serializer:
25
+ let buf = io:: mem_buffer ( ) ;
26
+ let w = ebml:: writer ( buf as io:: writer ) ;
27
+ ebml_ser_fn ( w, a1) ;
28
+ let d = ebml:: new_doc ( @io:: mem_buffer_buf ( buf) ) ;
29
+ let a2 = ebml_deser_fn ( ebml:: ebml_deserializer ( d) ) ;
30
+ io:: print ( "\n a1 = " ) ;
31
+ io_ser_fn ( io:: stdout ( ) , a1) ;
32
+ io:: print ( "\n a2 = " ) ;
33
+ io_ser_fn ( io:: stdout ( ) , a2) ;
34
+ io:: print ( "\n " ) ;
35
+ assert a1 == a2;
36
+
37
+ }
38
+
39
+ #[ auto_serialize]
40
+ enum expr {
41
+ val( uint ) ,
42
+ plus( @expr, @expr) ,
43
+ minus( @expr, @expr)
44
+ }
45
+
46
+
47
+ #[ auto_serialize]
48
+ type spanned < T > = { lo : uint , hi : uint , node : T } ;
49
+
50
+ #[ auto_serialize]
51
+ type spanned_uint = spanned < uint > ;
52
+
53
+ #[ auto_serialize]
54
+ type some_rec = { v : uint_vec } ;
55
+
56
+ #[ auto_serialize]
57
+ enum an_enum = some_rec;
58
+
59
+ #[ auto_serialize]
60
+ type uint_vec = [ uint ] ;
61
+
62
+ #[ auto_serialize]
63
+ type point = { x : uint , y : uint } ;
64
+
65
+ fn main ( ) {
66
+
67
+ test_ser_and_deser ( plus ( @minus ( @val ( 3 u) , @val ( 10 u) ) ,
68
+ @plus ( @val ( 22 u) , @val ( 5 u) ) ) ,
69
+ "plus(@minus(@val(3u), @val(10u)), \
70
+ @plus(@val(22u), @val(5u)))",
71
+ expr:: serialize ( _, _) ,
72
+ expr:: deserialize ( _) ,
73
+ expr:: serialize ( _, _) ) ;
74
+
75
+ test_ser_and_deser ( { lo: 0 u, hi: 5 u, node: 22 u} ,
76
+ "{lo: 0u, hi: 5u, node: 22u}" ,
77
+ spanned_uint:: serialize ( _, _) ,
78
+ spanned_uint:: deserialize ( _) ,
79
+ spanned_uint:: serialize ( _, _) ) ;
80
+
81
+ test_ser_and_deser ( an_enum ( { v: [ 1 u, 2 u, 3 u] } ) ,
82
+ "an_enum({v: [1u, 2u, 3u]})" ,
83
+ an_enum:: serialize ( _, _) ,
84
+ an_enum:: deserialize ( _) ,
85
+ an_enum:: serialize ( _, _) ) ;
86
+
87
+ test_ser_and_deser ( { x: 3 u, y: 5 u} ,
88
+ "{x: 3u, y: 5u}" ,
89
+ point:: serialize ( _, _) ,
90
+ point:: deserialize ( _) ,
91
+ point:: serialize ( _, _) ) ;
92
+
93
+ test_ser_and_deser ( [ 1 u, 2 u, 3 u] ,
94
+ "[1u, 2u, 3u]" ,
95
+ uint_vec:: serialize ( _, _) ,
96
+ uint_vec:: deserialize ( _) ,
97
+ uint_vec:: serialize ( _, _) ) ;
98
+ }
0 commit comments