001    /*****************************************************************************
002     * Copyright (C) PicoContainer Organization. All rights reserved.            *
003     * ------------------------------------------------------------------------- *
004     * The software in this package is published under the terms of the BSD      *
005     * style license a copy of which has been included with this distribution in *
006     * the LICENSE.txt file.                                                     *
007     * Original Code By: Centerline Computers, Inc.                              *
008     *****************************************************************************/
009    package org.picocontainer.injectors;
010    
011    import org.junit.Test;
012    
013    import static org.junit.Assert.assertFalse;
014    import static org.junit.Assert.assertTrue;
015    import static org.junit.Assert.fail;
016    import static org.picocontainer.injectors.PrimitiveMemberChecker.isPrimitiveArgument;
017    
018    import java.lang.reflect.Constructor;
019    import java.lang.reflect.Field;
020    import java.lang.reflect.Method;
021    
022    /**
023     * @author Michael Rimov
024     *
025     */
026    public class PrimitiveMemberCheckerTestCase {
027        
028        
029        @SuppressWarnings("unused") 
030        public static class TestClass {
031            
032            public String able;
033            
034            public int baker;
035            
036            public TestClass(int value) {
037               //Does nothing.
038            }
039            
040            public TestClass(String value) {
041                //Does nothing.            
042            }
043            
044            
045            public void doSomething(String avalue) {
046                //Does nothing.            
047            }
048            
049            public void doSomething(int anotherValue ) {
050                //Does nothing.            
051            }
052        }
053            
054        /*
055         * Test method for {@link org.picocontainer.injectors.PrimitiveMemberChecker#isPrimitiveArgument(java.lang.reflect.AccessibleObject, int)}.
056         */
057        @Test
058        public void testIsPrimitiveField() throws NoSuchFieldException {
059            Field targetOne = TestClass.class.getField("able");
060            assertFalse(isPrimitiveArgument(targetOne, 0));
061            
062            Field targetTwo = TestClass.class.getField("baker");
063            assertTrue(isPrimitiveArgument(targetTwo, 0));
064        }
065        
066        @Test
067        public void testIsPrimitiveConstructorArg() throws NoSuchMethodException {
068            Constructor cOne = TestClass.class.getConstructor(Integer.TYPE);
069            assertTrue(isPrimitiveArgument(cOne, 0));
070            
071            Constructor cTwo = TestClass.class.getConstructor(String.class);
072            assertFalse(isPrimitiveArgument(cTwo, 0));
073        }
074        
075        @Test
076        public void testIsPrimitiveMethodArg() throws NoSuchMethodException {
077            Method mOne = TestClass.class.getMethod("doSomething", Integer.TYPE);
078            assertTrue(isPrimitiveArgument(mOne, 0));
079            
080            Method mTwo = TestClass.class.getMethod("doSomething", String.class);
081            assertFalse(isPrimitiveArgument(mTwo, 0));
082        }
083    
084        
085        @Test
086        public void testArrayIndexOutOfBoundsIfIntegerArgTooBig() throws SecurityException, NoSuchMethodException {
087            Method mOne = TestClass.class.getMethod("doSomething", Integer.TYPE);
088            try {
089                boolean result = isPrimitiveArgument(mOne, 1);
090                fail("Should have thrown exception, instead got return value " + result);
091            } catch (ArrayIndexOutOfBoundsException e) {
092                //Message contents differentiate from a generic exception
093                assertTrue(e.getMessage().contains("Index i > types array length "));
094            }
095        }
096            
097    }