package hdgl.db.query.parser;
import static org.junit.Assert.*;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInput;
import java.io.DataInputStream;
import java.io.DataOutput;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import hdgl.db.query.convert.QueryCompletion;
import hdgl.db.query.convert.QueryToStateMachine;
import hdgl.db.query.expression.Expression;
import hdgl.db.query.stm.SimpleStateMachine;
import hdgl.db.query.stm.StateMachine;
import org.antlr.runtime.ANTLRStringStream;
import org.antlr.runtime.RecognitionException;
import org.antlr.runtime.TokenRewriteStream;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class ParserTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
}
QueryParser parser(String query){
QueryLexer lexer=new QueryLexer(new ANTLRStringStream(query));
QueryParser parser = new QueryParser(new TokenRewriteStream(lexer));
return parser;
}
@Test
public void experiment(){
HashSet<Integer> set1 = new HashSet<Integer>();
HashSet<Integer> set2 = new HashSet<Integer>();
assertEquals(set1, set2);
set1.add(1);
set2.add(1);
assertEquals(set1, set2);
set1.add(2);
assertTrue(!set1.equals(set2));
set2.add(2);
assertEquals(set1, set2);
assertNotSame(set1, set2);
set1.add(10003);
set2.add(10003);
assertEquals(set1, set2);
set1.add(new Integer(50));
set2.add(new Integer(50));
assertEquals(set1, set2);
Set<Set<Integer>> set3 = new HashSet<Set<Integer>>();
set3.add(set1);
assertFalse(set3.add(set2));
assertEquals(set3.size(), 1);
}
@Test
public void test() throws RecognitionException {
assertEquals(parser(".[desc:label<=val]*").expression().toString(), parser(".[DESC:label][label<=val]*").expression().toString());
assertEquals(parser(".-.[<:price]").expression().toString(), parser("((. -) .[ASC:price])").expression().toString());
assertEquals(parser(".[id=1]|-[price<10](.)*").expression().toString(), parser("(.[id=1]|-[price<10] .*)").expression().toString());
assertEquals(parser(".[desc:label<=val]*").expression().clone().toString(), parser(".[DESC:label][label<=val]*").expression().toString());
assertEquals(parser(".-.[<:price]").expression().clone().toString(), parser("((. -) .[ASC:price])").expression().toString());
assertEquals(parser(".[id=1]|-[price<10](.)*").expression().clone().toString(), parser("(.[id=1]|-[price<10] .*)").expression().toString());
assertEquals("(.[id=1]|((. -[price<10]) .) (- .)*)", QueryCompletion.complete(parser(".[id=1]|-[price<10](.)*").expression()).toString());
assertEquals("((. -[price<10])|(.[id=1] -) ((. -)* .))", QueryCompletion.complete(parser("-[price<10]|.[id=1](.)*").expression()).toString());
Expression q = QueryCompletion.complete(parser(".-.").expression());
SimpleStateMachine stm = QueryToStateMachine.convert(q);
stm.print(System.out);
StateMachine fstm = stm.buildStateMachine();
//fstm.print(System.out);
System.out.print(fstm);
q = QueryCompletion.complete(parser(".[id=1]|-[price<10](.)*").expression());
stm = QueryToStateMachine.convert(q);
//stm.print(System.out);
fstm = stm.buildStateMachine();
//fstm.print(System.out);
//System.out.print(fstm);
try{
ByteArrayOutputStream out=new ByteArrayOutputStream();
DataOutput d = new DataOutputStream(out);
fstm.write(d);
ByteArrayInputStream in=new ByteArrayInputStream(out.toByteArray());
DataInput input = new DataInputStream(in);
StateMachine nstm = new StateMachine();
nstm.readFields(input);
assertEquals(fstm.toString(), nstm.toString());
}catch (IOException e) {
fail(e.getMessage());
}
}
}