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