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