/*
* Copyright 2010 JBoss Inc
*
* 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.drools.ide.common.server.rules;
import java.util.*;
import java.util.jar.JarInputStream;
import org.drools.lang.dsl.DSLMapping;
import org.drools.lang.dsl.DSLMappingEntry;
import org.drools.lang.dsl.DSLTokenizedMappingFile;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.mockito.Mockito.*;
import static org.junit.Assert.*;
import org.drools.ide.common.client.modeldriven.FactTypeFilter;
import org.drools.ide.common.client.modeldriven.SuggestionCompletionEngine;
import org.drools.ide.common.client.modeldriven.ModelField.FIELD_CLASS_TYPE;
import org.drools.ide.common.server.rules.SuggestionCompletionLoader;
import org.drools.lang.descr.ImportDescr;
public class SuggestionCompletionLoaderTest {
@Test
public void testSuggestionCompLoader() throws Exception {
SuggestionCompletionLoader loader = new SuggestionCompletionLoader();
SuggestionCompletionEngine eng = loader.getSuggestionEngine("package foo \n import org.drools.Person", new ArrayList(), new ArrayList());
assertNotNull(eng);
}
@Test
public void testSuggestionCompLoaderWithExtraImportProviders() throws Exception {
SuggestionCompletionLoader loader = new SuggestionCompletionLoader();
loader.addExternalImportDescrProvider(new SuggestionCompletionLoader.ExternalImportDescrProvider() {
public Set<ImportDescr> getImportDescrs() {
return new HashSet<ImportDescr>() {
{
add(new ImportDescr("java.util.List"));
add(new ImportDescr("java.util.Set"));
}
};
}
});
SuggestionCompletionEngine eng = loader.getSuggestionEngine("package foo \n import org.drools.Person", new ArrayList(), new ArrayList());
assertNotNull(eng);
assertEquals(3, eng.getFactTypes().length);
List<String> factTypes = Arrays.asList(eng.getFactTypes());
assertTrue(factTypes.contains("List"));
assertTrue(factTypes.contains("Set"));
assertTrue(factTypes.contains("Person"));
eng = loader.getSuggestionEngine("package foo \n import org.drools.Person \n declare GenBean \n id: int \n name : String \n end \n declare GenBean2 \n list: java.util.List \n gb: GenBean \n end", new ArrayList(), new ArrayList());
assertEquals(5, eng.getFactTypes().length);
factTypes = Arrays.asList(eng.getFactTypes());
assertTrue(factTypes.contains("List"));
assertTrue(factTypes.contains("Set"));
assertTrue(factTypes.contains("Person"));
assertTrue(factTypes.contains("GenBean"));
assertTrue(factTypes.contains("GenBean2"));
}
@Test
public void testSuggestionCompLoaderWithExtraImportProvidersAndFilters() throws Exception {
SuggestionCompletionLoader loader = new SuggestionCompletionLoader();
loader.addExternalImportDescrProvider(new SuggestionCompletionLoader.ExternalImportDescrProvider() {
public Set<ImportDescr> getImportDescrs() {
return new HashSet<ImportDescr>() {
{
add(new ImportDescr("java.util.List"));
add(new ImportDescr("java.util.Set"));
}
};
}
});
SuggestionCompletionEngine eng = loader.getSuggestionEngine("package foo \n import org.drools.Person \n declare GenBean \n id: int \n name : String \n end \n declare GenBean2 \n list: java.util.List \n gb: GenBean \n end", new ArrayList(), new ArrayList());
eng.setFactTypeFilter(new FactTypeFilter() {
public boolean filter(String originalFact) {
return originalFact.equals("List") || originalFact.equals("GenBean2");
}
});
eng.setFilteringFacts(true);
assertNotNull(eng);
assertEquals(3, eng.getFactTypes().length);
List<String> factTypes = Arrays.asList(eng.getFactTypes());
assertTrue(factTypes.contains("Set"));
assertTrue(factTypes.contains("Person"));
assertTrue(factTypes.contains("GenBean"));
}
@Test
public void testSuggestionCompLoaderWildCards() throws Exception {
SuggestionCompletionLoader loader = new SuggestionCompletionLoader();
loader.getSuggestionEngine("package foo \n import org.drools.*", Collections.<JarInputStream>emptyList(), Collections.<DSLTokenizedMappingFile>emptyList());
assertEquals(1, loader.getErrors().size());
String err = loader.getErrors().get(0);
assertTrue(err.startsWith("Unable"));
}
@Test
public void testTestAnyEnum() throws Exception {
SuggestionCompletionLoader suggestionCompletionLoader = new SuggestionCompletionLoader();
ArrayList<DSLTokenizedMappingFile> dsls = new ArrayList<DSLTokenizedMappingFile>();
DSLTokenizedMappingFile dslTokenizedMappingFile = new DSLTokenizedMappingFile();
DSLMappingEntry dslMappingEntry = mock(DSLMappingEntry.class);
when(dslMappingEntry.getSection()).thenReturn(DSLMappingEntry.ANY);
dslTokenizedMappingFile.getMapping().addEntry(dslMappingEntry);
dsls.add(dslTokenizedMappingFile);
SuggestionCompletionEngine suggestionEngine = suggestionCompletionLoader.getSuggestionEngine("", Collections.<JarInputStream>emptyList(), dsls);
assertEquals(1, suggestionEngine.actionDSLSentences.length);
assertEquals(1, suggestionEngine.conditionDSLSentences.length);
assertEquals(0, suggestionEngine.keywordDSLItems.length);
}
@Test
public void testLoadDifferentFieldTypes() throws Exception {
SuggestionCompletionLoader loader = new SuggestionCompletionLoader();
SuggestionCompletionEngine eng = loader.getSuggestionEngine("package foo \n import org.drools.ide.common.server.rules.SomeFact", new ArrayList(), new ArrayList());
assertNotNull(eng);
assertEquals(SuggestionCompletionEngine.TYPE_NUMERIC, eng.getFieldType("SomeFact", "age"));
assertEquals(SuggestionCompletionEngine.TYPE_STRING, eng.getFieldType("SomeFact", "likes"));
assertEquals(SuggestionCompletionEngine.TYPE_STRING, eng.getFieldType("SomeFact", "name"));
assertEquals(SuggestionCompletionEngine.TYPE_NUMERIC, eng.getFieldType("SomeFact", "bigDecimal"));
assertEquals(SuggestionCompletionEngine.TYPE_BOOLEAN, eng.getFieldType("SomeFact", "alive"));
// assertEquals(SuggestionCompletionEngine.TYPE_COMPARABLE, eng.getFieldType( "SomeFact", "date"));
assertEquals(SuggestionCompletionEngine.TYPE_DATE, eng.getFieldType("SomeFact", "date"));
assertEquals("Cheese", eng.getFieldType("SomeFact", "cheese"));
assertEquals(SuggestionCompletionEngine.TYPE_BOOLEAN, eng.getFieldType("SomeFact", "dead"));
assertEquals(SuggestionCompletionEngine.TYPE_BOOLEAN, eng.getFieldType("SomeFact", "alive"));
assertEquals(SuggestionCompletionEngine.TYPE_COLLECTION, eng.getFieldType("SomeFact", "factList"));
assertEquals("SomeFact", eng.getParametricFieldType("SomeFact", "factList"));
assertEquals(SuggestionCompletionEngine.TYPE_COLLECTION, eng.getFieldType("SomeFact", "factListString"));
assertEquals("String", eng.getParametricFieldType("SomeFact", "factListString"));
}
@Test
public void testLoadDifferentMethodTypes() throws Exception {
SuggestionCompletionLoader loader = new SuggestionCompletionLoader();
SuggestionCompletionEngine eng = loader.getSuggestionEngine("package foo \n import org.drools.ide.common.server.rules.SomeFact", new ArrayList(), new ArrayList());
assertNotNull(eng);
assertEquals(List.class.getName(), eng.getMethodClassType("SomeFact", "aMethod(int)"));
assertEquals("SomeFact", eng.getParametricFieldType("SomeFact", "aMethod(int)"));
}
@Test
public void testGeneratedBeans() throws Exception {
SuggestionCompletionLoader loader = new SuggestionCompletionLoader();
SuggestionCompletionEngine eng = loader.getSuggestionEngine("package foo \n declare GenBean \n id: int \n name : String \n end \n declare GenBean2 \n list: java.util.List \n gb: GenBean \n end", new ArrayList(), new ArrayList());
assertFalse(loader.hasErrors());
assertNotNull(eng);
assertEquals(2, eng.getFactTypes().length);
assertEquals("GenBean", eng.getFactTypes()[0]);
assertEquals("GenBean2", eng.getFactTypes()[1]);
assertEquals(SuggestionCompletionEngine.TYPE_NUMERIC, eng.getFieldType("GenBean", "id"));
assertEquals(SuggestionCompletionEngine.TYPE_STRING, eng.getFieldType("GenBean", "name"));
assertEquals("GenBean", eng.getFieldType("GenBean2", "gb"));
}
@Test
public void testGlobal() throws Exception {
SuggestionCompletionLoader loader = new SuggestionCompletionLoader();
SuggestionCompletionEngine eng = loader.getSuggestionEngine("package foo \n global org.drools.Person p", new ArrayList(), new ArrayList());
assertNotNull(eng);
assertFalse(loader.hasErrors());
assertEquals(1, eng.getGlobalVariables().length);
assertEquals("p", eng.getGlobalVariables()[0]);
assertEquals("Person", eng.getGlobalVariable("p"));
String[] flds = (String[]) eng.getModelFields("Person");
assertNotNull(flds);
assertEquals(0, eng.getGlobalCollections().length);
}
@Test
public void testGlobalCollections() throws Exception {
SuggestionCompletionLoader loader = new SuggestionCompletionLoader();
SuggestionCompletionEngine eng = loader.getSuggestionEngine("package foo \n global java.util.List ls", new ArrayList(), new ArrayList());
assertNotNull(eng);
assertFalse(loader.hasErrors());
assertEquals(1, eng.getGlobalVariables().length);
assertEquals("ls", eng.getGlobalVariables()[0]);
assertEquals("List", eng.getGlobalVariable("ls"));
assertNotNull(eng.getGlobalCollections());
assertEquals(1, eng.getGlobalCollections().length);
assertEquals("ls", eng.getGlobalCollections()[0]);
}
@Test
public void testSortOrderOfFields() throws Exception {
SuggestionCompletionLoader loader = new SuggestionCompletionLoader();
SuggestionCompletionEngine eng = loader.getSuggestionEngine("package foo \n import org.drools.ide.common.server.rules.SomeFact", new ArrayList(), new ArrayList());
assertNotNull(eng);
String[] fields = eng.getFieldCompletions("SomeFact");
assertEquals("age", fields[0]);
assertEquals("alive", fields[1]);
assertEquals("anEnum", fields[2]);
assertEquals("bigDecimal", fields[3]);
}
@Test
public void testEnumFields() throws Exception {
SuggestionCompletionLoader loader = new SuggestionCompletionLoader();
SuggestionCompletionEngine eng = loader.getSuggestionEngine("package foo \n import org.drools.ide.common.server.rules.SomeFact", new ArrayList(), new ArrayList());
assertNotNull(eng);
assertTrue(eng.hasDataEnumLists());
assertEquals(eng.getDataEnumList("SomeFact.anEnum").length, 3);
String a[] = eng.getDataEnumList("SomeFact.anEnum");
assertEquals(a[0], "EnumClass.v1=EnumClass.v1");
assertEquals(a[1], "EnumClass.v2=EnumClass.v2");
assertEquals(a[2], "EnumClass.v3=EnumClass.v3");
}
@Test
public void testSortOrderOfFacts() throws Exception {
SuggestionCompletionLoader loader = new SuggestionCompletionLoader();
SuggestionCompletionEngine eng = loader.getSuggestionEngine("package foo \n import org.drools.ide.common.server.rules.SomeFact\n import org.drools.Person", new ArrayList(), new ArrayList());
assertNotNull(eng);
String[] facts = eng.getFactTypes();
assertEquals(2, facts.length);
assertEquals("Person", facts[0]);
assertEquals("SomeFact", facts[1]);
}
@Test
public void testTypeDeclarations() throws Exception {
SuggestionCompletionLoader loader = new SuggestionCompletionLoader();
String header = "";
header += "package foo\n";
header += "declare Applicant\n";
header += " creditRating: String\n";
header += " approved: Boolean\n";
header += " applicationDate: java.util.Date\n";
header += " age: Integer\n";
header += " name: String\n";
header += "end\n";
header += "declare LoanApplication\n";
header += " amount: Integer\n";
header += " approved: Boolean\n";
header += " deposit: Integer\n";
header += " approvedRate: Integer\n";
header += " lengthYears: Integer\n";
header += " explanation: String\n";
header += " insuranceCost: Integer\n";
header += " applicant: Applicant\n";
header += "end\n";
SuggestionCompletionEngine eng = loader.getSuggestionEngine(header, new ArrayList(), new ArrayList());
assertNotNull(eng);
assertEquals(SuggestionCompletionEngine.TYPE_STRING, eng.getFieldType("Applicant", "creditRating"));
assertEquals("java.lang.String", eng.getFieldClassName("Applicant", "creditRating"));
assertEquals(FIELD_CLASS_TYPE.TYPE_DECLARATION_CLASS, eng.getFieldClassType("Applicant", "creditRating"));
assertEquals(SuggestionCompletionEngine.TYPE_NUMERIC, eng.getFieldType("LoanApplication", "deposit"));
assertEquals("java.lang.Integer", eng.getFieldClassName("LoanApplication", "deposit"));
assertEquals(FIELD_CLASS_TYPE.TYPE_DECLARATION_CLASS, eng.getFieldClassType("LoanApplication", "deposit"));
assertEquals("Applicant", eng.getFieldType("LoanApplication", "applicant"));
assertNull(eng.getFieldClassName("LoanApplication", "applicant"));
assertEquals(FIELD_CLASS_TYPE.TYPE_DECLARATION_CLASS, eng.getFieldClassType("LoanApplication", "applicant"));
}
@Test
public void testLoaderWithExistingClassloader() throws Exception {
MockClassLoader mcl = new MockClassLoader();
SuggestionCompletionLoader loader = new SuggestionCompletionLoader(mcl);
SuggestionCompletionEngine eng = loader.getSuggestionEngine("package foo \n import org.foo.Bar", new ArrayList(), new ArrayList());
assertNotNull(eng);
//assertNotNull(eng.dataEnumLists);
assertTrue(mcl.called);
}
static class MockClassLoader extends ClassLoader {
public boolean called = false;
public Class<?> loadClass(String name) {
called = true;
return Object.class;
}
}
}