package org.xenei.jdbc4sparql.sparql.parser.jsqlparser.functions;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.Function;
import net.sf.jsqlparser.expression.LongValue;
import net.sf.jsqlparser.expression.StringValue;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import org.junit.Before;
import org.junit.Test;
import org.xenei.jdbc4sparql.iface.Column;
import org.xenei.jdbc4sparql.iface.ColumnDef;
import org.xenei.jdbc4sparql.iface.name.CatalogName;
import org.xenei.jdbc4sparql.iface.name.ColumnName;
import org.xenei.jdbc4sparql.impl.rdf.RdfCatalog;
import org.xenei.jdbc4sparql.sparql.SparqlQueryBuilder;
import org.xenei.jdbc4sparql.sparql.items.QueryColumnInfo;
import org.xenei.jdbc4sparql.sparql.parser.jsqlparser.SparqlExprVisitor;
import org.xenei.jdbc4sparql.sparql.parser.jsqlparser.SparqlExprVisitor.AliasInfo;
import org.xenei.jdbc4sparql.sparql.parser.jsqlparser.proxies.ExprInfo;
import com.hp.hpl.jena.sparql.expr.E_StrLength;
import com.hp.hpl.jena.sparql.expr.E_StrLowerCase;
import com.hp.hpl.jena.sparql.expr.E_StrReplace;
import com.hp.hpl.jena.sparql.expr.E_StrSubstring;
import com.hp.hpl.jena.sparql.expr.E_StrUpperCase;
import com.hp.hpl.jena.sparql.expr.Expr;
import com.hp.hpl.jena.sparql.expr.nodevalue.NodeValueInteger;
import com.hp.hpl.jena.sparql.expr.nodevalue.NodeValueString;
public class StringFunctionHandlerTests {
private StringFunctionHandler handler;
private final SparqlQueryBuilder builder;
private Function func;
private final CatalogName catName;
private final RdfCatalog catalog;
private final ColumnDef colDef;
private StringValue stringValue;
private ExpressionList expressionList;
private String text;
private List<Expression> lst2;
private AliasInfo alias;
public StringFunctionHandlerTests() {
final QueryColumnInfo colInfo = mock(QueryColumnInfo.class);
catName = new CatalogName("catalogName");
builder = mock(SparqlQueryBuilder.class);
catalog = mock(RdfCatalog.class);
final Column column = mock(Column.class);
colDef = mock(ColumnDef.class);
when(builder.getCatalog()).thenReturn(catalog);
when(catalog.getName()).thenReturn(catName);
when(builder.getColumn((ColumnName) any())).thenReturn(colInfo);
when(colInfo.getColumn()).thenReturn(column);
when(column.getColumnDef()).thenReturn(colDef);
}
@Before
public void setup() {
text = "AString";
func = new Function();
handler = new StringFunctionHandler(builder);
stringValue = new StringValue(String.format("'%s'", text));
lst2 = new ArrayList<Expression>();
lst2.add(stringValue);
expressionList = new ExpressionList(lst2);
final SparqlExprVisitor visitor = new SparqlExprVisitor(builder, false,
false);
alias = visitor.new AliasInfo("Alias", false);
}
@Test
public void testLCaseFunction() throws SQLException {
func.setName("LCASE");
func.setParameters(expressionList);
ExprInfo exprInfo = (ExprInfo) handler.handle(func, alias);
assertEquals(alias.getAlias(), exprInfo.getName().getShortName());
Expr expr = exprInfo.getExpr();
assertTrue(expr instanceof E_StrLowerCase);
E_StrLowerCase expr2 = (E_StrLowerCase) expr;
assertTrue(expr2.getArg() instanceof NodeValueString);
NodeValueString n = (NodeValueString) expr2.getArg();
assertEquals(text, n.getString());
func.setName("lower");
func.setParameters(expressionList);
exprInfo = (ExprInfo) handler.handle(func, alias);
assertEquals(alias.getAlias(), exprInfo.getName().getShortName());
expr = exprInfo.getExpr();
assertTrue(expr instanceof E_StrLowerCase);
expr2 = (E_StrLowerCase) expr;
assertTrue(expr2.getArg() instanceof NodeValueString);
n = (NodeValueString) expr2.getArg();
assertEquals(text, n.getString());
}
@Test
public void testLengthFunction() throws SQLException {
func.setName("length");
func.setParameters(expressionList);
ExprInfo exprInfo = (ExprInfo) handler.handle(func, alias);
assertEquals(alias.getAlias(), exprInfo.getName().getShortName());
Expr expr = exprInfo.getExpr();
assertTrue(expr instanceof E_StrLength);
E_StrLength expr2 = (E_StrLength) expr;
List<Expr> lst = expr2.getArgs();
assertEquals(1, lst.size());
assertTrue(lst.get(0) instanceof NodeValueString);
NodeValueString n = (NodeValueString) lst.get(0);
assertEquals(text, n.getString());
func.setName("len");
func.setParameters(expressionList);
exprInfo = (ExprInfo) handler.handle(func, alias);
assertEquals(alias.getAlias(), exprInfo.getName().getShortName());
expr = exprInfo.getExpr();
assertTrue(expr instanceof E_StrLength);
expr2 = (E_StrLength) expr;
lst = expr2.getArgs();
assertEquals(1, lst.size());
assertTrue(lst.get(0) instanceof NodeValueString);
n = (NodeValueString) lst.get(0);
assertEquals(text, n.getString());
}
@Test
public void testReplaceFunction() throws SQLException {
func.setName("replace");
lst2.add(new StringValue("'A'"));
lst2.add(new StringValue("'The '"));
func.setParameters(expressionList);
final ExprInfo exprInfo = (ExprInfo) handler.handle(func, alias);
assertEquals(alias.getAlias(), exprInfo.getName().getShortName());
final Expr expr = exprInfo.getExpr();
assertTrue(expr instanceof E_StrReplace);
final E_StrReplace expr2 = (E_StrReplace) expr;
final List<Expr> lst = expr2.getArgs();
assertEquals(3, lst.size());
assertTrue(lst.get(0) instanceof NodeValueString);
NodeValueString n = (NodeValueString) lst.get(0);
assertEquals(text, n.getString());
assertTrue(lst.get(1) instanceof NodeValueString);
n = (NodeValueString) lst.get(1);
assertEquals("A", n.getString());
assertTrue(lst.get(2) instanceof NodeValueString);
n = (NodeValueString) lst.get(2);
assertEquals("The ", n.getString());
}
@Test
public void testSubstringFunction() throws SQLException {
func.setName("substring");
lst2.add(new LongValue("2"));
func.setParameters(expressionList);
ExprInfo exprInfo = (ExprInfo) handler.handle(func, alias);
assertEquals(alias.getAlias(), exprInfo.getName().getShortName());
Expr expr = exprInfo.getExpr();
assertTrue(expr instanceof E_StrSubstring);
E_StrSubstring expr2 = (E_StrSubstring) expr;
List<Expr> lst = expr2.getArgs();
assertEquals(2, lst.size());
assertTrue(lst.get(0) instanceof NodeValueString);
NodeValueString n = (NodeValueString) lst.get(0);
assertEquals(text, n.getString());
assertTrue(lst.get(1) instanceof NodeValueInteger);
NodeValueInteger i = (NodeValueInteger) lst.get(1);
assertEquals(2, i.getInteger().intValue());
lst2.add(new LongValue("5"));
func.setParameters(expressionList);
exprInfo = (ExprInfo) handler.handle(func, alias);
assertEquals(alias.getAlias(), exprInfo.getName().getShortName());
expr = exprInfo.getExpr();
assertTrue(expr instanceof E_StrSubstring);
expr2 = (E_StrSubstring) expr;
lst = expr2.getArgs();
assertEquals(3, lst.size());
assertTrue(lst.get(0) instanceof NodeValueString);
n = (NodeValueString) lst.get(0);
assertEquals(text, n.getString());
assertTrue(lst.get(1) instanceof NodeValueInteger);
i = (NodeValueInteger) lst.get(1);
assertEquals(2, i.getInteger().intValue());
assertTrue(lst.get(2) instanceof NodeValueInteger);
i = (NodeValueInteger) lst.get(2);
assertEquals(5, i.getInteger().intValue());
}
@Test
public void testUCaseFunction() throws SQLException {
func.setName("UCASE");
func.setParameters(expressionList);
ExprInfo exprInfo = (ExprInfo) handler.handle(func, alias);
assertEquals(alias.getAlias(), exprInfo.getName().getShortName());
Expr expr = exprInfo.getExpr();
assertTrue(expr instanceof E_StrUpperCase);
E_StrUpperCase expr2 = (E_StrUpperCase) expr;
assertTrue(expr2.getArg() instanceof NodeValueString);
NodeValueString n = (NodeValueString) expr2.getArg();
assertEquals(text, n.getString());
func.setName("upper");
func.setParameters(expressionList);
exprInfo = (ExprInfo) handler.handle(func, alias);
assertEquals(alias.getAlias(), exprInfo.getName().getShortName());
expr = exprInfo.getExpr();
assertTrue(expr instanceof E_StrUpperCase);
expr2 = (E_StrUpperCase) expr;
assertTrue(expr2.getArg() instanceof NodeValueString);
n = (NodeValueString) expr2.getArg();
assertEquals(text, n.getString());
}
}