package se.liu.ida.rdfstar.tools.sparqlstar.resultset;

import static org.junit.Assert.assertEquals;

import org.apache.jena.graph.Node;
import org.apache.jena.graph.NodeFactory;
import org.apache.jena.graph.Node_Triple;
import org.apache.jena.graph.Triple;
import org.apache.jena.query.QuerySolution;
import org.apache.jena.query.QuerySolutionMap;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdf.model.RDFNode;
import org.apache.jena.shared.PrefixMapping;
import org.apache.jena.shared.impl.PrefixMappingImpl;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * 
 * @author Olaf Hartig http://olafhartig.de/
 */
public class TextOutputStarTest
{
	@Before
	public void setup() {
	}

	@After
	public void tearDown() {
	}

	@Test
	public void withoutPrefixMapping() {
		final MyTextOutput o = new MyTextOutput( new PrefixMappingImpl() );
		assertEquals("<http://example.com/i> <http://example.com/i> <http://example.com/i> ", getResult(o));
	}

	@Test
	public void withPrefixMapping() {
		final MyTextOutput o = new MyTextOutput( getPrefixMappingForTests() );
		assertEquals("ex:i ex:i ex:i ", getResult(o));
	}

	@Test
	public void nested1() {
		final MyTextOutput o = new MyTextOutput( getPrefixMappingForTests() );
		
		final Node u = NodeFactory.createURI("http://example.com/i");
		final Node n1 = new Node_Triple(new Triple(u, u, u));
		final Node n2 = new Node_Triple(new Triple(n1, u, u));
		final QuerySolution s = createQuerySolution( "?t", n2 );		
		final String result = o.get(s, "?t");

		assertEquals("<< ex:i ex:i ex:i >> ex:i ex:i ", result);
	}

	@Test
	public void nested2() {
		final MyTextOutput o = new MyTextOutput( getPrefixMappingForTests() );
		
		final Node u = NodeFactory.createURI("http://example.com/i");
		final Node n1 = new Node_Triple(new Triple(u, u, u));
		final Node n2 = new Node_Triple(new Triple(u, u, n1));
		final QuerySolution s = createQuerySolution( "?t", n2 );		
		final String result = o.get(s, "?t");

		assertEquals("ex:i ex:i << ex:i ex:i ex:i >> ", result);
	}



	// ---- helpers ----

	static public PrefixMapping getPrefixMappingForTests() {
		return new PrefixMappingImpl().setNsPrefix("ex", "http://example.com/");
	}

	static class MyTextOutput extends TextOutputStar {
		public MyTextOutput( PrefixMapping pm ) { super(pm); }
		public String get(QuerySolution s, String varName) { return getVarValueAsString(s, varName); }
	}

	public String getResult( MyTextOutput o ) {
		final Node u = NodeFactory.createURI("http://example.com/i");
		final Node n = new Node_Triple(new Triple(u, u, u));
		final QuerySolution s = createQuerySolution( "?t", n );		
		return o.get(s, "?t");
	}

	public QuerySolution createQuerySolution( String varName, Node n ) {
		final RDFNode nn = ModelFactory.createDefaultModel().asRDFNode(n);
		final QuerySolutionMap s = new QuerySolutionMap();
		s.add(varName, nn);
		return s;
	}
}