package eu.dnetlib.utils.cql;

import static org.junit.Assert.*;

import org.junit.Test;

public class CqlTest {

	@Test
	public void testParseAndEncode1() throws CqlException {
		String text = "foo or and and bar=\"goo=\\\"fff\\\" \" and ((a or (b)))";
		String expected = "(((foo) or (and)) and " +
				"(bar = \"goo=\\\"fff\\\" \")) and ((a) or (b))";
		
		//System.out.println("   query text : " + text);
		CqlQuery query = Cql.parse(text);
		//System.out.println(" parsed query : " + query);
		//System.out.println("encoded query : " + Cql.encode(query));
		assertEquals(query.toString(), Cql.encode(query));
		assertEquals(expected, Cql.encode(query));
	}

	@Test
	public void testParseAndEncode2() throws CqlException {
		String text = "(t=a and t=b) or ((t=c) and (t=d))";
		String expected = "((t = a) and (t = b)) or" +
				" ((t = c) and (t = d))";
		
		//System.out.println("   query text : " + text);
		CqlQuery query = Cql.parse(text);
		//System.out.println(" parsed query : " + query);
		//System.out.println("encoded query : " + Cql.encode(query));
		assertEquals(query.toString(), Cql.encode(query));
		assertEquals(expected, Cql.encode(query));
	}

	@Test
	public void testParseAndEncode3() throws CqlException {
		String text = "aaa =    b and aaa=d";
		String expected = "(aaa = b) and (aaa = d)";
		
		//System.out.println("   query text : " + text);
		CqlQuery query = Cql.parse(text);
		//System.out.println(" parsed query : " + query);
		//System.out.println("encoded query : " + Cql.encode(query));
		assertEquals(query.toString(), Cql.encode(query));
		assertEquals(expected, Cql.encode(query));
	}
	
	@Test
	public void testParseAndEncode4() throws CqlException {
		String text = "(((test))) and (repositoryName = \"research_online@UCD\")";
		String expected = "(test) and (repositoryName = \"research_online@UCD\")";
		
		//System.out.println("   query text : " + text);
		CqlQuery query = Cql.parse(text);
		//System.out.println(" parsed query : " + query);
		//System.out.println("encoded query : " + Cql.encode(query));
		assertEquals(query.toString(), Cql.encode(query));
		assertEquals(expected, Cql.encode(query));
	}
		
	@Test
	public void testParseAndEncode5() throws CqlException {
		String text = "time within \"2007-02-16 2008-02-16\"";
		String expected = "time within \"2007-02-16 2008-02-16\"";
		
		//System.out.println("   query text : " + text);
		CqlQuery query = Cql.parse(text);
		//System.out.println(" parsed query : " + query);
		//System.out.println("encoded query : " + Cql.encode(query));
		assertEquals(query.toString(), Cql.encode(query));
		assertEquals(expected, Cql.encode(query));
	}
		
	@Test
	public void testSyntaxValidation1() {
		String text = "foo bar";
		
		try {
			Cql.parse(text);
			fail();
			
		} catch (CqlException e) {
			assertTrue(true);
		}
	}
	
	@Test
	public void testSyntaxValidation2() {
		String text = "foo bar and (a and b)";
		
		try {
			Cql.parse(text);
			fail();
			
		} catch (CqlException e) {
			assertTrue(true);
		}
	}
	
	@Test
	public void testSyntaxValidation3() throws CqlException {
		String text = "((a = ((b))))";
		
		try {
			Cql.parse(text);
			fail();
			
		} catch (CqlException e) {
			assertTrue(true);
		}
	}
}
