@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);
 }