Locked History Actions

wicket/ExWicketTester/Source

拡張Wicketテスタのソース

package com.cm55.third.wicket.test;

import java.io.*;
import java.util.*;

import junit.framework.*;

import org.apache.wicket.*;
import org.apache.wicket.feedback.*;
import org.apache.wicket.markup.html.form.*;
import org.apache.wicket.markup.html.panel.*;
import org.apache.wicket.protocol.http.*;
import org.apache.wicket.util.tester.*;

/**
 * 拡張Wicketテスタ
 */
public class ExWicketTester  {

  /** Wicketのテスター */
  protected WicketTester wicketTester;
  
  /** 作成 */
  public ExWicketTester() {
    wicketTester = new WicketTester();
  }
  
  /** WebApplicationを指定して作成 */
  public ExWicketTester(WebApplication application) {
    wicketTester = new WicketTester(application);
  }
  
  /**
   * Formに対するテスターを作成する
   * @param form フォーム
   * @return ExFormTester
   */
  public <T extends Form<?>> ExFormTester<T> newFormTester(T form) {
    String path = form.getPageRelativePath();  
    if (path.length() == 0) {
      throw new IllegalArgumentException("指定フォームはページ上にありません");
    }    
    return new ExFormTester<T>(wicketTester.newFormTester(path));
  }

  /** ページの描画開始 */
  @SuppressWarnings("unchecked")
  public  <C extends Page> C startPage(Class<C> pageClass) {
    return (C)wicketTester.startPage(pageClass);
  }
  
  /** ページの描画開始 */
  @SuppressWarnings("unchecked")
  public <T extends Page> T startPage(T page) {
    return (T)wicketTester.startPage(page);
  }
  
  /** パネルの描画開始。ExTestPanelSourceを指定する */
  @SuppressWarnings("unchecked")
  public <T extends Panel> T startPanel(final ExTestPanelSource testPanelSource) {
    return (T)wicketTester.startPanel(new TestPanelSource() {
      public Panel getTestPanel(final String panelId) {
        return testPanelSource.getTestPanel(panelId);
      }
    });
  }

  /** 最後に描画したページを取得 */
  @SuppressWarnings("unchecked")
  public <T extends Page> T getLastRenderedPage() {
    return (T)wicketTester.getLastRenderedPage();
  }

  /** 何らかのエラーメッセージがある */
  public void assertHasErrorMessage() {
    List<Serializable> messages = wicketTester.getMessages(FeedbackMessage.ERROR);
    Assert.assertTrue("expect some error message, but contains none.",
        messages.size() != 0);
  }
  
  ////////////////////////////////////////////////////////////////////////////
  // 以下は単純なWicketTesterのラッパ
  ////////////////////////////////////////////////////////////////////////////
  
  public void assertRenderedPage(Class<? extends Page> expectedRenderedPageClass) {
    wicketTester.assertRenderedPage(expectedRenderedPageClass);
  }
  
  public void assertErrorMessages(String[] expectedErrorMessages) {
    wicketTester.assertErrorMessages(expectedErrorMessages);
  }
  
  public void assertInvisible(String path) {
    wicketTester.assertInvisible(path);
  }
  
  public void assertNoErrorMessage() {
    wicketTester.assertNoErrorMessage();
  }
  
  public void assertVisible(String path) {
    wicketTester.assertVisible(path);
  }
  
  public void assertLabel(String path, String expectedLabelText) {
    wicketTester.assertLabel(path, expectedLabelText);
  }
  
  public FormTester newFormTester(String path) {
    return wicketTester.newFormTester(path);
  }
  
  public void clickLink(String path) {
    wicketTester.clickLink(path);
  }
}

package com.cm55.third.wicket.test;

import org.apache.wicket.*;
import org.apache.wicket.markup.html.form.*;
import org.apache.wicket.util.tester.*;

/**
 * 拡張フォームテスタ
 */
public class ExFormTester<T extends Form<?>> {

  /** Wicket本体のフォームテスタ */
  protected FormTester formTester;
  
  /**
   * Wicketのフォームテスタとフォームを指定する。
   * @param formTester
   * @param form
   */
  @SuppressWarnings("unchecked")
  ExFormTester(FormTester formTester) {
    this.formTester = formTester;
  }
  
  /** フォームを取得 */
  @SuppressWarnings("unchecked")
  public T getForm() {
    return (T)formTester.getForm();
  }
    
  /** フォーム内コンポーネントのIDを指定して値を設定 */
  public void setValue(String id, String value) {
    formTester.setValue(id, value);
  }
  
  /** フォーム内コンポーネントの値を設定 */
  public void setValue(Component component, String value) {
    formTester.setValue(componentRelativePath(component), value);
  }
  
  /** フォームをサブミット */
  public void submit() {
    formTester.submit();
  }
  
  /** フォーム内コンポーネントを指定してサブミット */
  public void submit(Component component) {
    componentRelativePath(component);
    formTester.submit(component.getId());
  }
  
  /**
   * 指定されたコンポーネントについて、フォームからの相対パスを取得
   * @param component コンポーネント
   * @return フォームからの相対パス、コロン区切り
   */
  private String componentRelativePath(Component component) {
    // フォームのページからの相対パスとコンポーネントのページからの相対パスを取得し
    // その差分がコンポーネントのフォームからの相対パスとなる。
    String formPath = getForm().getPageRelativePath();    
    String componentPath = component.getPageRelativePath();
    if (!componentPath.startsWith(formPath)) {
      throw new IllegalArgumentException("指定コンポーネントはフォーム上にありません");
    }
    String path = componentPath.substring(formPath.length() + 1);    
    return path;
  }  
}

package com.cm55.third.wicket.test;

import org.apache.wicket.*;
import org.apache.wicket.markup.html.panel.*;

/**
 * テスト対象パネルの取得用インターフェース
 * @param <T> パネルのタイプ
 */
public interface ExTestPanelSource<T extends Panel> extends IClusterable {
  public T getTestPanel(final String panelId);
}