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 *****************************************************************************/
009package org.picocontainer.injectors;
010
011import org.junit.Test;
012
013import static org.junit.Assert.assertFalse;
014import static org.junit.Assert.assertTrue;
015import static org.junit.Assert.fail;
016import static org.picocontainer.injectors.PrimitiveMemberChecker.isPrimitiveArgument;
017
018import java.lang.reflect.Constructor;
019import java.lang.reflect.Field;
020import java.lang.reflect.Method;
021
022/**
023 * @author Michael Rimov
024 *
025 */
026public 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}