package eu.dnetlib.utils.ontologies;

import com.google.gson.Gson;
import org.apache.commons.lang3.StringUtils;
import org.junit.Assert;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;

import static org.junit.Assert.*;

/**
 * Created by claudio on 12/12/2016.
 */
public class OntologyLoaderTest {

    private String basePath = "/eu/dnetlib/test/profiles/OntologyDSResources/OntologyDSResourceType/";

    @Test
    public void testLoadOntologyFromCp() {

        final InputStream i = getClass().getResourceAsStream(basePath + "result_result_relations.xml");

        Ontology o = OntologyLoader.loadOntologyFromCp(i);
        checkOntology(o);

        String supplement = o.inverseOf("isSupplementedBy");
        assertEquals(supplement, "isSupplementTo");

        String part = o.inverseOf("isPartOf");
        assertEquals(part, "hasPart");
    }

    @Test
    public void testLoadOntologiesFromCp() throws IOException {

        OntologyLoader.loadOntologiesFromCp().values().forEach(o -> checkOntology(o));
    }

    @Test
    public void testLoadOntologiesSerialization() throws IOException {

        final Ontologies o = OntologyLoader.loadOntologiesFromCp();
        assertNotNull(o);

        final String json = o.toJson(true);

        assertFalse(StringUtils.isBlank(json));
        assertFalse("{}".equals(json.trim()));

        //System.out.println(json);

        assertTrue(StringUtils.isNoneBlank(json));

        final Ontologies o1 = new Gson().fromJson(json, Ontologies.class);

        assertNotNull(o1);

        o1.entrySet().forEach(e -> checkOntology(e.getValue()));
    }

    private void checkOntology(Ontology o) {
        Assert.assertNotNull(o);
        Assert.assertTrue(StringUtils.isNotBlank(o.getCode()));
        Assert.assertTrue(StringUtils.isNotBlank(o.getDescription()));
        Assert.assertNotNull(o.getTerms().values());

        o.getTerms().values().forEach(it -> {
            Assert.assertTrue(StringUtils.isNotBlank(it.getCode()));
            Assert.assertTrue(StringUtils.isNotBlank(it.getEncoding()));
            Assert.assertTrue(StringUtils.isNotBlank(it.getEnglishName()));
            Assert.assertTrue(StringUtils.isNotBlank(it.getNativeName()));
            Assert.assertTrue(StringUtils.isNotBlank(it.getInverseCode()));
            Assert.assertNotNull(o.getTerms().get(it.getInverseCode()));
        });
    }
}
