/*******************************************************************************
 * Copyright (c) 2009 Tasktop Technologies and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     Tasktop Technologies - initial API and implementation
 *******************************************************************************/
package org.eclipse.mylyn.tests.ui.util;

import org.eclipse.swtbot.swt.finder.SWTBot;
import org.eclipse.swtbot.swt.finder.waits.ICondition;

/**
 * a condition that dispatches to multiple delegates.
 * 
 * @author David Green
 */
public class CompoundCondition implements ICondition {

	private ICondition[] conditions;

	private boolean and;

	private boolean[] results;

	public static CompoundCondition and(ICondition... conditions) {
		return new CompoundCondition(conditions, true);
	}

	public static CompoundCondition or(ICondition... conditions) {
		return new CompoundCondition(conditions, false);
	}

	protected CompoundCondition(ICondition[] conditions, boolean and) {
		if (conditions == null || conditions.length == 0) {
			throw new IllegalArgumentException();
		}
		this.conditions = conditions;
		results = new boolean[conditions.length];
		this.and = and;
	}

	public String getFailureMessage() {
		String message = "";
		for (ICondition c : conditions) {
			if (message.length() == 0) {
				message += ", ";
				message += and ? "AND " : "OR ";
			}
			message += c.getFailureMessage();
		}
		return message;
	}

	public void init(SWTBot bot) {
		for (ICondition c : conditions) {
			c.init(bot);
		}
	}

	public boolean test() throws Exception {
		int success = 0;
		for (int x = 0; x < conditions.length; ++x) {
			ICondition c = conditions[x];
			if (c.test()) {
				results[x] = true;
				if (!and) {
					return true;
				}
				++success;
			} else {
				results[x] = false;
				if (and) {
					return false;
				}
			}
		}
		return success == conditions.length;
	}

	public boolean[] getResults() {
		return results;
	}
}
