Skip to content

Commit 40f921c

Browse files
committed
Add tests to ensure that short type paths can fetch the processor.
1 parent a61a6b6 commit 40f921c

File tree

1 file changed

+137
-1
lines changed
  • crates/bevy_asset/src/processor

1 file changed

+137
-1
lines changed

crates/bevy_asset/src/processor/mod.rs

Lines changed: 137 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1567,7 +1567,7 @@ pub enum InitializeError {
15671567
}
15681568

15691569
/// An error when retrieving an asset processor.
1570-
#[derive(Error, Debug)]
1570+
#[derive(Error, Debug, PartialEq, Eq)]
15711571
pub enum GetProcessorError {
15721572
#[error("The processor '{0}' does not exist")]
15731573
Missing(String),
@@ -1592,3 +1592,139 @@ impl From<GetProcessorError> for ProcessError {
15921592
}
15931593
}
15941594
}
1595+
1596+
#[cfg(test)]
1597+
mod tests {
1598+
use bevy_reflect::TypePath;
1599+
use core::marker::PhantomData;
1600+
1601+
use crate::io::memory::{Dir, MemoryAssetReader};
1602+
1603+
use super::*;
1604+
1605+
#[derive(TypePath)]
1606+
struct MyProcessor<T>(PhantomData<fn() -> T>);
1607+
1608+
impl<T: TypePath + 'static> Process for MyProcessor<T> {
1609+
type OutputLoader = ();
1610+
type Settings = ();
1611+
1612+
async fn process(
1613+
&self,
1614+
_context: &mut ProcessContext<'_>,
1615+
_meta: AssetMeta<(), Self>,
1616+
_writer: &mut crate::io::Writer,
1617+
) -> Result<(), ProcessError> {
1618+
Ok(())
1619+
}
1620+
}
1621+
1622+
#[derive(TypePath)]
1623+
struct Marker;
1624+
1625+
fn create_empty_asset_processor() -> AssetProcessor {
1626+
let mut sources = AssetSourceBuilders::default();
1627+
// Create an empty asset source so that AssetProcessor is happy.
1628+
let dir = Dir::default();
1629+
let memory_reader = MemoryAssetReader { root: dir.clone() };
1630+
sources.insert(
1631+
AssetSourceId::Default,
1632+
AssetSource::build().with_reader(move || Box::new(memory_reader.clone())),
1633+
);
1634+
1635+
AssetProcessor::new(&mut sources)
1636+
}
1637+
1638+
#[test]
1639+
fn get_asset_processor_by_name() {
1640+
let asset_processor = create_empty_asset_processor();
1641+
asset_processor.register_processor(MyProcessor::<Marker>(PhantomData));
1642+
1643+
let long_processor = asset_processor
1644+
.get_processor(
1645+
"bevy_asset::processor::tests::MyProcessor<bevy_asset::processor::tests::Marker>",
1646+
)
1647+
.expect("Processor was previously registered");
1648+
let short_processor = asset_processor
1649+
.get_processor("MyProcessor<Marker>")
1650+
.expect("Processor was previously registered");
1651+
1652+
// We can use either the long or short processor name and we will get the same processor
1653+
// out.
1654+
assert!(Arc::ptr_eq(&long_processor, &short_processor));
1655+
}
1656+
1657+
#[test]
1658+
fn missing_processor_returns_error() {
1659+
let asset_processor = create_empty_asset_processor();
1660+
1661+
let Err(long_processor_err) = asset_processor.get_processor(
1662+
"bevy_asset::processor::tests::MyProcessor<bevy_asset::processor::tests::Marker>",
1663+
) else {
1664+
panic!("Processor was returned even though we never registered any.");
1665+
};
1666+
let GetProcessorError::Missing(long_processor_err) = &long_processor_err else {
1667+
panic!("get_processor returned incorrect error: {long_processor_err}");
1668+
};
1669+
assert_eq!(
1670+
long_processor_err,
1671+
"bevy_asset::processor::tests::MyProcessor<bevy_asset::processor::tests::Marker>"
1672+
);
1673+
1674+
// Short paths should also return an error.
1675+
1676+
let Err(long_processor_err) = asset_processor.get_processor("MyProcessor<Marker>") else {
1677+
panic!("Processor was returned even though we never registered any.");
1678+
};
1679+
let GetProcessorError::Missing(long_processor_err) = &long_processor_err else {
1680+
panic!("get_processor returned incorrect error: {long_processor_err}");
1681+
};
1682+
assert_eq!(long_processor_err, "MyProcessor<Marker>");
1683+
}
1684+
1685+
// Create another marker type whose short name will overlap `Marker`.
1686+
mod sneaky {
1687+
use bevy_reflect::TypePath;
1688+
1689+
#[derive(TypePath)]
1690+
pub struct Marker;
1691+
}
1692+
1693+
#[test]
1694+
fn ambiguous_short_path_returns_error() {
1695+
let asset_processor = create_empty_asset_processor();
1696+
asset_processor.register_processor(MyProcessor::<Marker>(PhantomData));
1697+
asset_processor.register_processor(MyProcessor::<sneaky::Marker>(PhantomData));
1698+
1699+
let Err(long_processor_err) = asset_processor.get_processor("MyProcessor<Marker>") else {
1700+
panic!("Processor was returned even though the short path is ambiguous.");
1701+
};
1702+
let GetProcessorError::Ambiguous {
1703+
processor_short_name,
1704+
ambiguous_processor_names,
1705+
} = &long_processor_err
1706+
else {
1707+
panic!("get_processor returned incorrect error: {long_processor_err}");
1708+
};
1709+
assert_eq!(processor_short_name, "MyProcessor<Marker>");
1710+
let expected_ambiguous_names = [
1711+
"bevy_asset::processor::tests::MyProcessor<bevy_asset::processor::tests::Marker>",
1712+
"bevy_asset::processor::tests::MyProcessor<bevy_asset::processor::tests::sneaky::Marker>",
1713+
];
1714+
assert_eq!(ambiguous_processor_names, &expected_ambiguous_names);
1715+
1716+
let processor_1 = asset_processor
1717+
.get_processor(
1718+
"bevy_asset::processor::tests::MyProcessor<bevy_asset::processor::tests::Marker>",
1719+
)
1720+
.expect("Processor was previously registered");
1721+
let processor_2 = asset_processor
1722+
.get_processor(
1723+
"bevy_asset::processor::tests::MyProcessor<bevy_asset::processor::tests::sneaky::Marker>",
1724+
)
1725+
.expect("Processor was previously registered");
1726+
1727+
// If we fully specify the paths, we get the two different processors.
1728+
assert!(!Arc::ptr_eq(&processor_1, &processor_2));
1729+
}
1730+
}

0 commit comments

Comments
 (0)