@Test(expected = IllegalStateException.class) public void testTargetToSourceAssignable() throws Exception { defineAssignability(false, true); StackManipulation stackManipulation = ReferenceTypeAwareAssigner.INSTANCE.assign( sourceTypeDescription, targetTypeDescription, false); assertThat(stackManipulation.isValid(), is(false)); stackManipulation.apply(methodVisitor, implementationContext); }
@Test(expected = IllegalStateException.class) public void testPrimitiveAssignabilityWhenNotEqual() throws Exception { TypeDescription primitiveType = new TypeDescription.ForLoadedType(int.class); // Note: cannot mock equals TypeDescription otherPrimitiveType = new TypeDescription.ForLoadedType(long.class); // Note: cannot mock equals StackManipulation stackManipulation = ReferenceTypeAwareAssigner.INSTANCE.assign(primitiveType, otherPrimitiveType, true); assertThat(stackManipulation.isValid(), is(false)); stackManipulation.apply(methodVisitor, implementationContext); }
@Test public void testPrimitiveAssignabilityWhenEqual() throws Exception { TypeDescription primitiveType = new TypeDescription.ForLoadedType(int.class); // Note: cannot mock equals StackManipulation stackManipulation = ReferenceTypeAwareAssigner.INSTANCE.assign(primitiveType, primitiveType, true); assertThat(stackManipulation.isValid(), is(true)); StackManipulation.Size size = stackManipulation.apply(methodVisitor, implementationContext); assertThat(size.getSizeImpact(), is(0)); assertThat(size.getMaximalSize(), is(0)); verifyZeroInteractions(methodVisitor); }
@Test public void testSourceToTargetAssignable() throws Exception { defineAssignability(true, false); StackManipulation stackManipulation = ReferenceTypeAwareAssigner.INSTANCE.assign( sourceTypeDescription, targetTypeDescription, false); assertThat(stackManipulation.isValid(), is(true)); StackManipulation.Size size = stackManipulation.apply(methodVisitor, implementationContext); assertThat(size.getSizeImpact(), is(0)); assertThat(size.getMaximalSize(), is(0)); verifyZeroInteractions(methodVisitor); }
@Test public void testTargetToSourceAssignableRuntimeType() throws Exception { defineAssignability(false, false); when(targetTypeDescription.getInternalName()).thenReturn(FOO); StackManipulation stackManipulation = ReferenceTypeAwareAssigner.INSTANCE.assign( sourceTypeDescription, targetTypeDescription, true); assertThat(stackManipulation.isValid(), is(true)); StackManipulation.Size size = stackManipulation.apply(methodVisitor, implementationContext); assertThat(size.getSizeImpact(), is(0)); assertThat(size.getMaximalSize(), is(0)); verify(methodVisitor).visitTypeInsn(Opcodes.CHECKCAST, FOO); verifyNoMoreInteractions(methodVisitor); }