package org.testng.eclipse.ui.tree; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import org.testng.ITestResult; import org.testng.eclipse.ui.ImagesUtil; import org.testng.eclipse.ui.RunInfo; abstract public class BaseTreeItem implements ITreeItem { private static final String DATA_TREE_ITEM = "treeItem"; private float m_time; private TreeItem m_treeItem; private RunInfo m_runInfo; private Integer m_testState = 0; public static ITreeItem getTreeItem(TreeItem ti) { return (ITreeItem) ti.getData(DATA_TREE_ITEM); } public BaseTreeItem(TreeItem parent, RunInfo runInfo) { m_treeItem = new TreeItem(parent, SWT.None); init(runInfo); } public BaseTreeItem(Tree parent, RunInfo runInfo) { m_treeItem = new TreeItem(parent, SWT.None); init(runInfo); } private void init(RunInfo runInfo) { m_runInfo = runInfo; m_treeItem.setExpanded(true); m_treeItem.setData(DATA_TREE_ITEM, this); } public void addToCumulatedTime(RunInfo runInfo) { m_time += runInfo.getTime(); update(runInfo); } protected float getTime() { return m_time; } public TreeItem getTreeItem() { return m_treeItem; } public RunInfo getRunInfo() { return m_runInfo; } /** * Once a node is in failure, it needs to remain in failure, so only update it if * 1) it hasn't received an image yet or 2) it's being updated to something else * than a success. */ protected void maybeUpdateImage(RunInfo runInfo) { int status = runInfo.getStatus(); TreeItem treeItem = getTreeItem(); if (m_testState == 0 || isNewState(status)) { treeItem.setImage(ImagesUtil.getSuiteImage(status)); m_testState = status; } } /** * Only keep the most problematic state to give an accurate view to the user. * * @param state the new state to test * @return whether the passed in state will be the new state for this TreeItem. */ private boolean isNewState(int state) { switch (m_testState) { case ITestResult.STARTED: return state != ITestResult.STARTED; case ITestResult.SUCCESS: return state != ITestResult.STARTED && state != ITestResult.SUCCESS; case ITestResult.SUCCESS_PERCENTAGE_FAILURE: return state == ITestResult.FAILURE || state == ITestResult.SKIP; case ITestResult.SKIP: return state == ITestResult.FAILURE; case ITestResult.FAILURE: return false; default: throw new IllegalArgumentException("Illegal state: " + state); } } }