}
@Test
public void testHierEncoderComplexInheritance() {
HierarchyEncoder encoder = new HierarchyEncoderImpl();
encoder.encode( "A", Collections.EMPTY_LIST );
checkHier( encoder, 'A' );
encoder.encode( "B", Arrays.asList( "A" ) );
checkHier( encoder, 'B' );
encoder.encode( "C", Arrays.asList( "A" ) );
checkHier( encoder, 'C' );
encoder.encode( "D", Arrays.asList( "B" ) );
checkHier( encoder, 'D' );
encoder.encode( "E", Arrays.asList( "B" ) );
checkHier( encoder, 'E' );
encoder.encode( "F", Arrays.asList( "C" ) );
checkHier( encoder, 'F' );
encoder.encode( "G", Arrays.asList( "C" ) );
checkHier( encoder, 'G' );
encoder.encode( "H", Arrays.asList( "D" ) );
checkHier( encoder, 'H' );
encoder.encode( "I", Arrays.asList( "D" ) );
checkHier( encoder, 'I' );
//
encoder.encode( "J", Arrays.asList( "E", "F" ) );
checkHier( encoder, 'J' );
encoder.encode( "K", Arrays.asList( "E", "F" ) );
checkHier( encoder, 'K' );
encoder.encode( "L", Arrays.asList( "G" ) );
checkHier( encoder, 'L' );
encoder.encode( "M", Arrays.asList( "G" ) );
checkHier( encoder, 'M' );
encoder.encode( "N", Arrays.asList( "I", "L" ) );
checkHier( encoder, 'N' );
encoder.encode( "O", Arrays.asList( "H", "M" ) );
checkHier( encoder, 'O' );
System.out.println( encoder );
Collection<BitSet> codes = encoder.getSortedMap().values();
Iterator<BitSet> iter = codes.iterator();
Long last = -1L;
for ( int j = 0; j < codes.size() -1; j++ ) {
BitSet ns = iter.next();
Long next = toLong( ns );