diff -r f1112f777ce9 -r 96906a986c3b testdev/ite/src/com.nokia.testfw.core/src/com/nokia/testfw/core/model/result/TestRunResult.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/testdev/ite/src/com.nokia.testfw.core/src/com/nokia/testfw/core/model/result/TestRunResult.java Tue Mar 30 14:39:29 2010 +0800
@@ -0,0 +1,342 @@
+/*
+ * Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+package com.nokia.testfw.core.model.result;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IStatus;
+
+import com.nokia.testfw.core.StfPlugin;
+import com.nokia.testfw.core.model.result.TestResult.TestStatus;
+
+/**
+ * Result for one test run. It has summary counters and detail result for each
+ * test case.
+ *
+ *
+ * This result will be updated during test execution.
+ *
+ *
+ *
+ */
+public class TestRunResult {
+ int testCount = 0;
+ int passedTestCount = 0;
+ int failedTestCount = 0;
+ int skippedTestCount = 0;
+
+ LinkedHashMap root;
+ ArrayList listeners;
+
+ public TestRunResult() {
+ root = new LinkedHashMap();
+ listeners = new ArrayList();
+ }
+
+ public int getTestCount() {
+ return testCount;
+ }
+
+ public int getPassedTestCount() {
+ return passedTestCount;
+ }
+
+ public int getfailedTestCount() {
+ return failedTestCount;
+ }
+
+ public int getSkippedTestCount() {
+ return skippedTestCount;
+ }
+
+ /**
+ * add a suite to the result.
+ *
+ * @param suiteName
+ * @return
+ */
+ public synchronized TestSuiteResult addTestSuite(String suiteName) {
+ String[] suites = suiteName.split("\\.");
+
+ TestResult testResult;
+ TestSuiteResult parentSuite = null;
+ for (String suite : suites) {
+ if (parentSuite == null) {
+ testResult = root.get(new TestSuiteResult(suite)
+ .getUniqueName());
+ } else {
+ testResult = parentSuite.getChild(suite);
+ }
+ if ((testResult == null)
+ || !(testResult instanceof TestSuiteResult)) {
+ testResult = new TestSuiteResult(suite);
+ if (parentSuite == null) {
+ root.put(testResult.getUniqueName(), testResult);
+ } else {
+ parentSuite.addTestResult(testResult);
+ }
+ }
+ parentSuite = (TestSuiteResult) testResult;
+ }
+
+ return parentSuite;
+ }
+
+ /**
+ * add a test case to the result
+ *
+ * @param suiteName
+ * , maybe null if no associated suite
+ * @param caseName
+ * , test case name
+ * @return
+ */
+ public synchronized TestCaseResult addTestCase(String suiteName,
+ String caseName) {
+ TestCaseResult result = new TestCaseResult(caseName);
+ if (suiteName == null) {
+ // top level result
+ root.put(result.getUniqueName(), result);
+ } else {
+ TestSuiteResult suite = addTestSuite(suiteName);
+ suite.addTestResult(result);
+ }
+ testCount++;
+ for (TestResultListener listener : listeners) {
+ listener.addTestCase(result);
+ }
+ return result;
+ }
+
+ /**
+ * add a suite to the result.
+ *
+ * @param suiteName
+ * @return
+ */
+ public TestSuiteResult getTestSuite(String suiteName) {
+ String[] suites = suiteName.split("\\.");
+
+ TestResult testResult;
+ TestSuiteResult parentSuite = null;
+ for (String suite : suites) {
+ if (parentSuite == null) {
+ testResult = root.get(new TestSuiteResult(suite)
+ .getUniqueName());
+ } else {
+ testResult = parentSuite.getChild(suite);
+ }
+ if ((testResult != null) && (testResult instanceof TestSuiteResult)) {
+ parentSuite = (TestSuiteResult) testResult;
+ } else {
+ return null;
+ }
+ }
+
+ return parentSuite;
+ }
+
+ private TestCaseResult getTestCaseResult(String suiteName, String caseName) {
+ if (suiteName == null) {
+ return (TestCaseResult) root.get((new TestCaseResult(caseName))
+ .getUniqueName());
+ } else {
+ TestSuiteResult suite = getTestSuite(suiteName);
+ if (suite != null) {
+ TestResult result = suite.getChild(caseName);
+ if (result instanceof TestCaseResult) {
+ return (TestCaseResult) result;
+ }
+ }
+ return null;
+ }
+ }
+
+ /**
+ * update test case status and execution time. notify all listener about the
+ * test case state change
+ *
+ * @param suiteName
+ * , test suite name
+ * @param caseName
+ * , test case name
+ * @param status
+ * , the test case status
+ * @param time
+ * , will be ignored if set to -1
+ * @see TestStatus
+ * @see TestResultListener
+ */
+ public synchronized TestCaseResult updateCaseStatus(String suiteName,
+ String caseName, TestStatus status, double time) {
+ TestCaseResult result = getTestCaseResult(suiteName, caseName);
+ if (result != null) {
+ updateCaseStatus(result, status, time);
+ } else {
+ StringBuilder sb = new StringBuilder("unknown test case: ");
+ if (suiteName != null) {
+ sb.append(suiteName).append(".");
+ }
+ sb.append(caseName);
+ StfPlugin.log(IStatus.ERROR, sb.toString());
+ }
+ return result;
+ }
+
+ /**
+ * update test case status and execution time. notify all listener about the
+ * test case state change
+ *
+ * @param result
+ * , test case result
+ * @param status
+ * , the test case status
+ * @param time
+ * , will be ignored if set to -1
+ * @see TestStatus
+ * @see TestResultListener
+ */
+ public synchronized TestCaseResult updateCaseStatus(TestCaseResult result,
+ TestStatus status, double time) {
+ result.setStatus(status);
+ if (time >= 0) {
+ result.setTime(time);
+ }
+ switch (status) {
+ case SUCCESS:
+ passedTestCount++;
+ break;
+ case FAILURE:
+ failedTestCount++;
+ break;
+ case SKIP:
+ skippedTestCount++;
+ break;
+ case STARTED:
+ break;
+ default:
+ StfPlugin.log(IStatus.ERROR, "unknown teststatus:" + status);
+ }
+ updateSuiteResult(result, status);
+ for (TestResultListener listener : listeners) {
+ listener.testCaseStateChange(result, status);
+ }
+ return result;
+ }
+
+ private void updateSuiteResult(TestResult result, TestStatus status) {
+ TestSuiteResult suite = result.iParent;
+ if (suite == null) {
+ return;
+ }
+ if (status == TestStatus.STARTED) {
+ if (suite.getStatus() == TestStatus.NOTSTART) {
+ suite.setStatus(TestStatus.STARTED);
+ }
+ } else if (status == TestStatus.FAILURE) {
+ suite.setStatus(status);
+ } else if (status == TestStatus.SKIP) {
+ if (suite.getStatus() != TestStatus.FAILURE) {
+ suite.setStatus(status);
+ }
+ } else if (status == TestStatus.SUCCESS) {
+ // set the suite to pass only all cases passed
+ boolean suitePassed = true;
+ for (TestResult test : suite.getChildren()) {
+ if (test.getStatus() != TestStatus.SUCCESS) {
+ suitePassed = false;
+ break;
+ }
+ }// end of for
+ if (suitePassed) {
+ suite.setStatus(TestStatus.SUCCESS);
+ }
+ }
+ updateSuiteResult(suite, suite.getStatus());
+ }
+
+ /**
+ * add a new test result listener
+ *
+ * @param listener
+ * , the listener
+ */
+ public void addResultListener(TestResultListener listener) {
+ listeners.add(listener);
+ }
+
+ /**
+ * remove a test listener from the result
+ *
+ * @param listener
+ * , the listener to remove
+ */
+ public void removeResultListener(TestResultListener listener) {
+ listeners.remove(listener);
+ }
+
+ /**
+ * notify all listeners that test has started
+ *
+ * @see TestResultListener
+ */
+ public void testStarted() {
+ for (TestResultListener listener : listeners) {
+ listener.testStarted();
+ }
+ }
+
+ /**
+ * notify all listeners the test has finished.
+ *
+ * @see TestResultListener
+ */
+ public void testFinished() {
+ for (TestResultListener listener : listeners) {
+ listener.testFinished();
+ }
+ }
+
+ public TestResult[] getResults() {
+ return root.values().toArray(new TestResult[0]);
+ }
+
+ public Set getFailedResults() {
+ return gatherFailedTestCaseResult(root.values());
+ }
+
+ private Set gatherFailedTestCaseResult(
+ Collection results) {
+ Set failedCaseSet = new HashSet();
+ for (TestResult result : results) {
+ if (result instanceof TestCaseResult) {
+ if (result.getStatus() == TestStatus.FAILURE) {
+ failedCaseSet.add((TestCaseResult) result);
+ }
+ } else {
+ failedCaseSet
+ .addAll(gatherFailedTestCaseResult(((TestSuiteResult) result)
+ .getChildren()));
+ }
+ }
+ return failedCaseSet;
+ }
+}