読者です 読者をやめる 読者になる 読者になる

プラグインのテストコードを書く(ツールバー編:v3.3)

今日は4年に1度の大肉の日。今日リリースとかやったらかっこいいのだけれども、今回も断念。へたれっぷりにがっくし。
さて、プラグインのテストコードを書く(コマンド編:v3.3) - Fly me to the Juno!/プラグインのテストコードを書く(ショートカット編:v3.3) - Fly me to the Juno!に引き続きテストコードの型シリーズ第3回。今回もKenichi Takahashi氏のFontSizeChangerですよー。リポジトリ

https://eclipse-study.svn.sourceforge.net/svnroot/eclipse-study/EasyFontChanger/branches/TRY-Active-View/

です。
今回のお題はツールバー-コマンド間の実行(Toolbar-Command)です。
ツールバーとコマンドの関係はplugin.xmlに次のように書きます。

 <extension
   point="org.eclipse.ui.menus">
  <menuContribution
    locationURI="toolbar:org.eclipse.ui.main.toolbar?after=additions">
   <toolbar
     id="net.shu_cream.eclipse.font">
    <command
      commandId="net.shu_cream.eclipse.font.large" (1)
      icon="icons/large.gif"
      id="large" (3)
      label="Large"
      style="push"
      tooltip="Large">
    </command>
   </toolbar>
  </menuContribution>
 </extension>
 <extension
   point="org.eclipse.ui.commands">
  <command
    categoryId="net.shu-cream.eclipse.font.category1"
    id="net.shu_cream.eclipse.font.large" (1)
    name="Large">
 </extension>

例によって(1)がToolbarとCommandを結びつけるキーです。で、今回書いたテストコードはこんな感じ。

 @Test
 public void このクラスがツールバーに登録されているか() throws Exception {
  IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
  for(IWorkbenchWindow w : windows){
   ApplicationWindow window = (ApplicationWindow) w;//(a)
   ICoolBarManager coolbar = window.getCoolBarManager2();
   ToolBarContributionItem contributionItem = (ToolBarContributionItem) coolbar.find("net.shu_cream.eclipse.font");
   assertNotNull(contributionItem);
   
   ToolBarManager barManager = (ToolBarManager) contributionItem.getToolBarManager();
   IContributionItem item = barManager.find("large");//(b)
   assertNotNull(item);
   assertTrue(item instanceof CommandContributionItem);
   
   CommandContributionItem commandItem = (CommandContributionItem) item;
   assertTrue(commandItem.isEnabled());

   doCommand(barManager);
  }
  
 }

 private void doCommand(ToolBarManager barManager) {
  ToolBar toolbar = barManager.getControl();
  ToolItem[] toolItems = toolbar.getItems();
  for(ToolItem toolItem : toolItems){
   if("Large".equals(toolItem.getToolTipText())){
    // execute toolbar item
    toolItem.notifyListeners(SWT.Selection, null);//(c)
   }
  }
 }

若干無理やり感が漂っているコードですが、これでもツールバーに登録されていて、きちんと動くかどうかを確認できます。
まず(a)ですが、直接インスタンスを確認するとWorkbenchWinndowクラスが返ってきています。そうです。Eclipseのウィンドウクラスです。それを無理やりJFaceのApplicationWindowクラスへキャストしているのは、WorkbenchWindowクラスがinternalだから。不要なinternalへの参照はなるだけ避けるようにしましょう。
(b)ではlargeというキー名でツールバーのアイテムを取得しています。plugin.xmlの(3)のキー名です。さらっと取得してみましょ。
(c)では実際に取得したツールバーのアイテムを実行しています。ちょっとズルいのはラベル名を取得して比較しているところでしょうか。でもそういう名前のチェックがあってもいいよねー。(と言い訳にならない言い逃れ。)
これで一応FontSizeCheckerの一機能に関してはテストが書けたのではないかと自画自賛。プラグインのテストを書くと何が一番うれしいかって、バージョンやOSなどの環境の違うEclipse上できちんと動くかどうかさらっと検証ができる点。LL系のソフトでは実働環境で動いているかどうかを確認するためのテストコードが付属することが多いですが、Eclipse Pluginでそこまで手をまわす人が少ないこの事実。Eclipse Foundationが公開しているWikiにもあんまりその辺の情報がない点が足を引っ張っているんでしょうね。
以上テストで足らない点があればご指摘くださいね。