@Test
  public void testGroupInfoMapHasCorrectPosAndGroupIndex() {
    final String PATT = "(foo)(?<X>a)(?<Y>b)(bar)(?<Z>c)(?<Z>d)"; // two groups named "Z"
    Pattern p = Pattern.compile(PATT);
    Map<String, List<GroupInfo>> map = p.groupInfo();
    assertNotNull(map);

    GroupInfo[] inf = (GroupInfo[]) map.get("X").toArray(new GroupInfo[0]);
    assertEquals(1, inf.length);
    assertEquals(PATT.indexOf("(?<X>"), inf[0].pos());
    assertEquals(1, inf[0].groupIndex());

    GroupInfo[] inf2 = (GroupInfo[]) map.get("Y").toArray(new GroupInfo[0]);
    assertEquals(1, inf2.length);
    assertEquals(PATT.indexOf("(?<Y>"), inf2[0].pos());
    assertEquals(2, inf2[0].groupIndex());

    // test both Z groups
    GroupInfo[] inf3 = (GroupInfo[]) map.get("Z").toArray(new GroupInfo[0]);
    assertEquals(2, inf3.length);
    int posZ = PATT.indexOf("(?<Z>");
    assertEquals(posZ, inf3[0].pos());
    assertEquals(4, inf3[0].groupIndex());
    assertEquals(PATT.indexOf("(?<Z>", posZ + 1), inf3[1].pos());
    assertEquals(5, inf3[1].groupIndex());
  }
 @Test
 public void testGroupInfoMapHasNamesAsKeys() {
   final String PATT = "(foo)(?<X>a)(?<Y>b)(bar)(?<Z>c)(?<Z>d)"; // two groups named "Z"
   Pattern p = Pattern.compile(PATT);
   Map<String, List<GroupInfo>> map = p.groupInfo();
   assertNotNull(map);
   assertEquals(3, map.size());
   assertTrue(map.containsKey("X"));
   assertTrue(map.containsKey("Y"));
   assertTrue(map.containsKey("Z"));
 }