@Test(expected = CompilerException.class)
 public void testParseTargetMethodAnnotationsInvalid4() throws Exception {
   SootMethod m = toSootClass(Runners.class).getMethodByName("runner1");
   ObjCBlockPlugin.parseTargetMethodAnnotations(m, 0, "@ByVal(");
 }
  @Test
  public void testParseTargetMethodAnnotations() throws Exception {
    SootMethod m = toSootClass(Runners.class).getMethodByName("runner1");

    assertArrayEquals(new String[][] {{}}, ObjCBlockPlugin.parseTargetMethodAnnotations(m, 0, ""));
    assertArrayEquals(
        new String[][] {{}}, ObjCBlockPlugin.parseTargetMethodAnnotations(m, 0, "  "));
    assertArrayEquals(
        new String[][] {{}}, ObjCBlockPlugin.parseTargetMethodAnnotations(m, 0, "()"));
    assertArrayEquals(
        new String[][] {{BY_VAL, POINTER}},
        ObjCBlockPlugin.parseTargetMethodAnnotations(m, 0, "@Pointer@ByVal"));
    assertArrayEquals(
        new String[][] {{BY_VAL, POINTER}},
        ObjCBlockPlugin.parseTargetMethodAnnotations(m, 0, "@Pointer  @ByVal ()"));

    assertArrayEquals(
        new String[][] {{BY_VAL, POINTER}, {BY_REF}},
        ObjCBlockPlugin.parseTargetMethodAnnotations(m, 1, "@Pointer  @ByVal (@ByRef)"));
    assertArrayEquals(
        new String[][] {{BY_VAL, POINTER}, {BY_REF, POINTER}},
        ObjCBlockPlugin.parseTargetMethodAnnotations(
            m, 1, "@Pointer  @ByVal (  @ByRef  @Pointer  )"));
    assertArrayEquals(
        new String[][] {{BY_VAL, POINTER}, {BY_REF, POINTER}, {MACHINE_SIZED_S_INT}, {}},
        ObjCBlockPlugin.parseTargetMethodAnnotations(
            m, 3, "@Pointer  @ByVal (  @ByRef  @Pointer , @MachineSizedSInt , )"));
    assertArrayEquals(
        new String[][] {{BY_VAL, POINTER}, {}, {BY_REF, POINTER}},
        ObjCBlockPlugin.parseTargetMethodAnnotations(m, 2, "@Pointer @ByVal(,@ByRef @Pointer)"));
    assertArrayEquals(
        new String[][] {{}, {BY_REF, POINTER}},
        ObjCBlockPlugin.parseTargetMethodAnnotations(m, 1, "(@ByRef @Pointer)  "));

    assertArrayEquals(
        new String[][] {
          {},
          {
            BLOCK,
            BY_REF,
            BY_VAL,
            MACHINE_SIZED_FLOAT,
            MACHINE_SIZED_S_INT,
            MACHINE_SIZED_U_INT,
            POINTER
          }
        },
        ObjCBlockPlugin.parseTargetMethodAnnotations(
            m,
            1,
            "(@ByRef @ByVal @Pointer @MachineSizedFloat @MachineSizedSInt "
                + "@MachineSizedUInt @Block)  "));
  }