package eu.dnetlib.dlms.jdbc;

import java.util.Collection;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Before;
import org.junit.Test;

import eu.dnetlib.dlms.jdbc.ast.Statement;
import eu.dnetlib.dlms.jdbc.parser.IDQLParser;

public class TestClojureDQLParser {

	private static final Log log = LogFactory.getLog(TestClojureDQLParser.class); // NOPMD by marko on 11/24/08 5:02 PM

	private IDQLParser parser;

	@Before
	public void setUp() throws Exception {
		parser = (IDQLParser) Class.forName("eu.dnetlib.dlms.ClojureDQLParser").newInstance();
	}

	@Test
	public void testParse() {
		Collection<Statement> res = parser.parse("new pippo({k = :arg}); 2; select (id, url) carDesc/relation::*; [1,2,'test']; ?2; ?");
		log.info("RES: " + res);
		log.info(res.getClass());
		for (Statement st : res)
			log.info("ST: " + st);
	}

	@Test
	public void testParseIntegerLit() {
		Collection<Statement> res = parser.parse("1");
		for (Statement st : res)
			log.info("ST: " + st);
	}

	@Test
	public void testParseDateLit() {
		Collection<Statement> res = parser.parse("#'01-01-2010'");
		for (Statement st : res)
			log.info("ST: " + st);
	}

	@Test
	public void testParseStringLit() {
		Collection<Statement> res = parser.parse("'ciao'");
		for (Statement st : res)
			log.info("ST: " + st);
	}

	@Test
	public void testParseCollNode() {
		Collection<Statement> res = parser.parse("['el1', 'el2', 'el3']");
		for (Statement st : res)
			log.info("ST: " + st);
	}

	@Test
	public void testParseRef() {
		Collection<Statement> res = parser.parse("objRef");
		for (Statement st : res)
			log.info("ST: " + st);
	}

	@Test
	public void testParseBinPred() {
		Collection<Statement> res = parser.parse("select A[@ciao contains 'hello']");
		for (Statement st : res)
			log.info("ST: " + st);
	}

	@Test
	public void testParseParam1() {
		Collection<Statement> res = parser.parse("?1");
		for (Statement st : res)
			log.info("ST: " + st);
		res = parser.parse(":paramName1");
		for (Statement st : res)
			log.info("ST: " + st);
	}

	@Test
	public void testParseStruct() {
		Collection<Statement> res = parser.parse("{lab1='ciao', lab2=3}");
		for (Statement st : res)
			log.info("ST: " + st);
	}

	@Test
	public void testParseInst() {
		Collection<Statement> res = parser.parse("new setName()");
		for (Statement st : res)
			log.info("ST: " + st);
	}

	@Test
	public void testParseMultipleNavigation() {
		Collection<Statement> res = parser.parse("select A/(B |C)[@ciao]");
		for (Statement st : res)
			log.info("ST: " + st);
	}

	@Test
	public void testParseMultipleNavigation2() {
		Collection<Statement> res = parser.parse("select (composedBy | hasEPrint)/ciao");
		for (Statement st : res)
			log.info("ST: " + st);
	}

	@Test
	public void testParseSelectOne() {
		Collection<Statement> res = parser.parse("Object x = select ciao");
		for (Statement st : res)
			log.info("ST: " + st);
	}

	@Test
	public void testParseStartStar() {
		Collection<Statement> res = parser.parse("select */ciao");
		for (Statement st : res)
			log.info("ST: " + st);
	}

	@Test
	public void testParseStarNavigation() {
		Collection<Statement> res = parser.parse("select ciao/*");
		for (Statement st : res)
			log.info("ST: " + st);
	}

}
