/**
* Copyright (C) 2009 STMicroelectronics
*
* This file is part of "Mind Compiler" is free software: you can redistribute
* it and/or modify it under the terms of the GNU Lesser 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 Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Contact: mind@ow2.org
*
* Authors: Matthieu Leclercq
* Contributors:
*/
package org.ow2.mind.adl;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertTrue;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.ow2.mind.adl.ASTChecker.CheckerIterator;
import org.ow2.mind.adl.ASTChecker.DefinitionChecker;
import org.ow2.mind.adl.graph.ComponentGraph;
public class GraphChecker {
protected final Map<Object, Object> checkers = new IdentityHashMap<Object, Object>();
protected final ASTChecker astChecker;
public GraphChecker(final ASTChecker checker) {
this.astChecker = checker;
}
public GraphChecker() {
this(new ASTChecker());
}
protected void checkGraph(final ComponentGraph graph) {
assertNotNull("Given graph is null", graph);
assertNotNull("Graph definition is null", graph.getDefinition());
}
public ComponentGraphChecker assertGraph(final ComponentGraph graph) {
ComponentGraphChecker checker = (ComponentGraphChecker) checkers.get(graph);
if (checker == null) {
checker = createComponentGraphChecker(graph);
checkers.put(graph, checker);
}
return checker;
}
protected ComponentGraphChecker createComponentGraphChecker(
final ComponentGraph graph) {
return new ComponentGraphChecker(graph);
}
public class ComponentGraphChecker {
protected final ComponentGraph graph;
public ComponentGraphChecker(final ComponentGraph graph) {
this.graph = graph;
checkGraph(graph);
}
public DefinitionChecker definition() {
return astChecker.assertDefinition(graph.getDefinition());
}
public ComponentGraphChecker and() {
return this;
}
public ComponentGraphChecker isNotShared() {
assertTrue("Compoent has more than one parent",
graph.getParents().length <= 1);
return this;
}
public ComponentGraphChecker isShared() {
assertTrue("Compoent has less than two parent",
graph.getParents().length > 1);
return this;
}
public ComponentGraphChecker containsSubComponent(final String name) {
definition().containsComponent(name);
final ComponentGraph subComponent = graph.getSubComponent(name);
assertNotNull("Component graph does not contains a " + name
+ " sub-component.", subComponent);
return assertGraph(subComponent);
}
public ComponentGraphCheckerIterator containsSubComponents(
final String... names) {
definition().containsComponents(names);
final Set<String> nameSet = new HashSet<String>();
final List<ComponentGraphChecker> list = new ArrayList<ComponentGraphChecker>(
names.length);
for (final String name : names) {
assertTrue("Duplucated string in given names " + names, nameSet
.add(name));
list.add(containsSubComponent(name));
}
assertEquals("Definition contains more sub-components than expected.",
names.length, graph.getSubComponents().length);
return new ComponentGraphCheckerIterator(list);
}
public String containsAttributeValue(final String name) {
definition().containsAttribute(name);
final Map<?, ?> attributeValues = (Map<?, ?>) graph
.getDecoration("attribute-values");
assertNotNull("Component does not contains attribute value",
attributeValues);
final String v = (String) attributeValues.get(name);
assertNotNull(
"Component does not contains attribute value for attribute " + name,
v);
return v;
}
public ComponentGraphChecker containsAttributeValue(final String name,
final int v) {
assertEquals("Unexpected integer value", containsAttributeValue(name),
Integer.toString(v));
return this;
}
public ComponentGraphChecker containsAttributeValue(final String name,
final String v) {
assertEquals("Unexpected String value", containsAttributeValue(name), v);
return this;
}
}
public class ComponentGraphCheckerIterator
extends
CheckerIterator<ComponentGraphCheckerIterator, ComponentGraphChecker> {
public ComponentGraphCheckerIterator(final List<ComponentGraphChecker> list) {
super(list);
}
@Override
protected ComponentGraphCheckerIterator getThis() {
return this;
}
public ComponentGraphCheckerIterator isNotShared() {
element.isNotShared();
return this;
}
public ComponentGraphCheckerIterator isShared() {
element.isShared();
return this;
}
public ComponentGraphCheckerIterator containsSubComponent(final String name) {
element.containsSubComponent(name);
return this;
}
public ComponentGraphCheckerIterator containsSubComponents(
final String... names) {
return element.containsSubComponents(names);
}
public ComponentGraphCheckerIterator containsAttributeValue(
final String name) {
element.containsAttributeValue(name);
return this;
}
public ComponentGraphCheckerIterator containsAttributeValue(
final String name, final int v) {
element.containsAttributeValue(name, v);
return this;
}
public ComponentGraphCheckerIterator containsAttributeValue(
final String name, final String v) {
element.containsAttributeValue(name, v);
return this;
}
}
}