Skip to content

Commit e266eed

Browse files
committed
Add tests to ensure that short type paths can fetch the processor.
1 parent 316fd8a commit e266eed

File tree

1 file changed

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

1 file changed

+138
-1
lines changed

crates/bevy_asset/src/processor/mod.rs

Lines changed: 138 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,140 @@ 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+
let asset_processor = AssetProcessor::new(&mut sources);
1635+
1636+
asset_processor
1637+
}
1638+
1639+
#[test]
1640+
fn get_asset_processor_by_name() {
1641+
let asset_processor = create_empty_asset_processor();
1642+
asset_processor.register_processor(MyProcessor::<Marker>(PhantomData));
1643+
1644+
let long_processor = asset_processor
1645+
.get_processor(
1646+
"bevy_asset::processor::tests::MyProcessor<bevy_asset::processor::tests::Marker>",
1647+
)
1648+
.expect("Processor was previously registered");
1649+
let short_processor = asset_processor
1650+
.get_processor("MyProcessor<Marker>")
1651+
.expect("Processor was previously registered");
1652+
1653+
// We can use either the long or short processor name and we will get the same processor
1654+
// out.
1655+
assert!(Arc::ptr_eq(&long_processor, &short_processor));
1656+
}
1657+
1658+
#[test]
1659+
fn missing_processor_returns_error() {
1660+
let asset_processor = create_empty_asset_processor();
1661+
1662+
let Err(long_processor_err) = asset_processor.get_processor(
1663+
"bevy_asset::processor::tests::MyProcessor<bevy_asset::processor::tests::Marker>",
1664+
) else {
1665+
panic!("Processor was returned even though we never registered any.");
1666+
};
1667+
let GetProcessorError::Missing(long_processor_err) = &long_processor_err else {
1668+
panic!("get_processor returned incorrect error: {long_processor_err}");
1669+
};
1670+
assert_eq!(
1671+
long_processor_err,
1672+
"bevy_asset::processor::tests::MyProcessor<bevy_asset::processor::tests::Marker>"
1673+
);
1674+
1675+
// Short paths should also return an error.
1676+
1677+
let Err(long_processor_err) = asset_processor.get_processor("MyProcessor<Marker>") else {
1678+
panic!("Processor was returned even though we never registered any.");
1679+
};
1680+
let GetProcessorError::Missing(long_processor_err) = &long_processor_err else {
1681+
panic!("get_processor returned incorrect error: {long_processor_err}");
1682+
};
1683+
assert_eq!(long_processor_err, "MyProcessor<Marker>");
1684+
}
1685+
1686+
// Create another marker type whose short name will overlap `Marker`.
1687+
mod sneaky {
1688+
use bevy_reflect::TypePath;
1689+
1690+
#[derive(TypePath)]
1691+
pub struct Marker;
1692+
}
1693+
1694+
#[test]
1695+
fn ambiguous_short_path_returns_error() {
1696+
let asset_processor = create_empty_asset_processor();
1697+
asset_processor.register_processor(MyProcessor::<Marker>(PhantomData));
1698+
asset_processor.register_processor(MyProcessor::<sneaky::Marker>(PhantomData));
1699+
1700+
let Err(long_processor_err) = asset_processor.get_processor("MyProcessor<Marker>") else {
1701+
panic!("Processor was returned even though the short path is ambiguous.");
1702+
};
1703+
let GetProcessorError::Ambiguous {
1704+
processor_short_name,
1705+
ambiguous_processor_names,
1706+
} = &long_processor_err
1707+
else {
1708+
panic!("get_processor returned incorrect error: {long_processor_err}");
1709+
};
1710+
assert_eq!(processor_short_name, "MyProcessor<Marker>");
1711+
let expected_ambiguous_names = [
1712+
"bevy_asset::processor::tests::MyProcessor<bevy_asset::processor::tests::Marker>",
1713+
"bevy_asset::processor::tests::MyProcessor<bevy_asset::processor::tests::sneaky::Marker>",
1714+
];
1715+
assert_eq!(ambiguous_processor_names, &expected_ambiguous_names);
1716+
1717+
let processor_1 = asset_processor
1718+
.get_processor(
1719+
"bevy_asset::processor::tests::MyProcessor<bevy_asset::processor::tests::Marker>",
1720+
)
1721+
.expect("Processor was previously registered");
1722+
let processor_2 = asset_processor
1723+
.get_processor(
1724+
"bevy_asset::processor::tests::MyProcessor<bevy_asset::processor::tests::sneaky::Marker>",
1725+
)
1726+
.expect("Processor was previously registered");
1727+
1728+
// If we fully specify the paths, we get the two different processors.
1729+
assert!(!Arc::ptr_eq(&processor_1, &processor_2));
1730+
}
1731+
}

0 commit comments

Comments
 (0)