// Copyright (c) 2011. This source code is available under the terms of the GNU Lesser General Public License (LGPL)
// Author: Mario Volke <[email protected]>
// derivo GmbH, James-Franck-Ring, 89081 Ulm 

package de.derivo.sparqldlapi.tests;

import static org.junit.Assert.*;
import static org.mockito.Mockito.mock;

import de.derivo.sparqldlapi.Var;
import org.junit.Test;

import de.derivo.sparqldlapi.QueryArgument;
import de.derivo.sparqldlapi.types.QueryArgumentType;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;
import org.semanticweb.owlapi.model.IRI;
import org.semanticweb.owlapi.model.OWLAnonymousIndividual;
import org.semanticweb.owlapi.model.OWLLiteral;
import uk.ac.manchester.cs.owl.owlapi.OWLLiteralImpl;

/**
 * A jUnit 4.0 test class to test QueryArgument
 * 
 * @author Mario Volke
 */
@RunWith(MockitoJUnitRunner.class)
public class QueryArgumentTest 
{
	@Test
	public void testGetValue() 
	{
		QueryArgument arg = new QueryArgument(IRI.create("http://example.com"));
		assertEquals(arg.getValueAsIRI(), IRI.create("http://example.com"));
	}
	
	@Test
	public void testGetType() 
	{
		QueryArgument arg = new QueryArgument(IRI.create("http://example.com"));
		assertEquals(arg.getType(), QueryArgumentType.URI);
	}
	
	@Test
	public void testHasType() 
	{
		QueryArgument arg = new QueryArgument(IRI.create("http://example.com"));
		assertTrue(arg.hasType(QueryArgumentType.URI));
		assertFalse(arg.hasType(QueryArgumentType.VAR));
	}
	
	@Test
	public void testIsURI() 
	{
		QueryArgument arg = new QueryArgument(IRI.create("http://example.com"));
		assertTrue(arg.isURI());
		QueryArgument arg2 = new QueryArgument(new Var("x"));
		assertFalse(arg2.isURI());
	}
	
	@Test
	public void testIsVar() 
	{
		QueryArgument arg = new QueryArgument(new Var("x"));
		assertTrue(arg.isVar());
		QueryArgument arg2 = new QueryArgument(IRI.create("http://example.com"));
		assertFalse(arg2.isVar());
	}
	
	@Test
	public void testIsLiteral() 
	{
		QueryArgument arg = new QueryArgument(mock(OWLLiteral.class));
		assertTrue(arg.isLiteral());
		QueryArgument arg2 = new QueryArgument(new Var("x"));
		assertFalse(arg2.isLiteral());
	}
	
	@Test
	public void testIsBnode() 
	{
		QueryArgument arg = new QueryArgument(mock(OWLAnonymousIndividual.class));
		assertTrue(arg.isBnode());
		QueryArgument arg2 = new QueryArgument(new Var("x"));
		assertFalse(arg2.isBnode());
	}
	
	@Test
	public void testEqualsTrue() 
	{
		QueryArgument arg1 = new QueryArgument(new Var("x"));
		QueryArgument arg2 = new QueryArgument(new Var("x"));
		assertTrue(arg1.equals(arg2));
	}
	
	@Test
	public void testEqualsFalse() 
	{
		QueryArgument arg1 = new QueryArgument(new Var("x"));
		QueryArgument arg2 = new QueryArgument(mock(OWLLiteral.class));
		assertFalse(arg1.equals(arg2));
	}
	
	
	@Test
	public void testHashCodeEqualsTrue() 
	{
		QueryArgument arg1 = new QueryArgument(new Var("x"));
		QueryArgument arg2 = new QueryArgument(new Var("x"));
		assertEquals(arg1.hashCode(), arg2.hashCode());
	}
	
	@Test
	public void testHashCodeEqualsFalse() 
	{
		QueryArgument arg1 = new QueryArgument(new Var("x"));
		QueryArgument arg2 = new QueryArgument(mock(OWLLiteral.class));
		assertFalse(arg1.hashCode() == arg2.hashCode());
	}
}