Skip to content

Commit 73a33e9

Browse files
committed
Add tests to ensure that short type paths can fetch the processor.
1 parent 7347909 commit 73a33e9

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
@@ -1633,7 +1633,7 @@ pub enum SetTransactionLogFactoryError {
16331633
}
16341634

16351635
/// An error when retrieving an asset processor.
1636-
#[derive(Error, Debug)]
1636+
#[derive(Error, Debug, PartialEq, Eq)]
16371637
pub enum GetProcessorError {
16381638
#[error("The processor '{0}' does not exist")]
16391639
Missing(String),
@@ -1658,3 +1658,139 @@ impl From<GetProcessorError> for ProcessError {
16581658
}
16591659
}
16601660
}
1661+
1662+
#[cfg(test)]
1663+
mod tests {
1664+
use bevy_reflect::TypePath;
1665+
use core::marker::PhantomData;
1666+
1667+
use crate::io::memory::{Dir, MemoryAssetReader};
1668+
1669+
use super::*;
1670+
1671+
#[derive(TypePath)]
1672+
struct MyProcessor<T>(PhantomData<fn() -> T>);
1673+
1674+
impl<T: TypePath + 'static> Process for MyProcessor<T> {
1675+
type OutputLoader = ();
1676+
type Settings = ();
1677+
1678+
async fn process(
1679+
&self,
1680+
_context: &mut ProcessContext<'_>,
1681+
_meta: AssetMeta<(), Self>,
1682+
_writer: &mut crate::io::Writer,
1683+
) -> Result<(), ProcessError> {
1684+
Ok(())
1685+
}
1686+
}
1687+
1688+
#[derive(TypePath)]
1689+
struct Marker;
1690+
1691+
fn create_empty_asset_processor() -> AssetProcessor {
1692+
let mut sources = AssetSourceBuilders::default();
1693+
// Create an empty asset source so that AssetProcessor is happy.
1694+
let dir = Dir::default();
1695+
let memory_reader = MemoryAssetReader { root: dir.clone() };
1696+
sources.insert(
1697+
AssetSourceId::Default,
1698+
AssetSource::build().with_reader(move || Box::new(memory_reader.clone())),
1699+
);
1700+
1701+
AssetProcessor::new(&mut sources)
1702+
}
1703+
1704+
#[test]
1705+
fn get_asset_processor_by_name() {
1706+
let asset_processor = create_empty_asset_processor();
1707+
asset_processor.register_processor(MyProcessor::<Marker>(PhantomData));
1708+
1709+
let long_processor = asset_processor
1710+
.get_processor(
1711+
"bevy_asset::processor::tests::MyProcessor<bevy_asset::processor::tests::Marker>",
1712+
)
1713+
.expect("Processor was previously registered");
1714+
let short_processor = asset_processor
1715+
.get_processor("MyProcessor<Marker>")
1716+
.expect("Processor was previously registered");
1717+
1718+
// We can use either the long or short processor name and we will get the same processor
1719+
// out.
1720+
assert!(Arc::ptr_eq(&long_processor, &short_processor));
1721+
}
1722+
1723+
#[test]
1724+
fn missing_processor_returns_error() {
1725+
let asset_processor = create_empty_asset_processor();
1726+
1727+
let Err(long_processor_err) = asset_processor.get_processor(
1728+
"bevy_asset::processor::tests::MyProcessor<bevy_asset::processor::tests::Marker>",
1729+
) else {
1730+
panic!("Processor was returned even though we never registered any.");
1731+
};
1732+
let GetProcessorError::Missing(long_processor_err) = &long_processor_err else {
1733+
panic!("get_processor returned incorrect error: {long_processor_err}");
1734+
};
1735+
assert_eq!(
1736+
long_processor_err,
1737+
"bevy_asset::processor::tests::MyProcessor<bevy_asset::processor::tests::Marker>"
1738+
);
1739+
1740+
// Short paths should also return an error.
1741+
1742+
let Err(long_processor_err) = asset_processor.get_processor("MyProcessor<Marker>") else {
1743+
panic!("Processor was returned even though we never registered any.");
1744+
};
1745+
let GetProcessorError::Missing(long_processor_err) = &long_processor_err else {
1746+
panic!("get_processor returned incorrect error: {long_processor_err}");
1747+
};
1748+
assert_eq!(long_processor_err, "MyProcessor<Marker>");
1749+
}
1750+
1751+
// Create another marker type whose short name will overlap `Marker`.
1752+
mod sneaky {
1753+
use bevy_reflect::TypePath;
1754+
1755+
#[derive(TypePath)]
1756+
pub struct Marker;
1757+
}
1758+
1759+
#[test]
1760+
fn ambiguous_short_path_returns_error() {
1761+
let asset_processor = create_empty_asset_processor();
1762+
asset_processor.register_processor(MyProcessor::<Marker>(PhantomData));
1763+
asset_processor.register_processor(MyProcessor::<sneaky::Marker>(PhantomData));
1764+
1765+
let Err(long_processor_err) = asset_processor.get_processor("MyProcessor<Marker>") else {
1766+
panic!("Processor was returned even though the short path is ambiguous.");
1767+
};
1768+
let GetProcessorError::Ambiguous {
1769+
processor_short_name,
1770+
ambiguous_processor_names,
1771+
} = &long_processor_err
1772+
else {
1773+
panic!("get_processor returned incorrect error: {long_processor_err}");
1774+
};
1775+
assert_eq!(processor_short_name, "MyProcessor<Marker>");
1776+
let expected_ambiguous_names = [
1777+
"bevy_asset::processor::tests::MyProcessor<bevy_asset::processor::tests::Marker>",
1778+
"bevy_asset::processor::tests::MyProcessor<bevy_asset::processor::tests::sneaky::Marker>",
1779+
];
1780+
assert_eq!(ambiguous_processor_names, &expected_ambiguous_names);
1781+
1782+
let processor_1 = asset_processor
1783+
.get_processor(
1784+
"bevy_asset::processor::tests::MyProcessor<bevy_asset::processor::tests::Marker>",
1785+
)
1786+
.expect("Processor was previously registered");
1787+
let processor_2 = asset_processor
1788+
.get_processor(
1789+
"bevy_asset::processor::tests::MyProcessor<bevy_asset::processor::tests::sneaky::Marker>",
1790+
)
1791+
.expect("Processor was previously registered");
1792+
1793+
// If we fully specify the paths, we get the two different processors.
1794+
assert!(!Arc::ptr_eq(&processor_1, &processor_2));
1795+
}
1796+
}

0 commit comments

Comments
 (0)