com.github.podd.utils.test.OntologyUtilsTest.java Source code

Java tutorial

Introduction

Here is the source code for com.github.podd.utils.test.OntologyUtilsTest.java

Source

/**
 * PODD is an OWL ontology database used for scientific project management
 *
 * Copyright (C) 2009-2013 The University Of Queensland
 *
 * This program is free software: you can redistribute it and/or modify it under the terms of the
 * GNU Affero 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
 * Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License along with this program.
 * If not, see <http://www.gnu.org/licenses/>.
 */
/**
 *
 */
package com.github.podd.utils.test;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

import org.apache.commons.io.IOUtils;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.openrdf.model.Model;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import org.openrdf.model.impl.LinkedHashModel;
import org.openrdf.model.vocabulary.OWL;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.rio.RDFFormat;
import org.openrdf.rio.RDFHandler;
import org.openrdf.rio.Rio;
import org.openrdf.rio.helpers.StatementCollector;
import org.semanticweb.owlapi.model.IRI;
import org.semanticweb.owlapi.model.OWLOntologyID;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.github.podd.exception.SchemaManifestException;
import com.github.podd.utils.InferredOWLOntologyID;
import com.github.podd.utils.OntologyUtils;
import com.github.podd.utils.PODD;

/**
 * Test for OntologyUtils class that translates between RDF and InferredOWLOntologyID instances.
 *
 * @author Peter Ansell p_ansell@yahoo.com
 */
public class OntologyUtilsTest {
    private final Logger log = LoggerFactory.getLogger(this.getClass());
    private final ValueFactory vf = PODD.VF;

    private ConcurrentMap<URI, Set<URI>> importsMap;

