Skip to content

Commit d61134a

Browse files
committed
Create a test to show that the asset processor deletes assets out of
sync with the processor.
1 parent 0d46518 commit d61134a

File tree

1 file changed

+84
-9
lines changed

1 file changed

+84
-9
lines changed

crates/bevy_asset/src/processor/tests.rs

Lines changed: 84 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
96110
fn 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

Comments
 (0)