/*
Copyright 2014 Red Hat, Inc. and/or its affiliates.
This file is part of darcy-ui.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.redhat.darcy.ui.matchers;
import com.redhat.darcy.ui.api.View;
import com.redhat.darcy.ui.api.elements.Element;
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import static com.redhat.darcy.ui.matchers.DarcyMatchers.displayed;
import static com.redhat.darcy.ui.matchers.DarcyMatchers.loaded;
import static com.redhat.darcy.ui.matchers.DarcyMatchers.present;
/**
* Tests whether a required field's object's state is appropriate for a view with those fields to be
* considered loaded. What is required of an object's state is dependent on the type of object.
* See {@link #doesItemMatchAppropriateCondition(Object)} for details.
* <p>
* If the tested object is not a {@link com.redhat.darcy.ui.api.elements.Findable},
* {@link com.redhat.darcy.ui.api.elements.Element}, or {@link com.redhat.darcy.ui.api.View}, then
* it will never match.
*/
public class LoadConditionMatcher extends BaseMatcher<Object> {
@Override
public boolean matches(Object item) {
return doesItemMatchAppropriateCondition(item);
}
@Override
public void describeTo(Description description) {
description.appendText("a Findable, Element, or View that is present, displayed, or loaded "
+ "respectively, depending on the type.");
}
/**
* Takes an object, and determines a condition for that object that should satisfy the
* containing view is loaded. Different conditions are made depending on the type of object.
*
* <table>
* <thead>
* <tr>
* <td>Type</td>
* <td>Method</td>
* </tr>
* </thead>
* <tbody>
* <tr>
* <td>{@link com.redhat.darcy.ui.api.View}</td>
* <td>{@link com.redhat.darcy.ui.api.View#isLoaded()}</td>
* </tr>
* <tr>
* <td>{@link com.redhat.darcy.ui.api.elements.Element}</td>
* <td>{@link com.redhat.darcy.ui.api.elements.Element#isDisplayed()}</td>
* </tr>
* <tr>
* <td>{@link com.redhat.darcy.ui.api.elements.Findable}</td>
* <td>{@link com.redhat.darcy.ui.api.elements.Findable#isPresent()}</td>
* </tr>
* </tbody>
* </table>
*/
private boolean doesItemMatchAppropriateCondition(Object item) {
Matcher<?> matcher;
if (item instanceof View) {
matcher = loaded();
} else if (item instanceof Element) {
matcher = displayed();
} else {
matcher = present();
}
return matcher.matches(item);
}
}