@@ -0,0 +1,1627 @@
+package org.realityforge.replicant.server;%0A%0Aimport java.util.ArrayList;%0Aimport java.util.Arrays;%0Aimport java.util.Collections;%0Aimport java.util.List;%0Aimport org.testng.annotations.Test;%0Aimport static org.testng.Assert.*;%0A%0Apublic class ChannelDescriptorTest%0A%7B%0A  @SuppressWarnings( %22EqualsWithItself%22 )%0A  @Test%0A  public void basicOperation()%0A  %7B%0A    final ChannelDescriptor cd1 = new ChannelDescriptor( 1, %22X%22 );%0A    final ChannelDescriptor cd2 = new ChannelDescriptor( 1, %22X%22 );%0A    final ChannelDescriptor cd3 = new ChannelDescriptor( 1, %22Y%22 );%0A    final ChannelDescriptor cd4 = new ChannelDescriptor( 2, null );%0A    final ChannelDescriptor cd5 = new ChannelDescriptor( 3, null );%0A    final ChannelDescriptor cd6 = new ChannelDescriptor( 2, null );%0A%0A    assertEquals( cd1.getChannelID(), 1 );%0A    assertEquals( cd1.getSubChannelID(), %22X%22 );%0A    assertEquals( cd1.toString(), %22#1.X#%22 );%0A    assertTrue( cd1.equals( cd1 ) );%0A    assertTrue( cd1.equals( cd2 ) );%0A    assertFalse( cd1.equals( cd3 ) );%0A    assertFalse( cd1.equals( cd4 ) );%0A%0A    assertEquals( cd4.getChannelID(), 2 );%0A    assertEquals( cd4.getSubChannelID(), null );%0A    assertEquals( cd4.toString(), %22#2#%22 );%0A    assertTrue( cd4.equals( cd4 ) );%0A    assertTrue( cd4.equals( cd6 ) );%0A    assertFalse( cd4.equals( cd3 ) );%0A    assertFalse( cd4.equals( cd5 ) );%0A%0A    final List%3CChannelDescriptor%3E list = new ArrayList%3C%3E( Arrays.asList( cd6, cd5, cd4, cd3, cd2, cd1, cd6 ) );%0A%0A    Collections.sort( list );%0A%0A    final ChannelDescriptor%5B%5D expected = %7B cd1, cd2, cd3, cd4, cd6, cd6, cd5 %7D;%0A    assertEquals( list.toArray( new ChannelDescriptor%5B 0 %5D ), expected );%0A  %7D%0A%7D%0A

Add some basic tests around ChannelDescriptor