public void testBind() {
    MockAbstractBinder binder =
        new MockAbstractBinder(root, form, handler) {
          protected void setupController() throws Exception {
            put("setupController()", Boolean.TRUE);
          }
        };

    binder.bind();

    assertNotNull(binder.get("bindActionMetadata(String,FormMetadata,ActionMetadata)"));
    assertNotNull(binder.get("bindDataProvider(String,FormMetadata,DataProviderMetadata)"));
    assertNotNull(binder.get("bindFieldMetadata(String,FormMetadata,FieldMetadata)"));
    assertNotNull(binder.get("setupController()"));
  }
  public void testDataProvidedListChanged() throws Exception {
    DataProviderMetadata dataMeta =
        (DataProviderMetadata)
            form.getFormMetadata()
                .getDataProviderMetadatas()
                .get(new MethodEntry(form.getMethod("someDataProvider")));

    MockAbstractBinder binder =
        new MockAbstractBinder(root, form, handler) {
          protected void resetSelectedFields(DataProviderMetadata meta) throws Exception {
            put("resetSelectedFields(DataProviderMetadata)", meta);
          }
        };

    binder.bind();
    MockBoundDataProvider bound =
        (MockBoundDataProvider) binder.getBoundDataProvider(dataMeta.getWidgetName());

    final List list = Collections.singletonList("someValue");

    binder.dataProvidedListChanged(dataMeta, list);

    assertSame(list, bound.get("updateList(List)"));

    form.getController().setResetOnDataProviderChange(false);
    binder.clear();
    bound.clear();

    binder.dataProvidedListChanged(dataMeta, list);

    assertSame(list, bound.get("updateList(List)"));
    assertNull(binder.get("resetSelectedFields(DataProviderMetadata)"));
  }
  public void testRefreshWithException() throws Exception {
    final MockAbstractBinder binder = new MockAbstractBinder(root, form, handler);
    final Exception ex = new IllegalArgumentException();
    form.getController().putException("update()", ex);

    binder.bind();
    binder.refresh();

    assertNull(form.getController().get("update()"));
    assertSame(ex, binder.get("handleException(Throwable)"));
  }
  public void testBindWithException() {
    MockAbstractBinder binder =
        new MockAbstractBinder(root, form, handler) {
          protected BoundField bindFieldMetadata(
              String name, FormMetadata formMetadata, FieldMetadata fieldMetadata) {
            throw new IllegalArgumentException();
          }

          public void unbind() {
            put("unbind()", Boolean.TRUE);
          }

          public void handleException(Throwable throwable) {
            put("handleException(Throwable)", throwable);
          }
        };

    binder.bind();

    assertNotNull(binder.get("unbind()"));
    assertTrue(binder.get("handleException(Throwable)") instanceof IllegalArgumentException);
  }
  public void testInvokeAction() throws Exception {
    final MockAbstractBinder binder = new MockAbstractBinder(root, form, handler);

    binder.bind();
    binder.invokeAction("someAction");

    assertSame("someAction", form.getController().get("invokeAction(actionName)"));

    binder.clear();
    form.getController().clear();

    final Exception ex = new IllegalArgumentException();
    form.getController().putException("invokeAction(String,Map)", ex);
    binder.invokeAction("someAction");

    assertNull(form.getController().get("invokeAction(actionName)"));
    assertSame(ex, binder.get("handleException(Throwable)"));
  }