    private void assertA1B2C3(final ConcurrentMap<URI, Set<URI>> nextImportsMap) {
        Assert.assertEquals(5, nextImportsMap.size());

        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testVersionUriA1));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testVersionUriB1));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testVersionUriB2));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testVersionUriC1));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testVersionUriC3));

        Assert.assertEquals(0, nextImportsMap.get(OntologyConstant.testVersionUriA1).size());
        Assert.assertEquals(1, nextImportsMap.get(OntologyConstant.testVersionUriB1).size());
        Assert.assertEquals(1, nextImportsMap.get(OntologyConstant.testVersionUriB2).size());
        Assert.assertEquals(2, nextImportsMap.get(OntologyConstant.testVersionUriC1).size());
        Assert.assertEquals(2, nextImportsMap.get(OntologyConstant.testVersionUriC3).size());

        Assert.assertTrue(
                nextImportsMap.get(OntologyConstant.testVersionUriB1).contains(OntologyConstant.testVersionUriA1));
        Assert.assertTrue(
                nextImportsMap.get(OntologyConstant.testVersionUriB2).contains(OntologyConstant.testVersionUriA1));
        Assert.assertTrue(
                nextImportsMap.get(OntologyConstant.testVersionUriC1).contains(OntologyConstant.testVersionUriA1));
        Assert.assertTrue(
                nextImportsMap.get(OntologyConstant.testVersionUriC1).contains(OntologyConstant.testVersionUriB1));
        Assert.assertTrue(
                nextImportsMap.get(OntologyConstant.testVersionUriC3).contains(OntologyConstant.testVersionUriA1));
        Assert.assertTrue(
                nextImportsMap.get(OntologyConstant.testVersionUriC3).contains(OntologyConstant.testVersionUriB2));
    }

    private void assertRealisticImportsMapV2(final ConcurrentMap<URI, Set<URI>> nextImportsMap) {
        Assert.assertEquals(12, nextImportsMap.size());

        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testPoddDcUriV1));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testPoddDcUriV2));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testPoddFoafUriV1));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testPoddFoafUriV2));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testPoddUserUriV1));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testPoddUserUriV2));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testPoddBaseUriV1));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testPoddBaseUriV2));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testPoddScienceUriV1));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testPoddScienceUriV2));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testPoddPlantUriV1));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testPoddPlantUriV2));

        Assert.assertEquals(0, nextImportsMap.get(OntologyConstant.testPoddDcUriV1).size());
        Assert.assertEquals(0, nextImportsMap.get(OntologyConstant.testPoddDcUriV2).size());
        Assert.assertEquals(1, nextImportsMap.get(OntologyConstant.testPoddFoafUriV1).size());
        Assert.assertEquals(1, nextImportsMap.get(OntologyConstant.testPoddFoafUriV2).size());
        Assert.assertEquals(2, nextImportsMap.get(OntologyConstant.testPoddUserUriV1).size());
        Assert.assertEquals(2, nextImportsMap.get(OntologyConstant.testPoddUserUriV2).size());
        Assert.assertEquals(3, nextImportsMap.get(OntologyConstant.testPoddBaseUriV1).size());
        Assert.assertEquals(3, nextImportsMap.get(OntologyConstant.testPoddBaseUriV2).size());
        Assert.assertEquals(4, nextImportsMap.get(OntologyConstant.testPoddScienceUriV1).size());
        Assert.assertEquals(4, nextImportsMap.get(OntologyConstant.testPoddScienceUriV2).size());
        Assert.assertEquals(5, nextImportsMap.get(OntologyConstant.testPoddPlantUriV1).size());
        Assert.assertEquals(5, nextImportsMap.get(OntologyConstant.testPoddPlantUriV2).size());

        Assert.assertTrue(
                nextImportsMap.get(OntologyConstant.testPoddFoafUriV1).contains(OntologyConstant.testPoddDcUriV1));
        Assert.assertTrue(
                nextImportsMap.get(OntologyConstant.testPoddFoafUriV2).contains(OntologyConstant.testPoddDcUriV2));
        Assert.assertTrue(
                nextImportsMap.get(OntologyConstant.testPoddUserUriV1).contains(OntologyConstant.testPoddDcUriV1));
        Assert.assertTrue(
                nextImportsMap.get(OntologyConstant.testPoddUserUriV2).contains(OntologyConstant.testPoddDcUriV2));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddUserUriV1)
                .contains(OntologyConstant.testPoddFoafUriV1));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddUserUriV2)
                .contains(OntologyConstant.testPoddFoafUriV2));
        Assert.assertTrue(
                nextImportsMap.get(OntologyConstant.testPoddBaseUriV1).contains(OntologyConstant.testPoddDcUriV1));
        Assert.assertTrue(
                nextImportsMap.get(OntologyConstant.testPoddBaseUriV2).contains(OntologyConstant.testPoddDcUriV2));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddBaseUriV1)
                .contains(OntologyConstant.testPoddFoafUriV1));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddBaseUriV2)
                .contains(OntologyConstant.testPoddFoafUriV2));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddBaseUriV1)
                .contains(OntologyConstant.testPoddUserUriV1));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddBaseUriV2)
                .contains(OntologyConstant.testPoddUserUriV2));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddScienceUriV1)
                .contains(OntologyConstant.testPoddDcUriV1));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddScienceUriV2)
                .contains(OntologyConstant.testPoddDcUriV2));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddScienceUriV1)
                .contains(OntologyConstant.testPoddFoafUriV1));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddScienceUriV2)
                .contains(OntologyConstant.testPoddFoafUriV2));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddScienceUriV1)
                .contains(OntologyConstant.testPoddUserUriV1));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddScienceUriV2)
                .contains(OntologyConstant.testPoddUserUriV2));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddScienceUriV1)
                .contains(OntologyConstant.testPoddBaseUriV1));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddScienceUriV2)
                .contains(OntologyConstant.testPoddBaseUriV2));
        Assert.assertTrue(
                nextImportsMap.get(OntologyConstant.testPoddPlantUriV1).contains(OntologyConstant.testPoddDcUriV1));
        Assert.assertTrue(
                nextImportsMap.get(OntologyConstant.testPoddPlantUriV2).contains(OntologyConstant.testPoddDcUriV2));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddPlantUriV1)
                .contains(OntologyConstant.testPoddFoafUriV1));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddPlantUriV2)
                .contains(OntologyConstant.testPoddFoafUriV2));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddPlantUriV1)
                .contains(OntologyConstant.testPoddUserUriV1));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddPlantUriV2)
                .contains(OntologyConstant.testPoddUserUriV2));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddPlantUriV1)
                .contains(OntologyConstant.testPoddBaseUriV1));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddPlantUriV2)
                .contains(OntologyConstant.testPoddBaseUriV2));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddPlantUriV1)
                .contains(OntologyConstant.testPoddScienceUriV1));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddPlantUriV2)
                .contains(OntologyConstant.testPoddScienceUriV2));
    }

    private void assertRealisticImportsMapV3(final ConcurrentMap<URI, Set<URI>> nextImportsMap) {
        Assert.assertEquals(22, nextImportsMap.size());

        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testPoddDcUriV1));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testPoddDcUriV2));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testPoddDcUriV3));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testPoddFoafUriV1));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testPoddFoafUriV2));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testPoddFoafUriV3));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testPoddUserUriV1));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testPoddUserUriV2));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testPoddUserUriV3));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testPoddBaseUriV1));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testPoddBaseUriV2));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testPoddBaseUriV3));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testPoddScienceUriV1));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testPoddScienceUriV2));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testPoddScienceUriV3));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testPoddPlantUriV1));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testPoddPlantUriV2));
        Assert.assertTrue(nextImportsMap.containsKey(OntologyConstant.testPoddPlantUriV3));

        Assert.assertEquals(0, nextImportsMap.get(OntologyConstant.testPoddDcUriV1).size());
        Assert.assertEquals(0, nextImportsMap.get(OntologyConstant.testPoddDcUriV2).size());
        Assert.assertEquals(0, nextImportsMap.get(OntologyConstant.testPoddDcUriV3).size());
        Assert.assertEquals(1, nextImportsMap.get(OntologyConstant.testPoddFoafUriV1).size());
        Assert.assertEquals(1, nextImportsMap.get(OntologyConstant.testPoddFoafUriV2).size());
        Assert.assertEquals(1, nextImportsMap.get(OntologyConstant.testPoddFoafUriV3).size());
        Assert.assertEquals(2, nextImportsMap.get(OntologyConstant.testPoddUserUriV1).size());
        Assert.assertEquals(2, nextImportsMap.get(OntologyConstant.testPoddUserUriV2).size());
        Assert.assertEquals(2, nextImportsMap.get(OntologyConstant.testPoddUserUriV3).size());
        Assert.assertEquals(3, nextImportsMap.get(OntologyConstant.testPoddBaseUriV1).size());
        Assert.assertEquals(3, nextImportsMap.get(OntologyConstant.testPoddBaseUriV2).size());
        Assert.assertEquals(3, nextImportsMap.get(OntologyConstant.testPoddBaseUriV3).size());
        Assert.assertEquals(4, nextImportsMap.get(OntologyConstant.testPoddScienceUriV1).size());
        Assert.assertEquals(6, nextImportsMap.get(OntologyConstant.testPoddScienceUriV2).size());
        Assert.assertEquals(4, nextImportsMap.get(OntologyConstant.testPoddScienceUriV3).size());
        Assert.assertEquals(5, nextImportsMap.get(OntologyConstant.testPoddPlantUriV1).size());
        Assert.assertEquals(7, nextImportsMap.get(OntologyConstant.testPoddPlantUriV2).size());
        Assert.assertEquals(5, nextImportsMap.get(OntologyConstant.testPoddPlantUriV3).size());

        Assert.assertTrue(
                nextImportsMap.get(OntologyConstant.testPoddFoafUriV1).contains(OntologyConstant.testPoddDcUriV1));
        Assert.assertTrue(
                nextImportsMap.get(OntologyConstant.testPoddFoafUriV2).contains(OntologyConstant.testPoddDcUriV2));
        Assert.assertTrue(
                nextImportsMap.get(OntologyConstant.testPoddFoafUriV3).contains(OntologyConstant.testPoddDcUriV3));

        Assert.assertTrue(
                nextImportsMap.get(OntologyConstant.testPoddUserUriV1).contains(OntologyConstant.testPoddDcUriV1));
        Assert.assertTrue(
                nextImportsMap.get(OntologyConstant.testPoddUserUriV2).contains(OntologyConstant.testPoddDcUriV2));
        Assert.assertTrue(
                nextImportsMap.get(OntologyConstant.testPoddUserUriV3).contains(OntologyConstant.testPoddDcUriV3));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddUserUriV1)
                .contains(OntologyConstant.testPoddFoafUriV1));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddUserUriV2)
                .contains(OntologyConstant.testPoddFoafUriV2));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddUserUriV3)
                .contains(OntologyConstant.testPoddFoafUriV3));

        Assert.assertTrue(
                nextImportsMap.get(OntologyConstant.testPoddBaseUriV1).contains(OntologyConstant.testPoddDcUriV1));
        Assert.assertTrue(
                nextImportsMap.get(OntologyConstant.testPoddBaseUriV2).contains(OntologyConstant.testPoddDcUriV2));
        Assert.assertTrue(
                nextImportsMap.get(OntologyConstant.testPoddBaseUriV3).contains(OntologyConstant.testPoddDcUriV3));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddBaseUriV1)
                .contains(OntologyConstant.testPoddFoafUriV1));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddBaseUriV2)
                .contains(OntologyConstant.testPoddFoafUriV2));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddBaseUriV3)
                .contains(OntologyConstant.testPoddFoafUriV3));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddBaseUriV1)
                .contains(OntologyConstant.testPoddUserUriV1));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddBaseUriV2)
                .contains(OntologyConstant.testPoddUserUriV2));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddBaseUriV3)
                .contains(OntologyConstant.testPoddUserUriV3));

        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddScienceUriV1)
                .contains(OntologyConstant.testPoddDcUriV1));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddScienceUriV2)
                .contains(OntologyConstant.testPoddDcUriV2));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddScienceUriV3)
                .contains(OntologyConstant.testPoddDcUriV3));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddScienceUriV1)
                .contains(OntologyConstant.testPoddFoafUriV1));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddScienceUriV2)
                .contains(OntologyConstant.testPoddFoafUriV2));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddScienceUriV3)
                .contains(OntologyConstant.testPoddFoafUriV3));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddScienceUriV1)
                .contains(OntologyConstant.testPoddUserUriV1));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddScienceUriV2)
                .contains(OntologyConstant.testPoddUserUriV2));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddScienceUriV3)
                .contains(OntologyConstant.testPoddUserUriV3));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddScienceUriV1)
                .contains(OntologyConstant.testPoddBaseUriV1));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddScienceUriV2)
                .contains(OntologyConstant.testPoddBaseUriV2));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddScienceUriV3)
                .contains(OntologyConstant.testPoddBaseUriV3));

        Assert.assertTrue(
                nextImportsMap.get(OntologyConstant.testPoddPlantUriV1).contains(OntologyConstant.testPoddDcUriV1));
        Assert.assertTrue(
                nextImportsMap.get(OntologyConstant.testPoddPlantUriV2).contains(OntologyConstant.testPoddDcUriV2));
        Assert.assertTrue(
                nextImportsMap.get(OntologyConstant.testPoddPlantUriV3).contains(OntologyConstant.testPoddDcUriV3));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddPlantUriV1)
                .contains(OntologyConstant.testPoddFoafUriV1));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddPlantUriV2)
                .contains(OntologyConstant.testPoddFoafUriV2));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddPlantUriV3)
                .contains(OntologyConstant.testPoddFoafUriV3));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddPlantUriV1)
                .contains(OntologyConstant.testPoddUserUriV1));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddPlantUriV2)
                .contains(OntologyConstant.testPoddUserUriV2));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddPlantUriV3)
                .contains(OntologyConstant.testPoddUserUriV3));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddPlantUriV1)
                .contains(OntologyConstant.testPoddBaseUriV1));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddPlantUriV2)
                .contains(OntologyConstant.testPoddBaseUriV2));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddPlantUriV3)
                .contains(OntologyConstant.testPoddBaseUriV3));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddPlantUriV1)
                .contains(OntologyConstant.testPoddScienceUriV1));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddPlantUriV2)
                .contains(OntologyConstant.testPoddScienceUriV2));
        Assert.assertTrue(nextImportsMap.get(OntologyConstant.testPoddPlantUriV3)
                .contains(OntologyConstant.testPoddScienceUriV3));
    }

    @Before
    public void setUp() throws Exception {
        this.importsMap = new ConcurrentHashMap<>();
    }

    @Test
    public final void testGetArtifactImportsNoImports() throws Exception {
        final Model model = new LinkedHashModel();
        OntologyUtils.ontologyIDsToModel(Arrays.asList(OntologyConstant.testOntologyID), model);

        final List<OWLOntologyID> imports = OntologyUtils.artifactImports(OntologyConstant.testOntologyID, model);

        Assert.assertEquals(0, imports.size());
        Assert.assertTrue(imports.isEmpty());
    }

    @Test
    public final void testGetArtifactImportsNonExistent() throws Exception {
        final Model model = new LinkedHashModel();
        try {
            OntologyUtils.artifactImports(OntologyConstant.testOntologyID, model);
            Assert.fail("Did not find expected exception");
        } catch (final SchemaManifestException e) {

        }
    }

    @Test
    public final void testGetArtifactImportsNullArtifact() throws Exception {
        final Model model = new LinkedHashModel();
        try {
            OntologyUtils.artifactImports(null, model);
            Assert.fail("Did not find expected exception");
        } catch (final NullPointerException e) {

        }
    }

    @Test
    public final void testGetArtifactImportsNullModel() throws Exception {
        try {
            OntologyUtils.artifactImports(OntologyConstant.testOntologyID, null);
            Assert.fail("Did not find expected exception");
        } catch (final NullPointerException e) {

        }
    }

    @Test
    public final void testGetArtifactImportsOneImport() throws Exception {
        final Model model = new LinkedHashModel();
        OntologyUtils.ontologyIDsToModel(Arrays.asList(OntologyConstant.testOntologyID), model);
        model.add(OntologyConstant.testImportOntologyUri1, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportVersionUri1, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportOntologyUri1, OWL.VERSIONIRI, OntologyConstant.testImportVersionUri1);
        model.add(OntologyConstant.testOntologyUri1, OWL.IMPORTS, OntologyConstant.testImportOntologyUri1);

        // DebugUtils.printContents(model);

        final List<OWLOntologyID> imports = OntologyUtils.artifactImports(OntologyConstant.testOntologyID, model);

        Assert.assertEquals(1, imports.size());
        Assert.assertTrue(imports.contains(OntologyConstant.testImportOntologyID1));
    }

    @Test
    public final void testGetArtifactImportsOneImportNonTransitiveSingle() throws Exception {
        final Model model = new LinkedHashModel();
        OntologyUtils.ontologyIDsToModel(Arrays.asList(OntologyConstant.testOntologyID), model);
        model.add(OntologyConstant.testImportOntologyUri1, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportOntologyUri1, OWL.VERSIONIRI, OntologyConstant.testImportVersionUri1);
        model.add(OntologyConstant.testImportVersionUri1, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportOntologyUri2, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportVersionUri2, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportOntologyUri2, OWL.VERSIONIRI, OntologyConstant.testImportVersionUri2);
        model.add(OntologyConstant.testOntologyUri1, OWL.IMPORTS, OntologyConstant.testImportOntologyUri1);

        final List<OWLOntologyID> imports = OntologyUtils.artifactImports(OntologyConstant.testOntologyID, model);

        Assert.assertEquals(1, imports.size());
        Assert.assertTrue(imports.contains(OntologyConstant.testImportOntologyID1));
    }

    @Test
    public final void testGetArtifactImportsOneImportTransitiveDouble() throws Exception {
        final Model model = new LinkedHashModel();
        OntologyUtils.ontologyIDsToModel(Arrays.asList(OntologyConstant.testOntologyID), model);
        model.add(OntologyConstant.testOntologyUri1, OWL.IMPORTS, OntologyConstant.testImportOntologyUri1);
        model.add(OntologyConstant.testImportOntologyUri1, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportOntologyUri1, OWL.VERSIONIRI, OntologyConstant.testImportVersionUri1);
        model.add(OntologyConstant.testImportVersionUri1, RDF.TYPE, OWL.ONTOLOGY);

        model.add(OntologyConstant.testImportOntologyUri2, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportOntologyUri2, OWL.VERSIONIRI, OntologyConstant.testImportVersionUri2);
        model.add(OntologyConstant.testImportVersionUri2, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportVersionUri1, OWL.IMPORTS, OntologyConstant.testImportVersionUri2);

        model.add(OntologyConstant.testImportOntologyUri3, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportOntologyUri3, OWL.VERSIONIRI, OntologyConstant.testImportVersionUri3);
        model.add(OntologyConstant.testImportVersionUri3, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportVersionUri2, OWL.IMPORTS, OntologyConstant.testImportVersionUri3);

        final List<OWLOntologyID> imports = OntologyUtils.artifactImports(OntologyConstant.testOntologyID, model);

        Assert.assertEquals(3, imports.size());
        Assert.assertTrue(imports.contains(OntologyConstant.testImportOntologyID1));
        Assert.assertTrue(imports.contains(OntologyConstant.testImportOntologyID2));
        Assert.assertTrue(imports.contains(OntologyConstant.testImportOntologyID3));
        Assert.assertEquals(OntologyConstant.testImportOntologyID3, imports.get(0));
        Assert.assertEquals(OntologyConstant.testImportOntologyID2, imports.get(1));
        Assert.assertEquals(OntologyConstant.testImportOntologyID1, imports.get(2));
    }

    @Test
    public final void testGetArtifactImportsOneImportTransitiveDoubleDouble() throws Exception {
        final Model model = new LinkedHashModel();
        OntologyUtils.ontologyIDsToModel(Arrays.asList(OntologyConstant.testOntologyID), model);
        model.add(OntologyConstant.testOntologyUri1, OWL.IMPORTS, OntologyConstant.testImportOntologyUri1);
        model.add(OntologyConstant.testImportOntologyUri1, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportOntologyUri1, OWL.VERSIONIRI, OntologyConstant.testImportVersionUri1);
        model.add(OntologyConstant.testImportVersionUri1, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportVersionUri1, OWL.IMPORTS, OntologyConstant.testImportVersionUri2);

        model.add(OntologyConstant.testImportOntologyUri2, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportOntologyUri2, OWL.VERSIONIRI, OntologyConstant.testImportVersionUri2);
        model.add(OntologyConstant.testImportVersionUri2, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportVersionUri2, OWL.IMPORTS, OntologyConstant.testImportVersionUri3);
        model.add(OntologyConstant.testImportVersionUri2, OWL.IMPORTS, OntologyConstant.testImportVersionUri4);

        model.add(OntologyConstant.testImportOntologyUri3, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportOntologyUri3, OWL.VERSIONIRI, OntologyConstant.testImportVersionUri3);
        model.add(OntologyConstant.testImportVersionUri3, RDF.TYPE, OWL.ONTOLOGY);

        model.add(OntologyConstant.testImportOntologyUri4, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportOntologyUri4, OWL.VERSIONIRI, OntologyConstant.testImportVersionUri4);
        model.add(OntologyConstant.testImportVersionUri4, RDF.TYPE, OWL.ONTOLOGY);

        final List<OWLOntologyID> imports = OntologyUtils.artifactImports(OntologyConstant.testOntologyID, model);

        Assert.assertEquals(4, imports.size());
        Assert.assertTrue(imports.contains(OntologyConstant.testImportOntologyID1));
        Assert.assertTrue(imports.contains(OntologyConstant.testImportOntologyID2));
        Assert.assertTrue(imports.contains(OntologyConstant.testImportOntologyID3));
        Assert.assertTrue(imports.contains(OntologyConstant.testImportOntologyID4));
        Assert.assertTrue(imports.indexOf(OntologyConstant.testImportOntologyID2) > imports
                .indexOf(OntologyConstant.testImportOntologyID4));
        Assert.assertTrue(imports.indexOf(OntologyConstant.testImportOntologyID1) > imports
                .indexOf(OntologyConstant.testImportOntologyID2));
        Assert.assertTrue(imports.indexOf(OntologyConstant.testImportOntologyID2) > imports
                .indexOf(OntologyConstant.testImportOntologyID3));
        // NOTE: First two positions are not consistent, so only testing the last two
        Assert.assertEquals(OntologyConstant.testImportOntologyID2, imports.get(2));
        Assert.assertEquals(OntologyConstant.testImportOntologyID1, imports.get(3));
    }

    @Test
    public final void testGetArtifactImportsOneImportTransitiveSingle() throws Exception {
        final Model model = new LinkedHashModel();
        OntologyUtils.ontologyIDsToModel(Arrays.asList(OntologyConstant.testOntologyID), model);
        model.add(OntologyConstant.testImportOntologyUri1, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportOntologyUri1, OWL.VERSIONIRI, OntologyConstant.testImportVersionUri1);
        model.add(OntologyConstant.testImportVersionUri1, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportVersionUri1, OWL.IMPORTS, OntologyConstant.testImportVersionUri2);
        model.add(OntologyConstant.testImportOntologyUri2, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportVersionUri2, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportOntologyUri2, OWL.VERSIONIRI, OntologyConstant.testImportVersionUri2);
        model.add(OntologyConstant.testOntologyUri1, OWL.IMPORTS, OntologyConstant.testImportOntologyUri1);

        final List<OWLOntologyID> imports = OntologyUtils.artifactImports(OntologyConstant.testOntologyID, model);

        Assert.assertEquals(2, imports.size());
        Assert.assertTrue(imports.contains(OntologyConstant.testImportOntologyID1));
        Assert.assertTrue(imports.contains(OntologyConstant.testImportOntologyID2));
        Assert.assertEquals(OntologyConstant.testImportOntologyID2, imports.get(0));
        Assert.assertEquals(OntologyConstant.testImportOntologyID1, imports.get(1));
    }

    @Test
    public final void testGetArtifactImportsOneImportVersion() throws Exception {
        final Model model = new LinkedHashModel();
        OntologyUtils.ontologyIDsToModel(Arrays.asList(OntologyConstant.testOntologyID), model);
        model.add(OntologyConstant.testImportOntologyUri1, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportVersionUri1, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportOntologyUri1, OWL.VERSIONIRI, OntologyConstant.testImportVersionUri1);
        model.add(OntologyConstant.testVersionUri1, OWL.IMPORTS, OntologyConstant.testImportOntologyUri1);

        final List<OWLOntologyID> imports = OntologyUtils.artifactImports(OntologyConstant.testOntologyID, model);

        Assert.assertEquals(1, imports.size());
        Assert.assertTrue(imports.contains(OntologyConstant.testImportOntologyID1));
    }

    @Test
    public final void testGetArtifactImportsOneImportVersionTransitiveDoubleDouble() throws Exception {
        final Model model = new LinkedHashModel();
        OntologyUtils.ontologyIDsToModel(Arrays.asList(OntologyConstant.testOntologyID), model);
        model.add(OntologyConstant.testVersionUri1, OWL.IMPORTS, OntologyConstant.testImportOntologyUri1);
        model.add(OntologyConstant.testImportOntologyUri1, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportOntologyUri1, OWL.VERSIONIRI, OntologyConstant.testImportVersionUri1);
        model.add(OntologyConstant.testImportVersionUri1, RDF.TYPE, OWL.ONTOLOGY);

        model.add(OntologyConstant.testImportOntologyUri2, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportOntologyUri2, OWL.VERSIONIRI, OntologyConstant.testImportVersionUri2);
        model.add(OntologyConstant.testImportVersionUri2, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportVersionUri1, OWL.IMPORTS, OntologyConstant.testImportVersionUri2);

        model.add(OntologyConstant.testImportOntologyUri3, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportOntologyUri3, OWL.VERSIONIRI, OntologyConstant.testImportVersionUri3);
        model.add(OntologyConstant.testImportVersionUri3, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportVersionUri2, OWL.IMPORTS, OntologyConstant.testImportVersionUri3);

        model.add(OntologyConstant.testImportOntologyUri4, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportOntologyUri4, OWL.VERSIONIRI, OntologyConstant.testImportVersionUri4);
        model.add(OntologyConstant.testImportVersionUri4, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportVersionUri2, OWL.IMPORTS, OntologyConstant.testImportVersionUri4);

        final List<OWLOntologyID> imports = OntologyUtils.artifactImports(OntologyConstant.testOntologyID, model);

        Assert.assertEquals(4, imports.size());
        Assert.assertTrue(imports.contains(OntologyConstant.testImportOntologyID1));
        Assert.assertTrue(imports.contains(OntologyConstant.testImportOntologyID2));
        Assert.assertTrue(imports.contains(OntologyConstant.testImportOntologyID3));
        Assert.assertTrue(imports.contains(OntologyConstant.testImportOntologyID4));
        // NOTE: First two positions are not consistent, so only testing the last two
        Assert.assertEquals(OntologyConstant.testImportOntologyID2, imports.get(2));
        Assert.assertEquals(OntologyConstant.testImportOntologyID1, imports.get(3));
    }

    @Test
    public void testGetArtifactImportsRealistic() throws Exception {
        final Model model = Rio.parse(
                this.getClass().getResourceAsStream("/test/artifacts/artifact-imports-test.nq"), "",
                RDFFormat.NQUADS);

        model.addAll(Rio.parse(this.getClass().getResourceAsStream("/test/test-podd-schema-manifest.ttl"), "",
                RDFFormat.TURTLE));

        // DebugUtils.printContents(model);

        final List<OWLOntologyID> imports = OntologyUtils.artifactImports(OntologyConstant.testOntologyID, model);

        // this.log.info("Imports: {}", imports);
        Assert.assertTrue(imports.contains(OntologyConstant.testPoddBaseV1));
        Assert.assertTrue(imports.contains(OntologyConstant.testPoddScienceV1));
        Assert.assertTrue(imports.contains(OntologyConstant.testPoddDcV1));
        Assert.assertTrue(imports.contains(OntologyConstant.testPoddUserV1));
        Assert.assertTrue(imports.contains(OntologyConstant.testPoddFoafV1));
        Assert.assertEquals(5, imports.size());
    }

    @Test
    public void testGetArtifactImportsRealisticInra() throws Exception {
        final Model model = Rio.parse(
                this.getClass().getResourceAsStream("/test/artifacts/artifact-imports-test.nq"), "",
                RDFFormat.NQUADS);

        model.addAll(Rio.parse(this.getClass().getResourceAsStream("/test/test-podd-schema-manifest-inra.ttl"), "",
                RDFFormat.TURTLE));

        // DebugUtils.printContents(model);

        final List<OWLOntologyID> imports = OntologyUtils.artifactImports(OntologyConstant.testOntologyID, model);

        // this.log.info("Imports: {}", imports);
        Assert.assertTrue(imports.contains(OntologyConstant.testPoddBaseV1));
        Assert.assertTrue(imports.contains(OntologyConstant.testPoddScienceV1));
        Assert.assertTrue(imports.contains(OntologyConstant.testPoddDcV1));
        Assert.assertTrue(imports.contains(OntologyConstant.testPoddUserV1));
        Assert.assertTrue(imports.contains(OntologyConstant.testPoddFoafV1));
        Assert.assertEquals(5, imports.size());
    }

    @Test
    public void testGetArtifactImportsRealisticInraV2() throws Exception {
        final Model model = Rio.parse(
                this.getClass().getResourceAsStream("/test/artifacts/artifact-imports-test-V2.nq"), "",
                RDFFormat.NQUADS);

        model.addAll(Rio.parse(this.getClass().getResourceAsStream("/test/test-podd-schema-manifest-inra.ttl"), "",
                RDFFormat.TURTLE));

        // DebugUtils.printContents(model);

        final List<OWLOntologyID> imports = OntologyUtils.artifactImports(OntologyConstant.testOntologyID, model);

        // this.log.info("Imports: {}", imports);
        Assert.assertTrue(imports.contains(OntologyConstant.testMisteaEventV2));
        Assert.assertTrue(imports.contains(OntologyConstant.testMisteaObjectV2));
        Assert.assertTrue(imports.contains(OntologyConstant.testPoddBaseV2));
        Assert.assertTrue(imports.contains(OntologyConstant.testPoddScienceV2));
        Assert.assertTrue(imports.contains(OntologyConstant.testPoddDcV2));
        Assert.assertTrue(imports.contains(OntologyConstant.testPoddUserV2));
        Assert.assertTrue(imports.contains(OntologyConstant.testPoddFoafV2));
        Assert.assertEquals(7, imports.size());
    }

    @Test
    public void testGetArtifactImportsRealisticInraVersion2() throws Exception {
        final Model model = Rio.parse(
                this.getClass().getResourceAsStream("/test/artifacts/artifact-imports-test-inra.nq"), "",
                RDFFormat.NQUADS);

        model.addAll(Rio.parse(this.getClass().getResourceAsStream("/test/test-podd-schema-manifest-inra.ttl"), "",
                RDFFormat.TURTLE));

        // DebugUtils.printContents(model);

        final List<OWLOntologyID> imports = OntologyUtils.artifactImports(OntologyConstant.testOntologyID, model);

        // this.log.info("Imports: {}", imports);
        Assert.assertTrue(imports.contains(OntologyConstant.testMisteaEventV2));
        Assert.assertTrue(imports.contains(OntologyConstant.testMisteaObjectV2));
        Assert.assertTrue(imports.contains(OntologyConstant.testPoddBaseV2));
        Assert.assertTrue(imports.contains(OntologyConstant.testPoddScienceV2));
        Assert.assertTrue(imports.contains(OntologyConstant.testPoddDcV2));
        Assert.assertTrue(imports.contains(OntologyConstant.testPoddUserV2));
        Assert.assertTrue(imports.contains(OntologyConstant.testPoddFoafV2));
        Assert.assertEquals(7, imports.size());
    }

    @Test
    public void testGetArtifactImportsRealisticNewProjectVersion2() throws Exception {
        final Model model = Rio.parse(
                this.getClass().getResourceAsStream("/test/artifacts/artifact-new-project-test.nq"), "",
                RDFFormat.NQUADS);

        model.addAll(Rio.parse(this.getClass().getResourceAsStream("/test/test-podd-schema-manifest-inra.ttl"), "",
                RDFFormat.TURTLE));

        // DebugUtils.printContents(model);

        final List<OWLOntologyID> imports = OntologyUtils.artifactImports(OntologyConstant.testOntologyID, model);

        // this.log.info("Imports: {}", imports);
        Assert.assertTrue(imports.contains(OntologyConstant.testMisteaEventV2));
        Assert.assertTrue(imports.contains(OntologyConstant.testMisteaObjectV2));
        Assert.assertTrue(imports.contains(OntologyConstant.testPoddBaseV2));
        Assert.assertTrue(imports.contains(OntologyConstant.testPoddScienceV2));
        Assert.assertTrue(imports.contains(OntologyConstant.testPoddDcV2));
        Assert.assertTrue(imports.contains(OntologyConstant.testPoddUserV2));
        Assert.assertTrue(imports.contains(OntologyConstant.testPoddFoafV2));
        Assert.assertTrue(imports.contains(OntologyConstant.testPoddPlantV2));
        Assert.assertEquals(8, imports.size());
    }

    @Test
    public void testImportsOrderFourLevels() throws Exception {
        final Model model = new LinkedHashModel();
        OntologyUtils.ontologyIDsToModel(Arrays.asList(OntologyConstant.testOntologyID), model);
        model.add(OntologyConstant.testVersionUri1, OWL.IMPORTS, OntologyConstant.testImportOntologyUri1);
        model.add(OntologyConstant.testImportOntologyUri1, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportOntologyUri1, OWL.VERSIONIRI, OntologyConstant.testImportVersionUri1);
        model.add(OntologyConstant.testImportVersionUri1, RDF.TYPE, OWL.ONTOLOGY);

        model.add(OntologyConstant.testImportOntologyUri2, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportOntologyUri2, OWL.VERSIONIRI, OntologyConstant.testImportVersionUri2);
        model.add(OntologyConstant.testImportVersionUri2, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportVersionUri1, OWL.IMPORTS, OntologyConstant.testImportVersionUri2);

        model.add(OntologyConstant.testImportOntologyUri3, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportOntologyUri3, OWL.VERSIONIRI, OntologyConstant.testImportVersionUri3);
        model.add(OntologyConstant.testImportVersionUri3, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportVersionUri2, OWL.IMPORTS, OntologyConstant.testImportVersionUri3);

        model.add(OntologyConstant.testImportOntologyUri4, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportOntologyUri4, OWL.VERSIONIRI, OntologyConstant.testImportVersionUri4);
        model.add(OntologyConstant.testImportVersionUri4, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportVersionUri3, OWL.IMPORTS, OntologyConstant.testImportVersionUri4);

        final Set<URI> schemaOntologyUris = new LinkedHashSet<URI>();
        final Set<URI> schemaVersionUris = new LinkedHashSet<URI>();

        schemaOntologyUris.add(OntologyConstant.testOntologyUri1);
        schemaOntologyUris.add(OntologyConstant.testImportOntologyUri1);
        schemaOntologyUris.add(OntologyConstant.testImportOntologyUri2);
        schemaOntologyUris.add(OntologyConstant.testImportOntologyUri3);
        schemaOntologyUris.add(OntologyConstant.testImportOntologyUri4);

        schemaVersionUris.add(OntologyConstant.testVersionUri1);
        schemaVersionUris.add(OntologyConstant.testImportVersionUri1);
        schemaVersionUris.add(OntologyConstant.testImportVersionUri2);
        schemaVersionUris.add(OntologyConstant.testImportVersionUri3);
        schemaVersionUris.add(OntologyConstant.testImportVersionUri4);

        final ConcurrentMap<URI, Set<URI>> importsMap = new ConcurrentHashMap<URI, Set<URI>>();
        // Expected output solution from importsMap after calling orderImports
        // importsMap.put(testVersionUri1,
        // Collections.singleton(OntologyConstant.testImportVersionUri1));
        // importsMap.put(testImportVersionUri1,
        // Collections.singleton(OntologyConstant.testImportVersionUri2));
        // importsMap.put(testImportVersionUri2,
        // Collections.singleton(OntologyConstant.testImportVersionUri3));
        // importsMap.put(testImportVersionUri3, new
        // HashSet<URI>(Arrays.asList(OntologyConstant.testImportVersionUri4)));
        // importsMap.put(testImportVersionUri4, new HashSet<URI>());

        final List<URI> orderImports = OntologyUtils.orderImports(model, schemaOntologyUris, schemaVersionUris,
                importsMap, false);

        Assert.assertEquals(5, orderImports.size());
        Assert.assertEquals(OntologyConstant.testImportVersionUri4, orderImports.get(0));
        Assert.assertEquals(OntologyConstant.testImportVersionUri3, orderImports.get(1));
        Assert.assertEquals(OntologyConstant.testImportVersionUri2, orderImports.get(2));
        Assert.assertEquals(OntologyConstant.testImportVersionUri1, orderImports.get(3));
        Assert.assertEquals(OntologyConstant.testVersionUri1, orderImports.get(4));

        Assert.assertEquals(5, importsMap.size());
        Assert.assertTrue(importsMap.containsKey(OntologyConstant.testImportVersionUri4));
        Assert.assertTrue(importsMap.containsKey(OntologyConstant.testImportVersionUri3));
        Assert.assertTrue(importsMap.containsKey(OntologyConstant.testImportVersionUri2));
        Assert.assertTrue(importsMap.containsKey(OntologyConstant.testImportVersionUri1));
        Assert.assertTrue(importsMap.containsKey(OntologyConstant.testVersionUri1));

        final Set<URI> imports4 = importsMap.get(OntologyConstant.testImportVersionUri4);
        Assert.assertNotNull(imports4);
        Assert.assertEquals(0, imports4.size());

        final Set<URI> imports3 = importsMap.get(OntologyConstant.testImportVersionUri3);
        Assert.assertNotNull(imports3);
        Assert.assertEquals(1, imports3.size());
        Assert.assertTrue(imports3.contains(OntologyConstant.testImportVersionUri4));

        final Set<URI> imports2 = importsMap.get(OntologyConstant.testImportVersionUri2);
        Assert.assertNotNull(imports2);
        Assert.assertEquals(2, imports2.size());
        Assert.assertTrue(imports2.contains(OntologyConstant.testImportVersionUri3));
        Assert.assertTrue(imports2.contains(OntologyConstant.testImportVersionUri4));

        final Set<URI> imports1 = importsMap.get(OntologyConstant.testImportVersionUri1);
        Assert.assertNotNull(imports1);
        Assert.assertEquals(3, imports1.size());
        Assert.assertTrue(imports1.contains(OntologyConstant.testImportVersionUri2));
        Assert.assertTrue(imports1.contains(OntologyConstant.testImportVersionUri3));
        Assert.assertTrue(imports1.contains(OntologyConstant.testImportVersionUri4));

        final Set<URI> importsRoot = importsMap.get(OntologyConstant.testVersionUri1);
        Assert.assertNotNull(importsRoot);
        Assert.assertEquals(4, importsRoot.size());
        Assert.assertTrue(importsRoot.contains(OntologyConstant.testImportVersionUri1));
        Assert.assertTrue(importsRoot.contains(OntologyConstant.testImportVersionUri2));
        Assert.assertTrue(importsRoot.contains(OntologyConstant.testImportVersionUri3));
        Assert.assertTrue(importsRoot.contains(OntologyConstant.testImportVersionUri4));
    }

    @Test
    public void testImportsOrderFourLevelsOutOfOrder() throws Exception {
        final Model model = new LinkedHashModel();
        OntologyUtils.ontologyIDsToModel(Arrays.asList(OntologyConstant.testOntologyID), model);
        model.add(OntologyConstant.testVersionUri1, OWL.IMPORTS, OntologyConstant.testImportOntologyUri1);
        model.add(OntologyConstant.testImportOntologyUri1, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportOntologyUri1, OWL.VERSIONIRI, OntologyConstant.testImportVersionUri1);
        model.add(OntologyConstant.testImportVersionUri1, RDF.TYPE, OWL.ONTOLOGY);

        model.add(OntologyConstant.testImportOntologyUri2, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportOntologyUri2, OWL.VERSIONIRI, OntologyConstant.testImportVersionUri2);
        model.add(OntologyConstant.testImportVersionUri2, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportVersionUri1, OWL.IMPORTS, OntologyConstant.testImportVersionUri2);

        model.add(OntologyConstant.testImportOntologyUri3, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportOntologyUri3, OWL.VERSIONIRI, OntologyConstant.testImportVersionUri3);
        model.add(OntologyConstant.testImportVersionUri3, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportVersionUri2, OWL.IMPORTS, OntologyConstant.testImportVersionUri3);

        model.add(OntologyConstant.testImportOntologyUri4, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportOntologyUri4, OWL.VERSIONIRI, OntologyConstant.testImportVersionUri4);
        model.add(OntologyConstant.testImportVersionUri4, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportVersionUri3, OWL.IMPORTS, OntologyConstant.testImportVersionUri4);

        final Set<URI> schemaOntologyUris = new LinkedHashSet<URI>();
        final Set<URI> schemaVersionUris = new LinkedHashSet<URI>();

        schemaOntologyUris.add(OntologyConstant.testImportOntologyUri2);
        schemaOntologyUris.add(OntologyConstant.testImportOntologyUri4);
        schemaOntologyUris.add(OntologyConstant.testOntologyUri1);
        schemaOntologyUris.add(OntologyConstant.testImportOntologyUri3);
        schemaOntologyUris.add(OntologyConstant.testImportOntologyUri1);

        schemaVersionUris.add(OntologyConstant.testImportVersionUri2);
        schemaVersionUris.add(OntologyConstant.testImportVersionUri4);
        schemaVersionUris.add(OntologyConstant.testVersionUri1);
        schemaVersionUris.add(OntologyConstant.testImportVersionUri3);
        schemaVersionUris.add(OntologyConstant.testImportVersionUri1);

        final ConcurrentMap<URI, Set<URI>> importsMap = new ConcurrentHashMap<URI, Set<URI>>();

        final List<URI> orderImports = OntologyUtils.orderImports(model, schemaOntologyUris, schemaVersionUris,
                importsMap, false);

        Assert.assertEquals(5, orderImports.size());
        Assert.assertEquals(OntologyConstant.testImportVersionUri4, orderImports.get(0));
        Assert.assertEquals(OntologyConstant.testImportVersionUri3, orderImports.get(1));
        Assert.assertEquals(OntologyConstant.testImportVersionUri2, orderImports.get(2));
        Assert.assertEquals(OntologyConstant.testImportVersionUri1, orderImports.get(3));
        Assert.assertEquals(OntologyConstant.testVersionUri1, orderImports.get(4));

        Assert.assertEquals(5, importsMap.size());
        Assert.assertTrue(importsMap.containsKey(OntologyConstant.testImportVersionUri4));
        Assert.assertTrue(importsMap.containsKey(OntologyConstant.testImportVersionUri3));
        Assert.assertTrue(importsMap.containsKey(OntologyConstant.testImportVersionUri2));
        Assert.assertTrue(importsMap.containsKey(OntologyConstant.testImportVersionUri1));
        Assert.assertTrue(importsMap.containsKey(OntologyConstant.testVersionUri1));

        final Set<URI> imports4 = importsMap.get(OntologyConstant.testImportVersionUri4);
        Assert.assertNotNull(imports4);
        Assert.assertEquals(0, imports4.size());

        final Set<URI> imports3 = importsMap.get(OntologyConstant.testImportVersionUri3);
        Assert.assertNotNull(imports3);
        Assert.assertEquals(1, imports3.size());
        Assert.assertTrue(imports3.contains(OntologyConstant.testImportVersionUri4));

        final Set<URI> imports2 = importsMap.get(OntologyConstant.testImportVersionUri2);
        Assert.assertNotNull(imports2);
        Assert.assertEquals(2, imports2.size());
        Assert.assertTrue(imports2.contains(OntologyConstant.testImportVersionUri3));
        Assert.assertTrue(imports2.contains(OntologyConstant.testImportVersionUri4));

        final Set<URI> imports1 = importsMap.get(OntologyConstant.testImportVersionUri1);
        Assert.assertNotNull(imports1);
        Assert.assertEquals(3, imports1.size());
        Assert.assertTrue(imports1.contains(OntologyConstant.testImportVersionUri2));
        Assert.assertTrue(imports1.contains(OntologyConstant.testImportVersionUri3));
        Assert.assertTrue(imports1.contains(OntologyConstant.testImportVersionUri4));

        final Set<URI> importsRoot = importsMap.get(OntologyConstant.testVersionUri1);
        Assert.assertNotNull(importsRoot);
        Assert.assertEquals(4, importsRoot.size());
        Assert.assertTrue(importsRoot.contains(OntologyConstant.testImportVersionUri1));
        Assert.assertTrue(importsRoot.contains(OntologyConstant.testImportVersionUri2));
        Assert.assertTrue(importsRoot.contains(OntologyConstant.testImportVersionUri3));
        Assert.assertTrue(importsRoot.contains(OntologyConstant.testImportVersionUri4));
    }

    @Test
    public void testImportsOrderOneLevel() throws Exception {
        final Model model = new LinkedHashModel();
        OntologyUtils.ontologyIDsToModel(Arrays.asList(OntologyConstant.testOntologyID), model);
        model.add(OntologyConstant.testVersionUri1, OWL.IMPORTS, OntologyConstant.testImportOntologyUri1);
        model.add(OntologyConstant.testImportOntologyUri1, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportOntologyUri1, OWL.VERSIONIRI, OntologyConstant.testImportVersionUri1);
        model.add(OntologyConstant.testImportVersionUri1, RDF.TYPE, OWL.ONTOLOGY);

        final Set<URI> schemaOntologyUris = new HashSet<URI>();
        final Set<URI> schemaVersionUris = new HashSet<URI>();

        schemaOntologyUris.add(OntologyConstant.testOntologyUri1);
        schemaOntologyUris.add(OntologyConstant.testImportOntologyUri1);

        schemaVersionUris.add(OntologyConstant.testVersionUri1);
        schemaVersionUris.add(OntologyConstant.testImportVersionUri1);

        final ConcurrentMap<URI, Set<URI>> importsMap = new ConcurrentHashMap<URI, Set<URI>>();
        // Expected output solution from importsMap after calling orderImports
        // importsMap.put(testVersionUri1,
        // Collections.singleton(OntologyConstant.testImportVersionUri1));
        // importsMap.put(testImportVersionUri1, new HashSet<URI>());

        final List<URI> orderImports = OntologyUtils.orderImports(model, schemaOntologyUris, schemaVersionUris,
                importsMap, false);

        Assert.assertEquals(2, orderImports.size());
        Assert.assertEquals(OntologyConstant.testImportVersionUri1, orderImports.get(0));
        Assert.assertEquals(OntologyConstant.testVersionUri1, orderImports.get(1));

        Assert.assertEquals(2, importsMap.size());
        Assert.assertTrue(importsMap.containsKey(OntologyConstant.testImportVersionUri1));
        Assert.assertTrue(importsMap.containsKey(OntologyConstant.testVersionUri1));

        final Set<URI> imports1 = importsMap.get(OntologyConstant.testImportVersionUri1);
        Assert.assertNotNull(imports1);
        Assert.assertEquals(0, imports1.size());

        final Set<URI> importsRoot = importsMap.get(OntologyConstant.testVersionUri1);
        Assert.assertNotNull(importsRoot);
        Assert.assertEquals(1, importsRoot.size());
        Assert.assertEquals(OntologyConstant.testImportVersionUri1, importsRoot.iterator().next());
    }

    @Test
    public void testImportsOrderOneLevelOutOfOrder() throws Exception {
        final Model model = new LinkedHashModel();
        OntologyUtils.ontologyIDsToModel(Arrays.asList(OntologyConstant.testOntologyID), model);
        model.add(OntologyConstant.testImportOntologyUri1, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportOntologyUri1, OWL.VERSIONIRI, OntologyConstant.testImportVersionUri1);
        model.add(OntologyConstant.testImportVersionUri1, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testVersionUri1, OWL.IMPORTS, OntologyConstant.testImportOntologyUri1);

        final Set<URI> schemaOntologyUris = new LinkedHashSet<URI>();
        final Set<URI> schemaVersionUris = new LinkedHashSet<URI>();

        schemaOntologyUris.add(OntologyConstant.testImportOntologyUri1);
        schemaOntologyUris.add(OntologyConstant.testOntologyUri1);

        schemaVersionUris.add(OntologyConstant.testImportVersionUri1);
        schemaVersionUris.add(OntologyConstant.testVersionUri1);

        final ConcurrentMap<URI, Set<URI>> importsMap = new ConcurrentHashMap<URI, Set<URI>>();
        // Expected output solution from importsMap after calling orderImports
        // importsMap.put(testVersionUri1,
        // Collections.singleton(OntologyConstant.testImportVersionUri1));
        // importsMap.put(testImportVersionUri1, new HashSet<URI>());

        final List<URI> orderImports = OntologyUtils.orderImports(model, schemaOntologyUris, schemaVersionUris,
                importsMap, false);

        Assert.assertEquals(2, orderImports.size());
        Assert.assertEquals(OntologyConstant.testImportVersionUri1, orderImports.get(0));
        Assert.assertEquals(OntologyConstant.testVersionUri1, orderImports.get(1));

        Assert.assertEquals(2, importsMap.size());
        Assert.assertTrue(importsMap.containsKey(OntologyConstant.testImportVersionUri1));
        Assert.assertTrue(importsMap.containsKey(OntologyConstant.testVersionUri1));

        final Set<URI> imports1 = importsMap.get(OntologyConstant.testImportVersionUri1);
        Assert.assertNotNull(imports1);
        Assert.assertEquals(0, imports1.size());

        final Set<URI> importsRoot = importsMap.get(OntologyConstant.testVersionUri1);
        Assert.assertNotNull(importsRoot);
        Assert.assertEquals(1, importsRoot.size());
        Assert.assertEquals(OntologyConstant.testImportVersionUri1, importsRoot.iterator().next());
    }

    @Test
    public void testImportsOrderZeroLevels() throws Exception {
        final Model model = new LinkedHashModel();
        OntologyUtils.ontologyIDsToModel(Arrays.asList(OntologyConstant.testOntologyID), model);

        final Set<URI> schemaOntologyUris = new HashSet<URI>();
        final Set<URI> schemaVersionUris = new HashSet<URI>();

        schemaOntologyUris.add(OntologyConstant.testOntologyUri1);

        schemaVersionUris.add(OntologyConstant.testVersionUri1);

        final ConcurrentMap<URI, Set<URI>> importsMap = new ConcurrentHashMap<URI, Set<URI>>();
        // Expected output solution from importsMap after calling orderImports
        // importsMap.put(testVersionUri1, new HashSet<URI>());

        final List<URI> orderImports = OntologyUtils.orderImports(model, schemaOntologyUris, schemaVersionUris,
                importsMap, false);

        Assert.assertEquals(1, orderImports.size());
        Assert.assertEquals(OntologyConstant.testVersionUri1, orderImports.get(0));

        Assert.assertEquals(1, importsMap.size());
        Assert.assertTrue(importsMap.containsKey(OntologyConstant.testVersionUri1));

        final Set<URI> importsRoot = importsMap.get(OntologyConstant.testVersionUri1);
        Assert.assertNotNull(importsRoot);
        Assert.assertEquals(0, importsRoot.size());
    }

    /**
     * Test method for
     * {@link com.github.podd.utils.OntologyUtils#modelToOntologyIDs(org.openrdf.model.Model)}.
     */
    @Test
    public final void testModelToOntologyIDsEmpty() {
        final Model input = new LinkedHashModel();
        final Collection<InferredOWLOntologyID> modelToOntologyIDs = OntologyUtils.modelToOntologyIDs(input);

        // No statements, should return an empty collection
        Assert.assertEquals(0, modelToOntologyIDs.size());
    }

    /**
     * Test method for
     * {@link com.github.podd.utils.OntologyUtils#modelToOntologyIDs(org.openrdf.model.Model)}.
     */
    @Test
    public final void testModelToOntologyIDsNoVersion() {
        final Model input = new LinkedHashModel();
        input.add(this.vf.createStatement(OntologyConstant.testOntologyUri1, RDF.TYPE, OWL.ONTOLOGY));
        final Collection<InferredOWLOntologyID> modelToOntologyIDs = OntologyUtils.modelToOntologyIDs(input);

        // Must have a version to be returned
        Assert.assertEquals(0, modelToOntologyIDs.size());
    }

    /**
     * Test method for
     * {@link com.github.podd.utils.OntologyUtils#modelToOntologyIDs(org.openrdf.model.Model)}.
     */
    @Test
    public final void testModelToOntologyIDsOneVersion() {
        final Model input = new LinkedHashModel();
        input.add(this.vf.createStatement(OntologyConstant.testOntologyUri1, RDF.TYPE, OWL.ONTOLOGY));
        input.add(this.vf.createStatement(OntologyConstant.testVersionUri1, RDF.TYPE, OWL.ONTOLOGY));
        input.add(this.vf.createStatement(OntologyConstant.testOntologyUri1, OWL.VERSIONIRI,
                OntologyConstant.testVersionUri1));
        final Collection<InferredOWLOntologyID> modelToOntologyIDs = OntologyUtils.modelToOntologyIDs(input);

        // 1 ontology returned
        Assert.assertEquals(1, modelToOntologyIDs.size());
    }

    /**
     * Test method for
     * {@link com.github.podd.utils.OntologyUtils#ontologyIDsToHandler(java.util.Collection, org.openrdf.rio.RDFHandler)}
     * .
     *
     * @throws Exception
     */
    @Test
    public final void testOntologyIDsToHandlerAnonymousOntology() throws Exception {
        final Model input = new LinkedHashModel();

        OntologyUtils.ontologyIDsToHandler(Arrays.asList(OntologyConstant.owlid((IRI) null, null, null)),
                new StatementCollector(input));

        Assert.assertTrue(input.isEmpty());
    }

    /**
     * Test method for
     * {@link com.github.podd.utils.OntologyUtils#ontologyIDsToHandler(java.util.Collection, org.openrdf.rio.RDFHandler)}
     * .
     *
     * @throws Exception
     */
    @Test
    public final void testOntologyIDsToHandlerEmptyNotNull() throws Exception {
        final Model input = new LinkedHashModel();

        OntologyUtils.ontologyIDsToHandler(Collections.<InferredOWLOntologyID>emptyList(),
                new StatementCollector(input));

        Assert.assertTrue(input.isEmpty());
    }

    /**
     * Test method for
     * {@link com.github.podd.utils.OntologyUtils#ontologyIDsToHandler(java.util.Collection, org.openrdf.rio.RDFHandler)}
     * .
     *
     * @throws Exception
     */
    @Test
    public final void testOntologyIDsToHandlerEmptyNull() throws Exception {
        OntologyUtils.ontologyIDsToHandler(Collections.<InferredOWLOntologyID>emptyList(), (RDFHandler) null);
    }

    /**
     * Test method for
     * {@link com.github.podd.utils.OntologyUtils#ontologyIDsToHandler(java.util.Collection, org.openrdf.rio.RDFHandler)}
     * .
     *
     * @throws Exception
     */
    @Test
    public final void testOntologyIDsToHandlerNoInferredIRI() throws Exception {
        final Model input = new LinkedHashModel();

        OntologyUtils
                .ontologyIDsToHandler(
                        Arrays.asList(OntologyConstant.owlid(IRI.create("urn:test:ontology:iri:abc"),
                                IRI.create("urn:test:ontology:iri:abc:version:1"), null)),
                        new StatementCollector(input));

        Assert.assertEquals(3, input.size());
        Assert.assertTrue(input.contains(null, RDF.TYPE, OWL.ONTOLOGY));
        Assert.assertTrue(input.contains(null, OWL.VERSIONIRI, null));
        Assert.assertEquals(2, input.filter(null, RDF.TYPE, OWL.ONTOLOGY).size());
    }

    /**
     * Test method for
     * {@link com.github.podd.utils.OntologyUtils#ontologyIDsToHandler(java.util.Collection, org.openrdf.rio.RDFHandler)}
     * .
     *
     * @throws Exception
     */
    @Test
    public final void testOntologyIDsToHandlerNoVersionIRI() throws Exception {
        final Model input = new LinkedHashModel();

        OntologyUtils.ontologyIDsToHandler(
                Arrays.asList(OntologyConstant.owlid(IRI.create("urn:test:ontology:iri:abc"), null, null)),
                new StatementCollector(input));

        Assert.assertEquals(1, input.size());
        Assert.assertTrue(input.contains(null, RDF.TYPE, OWL.ONTOLOGY));
    }

    /**
     * Test method for
     * {@link com.github.podd.utils.OntologyUtils#ontologyIDsToHandler(java.util.Collection, org.openrdf.rio.RDFHandler)}
     * .
     *
     * @throws Exception
     */
    @Test
    public final void testOntologyIDsToHandlerWithInferredIRI() throws Exception {
        final Model input = new LinkedHashModel();

        OntologyUtils.ontologyIDsToHandler(
                Arrays.asList(OntologyConstant.owlid(IRI.create("urn:test:ontology:iri:abc"),
                        IRI.create("urn:test:ontology:iri:abc:version:1"),
                        IRI.create("urn:inferred:test:ontology:iri:abc:version:1:1"))),
                new StatementCollector(input));

        Assert.assertEquals(5, input.size());
        Assert.assertTrue(input.contains(null, RDF.TYPE, OWL.ONTOLOGY));
        Assert.assertTrue(input.contains(null, OWL.VERSIONIRI, null));
        Assert.assertTrue(input.contains(null, PODD.PODD_BASE_INFERRED_VERSION, null));
        Assert.assertEquals(3, input.filter(null, RDF.TYPE, OWL.ONTOLOGY).size());
    }

    /**
     * Test method for
     * {@link com.github.podd.utils.OntologyUtils#ontologyIDsToModel(java.util.Collection, org.openrdf.model.Model)}
     * .
     */
    @Test
    public final void testOntologyIDsToModelAnonymousOntology() throws Exception {
        final Model input = new LinkedHashModel();

        final Model ontologyIDsToModel = OntologyUtils
                .ontologyIDsToModel(Arrays.asList(OntologyConstant.owlid((IRI) null, null, null)), input);

        Assert.assertNotNull(ontologyIDsToModel);
        Assert.assertEquals(input, ontologyIDsToModel);
        Assert.assertTrue(ontologyIDsToModel.isEmpty());
    }

    /**
     * Test method for
     * {@link com.github.podd.utils.OntologyUtils#ontologyIDsToModel(java.util.Collection, org.openrdf.model.Model)}
     * .
     */
    @Test
    public final void testOntologyIDsToModelEmptyNotNull() {
        final Model input = new LinkedHashModel();

        final Model ontologyIDsToModel = OntologyUtils
                .ontologyIDsToModel(Collections.<InferredOWLOntologyID>emptyList(), input);

        Assert.assertNotNull(ontologyIDsToModel);
        Assert.assertEquals(input, ontologyIDsToModel);
        Assert.assertTrue(ontologyIDsToModel.isEmpty());
    }

    /**
     * Test method for
     * {@link com.github.podd.utils.OntologyUtils#ontologyIDsToModel(java.util.Collection, org.openrdf.model.Model)}
     * .
     */
    @Test
    public final void testOntologyIDsToModelEmptyNull() {
        final Model ontologyIDsToModel = OntologyUtils
                .ontologyIDsToModel(Collections.<InferredOWLOntologyID>emptyList(), (Model) null);

        Assert.assertNotNull(ontologyIDsToModel);
        Assert.assertTrue(ontologyIDsToModel.isEmpty());
    }

    /**
     * Test method for
     * {@link com.github.podd.utils.OntologyUtils#ontologyIDsToModel(java.util.Collection, org.openrdf.model.Model)}
     * .
     */
    @Test
    public final void testOntologyIDsToModelNoInferredIRI() {
        final Model input = new LinkedHashModel();

        final Model ontologyIDsToModel = OntologyUtils
                .ontologyIDsToModel(Arrays.asList(OntologyConstant.owlid(IRI.create("urn:test:ontology:iri:abc"),
                        IRI.create("urn:test:ontology:iri:abc:version:1"), null)), input);

        Assert.assertNotNull(ontologyIDsToModel);
        Assert.assertEquals(input, ontologyIDsToModel);
        Assert.assertEquals(3, ontologyIDsToModel.size());
        Assert.assertTrue(ontologyIDsToModel.contains(null, RDF.TYPE, OWL.ONTOLOGY));
        Assert.assertTrue(ontologyIDsToModel.contains(null, OWL.VERSIONIRI, null));
        Assert.assertEquals(2, ontologyIDsToModel.filter(null, RDF.TYPE, OWL.ONTOLOGY).size());
    }

    /**
     * Test method for
     * {@link com.github.podd.utils.OntologyUtils#ontologyIDsToModel(java.util.Collection, org.openrdf.model.Model)}
     * .
     */
    @Test
    public final void testOntologyIDsToModelNoVersionIRI() {
        final Model input = new LinkedHashModel();

        final Model ontologyIDsToModel = OntologyUtils.ontologyIDsToModel(
                Arrays.asList(OntologyConstant.owlid(IRI.create("urn:test:ontology:iri:abc"), null, null)), input);

        Assert.assertNotNull(ontologyIDsToModel);
        Assert.assertEquals(input, ontologyIDsToModel);
        Assert.assertEquals(1, ontologyIDsToModel.size());
        Assert.assertTrue(ontologyIDsToModel.contains(null, RDF.TYPE, OWL.ONTOLOGY));
    }

    /**
     * Test method for
     * {@link com.github.podd.utils.OntologyUtils#ontologyIDsToModel(java.util.Collection, org.openrdf.model.Model)}
     * .
     */
    @Test
    public final void testOntologyIDsToModelWithInferredIRI() {
        final Model input = new LinkedHashModel();

        final Model ontologyIDsToModel = OntologyUtils
                .ontologyIDsToModel(Arrays.asList(OntologyConstant.owlid(IRI.create("urn:test:ontology:iri:abc"),
                        IRI.create("urn:test:ontology:iri:abc:version:1"),
                        IRI.create("urn:inferred:test:ontology:iri:abc:version:1:1"))), input);

        Assert.assertNotNull(ontologyIDsToModel);
        Assert.assertEquals(input, ontologyIDsToModel);
        Assert.assertEquals(5, ontologyIDsToModel.size());
        Assert.assertTrue(ontologyIDsToModel.contains(null, RDF.TYPE, OWL.ONTOLOGY));
        Assert.assertTrue(ontologyIDsToModel.contains(null, OWL.VERSIONIRI, null));
        Assert.assertTrue(ontologyIDsToModel.contains(null, PODD.PODD_BASE_INFERRED_VERSION, null));
        Assert.assertEquals(3, ontologyIDsToModel.filter(null, RDF.TYPE, OWL.ONTOLOGY).size());
    }

    @Test
    public void testSchemaImportsA1() throws Exception {
        final Model model = Rio.parse(this.getClass().getResourceAsStream("/test/schema-manifest-a1b2c3.ttl"), "",
                RDFFormat.TURTLE);

        // DebugUtils.printContents(model);
        final List<OWLOntologyID> schemaManifestImports = OntologyUtils.schemaImports(model,
                new HashSet<OWLOntologyID>(Arrays.asList(OntologyConstant.testA1)), this.importsMap);

        Assert.assertNotNull(schemaManifestImports);
        Assert.assertEquals(1, schemaManifestImports.size());
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testA1));
        Assert.assertEquals(OntologyConstant.testA1, schemaManifestImports.get(0));

        this.assertA1B2C3(this.importsMap);
    }

    @Test
    public void testSchemaImportsA1B1C1() throws Exception {
        final Model model = Rio.parse(this.getClass().getResourceAsStream("/test/schema-manifest-a1b2c3.ttl"), "",
                RDFFormat.TURTLE);

        // DebugUtils.printContents(model);
        final List<OWLOntologyID> schemaManifestImports = OntologyUtils.schemaImports(model,
                new HashSet<OWLOntologyID>(
                        Arrays.asList(OntologyConstant.testA1, OntologyConstant.testB1, OntologyConstant.testC1)),
                this.importsMap);

        Assert.assertNotNull(schemaManifestImports);
        Assert.assertEquals(3, schemaManifestImports.size());
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testA1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testB1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testC1));
        Assert.assertEquals(OntologyConstant.testA1, schemaManifestImports.get(0));
        Assert.assertEquals(OntologyConstant.testB1, schemaManifestImports.get(1));
        Assert.assertEquals(OntologyConstant.testC1, schemaManifestImports.get(2));

        this.assertA1B2C3(this.importsMap);
    }

    @Test
    public void testSchemaImportsA1B1C3() throws Exception {
        final Model model = Rio.parse(this.getClass().getResourceAsStream("/test/schema-manifest-a1b2c3.ttl"), "",
                RDFFormat.TURTLE);

        // DebugUtils.printContents(model);
        final List<OWLOntologyID> schemaManifestImports = OntologyUtils.schemaImports(model,
                new HashSet<OWLOntologyID>(
                        Arrays.asList(OntologyConstant.testA1, OntologyConstant.testB1, OntologyConstant.testC3)),
                this.importsMap);

        Assert.assertNotNull(schemaManifestImports);
        Assert.assertEquals(4, schemaManifestImports.size());
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testA1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testB1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testB2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testC3));
        Assert.assertEquals(OntologyConstant.testA1, schemaManifestImports.get(0));
        // NOTE: The following three entries do not have a deterministic order in this case
        // If they start to break on another JVM, then comment them out
        // Assert.assertEquals(OntologyConstant.testB2, schemaManifestImports.get(1));
        // Assert.assertEquals(OntologyConstant.testC3, schemaManifestImports.get(2));
        // Assert.assertEquals(OntologyConstant.testB1, schemaManifestImports.get(3));
        // Check the general ordering of B2 and C3 are correct. B1 only depends on A1 so it can be
        // anywhere except the first position
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testB2) < schemaManifestImports
                .indexOf(OntologyConstant.testC3));

        this.assertA1B2C3(this.importsMap);

    }

    @Test
    public void testSchemaImportsA1B2C3() throws Exception {
        final Model model = Rio.parse(this.getClass().getResourceAsStream("/test/schema-manifest-a1b2c3.ttl"), "",
                RDFFormat.TURTLE);

        // DebugUtils.printContents(model);
        final List<OWLOntologyID> schemaManifestImports = OntologyUtils.schemaImports(model,
                new HashSet<OWLOntologyID>(
                        Arrays.asList(OntologyConstant.testA1, OntologyConstant.testB2, OntologyConstant.testC3)),
                this.importsMap);

        Assert.assertNotNull(schemaManifestImports);
        Assert.assertEquals(3, schemaManifestImports.size());
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testA1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testB2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testC3));
        Assert.assertEquals(OntologyConstant.testA1, schemaManifestImports.get(0));
        Assert.assertEquals(OntologyConstant.testB2, schemaManifestImports.get(1));
        Assert.assertEquals(OntologyConstant.testC3, schemaManifestImports.get(2));

        this.assertA1B2C3(this.importsMap);
    }

    @Test
    public void testSchemaImportsB1() throws Exception {
        final Model model = Rio.parse(this.getClass().getResourceAsStream("/test/schema-manifest-a1b2c3.ttl"), "",
                RDFFormat.TURTLE);

        // DebugUtils.printContents(model);
        final List<OWLOntologyID> schemaManifestImports = OntologyUtils.schemaImports(model,
                new HashSet<OWLOntologyID>(Arrays.asList(OntologyConstant.testB1)), this.importsMap);

        Assert.assertNotNull(schemaManifestImports);
        Assert.assertEquals(2, schemaManifestImports.size());
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testA1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testB1));
        Assert.assertEquals(OntologyConstant.testA1, schemaManifestImports.get(0));
        Assert.assertEquals(OntologyConstant.testB1, schemaManifestImports.get(1));

        this.assertA1B2C3(this.importsMap);
    }

    @Test
    public void testSchemaImportsB2() throws Exception {
        final Model model = Rio.parse(this.getClass().getResourceAsStream("/test/schema-manifest-a1b2c3.ttl"), "",
                RDFFormat.TURTLE);

        // DebugUtils.printContents(model);
        final List<OWLOntologyID> schemaManifestImports = OntologyUtils.schemaImports(model,
                new HashSet<OWLOntologyID>(Arrays.asList(OntologyConstant.testB2)), this.importsMap);

        Assert.assertNotNull(schemaManifestImports);
        Assert.assertEquals(2, schemaManifestImports.size());
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testA1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testB2));
        Assert.assertEquals(OntologyConstant.testA1, schemaManifestImports.get(0));
        Assert.assertEquals(OntologyConstant.testB2, schemaManifestImports.get(1));

        this.assertA1B2C3(this.importsMap);
    }

    @Test
    public void testSchemaImportsC1() throws Exception {
        final Model model = Rio.parse(this.getClass().getResourceAsStream("/test/schema-manifest-a1b2c3.ttl"), "",
                RDFFormat.TURTLE);

        // DebugUtils.printContents(model);
        final List<OWLOntologyID> schemaManifestImports = OntologyUtils.schemaImports(model,
                new HashSet<OWLOntologyID>(Arrays.asList(OntologyConstant.testC1)), this.importsMap);

        Assert.assertNotNull(schemaManifestImports);
        Assert.assertEquals(3, schemaManifestImports.size());
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testA1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testB1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testC1));
        Assert.assertEquals(OntologyConstant.testA1, schemaManifestImports.get(0));
        Assert.assertEquals(OntologyConstant.testB1, schemaManifestImports.get(1));
        Assert.assertEquals(OntologyConstant.testC1, schemaManifestImports.get(2));

        this.assertA1B2C3(this.importsMap);
    }

    @Test
    public void testSchemaImportsC3() throws Exception {
        final Model model = Rio.parse(this.getClass().getResourceAsStream("/test/schema-manifest-a1b2c3.ttl"), "",
                RDFFormat.TURTLE);

        // DebugUtils.printContents(model);
        final List<OWLOntologyID> schemaManifestImports = OntologyUtils.schemaImports(model,
                new HashSet<OWLOntologyID>(Arrays.asList(OntologyConstant.testC3)), this.importsMap);

        Assert.assertNotNull(schemaManifestImports);
        Assert.assertEquals(3, schemaManifestImports.size());
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testA1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testB2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testC3));
        Assert.assertEquals(OntologyConstant.testA1, schemaManifestImports.get(0));
        Assert.assertEquals(OntologyConstant.testB2, schemaManifestImports.get(1));
        Assert.assertEquals(OntologyConstant.testC3, schemaManifestImports.get(2));

        this.assertA1B2C3(this.importsMap);
    }

    @Test
    public void testSchemaImportsEmpty() throws Exception {
        final Model model = new LinkedHashModel();

        final List<OWLOntologyID> schemaManifestImports = OntologyUtils.schemaImports(model,
                Collections.<OWLOntologyID>emptySet(), this.importsMap);

        Assert.assertNotNull(schemaManifestImports);
        Assert.assertEquals(0, schemaManifestImports.size());

        Assert.assertEquals(0, this.importsMap.size());
    }

    @Test
    public void testSchemaImportsOneLevel() throws Exception {
        final Model model = new LinkedHashModel();
        OntologyUtils.ontologyIDsToModel(Arrays.asList(OntologyConstant.testOntologyID), model);
        model.add(OntologyConstant.testVersionUri1, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testVersionUri1, OWL.IMPORTS, OntologyConstant.testImportVersionUri1);
        model.add(OntologyConstant.testImportOntologyUri1, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportOntologyUri1, OWL.VERSIONIRI, OntologyConstant.testImportVersionUri1);
        model.add(OntologyConstant.testImportVersionUri1, RDF.TYPE, OWL.ONTOLOGY);

        // DebugUtils.printContents(model);

        final List<OWLOntologyID> schemaManifestImports = OntologyUtils.schemaImports(model,
                new HashSet<OWLOntologyID>(
                        Arrays.asList(OntologyConstant.testOntologyID, OntologyConstant.testImportOntologyID1)),
                this.importsMap);

        Assert.assertNotNull(schemaManifestImports);
        Assert.assertEquals(2, schemaManifestImports.size());
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testOntologyID));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testImportOntologyID1));
        Assert.assertEquals(OntologyConstant.testImportOntologyID1, schemaManifestImports.get(0));
        Assert.assertEquals(OntologyConstant.testOntologyID, schemaManifestImports.get(1));

        Assert.assertEquals(2, this.importsMap.size());
        Assert.assertTrue(this.importsMap.containsKey(OntologyConstant.testImportVersionUri1));
        Assert.assertTrue(this.importsMap.containsKey(OntologyConstant.testVersionUri1));
        Assert.assertTrue(this.importsMap.get(OntologyConstant.testImportVersionUri1).isEmpty());
        Assert.assertEquals(1, this.importsMap.get(OntologyConstant.testVersionUri1).size());
        Assert.assertTrue(this.importsMap.get(OntologyConstant.testVersionUri1)
                .contains(OntologyConstant.testImportVersionUri1));
    }

    @Test
    public void testSchemaImportsOneLevelCurrentVersion() throws Exception {
        final Model model = new LinkedHashModel();
        OntologyUtils.ontologyIDsToModel(Arrays.asList(OntologyConstant.testOntologyID), model);
        model.add(OntologyConstant.testVersionUri1, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testVersionUri1, OWL.IMPORTS, OntologyConstant.testImportOntologyUri1);
        model.add(OntologyConstant.testImportOntologyUri1, RDF.TYPE, OWL.ONTOLOGY);
        model.add(OntologyConstant.testImportOntologyUri1, PODD.OMV_CURRENT_VERSION,
                OntologyConstant.testImportVersionUri1);
        model.add(OntologyConstant.testImportOntologyUri1, OWL.VERSIONIRI, OntologyConstant.testImportVersionUri1);
        model.add(OntologyConstant.testImportVersionUri1, RDF.TYPE, OWL.ONTOLOGY);

        // DebugUtils.printContents(model);

        final List<OWLOntologyID> schemaManifestImports = OntologyUtils.schemaImports(model,
                new HashSet<OWLOntologyID>(
                        Arrays.asList(OntologyConstant.testOntologyID, OntologyConstant.testImportOntologyID1)),
                this.importsMap);

        Assert.assertNotNull(schemaManifestImports);
        Assert.assertEquals(2, schemaManifestImports.size());
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testOntologyID));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testImportOntologyID1));
        Assert.assertEquals(OntologyConstant.testImportOntologyID1, schemaManifestImports.get(0));
        Assert.assertEquals(OntologyConstant.testOntologyID, schemaManifestImports.get(1));

        Assert.assertEquals(2, this.importsMap.size());
        Assert.assertTrue(this.importsMap.containsKey(OntologyConstant.testVersionUri1));
        Assert.assertTrue(this.importsMap.containsKey(OntologyConstant.testImportVersionUri1));
        Assert.assertEquals(0, this.importsMap.get(OntologyConstant.testImportVersionUri1).size());
        Assert.assertEquals(1, this.importsMap.get(OntologyConstant.testVersionUri1).size());
        Assert.assertTrue(this.importsMap.get(OntologyConstant.testVersionUri1)
                .contains(OntologyConstant.testImportVersionUri1));
    }

    @Test
    public void testSchemaImportsRealisticPoddV1Base() throws Exception {
        final Model model = Rio.parse(this.getClass().getResourceAsStream("/test/test-podd-schema-manifest.ttl"),
                "", RDFFormat.TURTLE);

        // DebugUtils.printContents(model);
        final List<OWLOntologyID> schemaManifestImports = OntologyUtils.schemaImports(model,
                new HashSet<OWLOntologyID>(Arrays.asList(OntologyConstant.testPoddBaseV1)), this.importsMap);

        Assert.assertNotNull(schemaManifestImports);
        Assert.assertEquals(4, schemaManifestImports.size());
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddDcV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddFoafV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddUserV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddBaseV1));
        Assert.assertEquals(OntologyConstant.testPoddDcV1, schemaManifestImports.get(0));
        Assert.assertEquals(OntologyConstant.testPoddFoafV1, schemaManifestImports.get(1));
        Assert.assertEquals(OntologyConstant.testPoddUserV1, schemaManifestImports.get(2));
        Assert.assertEquals(OntologyConstant.testPoddBaseV1, schemaManifestImports.get(3));

        this.assertRealisticImportsMapV2(this.importsMap);
    }

    @Test
    public void testSchemaImportsRealisticPoddV1DcFoaf() throws Exception {
        final Model model = Rio.parse(this.getClass().getResourceAsStream("/test/test-podd-schema-manifest.ttl"),
                "", RDFFormat.TURTLE);

        // DebugUtils.printContents(model);
        final List<OWLOntologyID> schemaManifestImports = OntologyUtils.schemaImports(model,
                new LinkedHashSet<OWLOntologyID>(
                        Arrays.asList(OntologyConstant.testPoddDcV1, OntologyConstant.testPoddFoafV1)),
                this.importsMap);

        Assert.assertNotNull(schemaManifestImports);
        Assert.assertEquals(2, schemaManifestImports.size());
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddDcV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddFoafV1));
        Assert.assertEquals(OntologyConstant.testPoddDcV1, schemaManifestImports.get(0));
        Assert.assertEquals(OntologyConstant.testPoddFoafV1, schemaManifestImports.get(1));

        this.assertRealisticImportsMapV2(this.importsMap);
    }

    @Test
    public void testSchemaImportsRealisticPoddV1Plant() throws Exception {
        final Model model = Rio.parse(this.getClass().getResourceAsStream("/test/test-podd-schema-manifest.ttl"),
                "", RDFFormat.TURTLE);

        // DebugUtils.printContents(model);
        final List<OWLOntologyID> schemaManifestImports = OntologyUtils.schemaImports(model,
                new HashSet<OWLOntologyID>(Arrays.asList(OntologyConstant.testPoddPlantV1)), this.importsMap);

        Assert.assertNotNull(schemaManifestImports);
        Assert.assertEquals(6, schemaManifestImports.size());
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddDcV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddFoafV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddUserV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddBaseV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddScienceV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddPlantV1));
        Assert.assertEquals(OntologyConstant.testPoddDcV1, schemaManifestImports.get(0));
        Assert.assertEquals(OntologyConstant.testPoddFoafV1, schemaManifestImports.get(1));
        Assert.assertEquals(OntologyConstant.testPoddUserV1, schemaManifestImports.get(2));
        Assert.assertEquals(OntologyConstant.testPoddBaseV1, schemaManifestImports.get(3));
        Assert.assertEquals(OntologyConstant.testPoddScienceV1, schemaManifestImports.get(4));
        Assert.assertEquals(OntologyConstant.testPoddPlantV1, schemaManifestImports.get(5));

        this.assertRealisticImportsMapV2(this.importsMap);
    }

    @Test
    public void testSchemaImportsRealisticPoddV1V2AllToBaseInOrder() throws Exception {
        final Model model = Rio.parse(this.getClass().getResourceAsStream("/test/test-podd-schema-manifest.ttl"),
                "", RDFFormat.TURTLE);

        // DebugUtils.printContents(model);
        final List<OWLOntologyID> schemaManifestImports = OntologyUtils.schemaImports(model,
                new LinkedHashSet<OWLOntologyID>(
                        Arrays.asList(OntologyConstant.testPoddDcV1, OntologyConstant.testPoddDcV2,
                                OntologyConstant.testPoddFoafV1, OntologyConstant.testPoddFoafV2,
                                OntologyConstant.testPoddUserV1, OntologyConstant.testPoddUserV2,
                                OntologyConstant.testPoddBaseV1, OntologyConstant.testPoddBaseV2)),
                this.importsMap);

        Assert.assertNotNull(schemaManifestImports);
        Assert.assertEquals(8, schemaManifestImports.size());
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddDcV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddDcV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddFoafV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddFoafV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddUserV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddUserV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddBaseV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddBaseV2));

        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddFoafV1));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddUserV1));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddBaseV1));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddFoafV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddUserV1));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddFoafV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddBaseV1));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddUserV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddBaseV1));

        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddFoafV2));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddUserV2));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddBaseV2));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddFoafV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddUserV2));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddFoafV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddBaseV2));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddUserV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddBaseV2));

        this.assertRealisticImportsMapV2(this.importsMap);
    }

    /**
     * Randomised test, to fuzz test the algorithm.
     *
     * @throws Exception
     */
    @Test
    public void testSchemaImportsRealisticPoddV1V2AllToBaseRandomOrder() throws Exception {
        final Model model = Rio.parse(this.getClass().getResourceAsStream("/test/test-podd-schema-manifest.ttl"),
                "", RDFFormat.TURTLE);

        final List<OWLOntologyID> imports = new ArrayList<OWLOntologyID>(Arrays.asList(
                OntologyConstant.testPoddBaseV1, OntologyConstant.testPoddUserV1, OntologyConstant.testPoddUserV2,
                OntologyConstant.testPoddFoafV1, OntologyConstant.testPoddBaseV2, OntologyConstant.testPoddFoafV2,
                OntologyConstant.testPoddDcV1, OntologyConstant.testPoddDcV2));

        Collections.shuffle(imports);

        // DebugUtils.printContents(model);
        final List<OWLOntologyID> schemaManifestImports = OntologyUtils.schemaImports(model,
                new LinkedHashSet<OWLOntologyID>(imports), this.importsMap);

        Assert.assertNotNull(schemaManifestImports);
        Assert.assertEquals(8, schemaManifestImports.size());
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddDcV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddDcV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddFoafV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddFoafV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddUserV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddUserV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddBaseV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddBaseV2));

        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddFoafV1));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddUserV1));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddBaseV1));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddFoafV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddUserV1));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddFoafV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddBaseV1));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddUserV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddBaseV1));

        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddFoafV2));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddUserV2));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddBaseV2));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddFoafV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddUserV2));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddFoafV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddBaseV2));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddUserV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddBaseV2));

        this.assertRealisticImportsMapV2(this.importsMap);
    }

    @Test
    public void testSchemaImportsRealisticPoddV1V2AllToBaseReverseOrder() throws Exception {
        final Model model = Rio.parse(this.getClass().getResourceAsStream("/test/test-podd-schema-manifest.ttl"),
                "", RDFFormat.TURTLE);

        // DebugUtils.printContents(model);
        final List<OWLOntologyID> schemaManifestImports = OntologyUtils.schemaImports(model,
                new LinkedHashSet<OWLOntologyID>(
                        Arrays.asList(OntologyConstant.testPoddBaseV1, OntologyConstant.testPoddBaseV2,
                                OntologyConstant.testPoddUserV1, OntologyConstant.testPoddUserV2,
                                OntologyConstant.testPoddFoafV1, OntologyConstant.testPoddFoafV2,
                                OntologyConstant.testPoddDcV1, OntologyConstant.testPoddDcV2)),
                this.importsMap);

        Assert.assertNotNull(schemaManifestImports);
        Assert.assertEquals(8, schemaManifestImports.size());
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddDcV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddDcV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddFoafV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddFoafV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddUserV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddUserV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddBaseV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddBaseV2));

        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddFoafV1));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddUserV1));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddBaseV1));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddFoafV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddUserV1));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddFoafV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddBaseV1));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddUserV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddBaseV1));

        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddFoafV2));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddUserV2));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddBaseV2));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddFoafV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddUserV2));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddFoafV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddBaseV2));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddUserV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddBaseV2));

        this.assertRealisticImportsMapV2(this.importsMap);
    }

    /**
     * Randomised test, to fuzz test the algorithm.
     *
     * @throws Exception
     */
    @Test
    public void testSchemaImportsRealisticPoddV1V2AllToPlantRandomOrder() throws Exception {
        final Model model = Rio.parse(this.getClass().getResourceAsStream("/test/test-podd-schema-manifest.ttl"),
                "", RDFFormat.TURTLE);

        final List<OWLOntologyID> imports = new ArrayList<OWLOntologyID>(Arrays.asList(
                OntologyConstant.testPoddBaseV1, OntologyConstant.testPoddUserV1, OntologyConstant.testPoddUserV2,
                OntologyConstant.testPoddFoafV1, OntologyConstant.testPoddPlantV1, OntologyConstant.testPoddPlantV2,
                OntologyConstant.testPoddBaseV2, OntologyConstant.testPoddFoafV2, OntologyConstant.testPoddDcV1,
                OntologyConstant.testPoddDcV2, OntologyConstant.testPoddScienceV1,
                OntologyConstant.testPoddScienceV2));

        // Randomise the order to fuzz test the algorithm
        Collections.shuffle(imports);

        // DebugUtils.printContents(model);
        final List<OWLOntologyID> result = OntologyUtils.schemaImports(model,
                new LinkedHashSet<OWLOntologyID>(imports), this.importsMap);

        Assert.assertNotNull(result);
        Assert.assertEquals(12, result.size());
        Assert.assertTrue(result.contains(OntologyConstant.testPoddDcV1));
        Assert.assertTrue(result.contains(OntologyConstant.testPoddDcV2));
        Assert.assertTrue(result.contains(OntologyConstant.testPoddFoafV1));
        Assert.assertTrue(result.contains(OntologyConstant.testPoddFoafV2));
        Assert.assertTrue(result.contains(OntologyConstant.testPoddUserV1));
        Assert.assertTrue(result.contains(OntologyConstant.testPoddUserV2));
        Assert.assertTrue(result.contains(OntologyConstant.testPoddBaseV1));
        Assert.assertTrue(result.contains(OntologyConstant.testPoddBaseV2));
        Assert.assertTrue(result.contains(OntologyConstant.testPoddScienceV1));
        Assert.assertTrue(result.contains(OntologyConstant.testPoddScienceV2));
        Assert.assertTrue(result.contains(OntologyConstant.testPoddPlantV1));
        Assert.assertTrue(result.contains(OntologyConstant.testPoddPlantV2));

        Assert.assertTrue(
                result.indexOf(OntologyConstant.testPoddDcV1) < result.indexOf(OntologyConstant.testPoddFoafV1));
        Assert.assertTrue(
                result.indexOf(OntologyConstant.testPoddDcV1) < result.indexOf(OntologyConstant.testPoddUserV1));
        Assert.assertTrue(
                result.indexOf(OntologyConstant.testPoddDcV1) < result.indexOf(OntologyConstant.testPoddBaseV1));
        Assert.assertTrue(
                result.indexOf(OntologyConstant.testPoddDcV1) < result.indexOf(OntologyConstant.testPoddScienceV1));
        Assert.assertTrue(
                result.indexOf(OntologyConstant.testPoddDcV1) < result.indexOf(OntologyConstant.testPoddPlantV1));
        Assert.assertTrue(
                result.indexOf(OntologyConstant.testPoddFoafV1) < result.indexOf(OntologyConstant.testPoddUserV1));
        Assert.assertTrue(
                result.indexOf(OntologyConstant.testPoddFoafV1) < result.indexOf(OntologyConstant.testPoddBaseV1));
        Assert.assertTrue(result.indexOf(OntologyConstant.testPoddFoafV1) < result
                .indexOf(OntologyConstant.testPoddScienceV1));
        Assert.assertTrue(
                result.indexOf(OntologyConstant.testPoddFoafV1) < result.indexOf(OntologyConstant.testPoddPlantV1));
        Assert.assertTrue(
                result.indexOf(OntologyConstant.testPoddUserV1) < result.indexOf(OntologyConstant.testPoddBaseV1));
        Assert.assertTrue(result.indexOf(OntologyConstant.testPoddUserV1) < result
                .indexOf(OntologyConstant.testPoddScienceV1));
        Assert.assertTrue(
                result.indexOf(OntologyConstant.testPoddUserV1) < result.indexOf(OntologyConstant.testPoddPlantV1));
        Assert.assertTrue(result.indexOf(OntologyConstant.testPoddBaseV1) < result
                .indexOf(OntologyConstant.testPoddScienceV1));
        Assert.assertTrue(
                result.indexOf(OntologyConstant.testPoddBaseV1) < result.indexOf(OntologyConstant.testPoddPlantV1));
        Assert.assertTrue(result.indexOf(OntologyConstant.testPoddScienceV1) < result
                .indexOf(OntologyConstant.testPoddPlantV1));

        Assert.assertTrue(
                result.indexOf(OntologyConstant.testPoddDcV2) < result.indexOf(OntologyConstant.testPoddFoafV2));
        Assert.assertTrue(
                result.indexOf(OntologyConstant.testPoddDcV2) < result.indexOf(OntologyConstant.testPoddUserV2));
        Assert.assertTrue(
                result.indexOf(OntologyConstant.testPoddDcV2) < result.indexOf(OntologyConstant.testPoddBaseV2));
        Assert.assertTrue(
                result.indexOf(OntologyConstant.testPoddDcV2) < result.indexOf(OntologyConstant.testPoddScienceV2));
        Assert.assertTrue(
                result.indexOf(OntologyConstant.testPoddDcV2) < result.indexOf(OntologyConstant.testPoddPlantV2));
        Assert.assertTrue(
                result.indexOf(OntologyConstant.testPoddFoafV2) < result.indexOf(OntologyConstant.testPoddUserV2));
        Assert.assertTrue(
                result.indexOf(OntologyConstant.testPoddFoafV2) < result.indexOf(OntologyConstant.testPoddBaseV2));
        Assert.assertTrue(result.indexOf(OntologyConstant.testPoddFoafV2) < result
                .indexOf(OntologyConstant.testPoddScienceV2));
        Assert.assertTrue(
                result.indexOf(OntologyConstant.testPoddFoafV2) < result.indexOf(OntologyConstant.testPoddPlantV2));
        Assert.assertTrue(
                result.indexOf(OntologyConstant.testPoddUserV2) < result.indexOf(OntologyConstant.testPoddBaseV2));
        Assert.assertTrue(result.indexOf(OntologyConstant.testPoddUserV2) < result
                .indexOf(OntologyConstant.testPoddScienceV2));
        Assert.assertTrue(
                result.indexOf(OntologyConstant.testPoddUserV2) < result.indexOf(OntologyConstant.testPoddPlantV2));
        Assert.assertTrue(result.indexOf(OntologyConstant.testPoddBaseV2) < result
                .indexOf(OntologyConstant.testPoddScienceV2));
        Assert.assertTrue(
                result.indexOf(OntologyConstant.testPoddBaseV2) < result.indexOf(OntologyConstant.testPoddPlantV2));
        Assert.assertTrue(result.indexOf(OntologyConstant.testPoddScienceV2) < result
                .indexOf(OntologyConstant.testPoddPlantV2));

        this.assertRealisticImportsMapV2(this.importsMap);
    }

    /**
     * Randomised test, to fuzz test the algorithm.
     *
     * @throws Exception
     */
    @Test
    public void testSchemaImportsRealisticPoddV1V2AllToScienceRandomOrder() throws Exception {
        final Model model = Rio.parse(this.getClass().getResourceAsStream("/test/test-podd-schema-manifest.ttl"),
                "", RDFFormat.TURTLE);

        final List<OWLOntologyID> imports = new ArrayList<OWLOntologyID>(Arrays.asList(
                OntologyConstant.testPoddBaseV1, OntologyConstant.testPoddUserV1, OntologyConstant.testPoddUserV2,
                OntologyConstant.testPoddFoafV1, OntologyConstant.testPoddBaseV2, OntologyConstant.testPoddFoafV2,
                OntologyConstant.testPoddDcV1, OntologyConstant.testPoddDcV2, OntologyConstant.testPoddScienceV1,
                OntologyConstant.testPoddScienceV2));

        Collections.shuffle(imports);

        // DebugUtils.printContents(model);
        final List<OWLOntologyID> schemaManifestImports = OntologyUtils.schemaImports(model,
                new LinkedHashSet<OWLOntologyID>(imports), this.importsMap);

        Assert.assertNotNull(schemaManifestImports);
        Assert.assertEquals(10, schemaManifestImports.size());
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddDcV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddDcV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddFoafV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddFoafV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddUserV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddUserV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddBaseV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddBaseV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddScienceV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddScienceV2));

        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddFoafV1));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddUserV1));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddBaseV1));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddScienceV1));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddFoafV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddUserV1));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddFoafV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddBaseV1));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddFoafV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddScienceV1));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddUserV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddBaseV1));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddUserV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddScienceV1));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddBaseV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddScienceV1));

        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddFoafV2));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddUserV2));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddBaseV2));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddScienceV2));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddFoafV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddUserV2));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddFoafV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddBaseV2));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddFoafV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddScienceV2));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddUserV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddBaseV2));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddUserV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddScienceV2));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddBaseV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddScienceV2));

        this.assertRealisticImportsMapV2(this.importsMap);
    }

    @Test
    public void testSchemaImportsRealisticPoddV1V2Base() throws Exception {
        final Model model = Rio.parse(this.getClass().getResourceAsStream("/test/test-podd-schema-manifest.ttl"),
                "", RDFFormat.TURTLE);

        // DebugUtils.printContents(model);
        final List<OWLOntologyID> schemaManifestImports = OntologyUtils.schemaImports(model,
                new HashSet<OWLOntologyID>(
                        Arrays.asList(OntologyConstant.testPoddBaseV1, OntologyConstant.testPoddBaseV2)),
                this.importsMap);

        Assert.assertNotNull(schemaManifestImports);
        Assert.assertEquals(8, schemaManifestImports.size());
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddDcV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddDcV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddFoafV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddFoafV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddUserV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddUserV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddBaseV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddBaseV2));

        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddFoafV1));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddUserV1));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddBaseV1));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddFoafV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddUserV1));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddFoafV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddBaseV1));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddUserV1) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddBaseV1));

        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddFoafV2));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddUserV2));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddDcV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddBaseV2));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddFoafV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddUserV2));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddFoafV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddBaseV2));
        Assert.assertTrue(schemaManifestImports.indexOf(OntologyConstant.testPoddUserV2) < schemaManifestImports
                .indexOf(OntologyConstant.testPoddBaseV2));

        this.assertRealisticImportsMapV2(this.importsMap);
    }

    @Test
    public void testSchemaImportsRealisticPoddV2All() throws Exception {
        final Model model = Rio.parse(this.getClass().getResourceAsStream("/test/test-podd-schema-manifest.ttl"),
                "", RDFFormat.TURTLE);

        // DebugUtils.printContents(model);
        final List<OWLOntologyID> schemaManifestImports = OntologyUtils.schemaImports(model,
                new LinkedHashSet<OWLOntologyID>(
                        Arrays.asList(OntologyConstant.testPoddDcV2, OntologyConstant.testPoddFoafV2,
                                OntologyConstant.testPoddUserV2, OntologyConstant.testPoddBaseV2,
                                OntologyConstant.testPoddScienceV2, OntologyConstant.testPoddPlantV2)),
                this.importsMap);

        Assert.assertNotNull(schemaManifestImports);
        Assert.assertEquals(6, schemaManifestImports.size());
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddDcV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddFoafV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddUserV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddBaseV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddScienceV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddPlantV2));
        Assert.assertEquals(OntologyConstant.testPoddDcV2, schemaManifestImports.get(0));
        Assert.assertEquals(OntologyConstant.testPoddFoafV2, schemaManifestImports.get(1));
        Assert.assertEquals(OntologyConstant.testPoddUserV2, schemaManifestImports.get(2));
        Assert.assertEquals(OntologyConstant.testPoddBaseV2, schemaManifestImports.get(3));
        Assert.assertEquals(OntologyConstant.testPoddScienceV2, schemaManifestImports.get(4));
        Assert.assertEquals(OntologyConstant.testPoddPlantV2, schemaManifestImports.get(5));

        this.assertRealisticImportsMapV2(this.importsMap);
    }

    @Test
    public void testSchemaImportsRealisticPoddV2DcFoaf() throws Exception {
        final Model model = Rio.parse(this.getClass().getResourceAsStream("/test/test-podd-schema-manifest.ttl"),
                "", RDFFormat.TURTLE);

        // DebugUtils.printContents(model);
        final List<OWLOntologyID> schemaManifestImports = OntologyUtils.schemaImports(model,
                new LinkedHashSet<OWLOntologyID>(
                        Arrays.asList(OntologyConstant.testPoddDcV2, OntologyConstant.testPoddFoafV2)),
                this.importsMap);

        Assert.assertNotNull(schemaManifestImports);
        Assert.assertEquals(2, schemaManifestImports.size());
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddDcV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddFoafV2));
        Assert.assertEquals(OntologyConstant.testPoddDcV2, schemaManifestImports.get(0));
        Assert.assertEquals(OntologyConstant.testPoddFoafV2, schemaManifestImports.get(1));

        this.assertRealisticImportsMapV2(this.importsMap);
    }

    @Test
    public void testSchemaImportsRealisticPoddV2DcPlant() throws Exception {
        final Model model = Rio.parse(this.getClass().getResourceAsStream("/test/test-podd-schema-manifest.ttl"),
                "", RDFFormat.TURTLE);

        // DebugUtils.printContents(model);
        final List<OWLOntologyID> schemaManifestImports = OntologyUtils.schemaImports(model,
                new HashSet<OWLOntologyID>(
                        Arrays.asList(OntologyConstant.testPoddDcV2, OntologyConstant.testPoddPlantV2)),
                this.importsMap);

        Assert.assertNotNull(schemaManifestImports);
        Assert.assertEquals(6, schemaManifestImports.size());
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddDcV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddFoafV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddUserV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddBaseV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddScienceV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddPlantV2));
        Assert.assertEquals(OntologyConstant.testPoddDcV2, schemaManifestImports.get(0));
        Assert.assertEquals(OntologyConstant.testPoddFoafV2, schemaManifestImports.get(1));
        Assert.assertEquals(OntologyConstant.testPoddUserV2, schemaManifestImports.get(2));
        Assert.assertEquals(OntologyConstant.testPoddBaseV2, schemaManifestImports.get(3));
        Assert.assertEquals(OntologyConstant.testPoddScienceV2, schemaManifestImports.get(4));
        Assert.assertEquals(OntologyConstant.testPoddPlantV2, schemaManifestImports.get(5));

        this.assertRealisticImportsMapV2(this.importsMap);
    }

    @Test
    public void testSchemaImportsRealisticPoddV2Plant() throws Exception {
        final Model model = Rio.parse(this.getClass().getResourceAsStream("/test/test-podd-schema-manifest.ttl"),
                "", RDFFormat.TURTLE);

        // DebugUtils.printContents(model);
        final List<OWLOntologyID> schemaManifestImports = OntologyUtils.schemaImports(model,
                new HashSet<OWLOntologyID>(Arrays.asList(OntologyConstant.testPoddPlantV2)), this.importsMap);

        Assert.assertNotNull(schemaManifestImports);
        Assert.assertEquals(6, schemaManifestImports.size());
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddDcV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddFoafV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddUserV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddBaseV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddScienceV2));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddPlantV2));
        Assert.assertEquals(OntologyConstant.testPoddDcV2, schemaManifestImports.get(0));
        Assert.assertEquals(OntologyConstant.testPoddFoafV2, schemaManifestImports.get(1));
        Assert.assertEquals(OntologyConstant.testPoddUserV2, schemaManifestImports.get(2));
        Assert.assertEquals(OntologyConstant.testPoddBaseV2, schemaManifestImports.get(3));
        Assert.assertEquals(OntologyConstant.testPoddScienceV2, schemaManifestImports.get(4));
        Assert.assertEquals(OntologyConstant.testPoddPlantV2, schemaManifestImports.get(5));

        this.assertRealisticImportsMapV2(this.importsMap);
    }

    @Test
    public void testSchemaImportsRealisticV3PoddV2DcFoaf() throws Exception {
        final Model model = Rio.parse(this.getClass().getResourceAsStream("/default-podd-schema-manifest.ttl"), "",
                RDFFormat.TURTLE);

        // DebugUtils.printContents(model);
        final List<OWLOntologyID> schemaManifestImports = OntologyUtils.schemaImports(model,
                new LinkedHashSet<OWLOntologyID>(
                        Arrays.asList(OntologyConstant.testPoddDcV1, OntologyConstant.testPoddFoafV1)),
                this.importsMap);

        Assert.assertNotNull(schemaManifestImports);
        Assert.assertEquals(2, schemaManifestImports.size());
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddDcV1));
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testPoddFoafV1));
        Assert.assertEquals(OntologyConstant.testPoddDcV1, schemaManifestImports.get(0));
        Assert.assertEquals(OntologyConstant.testPoddFoafV1, schemaManifestImports.get(1));

        this.assertRealisticImportsMapV3(this.importsMap);
    }

    @Test
    public void testSchemaImportsZeroLevels() throws Exception {
        final Model model = new LinkedHashModel();
        OntologyUtils.ontologyIDsToModel(Arrays.asList(OntologyConstant.testOntologyID), model);

        final List<OWLOntologyID> schemaManifestImports = OntologyUtils.schemaImports(model,
                Collections.singleton(OntologyConstant.testOntologyID), this.importsMap);

        Assert.assertNotNull(schemaManifestImports);
        Assert.assertEquals(1, schemaManifestImports.size());
        Assert.assertTrue(schemaManifestImports.contains(OntologyConstant.testOntologyID));

        Assert.assertEquals(1, this.importsMap.size());
        Assert.assertTrue(this.importsMap.containsKey(OntologyConstant.testVersionUri1));
        Assert.assertEquals(0, this.importsMap.get(OntologyConstant.testVersionUri1).size());
    }

    /**
     * Test method for
     * {@link com.github.podd.utils.OntologyUtils#stringToOntologyID(String, RDFFormat)}.
     */
    @Test
    public final void testStringToOntologyIDsInRdfXml() throws Exception {
        final InputStream resourceStream = this.getClass().getResourceAsStream("/test/test-ontologyid-2.rdf");
        final String rdfString = IOUtils.toString(resourceStream);

        final Collection<InferredOWLOntologyID> ontologyIDs = OntologyUtils.stringToOntologyID(rdfString,
                RDFFormat.RDFXML);

        Assert.assertEquals("Did not find any Ontology IDs", 1, ontologyIDs.size());
        Assert.assertEquals("Version IRI did not match",
                "http://example.org/purl/c54fbaa5-0767-4f78-88b1-2509ff428f60/artifact:1:version:1",
                ontologyIDs.iterator().next().getVersionIRI().toString());
    }

    /**
     * Test method for
     * {@link com.github.podd.utils.OntologyUtils#stringToOntologyID(String, RDFFormat)}.
     */
    @Test
    public final void testStringToOntologyIDsInTurtle() throws Exception {
        final InputStream resourceStream = this.getClass().getResourceAsStream("/test/test-ontologyid-1.ttl");
        final String rdfString = IOUtils.toString(resourceStream);

        final Collection<InferredOWLOntologyID> ontologyIDs = OntologyUtils.stringToOntologyID(rdfString,
                RDFFormat.TURTLE);

        Assert.assertEquals("Did not find any Ontology IDs", 1, ontologyIDs.size());
        Assert.assertEquals("Version IRI did not match",
                "http://example.org/purl/91bb7bff-acd6-4b2e-abf7-ce74d3d91061/artifact:1:version:1",
                ontologyIDs.iterator().next().getVersionIRI().toString());
    }

}