package li.strolch.model.query.parser;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.List;
import org.junit.Test;
import li.strolch.model.Resource;
import li.strolch.model.query.IdSelection;
import li.strolch.model.query.NameSelection;
import li.strolch.model.query.OrSelection;
import li.strolch.model.query.ResourceQuery;
import li.strolch.model.query.Selection;
import li.strolch.model.query.StrolchTypeNavigation;
public class QueryParserTest {
@Test
public void shouldIgnoreGibberish() {
ResourceQuery<Resource> query = QueryParser.parseToResourceQuery("sdf dfg3 !sdf", false);
assertFalse(query.hasNavigation());
assertFalse(query.hasSelection());
}
@Test
public void shouldParseEmpty() {
ResourceQuery<Resource> query = QueryParser.parseToResourceQuery("", false);
assertFalse(query.hasNavigation());
assertFalse(query.hasSelection());
}
@Test
public void shouldParseEmptyId() {
ResourceQuery<Resource> query = QueryParser.parseToResourceQuery("id:", false);
assertFalse(query.hasNavigation());
assertFalse(query.hasSelection());
}
@Test
public void shouldParseEmptyName() {
ResourceQuery<Resource> query = QueryParser.parseToResourceQuery("name:", false);
assertFalse(query.hasNavigation());
assertFalse(query.hasSelection());
}
@Test
public void shouldParseEmptyType() {
ResourceQuery<Resource> query = QueryParser.parseToResourceQuery("type:", false);
assertFalse(query.hasNavigation());
assertFalse(query.hasSelection());
}
@Test
public void shouldParseEmptyIdNameType() {
ResourceQuery<Resource> query = QueryParser.parseToResourceQuery("id: name: type:", false);
assertFalse(query.hasNavigation());
assertFalse(query.hasSelection());
}
@Test
public void shouldParseId() {
ResourceQuery<Resource> query = QueryParser.parseToResourceQuery("id:asd", false);
OrSelection or = (OrSelection) query.getSelection();
List<Selection> selections = or.getSelections();
assertEquals(1, selections.size());
assertEquals(IdSelection.class, selections.get(0).getClass());
IdSelection idSelection = (IdSelection) selections.get(0);
List<String> ids = idSelection.getIds();
assertEquals(1, ids.size());
assertEquals("asd", ids.get(0));
assertFalse(query.hasNavigation());
}
@Test
public void shouldParseIds() {
ResourceQuery<Resource> query = QueryParser.parseToResourceQuery("id:asd id:bbb", false);
OrSelection or = (OrSelection) query.getSelection();
List<Selection> selections = or.getSelections();
assertEquals(1, selections.size());
assertEquals(IdSelection.class, selections.get(0).getClass());
IdSelection idSelection = (IdSelection) selections.get(0);
List<String> ids = idSelection.getIds();
assertEquals(2, ids.size());
assertEquals("asd", ids.get(0));
assertEquals("bbb", ids.get(1));
assertFalse(query.hasNavigation());
}
@Test
public void shouldParseName() {
ResourceQuery<Resource> query = QueryParser.parseToResourceQuery("name:asd", false);
OrSelection or = (OrSelection) query.getSelection();
List<Selection> selections = or.getSelections();
assertEquals(1, selections.size());
assertEquals(NameSelection.class, selections.get(0).getClass());
assertEquals("asd", ((NameSelection) selections.get(0)).getName());
assertFalse(query.hasNavigation());
}
@Test
public void shouldParseNames() {
ResourceQuery<Resource> query = QueryParser.parseToResourceQuery("name:asd name:bbb", false);
OrSelection or = (OrSelection) query.getSelection();
List<Selection> selections = or.getSelections();
assertEquals(2, selections.size());
assertEquals(NameSelection.class, selections.get(0).getClass());
assertEquals("asd", ((NameSelection) selections.get(0)).getName());
assertEquals(NameSelection.class, selections.get(1).getClass());
assertEquals("bbb", ((NameSelection) selections.get(1)).getName());
assertFalse(query.hasNavigation());
}
@Test
public void shouldParseType() {
ResourceQuery<Resource> query = QueryParser.parseToResourceQuery("type:asd", false);
assertFalse(query.hasSelection());
assertTrue(query.hasNavigation());
StrolchTypeNavigation navigation = (StrolchTypeNavigation) query.getNavigation();
assertEquals("asd", navigation.getType());
}
@Test
public void shouldReplaceMultipleType() {
ResourceQuery<Resource> query = QueryParser.parseToResourceQuery("type:asd type:fff", false);
assertFalse(query.hasSelection());
assertTrue(query.hasNavigation());
StrolchTypeNavigation navigation = (StrolchTypeNavigation) query.getNavigation();
assertEquals("fff", navigation.getType());
}
@Test
public void shouldParseIdNameType() {
ResourceQuery<Resource> query = QueryParser.parseToResourceQuery("id:foo name:bar type:asd", false);
OrSelection or = (OrSelection) query.getSelection();
List<Selection> selections = or.getSelections();
assertEquals(2, selections.size());
assertEquals(IdSelection.class, selections.get(0).getClass());
assertEquals(NameSelection.class, selections.get(1).getClass());
assertTrue(query.hasNavigation());
}
@Test
public void shouldParseWithWhitespace() {
ResourceQuery<Resource> query = QueryParser.parseToResourceQuery(" id:foo name:bar type:asd \t ", false);
OrSelection or = (OrSelection) query.getSelection();
List<Selection> selections = or.getSelections();
assertEquals(2, selections.size());
assertEquals(IdSelection.class, selections.get(0).getClass());
assertEquals(NameSelection.class, selections.get(1).getClass());
assertTrue(query.hasNavigation());
}
}