@@ -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,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