JavaParameterTest.java

package com.thoughtworks.qdox.model;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

public abstract class JavaParameterTest<P extends JavaParameter> {
    private final JavaClass VOID = newType( "void" );

    // constructors
    protected abstract P newJavaParameter( JavaClass type, String name );

    protected abstract P newJavaParameter( JavaClass type, String name, boolean varArgs );

    // setters
    protected abstract void setJavaExecutable( P parameter, JavaExecutable executable );

    protected JavaClass newType( String typeName )
    {
        JavaClass result = mock( JavaClass.class );
        when( result.getFullyQualifiedName() ).thenReturn( typeName );
        return result;
    }

    @Test
    public void testHashCode()
    {
        Assertions.assertTrue(newJavaParameter( VOID, "" ).hashCode() != 0, "hashCode should never resolve to 0");

        P simpleParameter = newJavaParameter( VOID, "", false );
        P varArgParameter = newJavaParameter( VOID, "", true );

        Assertions.assertTrue(simpleParameter.hashCode() != varArgParameter.hashCode());
    }

    @Test
    public void testEquals()
    {
        P simpleParameter = newJavaParameter( VOID, "", false );
        P varArgParameter = newJavaParameter( VOID, "", true );
        Assertions.assertTrue(!simpleParameter.equals( varArgParameter ));

        // name of parameter shouldn't matter
        P fooParameter = newJavaParameter( VOID, "foo" );
        P barParameter = newJavaParameter( VOID, "bar" );
        Assertions.assertEquals(fooParameter, barParameter);
    }

    @Test
    public void testExecutableDeclarator()
    {
        P p = newJavaParameter( newType( "x" ), "x" );
        Assertions.assertNull(p.getExecutable());

        JavaExecutable e = mock( JavaExecutable.class );
        setJavaExecutable( p, e );
        Assertions.assertSame(e, p.getExecutable());
    }
}