import com.hp.hpl.jena.graph.Node;
import com.hp.hpl.jena.graph.Triple;
import com.hp.hpl.jena.util.iterator.ExtendedIterator;
import fr.cnrs.liris.strap.jena.JenaStrapClient;
import junit.framework.TestCase;


public class TestClient extends TestCase {
	private JenaStrapClient cl ;
	
	public TestClient (String name) {
		super (name) ;
	}
	
	public void setUp () throws Exception {
		cl = new JenaStrapClient ("localhost", 1234, "/utest/tiny.rdf") ;
	}
	
	public void tearDown () throws Exception {
		cl.close() ;
	}
	
	private int SIZE = 3 ;
	
	private int size () {
		int l = 0 ;
		ExtendedIterator it = cl.find(null, null, null) ;
		while (it.hasNext()) {
			//Object o =
			it.next();
			//System.err.println (o);
			l += 1 ;
		}
		it.close();
		return l;
	}
	
	public void testSize () {
		assertEquals(SIZE, size()) ;
	}

	public void testRemoveSucceed () {
		cl.delete(new Triple (
				Node.createURI("file:///a"),
				Node.createURI("file:///b"),
				Node.createURI("file:///c")
				));
		assertEquals(SIZE-1, size()) ;
	}

	public void testRemoveFail () {
		cl.delete(new Triple (
				Node.createURI("file:///a"),
				Node.createURI("file:///b"),
				Node.createURI("file:///d")
				));
		assertEquals(SIZE, size()) ;
	}
	
	public void testAddSucceed () {
		cl.add(new Triple (
				Node.createURI("file:///a"),
				Node.createURI("file:///b"),
				Node.createURI("file:///d")
				));
		assertEquals(SIZE+1, size()) ;
	}

	public void testAddFail () {
		cl.add(new Triple (
				Node.createURI("file:///a"),
				Node.createURI("file:///b"),
				Node.createURI("file:///c")
				));
		assertEquals(SIZE, size()) ;
	}
	
	public void testTriplesExactSucceed () {
		ExtendedIterator it = cl.find(
				Node.createURI("file:///a"),
				Node.createURI("file:///b"),
				Node.createURI("file:///c"));
        int size = 0;
        while (it.hasNext()) {
        	//Object o =
        	it.next();
        	size += 1;
        }
        it.close() ;
		assertEquals(1, size) ;
	}
	
	public void testTriplesExactFail () {
		ExtendedIterator it = cl.find(
				Node.createURI("file:///a"),
				Node.createURI("file:///b"),
				Node.createURI("file:///d"));
        int size = 0;
        while (it.hasNext()) {
        	//Object o =
        	it.next();
        	size += 1;
        }
        it.close ();
		assertEquals(0, size) ;
	}
	
	public void testTriplesWildcard () {
		ExtendedIterator it = cl.find(
				Node.createURI("file:///a"),
				Node.createURI("file:///b"),
				null);
        int size = 0;
        while (it.hasNext()) {
        	//Object o =
        	it.next();
        	size += 1;
        }
        it.close ();
		assertEquals(2, size) ;
	}
	
	public void testStackMeta () throws Exception {
		ExtendedIterator it = cl.find(null, null, null);
		int size = 0;
        while (it.hasNext()) {
        	//Object o =
        	it.next();
        	cl.meta() ;
   			size += 1;
        }
        it.close() ;
		assertEquals(SIZE, size) ;
	}
	
	public void testStackTriples () {
		ExtendedIterator it = cl.find(null, null, null);
		int size = 0;
        while (it.hasNext()) {
        	//Object o =
        	it.next();
    		ExtendedIterator jt = cl.find(null, null, null);
    		while (jt.hasNext()) {
            	//o =
    			jt.next();
    			size += 1;
    		}
    		jt.close();
        }
        it.close() ;
		assertEquals(SIZE*SIZE, size) ;
	}
	
	public void testIllFormedClose () {
		ExtendedIterator it1 = cl.find(null, null, null);
		ExtendedIterator it2 = cl.find(null, null, null);
		it2.next();
		try {
		    it1.close();
		}
		catch (RuntimeException ex) {
			return ;
		}
		fail("No RuntimeException caught") ;
	}
}
