1
1
#![ cfg( test) ]
2
2
//! Testing of serialization and deserialization of diverse scene components.
3
3
4
- use bevy:: ecs:: entity:: EntityMap ;
4
+ use bevy:: ecs:: entity:: EntityHashMap ;
5
5
use bevy:: prelude:: * ;
6
6
use bevy:: reflect:: erased_serde:: __private:: serde:: de:: DeserializeSeed ;
7
7
use bevy:: reflect:: erased_serde:: __private:: serde:: Serialize ;
8
+ use bevy:: reflect:: TypeRegistry ;
8
9
use bevy:: scene:: serde:: { SceneDeserializer , SceneSerializer } ;
9
10
use bevy:: scene:: ScenePlugin ;
10
11
use bincode:: Options ;
@@ -32,43 +33,43 @@ fn messagepack_roundtrip_equality() {
32
33
33
34
/// Convenience function for testing the roundtrip equality of different serialization methods.
34
35
fn assert_round_trip_equality (
35
- serialize : fn ( DynamicScene , & AppTypeRegistry ) -> Vec < u8 > ,
36
+ serialize : fn ( DynamicScene , & TypeRegistry ) -> Vec < u8 > ,
36
37
deserialize : fn ( SceneDeserializer , & [ u8 ] ) -> DynamicScene ,
37
38
) {
38
39
let mut input_app = create_test_app ( ) ;
39
40
spawn_test_entities ( & mut input_app) ;
40
41
41
- let type_registry = input_app. world . resource :: < AppTypeRegistry > ( ) ;
42
- let scene = DynamicScene :: from_world ( & input_app. world , type_registry ) ;
43
- let serialized = serialize ( scene, type_registry) ;
42
+ let type_registry = input_app. world ( ) . resource :: < AppTypeRegistry > ( ) . read ( ) ;
43
+ let scene = DynamicScene :: from_world ( & input_app. world ( ) ) ;
44
+ let serialized = serialize ( scene, & type_registry) ;
44
45
45
46
// We use a clean app to deserialize into, so nothing of the input app can interfere.
46
47
let mut output_app = create_test_app ( ) ;
47
48
let scene = {
48
49
let scene_deserializer = SceneDeserializer {
49
- type_registry : & output_app. world . resource :: < AppTypeRegistry > ( ) . read ( ) ,
50
+ type_registry : & output_app. world ( ) . resource :: < AppTypeRegistry > ( ) . read ( ) ,
50
51
} ;
51
52
deserialize ( scene_deserializer, & serialized)
52
53
} ;
53
54
54
- let mut entity_map = EntityMap :: default ( ) ;
55
+ let mut entity_map = EntityHashMap :: default ( ) ;
55
56
scene
56
- . write_to_world ( & mut output_app. world , & mut entity_map)
57
+ . write_to_world ( & mut output_app. world_mut ( ) , & mut entity_map)
57
58
. unwrap_or_else ( |error| panic ! ( "Could not add deserialized scene to world: {error}" ) ) ;
58
59
59
60
// TODO: Ideally we'd check whether the input and output world are exactly equal. But the world does not implement Eq.
60
61
// so instead we check the serialized outputs against each other. However, this will miss anything that fails to serialize in the first place.
61
62
62
- let type_registry = input_app. world . resource :: < AppTypeRegistry > ( ) ;
63
- let scene = DynamicScene :: from_world ( & input_app. world , type_registry ) ;
64
- let serialized_again = serialize ( scene, type_registry) ;
63
+ let type_registry = input_app. world ( ) . resource :: < AppTypeRegistry > ( ) . read ( ) ;
64
+ let scene = DynamicScene :: from_world ( & input_app. world ( ) ) ;
65
+ let serialized_again = serialize ( scene, & type_registry) ;
65
66
66
67
assert_eq ! ( serialized, serialized_again) ;
67
68
}
68
69
69
- fn serialize_world_ron ( scene : DynamicScene , type_registry : & AppTypeRegistry ) -> Vec < u8 > {
70
+ fn serialize_world_ron ( scene : DynamicScene , type_registry : & TypeRegistry ) -> Vec < u8 > {
70
71
scene
71
- . serialize_ron ( type_registry)
72
+ . serialize ( type_registry)
72
73
. map ( |output| output. as_bytes ( ) . to_vec ( ) )
73
74
. unwrap_or_else ( |error| panic ! ( "Scene failed to serialize: {error}" ) )
74
75
}
@@ -81,8 +82,8 @@ fn deserialize_world_ron(scene_deserializer: SceneDeserializer, input: &[u8]) ->
81
82
. unwrap_or_else ( |error| panic ! ( "Scene failed to deserialize: {error}" ) )
82
83
}
83
84
84
- fn serialize_world_postcard ( scene : DynamicScene , type_registry : & AppTypeRegistry ) -> Vec < u8 > {
85
- let scene_serializer = SceneSerializer :: new ( & scene, & type_registry. 0 ) ;
85
+ fn serialize_world_postcard ( scene : DynamicScene , type_registry : & TypeRegistry ) -> Vec < u8 > {
86
+ let scene_serializer = SceneSerializer :: new ( & scene, type_registry) ;
86
87
postcard:: to_allocvec ( & scene_serializer)
87
88
. unwrap_or_else ( |error| panic ! ( "Scene failed to serialize: {error}" ) )
88
89
}
@@ -94,8 +95,8 @@ fn deserialize_world_postcard(scene_deserializer: SceneDeserializer, input: &[u8
94
95
. unwrap_or_else ( |error| panic ! ( "Scene failed to deserialize: {error}" ) )
95
96
}
96
97
97
- fn serialize_world_bincode ( scene : DynamicScene , type_registry : & AppTypeRegistry ) -> Vec < u8 > {
98
- let scene_serializer = SceneSerializer :: new ( & scene, & type_registry. 0 ) ;
98
+ fn serialize_world_bincode ( scene : DynamicScene , type_registry : & TypeRegistry ) -> Vec < u8 > {
99
+ let scene_serializer = SceneSerializer :: new ( & scene, type_registry) ;
99
100
bincode:: serialize ( & scene_serializer)
100
101
. unwrap_or_else ( |error| panic ! ( "Scene failed to serialize: {error}" ) )
101
102
}
@@ -107,8 +108,8 @@ fn deserialize_world_bincode(scene_deserializer: SceneDeserializer, input: &[u8]
107
108
. unwrap_or_else ( |error| panic ! ( "Scene failed to deserialize: {error}" ) )
108
109
}
109
110
110
- fn serialize_world_messagepack ( scene : DynamicScene , type_registry : & AppTypeRegistry ) -> Vec < u8 > {
111
- let scene_serializer = SceneSerializer :: new ( & scene, & type_registry. 0 ) ;
111
+ fn serialize_world_messagepack ( scene : DynamicScene , type_registry : & TypeRegistry ) -> Vec < u8 > {
112
+ let scene_serializer = SceneSerializer :: new ( & scene, type_registry) ;
112
113
let mut buf = Vec :: new ( ) ;
113
114
let mut ser = rmp_serde:: Serializer :: new ( & mut buf) ;
114
115
scene_serializer
@@ -130,33 +131,20 @@ fn deserialize_world_messagepack(
130
131
131
132
fn create_test_app ( ) -> App {
132
133
let mut app = App :: new ( ) ;
133
- app. add_plugins ( MinimalPlugins )
134
- . add_plugin ( AssetPlugin :: default ( ) )
135
- . add_plugin ( ScenePlugin :: default ( ) )
136
- . add_plugin ( TransformPlugin :: default ( ) )
137
- . register_type :: < ReferenceComponent > ( )
138
- . register_type :: < Option < Entity > > ( )
139
- . register_type :: < VectorComponent > ( )
140
- . register_type :: < TupleComponent > ( )
141
- // TODO: Without the `Vec` registrations, the serialization
142
- // works. But the de-serialization fails. This does not sound correct.
143
- // Either both should fail, or both should work.
144
- . register_type :: < Vec < u32 > > ( )
145
- . register_type :: < Vec < String > > ( )
146
- // TODO: Without these tuple registrations, the serialization
147
- // works. But the de-serialization fails. This does not sound correct.
148
- // Either both should fail, or both should work.
149
- . register_type :: < ( i32 , String , f32 ) > ( )
150
- . register_type :: < ( bool , bool , u32 ) > ( ) ;
134
+ app. add_plugins ( MinimalPlugins ) . add_plugins ( (
135
+ AssetPlugin :: default ( ) ,
136
+ ScenePlugin ,
137
+ TransformPlugin ,
138
+ ) ) ;
151
139
152
140
app
153
141
}
154
142
155
143
fn spawn_test_entities ( app : & mut App ) {
156
- let entity_1 = app. world . spawn ( TransformBundle :: default ( ) ) . id ( ) ;
157
- app. world . spawn ( ReferenceComponent ( Some ( entity_1) ) ) ;
144
+ let entity_1 = app. world_mut ( ) . spawn ( Transform :: default ( ) ) . id ( ) ;
145
+ app. world_mut ( ) . spawn ( ReferenceComponent ( Some ( entity_1) ) ) ;
158
146
159
- app. world
147
+ app. world_mut ( )
160
148
. spawn ( VectorComponent {
161
149
integer_vector : vec ! [ 1 , 2 , 3 , 4 , 5 , 123456789 ] ,
162
150
// Testing different characters in strings
0 commit comments