/*
* Copyright 2013 Future Systems
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.araqne.logdb.query.parser;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.List;
import org.araqne.logdb.Account;
import org.araqne.logdb.AccountService;
import org.araqne.logdb.Procedure;
import org.araqne.logdb.ProcedureParameter;
import org.araqne.logdb.ProcedureRegistry;
import org.araqne.logdb.QueryContext;
import org.araqne.logdb.QueryParseException;
import org.araqne.logdb.QueryParserService;
import org.araqne.logdb.QueryPlanner;
import org.araqne.logdb.QueryService;
import org.araqne.logdb.impl.FunctionRegistryImpl;
import org.araqne.logdb.query.command.Proc;
import org.araqne.logdb.query.engine.QueryParserServiceImpl;
import org.junit.Before;
import org.junit.Test;
public class ProcParserTest {
private QueryParserService queryParserService;
@Before
public void setup() {
QueryParserServiceImpl p = new QueryParserServiceImpl();
p.setFunctionRegistry(new FunctionRegistryImpl());
queryParserService = p;
}
@Test
public void testError11000() {
ProcParser p = new ProcParser(null, queryParserService, null, creatQueryServiceMock());
p.setQueryParserService(queryParserService);
String query = "proc undefined()";
try {
parse(query);
fail();
} catch (QueryParseException e) {
if(e.isDebugMode()){
System.out.println("query " + query);
System.out.println(e.getMessage());
}
assertEquals("11000", e.getType());
assertEquals(5, e.getStartOffset());
assertEquals(15, e.getEndOffset());
}
}
@Test
public void testError11001(){
ProcParser p = new ProcParser(null, queryParserService, null, creatQueryServiceMock());
p.setQueryParserService(queryParserService);
String query = "proc tables(\"log\", 1.1)";
try {
parse(query);
fail();
} catch (QueryParseException e) {
if(e.isDebugMode()){
System.out.println("query " + query);
System.out.println(e.getMessage());
}
assertEquals("11001", e.getType());
assertEquals(11, e.getStartOffset());
assertEquals(22, e.getEndOffset());
}
}
@Test
public void testError11002(){
ProcParser p = new ProcParser(null, queryParserService, null, creatQueryServiceMock());
p.setQueryParserService(queryParserService);
String query = "proc tables(\"log\", 1)";
try {
parse(query);
fail();
} catch (QueryParseException e) {
if(e.isDebugMode()){
System.out.println("query " + query);
System.out.println(e.getMessage());
}
assertEquals("11002", e.getType());
assertEquals(-1, e.getStartOffset());
assertEquals(-1, e.getEndOffset());
}
}
@Test
public void testError11003(){
ProcParser p = new ProcParser(null, queryParserService, null, creatQueryServiceMock());
p.setQueryParserService(queryParserService);
String query = "proc tables(\"log\", 1, 2)";
try {
parse(query, true);
fail();
} catch (QueryParseException e) {
if(e.isDebugMode()){
System.out.println("query " + query);
System.out.println(e.getMessage());
}
assertEquals("11003", e.getType());
assertEquals(5, e.getStartOffset());
assertEquals(23, e.getEndOffset());
}
}
private Proc parse(String query){
return parse(query, false);
}
private Proc parse(String query, boolean isAccount) {
List<ProcedureParameter> list = new ArrayList<ProcedureParameter>();
ProcedureParameter stringParam = new ProcedureParameter();
ProcedureParameter intParam = new ProcedureParameter();
stringParam.setType("string");
intParam.setType("int");
list.add(stringParam);
list.add(intParam);
AccountService mockAccount = mock(AccountService.class);
ProcedureRegistry mockParserRegistry = mock(ProcedureRegistry.class);
Procedure mockProcedure = mock(Procedure.class);
when(mockParserRegistry.getProcedure("tables")).thenReturn(mockProcedure);
when(mockProcedure.getParameters()).thenReturn(list);
when(mockProcedure.getName()).thenReturn("tables");
if(isAccount)
when(mockAccount.getAccount(null)).thenReturn(new Account());
ProcParser parser = new ProcParser(mockAccount, null , mockParserRegistry, creatQueryServiceMock());
parser.setQueryParserService(queryParserService);
Proc proc = (Proc) parser.parse(new QueryContext(null), query);
return proc;
}
private QueryService creatQueryServiceMock() {
QueryService mock = mock(QueryService.class);
when(mock.getPlanners()).thenReturn(new ArrayList<QueryPlanner>());
return mock;
}
}