@@ -1567,7 +1567,7 @@ pub enum InitializeError {
1567
1567
}
1568
1568
1569
1569
/// An error when retrieving an asset processor.
1570
- #[ derive( Error , Debug ) ]
1570
+ #[ derive( Error , Debug , PartialEq , Eq ) ]
1571
1571
pub enum GetProcessorError {
1572
1572
#[ error( "The processor '{0}' does not exist" ) ]
1573
1573
Missing ( String ) ,
@@ -1592,3 +1592,140 @@ impl From<GetProcessorError> for ProcessError {
1592
1592
}
1593
1593
}
1594
1594
}
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