4040import static org .junit .Assert .assertTrue ;
4141import static org .junit .Assert .fail ;
4242
43+ import java .lang .reflect .Field ;
4344import java .lang .reflect .Type ;
45+ import java .math .BigDecimal ;
4446import java .util .ArrayList ;
4547import java .util .Collection ;
4648import java .util .Collections ;
5456import org .junit .Test ;
5557import org .scijava .Context ;
5658import org .scijava .Priority ;
59+ import org .scijava .convert .ArrayConverters .ByteArrayWrapper ;
60+ import org .scijava .convert .ArrayConverters .DoubleArrayUnwrapper ;
61+ import org .scijava .convert .ArrayConverters .FloatArrayWrapper ;
62+ import org .scijava .convert .ArrayConverters .LongArrayWrapper ;
63+ import org .scijava .convert .ArrayConverters .ShortArrayUnwrapper ;
64+ import org .scijava .convert .NumberConverters .ByteToLongConverter ;
65+ import org .scijava .convert .NumberConverters .DoubleToBigDecimalConverter ;
66+ import org .scijava .convert .NumberConverters .ShortToFloatConverter ;
5767import org .scijava .plugin .Plugin ;
5868import org .scijava .util .BoolArray ;
69+ import org .scijava .util .ByteArray ;
5970import org .scijava .util .CharArray ;
6071import org .scijava .util .ClassUtils ;
6172import org .scijava .util .DoubleArray ;
6273import org .scijava .util .FloatArray ;
74+ import org .scijava .util .GenericUtils ;
6375import org .scijava .util .IntArray ;
6476import org .scijava .util .LongArray ;
6577import org .scijava .util .PrimitiveArray ;
@@ -135,7 +147,7 @@ public void testPrimitives() {
135147 */
136148 @ Test
137149 public void testArrays () {
138- // Test that each primitive [] is compatible in either direciton with its
150+ // Test that each primitive [] is compatible in either direction with its
139151 // paired PrimitiveArray
140152 testIntechangeable (int [].class , IntArray .class );
141153 testIntechangeable (long [].class , LongArray .class );
@@ -145,7 +157,7 @@ public void testArrays() {
145157 testIntechangeable (char [].class , CharArray .class );
146158 testIntechangeable (boolean [].class , BoolArray .class );
147159
148- // Test that primitive [] can not be convertied to mismatched PrimitiveArray
160+ // Test that primitive [] can not be converted to mismatched PrimitiveArray
149161 assertFalse (convertService .supports (int [].class , LongArray .class ));
150162
151163 // Test that lists can be converted to any primitive []
@@ -565,6 +577,126 @@ public void testGetCompatibleInputs() {
565577 assertEquals (StringHisListConverter .S4 , compatibleInputs .get (3 ));
566578 }
567579
580+ /**
581+ * Tests that the {@link NullConverter} is chosen for null src and/or dest.
582+ */
583+ @ Test
584+ public void testNullConverterMatching () {
585+ final Converter <?, ?> c = convertService .getHandler (new ConversionRequest (
586+ null , List .class ));
587+ assertEquals (NullConverter .class , c .getClass ());
588+
589+ final Converter <?, ?> cc = convertService .getHandler (new ConversionRequest (
590+ new Object (), (Class <?>) null ));
591+ assertEquals (NullConverter .class , cc .getClass ());
592+
593+ final Converter <?, ?> ccc = convertService .getHandler (new ConversionRequest (
594+ null , (Class <?>) null ));
595+ assertEquals (NullConverter .class , ccc .getClass ());
596+ }
597+
598+ /**
599+ * Tests the the appropriate wrapping ArrayConverter is chosen for converting
600+ * primitive arrays to scijava wrappers.
601+ */
602+ @ Test
603+ public void testArrayConverterWrappingMatching () {
604+ final byte [] b = new byte [] { -128 , 0 , 127 };
605+ final long [] l = new long [] { 13 , 17 , -103209 , 0 , 6 };
606+ final float [] f = new float [] { 12.125f , -0.0625f , 2.5f };
607+
608+ final Converter <?, ?> c = convertService .getHandler (b , ByteArray .class );
609+ assertEquals (ByteArrayWrapper .class , c .getClass ());
610+
611+ final Converter <?, ?> cc = convertService .getHandler (l , LongArray .class );
612+ assertEquals (LongArrayWrapper .class , cc .getClass ());
613+
614+ final Converter <?, ?> ccc = convertService .getHandler (f , FloatArray .class );
615+ assertEquals (FloatArrayWrapper .class , ccc .getClass ());
616+ }
617+
618+ /**
619+ * Tests that the appropriate unwrapping ArrayConverter is chosen for
620+ * converting scijava arrays to primitive arrays.
621+ */
622+ @ Test
623+ public void testArrayConverterUnwrappingMatching () {
624+ final ShortArray s = new ShortArray ();
625+ final DoubleArray d = new DoubleArray ();
626+
627+ final Converter <?, ?> c = convertService .getHandler (s , short [].class );
628+ assertEquals (ShortArrayUnwrapper .class , c .getClass ());
629+
630+ final Converter <?, ?> cc = convertService .getHandler (d , double [].class );
631+ assertEquals (DoubleArrayUnwrapper .class , cc .getClass ());
632+ }
633+
634+ /**
635+ * Tests that the {@link CastingConverter} is called when casting is possible.
636+ */
637+ @ Test
638+ public void testCastingConverterMatching () {
639+ final ArrayList <Double > al = new ArrayList <>();
640+
641+ final Converter <?, ?> c = convertService .getHandler (al , Collection .class );
642+ assertEquals (CastingConverter .class , c .getClass ());
643+ }
644+
645+ /**
646+ * Tests the that the appropriate {@link NumberToNumberConverter} is chosen.
647+ */
648+ @ Test
649+ public void testNumberConverterMatching () {
650+ final double d = -24312926.0625 ;
651+ final byte b = 64 ;
652+ final short s = 32625 ;
653+
654+ // Number converters only handle widening conversions
655+ final Converter <?, ?> c = convertService .getHandler (d , BigDecimal .class );
656+ assertEquals (DoubleToBigDecimalConverter .class , c .getClass ());
657+
658+ final Converter <?, ?> cc = convertService .getHandler (b , long .class );
659+ assertEquals (ByteToLongConverter .class , cc .getClass ());
660+
661+ final Converter <?, ?> ccc = convertService .getHandler (s , float .class );
662+ assertEquals (ShortToFloatConverter .class , ccc .getClass ());
663+ }
664+
665+ /**
666+ * Tests that the {@link DefaultConverter} is chosen when no other suitable
667+ * converter is available.
668+ */
669+ @ Test
670+ public void testDefaultConverterMatching () {
671+ final float f = 13624292.25f ;
672+ final List <String > l = new ArrayList <>();
673+
674+ // Narrowing number conversion
675+ final Converter <?, ?> c = convertService .getHandler (f , byte .class );
676+ assertEquals (DefaultConverter .class , c .getClass ());
677+
678+ // List to Array
679+ final Converter <?, ?> cc = convertService .getHandler (l , String [].class );
680+ assertEquals (DefaultConverter .class , cc .getClass ());
681+
682+ // Object to String
683+ final Converter <?, ?> os = convertService .getHandler (new Object (),
684+ String .class );
685+ assertEquals (DefaultConverter .class , os .getClass ());
686+
687+ // String to Character
688+ final Converter <?, ?> ss = convertService .getHandler ("hello" , char .class );
689+ assertEquals (DefaultConverter .class , ss .getClass ());
690+
691+ // String to Enum
692+ final Converter <?, ?> se = convertService .getHandler ("bye" , Words .class );
693+ assertEquals (DefaultConverter .class , se .getClass ());
694+
695+ // Source which can be wrapped as destination
696+ final Converter <?, ?> w = convertService .getHandler (10122017l , Date .class );
697+ assertEquals (DefaultConverter .class , w .getClass ());
698+ }
699+
568700// -- Helper Methods --
569701
570702 /**
@@ -751,7 +883,7 @@ public <T> T convert(Object src, Class<T> dest) {
751883 // -- Helper methods --
752884
753885 /**
754- * Verify bi-direciotnal conversion is supported between the two classes
886+ * Verify bi-directional conversion is supported between the two classes
755887 */
756888 private void testIntechangeable (final Class <?> c1 , final Class <?> c2 ) {
757889 assertTrue (convertService .supports (c1 , c2 ));
0 commit comments