@Override
 public ISpecies getParentSpecies() {
   if (parentSpecies == null) {
     final TypeDescription parentSpecDesc = getDescription().getParent();
     // Takes care of invalid species (see Issue 711)
     if (parentSpecDesc == null || parentSpecDesc == getDescription()) {
       return null;
     }
     ISpecies currentMacroSpec = this.getMacroSpecies();
     while (currentMacroSpec != null && parentSpecies == null) {
       parentSpecies = currentMacroSpec.getMicroSpecies(parentSpecDesc.getName());
       currentMacroSpec = currentMacroSpec.getMacroSpecies();
     }
   }
   return parentSpecies;
 }
 @Test
 public void testEquals() throws Exception {
   TypeDescription identical = describe(SampleClass.class);
   assertThat(identical, equalTo(identical));
   TypeDescription equalFirst = mock(TypeDescription.class);
   when(equalFirst.getName()).thenReturn(SampleClass.class.getName());
   assertThat(describe(SampleClass.class), equalTo(equalFirst));
   assertThat(describe(SampleClass.class), not(equalTo(describe(SampleInterface.class))));
   assertThat(
       describe(SampleClass.class),
       not(equalTo((TypeDescription) new TypeDescription.ForLoadedType(SampleInterface.class))));
   assertThat(describe(SampleClass.class), not(equalTo(new Object())));
   assertThat(describe(SampleClass.class), not(equalTo(null)));
   assertThat(
       describe(Object[].class),
       equalTo((TypeDescription) new TypeDescription.ForLoadedType(Object[].class)));
   assertThat(
       describe(Object[].class),
       not(equalTo((TypeDescription) new TypeDescription.ForLoadedType(Object.class))));
 }
 @Test
 public void testEquals() throws Exception {
   TypeDescription identical = describe(SampleClass.class);
   assertThat(identical, is(identical));
   TypeDescription equalFirst = mock(TypeDescription.class);
   when(equalFirst.getSort()).thenReturn(TypeDefinition.Sort.NON_GENERIC);
   when(equalFirst.asErasure()).thenReturn(equalFirst);
   when(equalFirst.getName()).thenReturn(SampleClass.class.getName());
   assertThat(describe(SampleClass.class), is(equalFirst));
   assertThat(describe(SampleClass.class), not(describe(SampleInterface.class)));
   assertThat(
       describe(SampleClass.class),
       not((TypeDescription) new TypeDescription.ForLoadedType(SampleInterface.class)));
   TypeDefinition nonRawType = mock(TypeDescription.Generic.class);
   when(nonRawType.getSort()).thenReturn(TypeDefinition.Sort.VARIABLE);
   assertThat(describe(SampleClass.class), not(nonRawType));
   assertThat(describe(SampleClass.class), not(new Object()));
   assertThat(describe(SampleClass.class), not(equalTo(null)));
   assertThat(
       describe(Object[].class),
       is((TypeDescription) new TypeDescription.ForLoadedType(Object[].class)));
   assertThat(describe(Object[].class), not(TypeDescription.OBJECT));
 }