@@ -93,6 +93,20 @@ impl<R: AssetReader> AssetReader for LockGatedReader<R> {
9393 }
9494}
9595
96+ /// Serializes `text` into a `CoolText` that can be loaded.
97+ ///
98+ /// This doesn't support all the features of `CoolText`, so more complex scenarios may require doing
99+ /// this manually.
100+ fn serialize_as_cool_text ( text : & str ) -> String {
101+ let cool_text_ron = CoolTextRon {
102+ text : text. into ( ) ,
103+ dependencies : vec ! [ ] ,
104+ embedded_dependencies : vec ! [ ] ,
105+ sub_texts : vec ! [ ] ,
106+ } ;
107+ ron:: ser:: to_string_pretty ( & cool_text_ron, PrettyConfig :: new ( ) . new_line ( "\n " ) ) . unwrap ( )
108+ }
109+
96110fn create_app_with_asset_processor ( extra_sources : & [ String ] ) -> AppWithProcessor {
97111 let mut app = App :: new ( ) ;
98112 let source_gate = Arc :: new ( RwLock :: new ( ( ) ) ) ;
@@ -945,15 +959,6 @@ fn asset_processor_processes_all_sources() {
945959 // All the assets will have the same path, but they will still be separately processed since
946960 // they are in different sources.
947961 let path = Path :: new ( "asset.cool.ron" ) ;
948- let serialize_as_cool_text = |text : & str | {
949- let cool_text_ron = CoolTextRon {
950- text : text. into ( ) ,
951- dependencies : vec ! [ ] ,
952- embedded_dependencies : vec ! [ ] ,
953- sub_texts : vec ! [ ] ,
954- } ;
955- ron:: ser:: to_string_pretty ( & cool_text_ron, PrettyConfig :: new ( ) . new_line ( "\n " ) ) . unwrap ( )
956- } ;
957962 default_source_dir. insert_asset_text ( path, & serialize_as_cool_text ( "default asset" ) ) ;
958963 custom_1_source_dir. insert_asset_text ( path, & serialize_as_cool_text ( "custom 1 asset" ) ) ;
959964 custom_2_source_dir. insert_asset_text ( path, & serialize_as_cool_text ( "custom 2 asset" ) ) ;
@@ -1244,3 +1249,73 @@ fn nested_loads_of_processed_asset_reprocesses_on_reload() {
12441249
12451250 assert_eq ! ( get_process_count( ) , 7 ) ;
12461251}
1252+
1253+ #[ test]
1254+ fn clears_invalid_data_from_processed_dir ( ) {
1255+ let AppWithProcessor {
1256+ mut app,
1257+ source_gate,
1258+ default_source_dirs :
1259+ ProcessingDirs {
1260+ source : default_source_dir,
1261+ processed : default_processed_dir,
1262+ ..
1263+ } ,
1264+ ..
1265+ } = create_app_with_asset_processor ( & [ ] ) ;
1266+
1267+ type CoolTextProcessor = LoadTransformAndSave <
1268+ CoolTextLoader ,
1269+ RootAssetTransformer < AddText , CoolText > ,
1270+ CoolTextSaver ,
1271+ > ;
1272+ app. init_asset :: < CoolText > ( )
1273+ . init_asset :: < SubText > ( )
1274+ . register_asset_loader ( CoolTextLoader )
1275+ . register_asset_processor ( CoolTextProcessor :: new (
1276+ RootAssetTransformer :: new ( AddText ( " processed" . to_string ( ) ) ) ,
1277+ CoolTextSaver ,
1278+ ) )
1279+ . set_default_asset_processor :: < CoolTextProcessor > ( "cool.ron" ) ;
1280+
1281+ let guard = source_gate. write_blocking ( ) ;
1282+
1283+ default_source_dir. insert_asset_text ( Path :: new ( "a.cool.ron" ) , & serialize_as_cool_text ( "a" ) ) ;
1284+ default_source_dir. insert_asset_text ( Path :: new ( "dir/b.cool.ron" ) , & serialize_as_cool_text ( "b" ) ) ;
1285+ default_source_dir. insert_asset_text (
1286+ Path :: new ( "dir/subdir/c.cool.ron" ) ,
1287+ & serialize_as_cool_text ( "c" ) ,
1288+ ) ;
1289+
1290+ // This asset has the right data, but no meta, so it should be reprocessed.
1291+ let a = Path :: new ( "a.cool.ron" ) ;
1292+ default_processed_dir. insert_asset_text ( a, & serialize_as_cool_text ( "a processed" ) ) ;
1293+ // These assets aren't present in the unprocessed directory, so they should be deleted.
1294+ let missing1 = Path :: new ( "missing1.cool.ron" ) ;
1295+ let missing2 = Path :: new ( "dir/missing2.cool.ron" ) ;
1296+ let missing3 = Path :: new ( "other_dir/missing3.cool.ron" ) ;
1297+ default_processed_dir. insert_asset_text ( missing1, & serialize_as_cool_text ( "missing1" ) ) ;
1298+ default_processed_dir. insert_meta_text ( missing1, "" ) ; // This asset has metadata.
1299+ default_processed_dir. insert_asset_text ( missing2, & serialize_as_cool_text ( "missing2" ) ) ;
1300+ default_processed_dir. insert_asset_text ( missing3, & serialize_as_cool_text ( "missing3" ) ) ;
1301+ // This directory is empty, so it should be deleted.
1302+ let empty_dir = Path :: new ( "empty_dir" ) ;
1303+ let empty_dir_subdir = Path :: new ( "empty_dir/empty_subdir" ) ;
1304+ default_processed_dir. get_or_insert_dir ( empty_dir_subdir) ;
1305+
1306+ run_app_until_finished_processing ( & mut app, guard) ;
1307+
1308+ assert_eq ! (
1309+ read_asset_as_string( & default_processed_dir, a) ,
1310+ serialize_as_cool_text( "a processed" )
1311+ ) ;
1312+ assert ! ( default_processed_dir. get_metadata( a) . is_some( ) ) ;
1313+
1314+ assert ! ( default_processed_dir. get_asset( missing1) . is_none( ) ) ;
1315+ assert ! ( default_processed_dir. get_metadata( missing1) . is_none( ) ) ;
1316+ assert ! ( default_processed_dir. get_asset( missing2) . is_none( ) ) ;
1317+ assert ! ( default_processed_dir. get_asset( missing3) . is_none( ) ) ;
1318+
1319+ assert ! ( default_processed_dir. get_dir( empty_dir_subdir) . is_none( ) ) ;
1320+ assert ! ( default_processed_dir. get_dir( empty_dir) . is_none( ) ) ;
1321+ }
0 commit comments