package semantic;

import org.junit.Assert;
import org.junit.Test;

import semantic.controler.Controler;
import semantic.model.TimestampEntity;

public class TestModelFunctions
{
	@Test
	public void testPlaceCreation()
	{
		Controler c = new Controler();
		String jurassicParkURI = c.getCustomModel().createPlace("Jurassic park");
		String placeClassURI = c.getModel().getEntityURI("Lieu").get(0);
		Assert.assertTrue("L'entité créée n'est pas de classe Lieu", c.getModel().isOfType(jurassicParkURI, placeClassURI));
		Assert.assertTrue("Le lieu créé n'a pas de label pour indiquer son nom", c.getModel().listLabels(jurassicParkURI).contains("Jurassic park"));
	}
	
	@Test
	public void testInstantCreation()
	{
		Controler c = new Controler();
		TimestampEntity t = new TimestampEntity("2014-02-13T06:20:00");
		String instantURI = c.getCustomModel().createInstant(t);
		String instantClassURI = c.getModel().getEntityURI("Instant").get(0);
		String propertyURI =  c.getModel().getEntityURI("a pour timestamp").get(0);
		Assert.assertTrue("L'entité créée n'est pas de la classe Instant", c.getModel().isOfType(instantURI, instantClassURI));
		Assert.assertTrue("L'instant créé n'a pas le bon timestamp", c.getModel().hasDataPropertyValue(
				instantURI, propertyURI, "2014-02-13T06:20:00"));
	}
	
	@Test
	public void testInstantRetrieval()
	{
		Controler c = new Controler();
		TimestampEntity t = new TimestampEntity("2014-02-13T06:20:00");
		TimestampEntity t2 = new TimestampEntity("2015-02-13T06:20:00");
		String instantURI = c.getCustomModel().createInstant(t);
		Assert.assertTrue("La recherche d'un instant par timestamp ne retourne rien pour un instant sensé exister", c.getCustomModel().getInstantURI(t).equals(instantURI));
		Assert.assertNull("La recherche d'un instant par timestamp inexistant ne retourne pas un résultat null", c.getCustomModel().getInstantURI(t2));
	}
	
	@Test
	public void testTimestampRetrieval()
	{
		Controler c = new Controler();
		TimestampEntity t = new TimestampEntity("2014-02-13T06:20:00");
		String instantURI = c.getCustomModel().createInstant(t);
		Assert.assertTrue("Le timestamp ne correspond pas", c.getCustomModel().getInstantTimestamp(instantURI).equals("2014-02-13T06:20:00"));
	}
	
	@Test
	public void testObservationCreation()
	{
		Controler c = new Controler();
		TimestampEntity t = new TimestampEntity("2014-02-13T06:20:00");
		String instantURI = c.getCustomModel().createInstant(t);
		String paramURI = c.getModel().getEntityURI("Température").get(0);
		String value = "25.0";
		String obsURI = c.getCustomModel().createObs(value, paramURI, instantURI);
		// Entities relevant to the test
		String obsClassURI = c.getModel().getEntityURI("Observation").get(0);
		String hasDataValueURI = c.getModel().getEntityURI("a pour valeur").get(0);
		String datePropertyURI = c.getModel().getEntityURI("a pour date").get(0);
		String sensorURI = c.getModel().whichSensorDidIt("2014-02-13T06:20:00", paramURI);
		Assert.assertTrue("L'observation n'est pas une instance de la bonne classe", c.getModel().isOfType(obsURI, obsClassURI));
		Assert.assertTrue("L'observation n'a pas la bonne valeur",c.getModel().hasDataPropertyValue(obsURI, hasDataValueURI, value));
		Assert.assertTrue("L'observation n'a pas la bonne date",c.getModel().hasObjectProperty(obsURI, datePropertyURI, instantURI));
		Assert.assertTrue("L'observation n'est pas rattachée au bon capteur", c.getModel().hasSensorDoneIt(obsURI, sensorURI));
	}
}
