package com.redspr.redquerybuilder.core.client;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.junit.Ignore;
import com.google.gwt.dom.client.Element;
import com.google.gwt.junit.client.GWTTestCase;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.MultiWordSuggestOracle.MultiWordSuggestion;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.SuggestOracle.Response;
import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
import com.google.gwt.user.client.ui.Widget;
import com.redspr.redquerybuilder.core.client.conf.IdentifierEscaper;
import com.redspr.redquerybuilder.core.client.engine.Session;
import com.redspr.redquerybuilder.core.client.table.TableFilter;
import com.redspr.redquerybuilder.core.shared.meta.Cardinality;
import com.redspr.redquerybuilder.core.shared.meta.Column;
import com.redspr.redquerybuilder.core.shared.meta.ConstraintReferential;
import com.redspr.redquerybuilder.core.shared.meta.Database;
import com.redspr.redquerybuilder.core.shared.meta.Editor;
import com.redspr.redquerybuilder.core.shared.meta.EnumerateRequest;
import com.redspr.redquerybuilder.core.shared.meta.Operator;
import com.redspr.redquerybuilder.core.shared.meta.Schema;
import com.redspr.redquerybuilder.core.shared.meta.SuggestEditor;
import com.redspr.redquerybuilder.core.shared.meta.SuggestRequest;
import com.redspr.redquerybuilder.core.shared.meta.Table;
import com.redspr.redquerybuilder.core.shared.meta.Type;
@Ignore
public class AbstractTest extends GWTTestCase {
@Override
public void gwtSetUp() {
TableFilter.resetAlias();
RootPanel.get().clear();
}
protected void assertEquals(String html, Widget w) {
assertEquals(html, w.getElement());
}
protected void assertEquals(String html, Element elmt) {
assertEquals(html.replace('\'', '"'), elmt.getInnerHTML());
}
protected Session getSession() {
return createSession(null);
}
protected Session createSession(Configuration config) {
Schema schema = new Schema();
Database database = new Database(schema);
Type stringType = new Type("VARCHAR");
stringType.setOperators(new Operator[] {
new Operator("="),
new Operator("IS NULL", Cardinality.ZERO),
new Operator("LIKE"), new Operator("CUSTOM_OP") });
// XXX IN done better as hint or style?
Type refType = new Type("REFS");
refType.setEditor(new Editor.SelectEditor());
refType.setOperators(new Operator[]{
new Operator("IN", Cardinality.MULTI),
new Operator("NOT IN", Cardinality.MULTI)});
Type suggestType = new Type("SUGGEST");
suggestType.setEditor(new SuggestEditor());
suggestType.setOperators(new Operator[]{new Operator("=")});
Type singleRefType = new Type("REF");
singleRefType.setEditor(new Editor.SelectEditor());
singleRefType.setOperators(new Operator[] {
new Operator("="),
new Operator("IS NULL", Cardinality.ZERO),
new Operator("CUSTOM_OP", Cardinality.ONE)});
Type dateType = new Type("DATE");
dateType.setEditor(new Editor.DateEditor());
Type[] types = new Type[]{stringType, dateType, refType, singleRefType};
database.setTypes(types);
Table person = new Table("PERSON"); // XXX want case sensitivity?
Column personId = new Column("id", stringType);
person.add(personId);
person.add(new Column("sex", singleRefType));
person.add(new Column("owner", stringType));
person.add(new Column("category", refType));
person.add(new Column("category2", refType));
person.add(new Column("county", suggestType));
schema.add(person);
{
Table log = new Table("Log");
log.add(new Column("id", stringType));
log.add(new Column("date", dateType));
Column pc = new Column("parent", stringType);
ConstraintReferential fk = new ConstraintReferential("parentfk",
log);
fk.setRefTable(person);
fk.setColumns(new Column[] {pc });
fk.setRefColumns(new Column[] {personId });
log.add(fk);
log.add(pc);
schema.add(log);
}
{
Table order = new Table("Order");
order.add(new Column("date", dateType));
Column pc = new Column("parent", stringType);
ConstraintReferential fk = new ConstraintReferential("orderparentfk",
order);
fk.setRefTable(person);
fk.setColumns(new Column[] {pc });
fk.setRefColumns(new Column[] {personId });
order.add(fk);
order.add(pc);
schema.add(order);
}
if (config == null) {
config = createSimpleConfig();
}
config.setDatabase(database);
Session session = new Session(config);
session.setIdentifierEscaper(new IdentifierEscaper() {
@Override
public String quote(String id) {
return id;
}
});
return session;
}
private Configuration createSimpleConfig() {
Configuration config = new Configuration() {
@Override
public void fireEnumerate(EnumerateRequest request, AsyncCallback<Response> callback) {
Collection<Suggestion> s = new ArrayList<Suggestion>();
if ("category".equals(request.getColumnName())) {
s.add(new MultiWordSuggestion("A", "A"));
s.add(new MultiWordSuggestion("B", "B"));
s.add(new MultiWordSuggestion("C", "C"));
} else if ("category2".equals(request.getColumnName())) {
s.add(new MultiWordSuggestion("X", "X"));
s.add(new MultiWordSuggestion("Y", "Y"));
s.add(new MultiWordSuggestion("Z", "Z"));
} else {
s.add(new MultiWordSuggestion("M", "M"));
s.add(new MultiWordSuggestion("F", "F"));
}
callback.onSuccess(new Response(s));
}
@Override
public void fireSuggest(SuggestRequest request,
AsyncCallback<Response> callback) {
Collection<Suggestion> s = new ArrayList<Suggestion>();
s.add(new MultiWordSuggestion("Lancashire", "Lancashire"));
s.add(new MultiWordSuggestion("Bedfordshire", "Bedfordshire"));
s.add(new MultiWordSuggestion("Oxfordshire", "Oxfordshire"));
callback.onSuccess(new Response(s));
}
};
return config;
}
protected List<Element> find(Element elmt, String n) {
List<Element> x = new ArrayList<Element>();
find(elmt, n, x);
return x;
}
private void find(Element elmt, String n, List<Element> list) {
String[] cn = elmt.getClassName().split(" ");
for (String n2 : cn) {
if (n2.equals(n)) {
list.add(elmt);
}
}
Element s = elmt.getNextSiblingElement();
if (s != null) {
find(s, n, list);
}
Element c = elmt.getFirstChildElement();
if (c != null) {
find(c, n, list);
}
}
@Override
public String getModuleName() {
return "com.redspr.redquerybuilder.core.RedQueryBuilderCore";
}
}