@@ -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 ) ]
15711571pub 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