@Test(expectedExceptions = IllegalArgumentException.class)
  public void illegalParameterIndexCausesException() throws Exception {

    Method method = CustomerRepository.class.getMethod("foo");
    ExecutableMetaData methodMetaData =
        beanMetaData.getMetaDataFor(ExecutableElement.forMethod(method));

    methodMetaData.getParameterMetaData(0);
  }
  @Test
  public void locallyDefinedGroupConversion() throws Exception {

    Method method =
        CustomerRepository.class.getMethod("methodWithParameterGroupConversion", Set.class);
    ExecutableMetaData methodMetaData =
        beanMetaData.getMetaDataFor(ExecutableElement.forMethod(method));

    assertThat(methodMetaData.getParameterMetaData(0).convertGroup(Default.class))
        .isEqualTo(ValidationGroup.class);
  }
  @Test
  public void unconstrainedParameterMetaData() throws Exception {

    Method method = CustomerRepository.class.getMethod("updateCustomer", Customer.class);
    ExecutableMetaData methodMetaData =
        beanMetaData.getMetaDataFor(ExecutableElement.forMethod(method));

    ParameterMetaData parameterMetaData = methodMetaData.getParameterMetaData(0);

    assertFalse(parameterMetaData.isCascading());
    assertFalse(parameterMetaData.isConstrained());
    assertThat(parameterMetaData).isEmpty();
  }
  @Test
  public void cascadingParameterMetaData() throws Exception {

    Method method = CustomerRepository.class.getMethod("saveCustomer", Customer.class);
    ExecutableMetaData methodMetaData =
        beanMetaData.getMetaDataFor(ExecutableElement.forMethod(method));

    ParameterMetaData parameterMetaData = methodMetaData.getParameterMetaData(0);

    assertTrue(parameterMetaData.isCascading());
    assertTrue(parameterMetaData.isConstrained());
    assertEquals(parameterMetaData.getIndex(), 0);
    assertEquals(parameterMetaData.getName(), "arg0");
    assertThat(parameterMetaData).isEmpty();
  }
  @Test
  public void constrainedParameterMetaData() throws Exception {

    Method method =
        CustomerRepository.class.getMethod("createCustomer", CharSequence.class, String.class);
    ExecutableMetaData methodMetaData =
        beanMetaData.getMetaDataFor(ExecutableElement.forMethod(method));

    ParameterMetaData parameterMetaData = methodMetaData.getParameterMetaData(1);

    assertFalse(parameterMetaData.isCascading());
    assertTrue(parameterMetaData.isConstrained());
    assertEquals(parameterMetaData.getIndex(), 1);
    assertEquals(parameterMetaData.getName(), "arg1");
    assertThat(parameterMetaData).hasSize(1);
    assertEquals(
        parameterMetaData.iterator().next().getDescriptor().getAnnotation().annotationType(),
        NotNull.class);
  }