/* $Id: AbstractBoModuleTest.java,v 1.1 2005/12/09 18:26:20 m31 Exp $
 *
 * This file is part of the project "Hilbert II" - http://www.qedeq.org
 *
 * Copyright 2000-2005,  Michael Meyling <mime@qedeq.org>.
 *
 * "Hilbert II" 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 2 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.
 */

package org.qedeq.kernel.bo.module;

import java.util.HashMap;
import java.util.Map;

import org.qedeq.kernel.base.module.Author;
import org.qedeq.kernel.base.module.AuthorList;
import org.qedeq.kernel.base.module.Axiom;
import org.qedeq.kernel.base.module.Chapter;
import org.qedeq.kernel.base.module.ChapterList;
import org.qedeq.kernel.base.module.Definition;
import org.qedeq.kernel.base.module.FormulaOrTerm;
import org.qedeq.kernel.base.module.Header;
import org.qedeq.kernel.base.module.Import;
import org.qedeq.kernel.base.module.ImportList;
import org.qedeq.kernel.base.module.Latex;
import org.qedeq.kernel.base.module.LatexList;
import org.qedeq.kernel.base.module.LinkList;
import org.qedeq.kernel.base.module.Location;
import org.qedeq.kernel.base.module.LocationList;
import org.qedeq.kernel.base.module.Node;
import org.qedeq.kernel.base.module.NodeType;
import org.qedeq.kernel.base.module.Proof;
import org.qedeq.kernel.base.module.ProofList;
import org.qedeq.kernel.base.module.Proposition;
import org.qedeq.kernel.base.module.Qedeq;
import org.qedeq.kernel.base.module.Rule;
import org.qedeq.kernel.base.module.Section;
import org.qedeq.kernel.base.module.SectionList;
import org.qedeq.kernel.base.module.Specification;
import org.qedeq.kernel.base.module.Subsection;
import org.qedeq.kernel.base.module.SubsectionList;
import org.qedeq.kernel.base.module.SubsectionType;
import org.qedeq.kernel.base.module.UsedByList;
import org.qedeq.kernel.base.module.VariableList;
import org.qedeq.kernel.test.AbstractValueObjectTest;

/**
 * Test helper. Gives concrete class for an interface.
 *
 * @version $Revision: 1.1 $
 * @author    Michael Meyling
 */
public abstract class AbstractBoModuleTest extends AbstractValueObjectTest {

    /** Maps abstract classes to an implementation class. */
    private static final Map interface2ConcreteClass = new HashMap();

    static {
        interface2ConcreteClass.put(Author.class, AuthorBo.class);
        interface2ConcreteClass.put(AuthorList.class, AuthorListBo.class);
        interface2ConcreteClass.put(Axiom.class, AxiomBo.class);
        interface2ConcreteClass.put(Chapter.class, ChapterBo.class);
        interface2ConcreteClass.put(ChapterList.class, ChapterListBo.class);
        interface2ConcreteClass.put(Definition.class, DefinitionBo.class);
        interface2ConcreteClass.put(FormulaOrTerm.class, FormulaOrTermBo.class);
        interface2ConcreteClass.put(Header.class, HeaderBo.class);
        interface2ConcreteClass.put(Import.class, ImportBo.class);
        interface2ConcreteClass.put(ImportList.class, ImportListBo.class);
        interface2ConcreteClass.put(Latex.class, LatexBo.class);
        interface2ConcreteClass.put(LatexList.class, LatexListBo.class);
        interface2ConcreteClass.put(LinkList.class, LinkListBo.class);
        interface2ConcreteClass.put(Location.class, LocationBo.class);
        interface2ConcreteClass.put(LocationList.class, LocationListBo.class);
        interface2ConcreteClass.put(Node.class, NodeBo.class);
        interface2ConcreteClass.put(Proof.class, ProofBo.class);
        interface2ConcreteClass.put(ProofList.class, ProofListBo.class);
        interface2ConcreteClass.put(Proposition.class, PropositionBo.class);
        interface2ConcreteClass.put(Qedeq.class, QedeqBo.class);
        interface2ConcreteClass.put(Rule.class, RuleBo.class);
        interface2ConcreteClass.put(Section.class, SectionBo.class);
        interface2ConcreteClass.put(SectionList.class, SectionListBo.class);
        interface2ConcreteClass.put(Specification.class, SpecificationBo.class);
        interface2ConcreteClass.put(Subsection.class, SubsectionBo.class);
        interface2ConcreteClass.put(SubsectionList.class, SubsectionListBo.class);
        interface2ConcreteClass.put(UsedByList.class, UsedByListBo.class);
        interface2ConcreteClass.put(VariableList.class, VariableListBo.class);

        interface2ConcreteClass.put(NodeType.class, DefinitionBo.class);
        interface2ConcreteClass.put(SubsectionType.class, NodeBo.class);
    }

    protected Class abstractToConcreteClass(final Class clazz) {
        return (Class) interface2ConcreteClass.get(clazz);
    }

}
