@Test
  public void customBinaryFieldTest() throws IOException {
    BinaryStruct struct =
        new BinaryStruct() {
          @BinaryStruct.CustomBinaryField(index = 1, serializer = ByteStringSerializer.class)
          public String s1 = "1234";
        };

    byte[] data = BinaryStructOutputStream.serialize(struct);
    assertArrayEquals(new byte[] {0b0000_0001, 0b0000_0010, 0b0000_0011, 0b0000_0100}, data);
  }
  @Test
  public void basicBooleanTest() throws IOException {
    BinaryStruct struct =
        new BinaryStruct() {
          @BinaryField(index = 1, length = 1)
          public boolean b1 = false;

          @BinaryField(index = 2, length = 1)
          public boolean b2 = true;
        };

    byte[] data = BinaryStructOutputStream.serialize(struct);
    assertArrayEquals(new byte[] {(byte) 0b0100_0000}, data);
  }
  @Test
  public void shortIntTest() throws IOException {
    BinaryStruct struct =
        new BinaryStruct() {
          @BinaryField(index = 1, length = 16)
          int i1 = 1;

          @BinaryField(index = 2, length = 16)
          int i2 = 2;
        };

    byte[] data = BinaryStructOutputStream.serialize(struct);
    assertArrayEquals(new byte[] {0, 1, 0, 2}, data);
  }
  @Test
  public void basicStringTest() throws IOException {
    BinaryStruct struct =
        new BinaryStruct() {
          @BinaryField(index = 1, length = 8)
          int i1 = Integer.MAX_VALUE;

          @BinaryField(index = 2, length = 12 * 8)
          public String s2 = "hello world!";
        };

    byte[] expected = "0hello world!".getBytes();
    expected[0] = (byte) 0xFF;
    byte[] data = BinaryStructOutputStream.serialize(struct);
    assertArrayEquals(expected, data);
  }
  @Test
  public void variableLengthFieldTest() throws IOException {
    BinaryStruct struct =
        new BinaryStruct() {
          @BinaryField(index = 1, length = 8)
          private int s1 = 2;

          @VariableLengthBinaryField(index = 2, lengthField = "s1")
          private String s2 = "12345";
        };

    byte[] expected = "012".getBytes();
    expected[0] = 2;
    byte[] data = BinaryStructOutputStream.serialize(struct);
    assertArrayEquals(expected, data);
  }
  @Test
  public void mixedTypeTest() throws IOException {
    BinaryStruct struct =
        new BinaryStruct() {
          @BinaryField(index = 1, length = 26)
          private int house = 11_772_006;

          @BinaryField(index = 2, length = 1)
          private boolean group = false;

          @BinaryField(index = 3, length = 1)
          private boolean enable = true;

          @BinaryField(index = 4, length = 4)
          private int unit = 0;
        };

    byte[] expected =
        new byte[] {
          (byte) 0b0010_1100, (byte) 0b1110_1000, (byte) 0b0001_1001, (byte) 0b10_0_1_0000
        };
    byte[] actual = BinaryStructOutputStream.serialize(struct);
    assertArrayEquals(expected, actual);
  }