Package org.drools.ide.common.server.rules

Source Code of org.drools.ide.common.server.rules.SuggestionCompletionLoaderTest$MockClassLoader

/*
* 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 static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.jar.JarInputStream;

import org.drools.ide.common.client.modeldriven.FactTypeFilter;
import org.drools.ide.common.client.modeldriven.ModelAnnotation;
import org.drools.ide.common.client.modeldriven.ModelField.FIELD_CLASS_TYPE;
import org.drools.ide.common.client.modeldriven.SuggestionCompletionEngine;
import org.drools.lang.descr.ImportDescr;
import org.drools.lang.dsl.DSLMappingEntry;
import org.drools.lang.dsl.DSLTokenizedMappingFile;
import org.junit.Test;

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 testGeneratedBeansExtendsSimple() throws Exception {
        String packageDrl = "package foo \n"
                            + "declare Bean1 \n"
                            + "age: int \n"
                            + "name : String \n"
                            + "end \n"
                            + "declare Bean2 extends Bean1\n"
                            + "cheese : String \n"
                            + "end";
        SuggestionCompletionLoader loader = new SuggestionCompletionLoader();
        SuggestionCompletionEngine eng = loader.getSuggestionEngine( packageDrl,
                                                                     new ArrayList(),
                                                                     new ArrayList() );
        assertFalse( loader.hasErrors() );
        assertNotNull( eng );

        assertEquals( 2,
                      eng.getFactTypes().length );
        assertEquals( "Bean1",
                      eng.getFactTypes()[0] );
        assertEquals( "Bean2",
                      eng.getFactTypes()[1] );

        assertEquals( 3,
                      eng.getFieldCompletions( "Bean1" ).length );
        assertEquals( "Bean1",
                      eng.getFieldType( "Bean1",
                                        "this" ) );
        assertEquals( SuggestionCompletionEngine.TYPE_NUMERIC,
                      eng.getFieldType( "Bean1",
                                        "age" ) );
        assertEquals( SuggestionCompletionEngine.TYPE_STRING,
                      eng.getFieldType( "Bean1",
                                        "name" ) );

        assertEquals( 4,
                      eng.getFieldCompletions( "Bean2" ).length );
        assertEquals( "Bean2",
                      eng.getFieldType( "Bean2",
                                        "this" ) );
        assertEquals( SuggestionCompletionEngine.TYPE_NUMERIC,
                      eng.getFieldType( "Bean2",
                                        "age" ) );
        assertEquals( SuggestionCompletionEngine.TYPE_STRING,
                      eng.getFieldType( "Bean2",
                                        "name" ) );
        assertEquals( SuggestionCompletionEngine.TYPE_STRING,
                      eng.getFieldType( "Bean2",
                                        "cheese" ) );
    }

    @Test
    public void testGeneratedBeansExtendsPOJOSimple() throws Exception {
        String packageDrl = "package foo \n"
                            + "import org.drools.Address\n"
                            + "declare Address \n"
                            + "end";
        SuggestionCompletionLoader loader = new SuggestionCompletionLoader();
        SuggestionCompletionEngine eng = loader.getSuggestionEngine( packageDrl,
                                                                     new ArrayList(),
                                                                     new ArrayList() );
        assertFalse( loader.hasErrors() );
        assertNotNull( eng );

        assertEquals( 1,
                      eng.getFactTypes().length );
        assertEquals( "Address",
                      eng.getFactTypes()[0] );

        assertEquals( 4,
                      eng.getFieldCompletions( "Address" ).length );
        assertEquals( "Address",
                      eng.getFieldType( "Address",
                                        "this" ) );
        assertEquals( SuggestionCompletionEngine.TYPE_STRING,
                      eng.getFieldType( "Address",
                                        "street" ) );
        assertEquals( SuggestionCompletionEngine.TYPE_STRING,
                      eng.getFieldType( "Address",
                                        "suburb" ) );
        assertEquals( SuggestionCompletionEngine.TYPE_STRING,
                      eng.getFieldType( "Address",
                                        "zipCode" ) );
    }

    @Test
    public void testGeneratedBeansExtendsPOJOComplex() throws Exception {
        String packageDrl = "package foo \n"
                            + "import org.drools.Address\n"
                            + "declare Address \n"
                            + "end\n"
                            + "declare Address2 extends Address\n"
                            + "isNicePlace : Boolean \n"
                            + "end";
        SuggestionCompletionLoader loader = new SuggestionCompletionLoader();
        SuggestionCompletionEngine eng = loader.getSuggestionEngine( packageDrl,
                                                                     new ArrayList(),
                                                                     new ArrayList() );
        assertFalse( loader.hasErrors() );
        assertNotNull( eng );

        assertEquals( 2,
                      eng.getFactTypes().length );
        assertEquals( "Address",
                      eng.getFactTypes()[0] );
        assertEquals( "Address2",
                      eng.getFactTypes()[1] );

        assertEquals( 4,
                      eng.getFieldCompletions( "Address" ).length );
        assertEquals( "Address",
                      eng.getFieldType( "Address",
                                        "this" ) );
        assertEquals( SuggestionCompletionEngine.TYPE_STRING,
                      eng.getFieldType( "Address",
                                        "street" ) );
        assertEquals( SuggestionCompletionEngine.TYPE_STRING,
                      eng.getFieldType( "Address",
                                        "suburb" ) );
        assertEquals( SuggestionCompletionEngine.TYPE_STRING,
                      eng.getFieldType( "Address",
                                        "zipCode" ) );

        assertEquals( 5,
                      eng.getFieldCompletions( "Address2" ).length );
        assertEquals( "Address2",
                      eng.getFieldType( "Address2",
                                        "this" ) );
        assertEquals( SuggestionCompletionEngine.TYPE_STRING,
                      eng.getFieldType( "Address2",
                                        "street" ) );
        assertEquals( SuggestionCompletionEngine.TYPE_STRING,
                      eng.getFieldType( "Address2",
                                        "suburb" ) );
        assertEquals( SuggestionCompletionEngine.TYPE_STRING,
                      eng.getFieldType( "Address2",
                                        "zipCode" ) );
        assertEquals( SuggestionCompletionEngine.TYPE_BOOLEAN,
                      eng.getFieldType( "Address2",
                                        "isNicePlace" ) );
    }

    @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( "this",
                      fields[0] );
        assertEquals( "age",
                      fields[1] );
        assertEquals( "alive",
                      fields[2] );
        assertEquals( "anEnum",
                      fields[3] );
        assertEquals( "bigDecimal",
                      fields[4] );
    }

    @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" ) );
        assertEquals( "Applicant",
                      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;
        }

    }

    @Test
    public void testTypeDeclarationsAnnotations() throws Exception {
        SuggestionCompletionLoader loader = new SuggestionCompletionLoader();

        String header = "";
        header += "package foo\n";

        header += "declare Applicant\n";
        header += "@role( event )\n";
        header += "end\n";

        SuggestionCompletionEngine eng = loader.getSuggestionEngine( header,
                                                                     new ArrayList(),
                                                                     new ArrayList() );
        assertNotNull( eng );

        assertNotNull( eng.getAnnotations() );
        assertEquals( 1,
                      eng.getAnnotations().size() );

        assertNotNull( eng.getAnnotations().get( "Applicant" ) );
        assertEquals( 1,
                      eng.getAnnotations().get( "Applicant" ).size() );

        assertNotNull( eng.getAnnotations().get( "Applicant" ).get( 0 ) );
        assertEquals( "role",
                      eng.getAnnotations().get( "Applicant" ).get( 0 ).getAnnotationName() );
        assertEquals( "event",
                      eng.getAnnotations().get( "Applicant" ).get( 0 ).getAnnotationValues().get( "value" ) );

        assertNotNull( eng.getAnnotationsForFactType( "Applicant" ) );
        assertNotNull( eng.getAnnotationsForFactType( "Applicant" ).get( 0 ) );
        assertEquals( "role",
                      eng.getAnnotationsForFactType( "Applicant" ).get( 0 ).getAnnotationName() );
        assertEquals( "event",
                      eng.getAnnotationsForFactType( "Applicant" ).get( 0 ).getAnnotationValues().get( "value" ) );

    }

    @Test
    public void testTypeDeclarationsMultipleAnnotations() throws Exception {
        SuggestionCompletionLoader loader = new SuggestionCompletionLoader();

        String header = "";
        header += "package foo\n";

        header += "declare Applicant\n";
        header += "@role( event )\n";
        header += "@smurf( name = Pupa)\n";
        header += "end\n";

        SuggestionCompletionEngine eng = loader.getSuggestionEngine( header,
                                                                     new ArrayList(),
                                                                     new ArrayList() );
        assertNotNull( eng );

        assertNotNull( eng.getAnnotations() );
        assertEquals( 1,
                      eng.getAnnotations().size() );

        assertNotNull( eng.getAnnotations().get( "Applicant" ) );
        assertEquals( 2,
                      eng.getAnnotations().get( "Applicant" ).size() );

        int idx0 = getIndexOfAnnotation( eng.getAnnotationsForFactType( "Applicant" ),
                                         "role" );
        int idx1 = getIndexOfAnnotation( eng.getAnnotationsForFactType( "Applicant" ),
                                         "smurf" );

        assertNotNull( eng.getAnnotations().get( "Applicant" ).get( idx0 ) );
        assertEquals( "role",
                      eng.getAnnotations().get( "Applicant" ).get( idx0 ).getAnnotationName() );
        assertEquals( "event",
                      eng.getAnnotations().get( "Applicant" ).get( idx0 ).getAnnotationValues().get( "value" ) );

        assertNotNull( eng.getAnnotations().get( "Applicant" ).get( idx1 ) );
        assertEquals( "smurf",
                      eng.getAnnotations().get( "Applicant" ).get( idx1 ).getAnnotationName() );
        assertEquals( "Pupa",
                      eng.getAnnotations().get( "Applicant" ).get( idx1 ).getAnnotationValues().get( "name" ) );

    }

    private int getIndexOfAnnotation(List<ModelAnnotation> annotations,
                                     String annotationName) {
        for ( int i = 0; i < annotations.size(); i++ ) {
            ModelAnnotation annotation = annotations.get( i );
            if ( annotationName.equals( annotation.getAnnotationName() ) ) {
                return i;
            }
        }
        return -1;
    }

    @Test
    public void testReadOnlyFieldWithAnnotation() throws Exception {
        // GUVNOR-1792
        SuggestionCompletionLoader loader = new SuggestionCompletionLoader();

        String header = "";
        header += "package foo \n import org.drools.ide.common.server.rules.ReadOnlyFact\n";

        header += "declare ReadOnlyFact\n";
        header += "@role( event )\n";
        header += "end\n";

        SuggestionCompletionEngine eng = loader.getSuggestionEngine( header,
                                                                     new ArrayList(),
                                                                     new ArrayList() );
        assertNotNull( eng );

        assertEquals( SuggestionCompletionEngine.TYPE_STRING,
                      eng.getFieldType( "ReadOnlyFact",
                                        "name" ) );
    }

    @Test
    public void testReadOnlyFieldWithAnnotationAndField() throws Exception {
        SuggestionCompletionLoader loader = new SuggestionCompletionLoader();

        String header = "";
        header += "package foo \n import org.drools.ide.common.server.rules.ReadOnlyFact\n";

        header += "declare ReadOnlyFact\n";
        header += "@role( event )\n";
        header += "age: Integer\n";
        header += "end\n";

        SuggestionCompletionEngine eng = loader.getSuggestionEngine( header,
                                                                     new ArrayList(),
                                                                     new ArrayList() );
        assertNotNull( eng );

        assertEquals( SuggestionCompletionEngine.TYPE_STRING,
                      eng.getFieldType( "ReadOnlyFact",
                                        "name" ) );
        assertEquals( SuggestionCompletionEngine.TYPE_NUMERIC,
                      eng.getFieldType( "ReadOnlyFact",
                                        "age" ) );
    }

    @Test
    public void testLoadDelegatedProperties() throws Exception {
        SuggestionCompletionLoader loader = new SuggestionCompletionLoader();
        SuggestionCompletionEngine eng = loader.getSuggestionEngine( "package foo \n" +
                                                                             "import org.drools.ide.common.server.rules.MotherClass\n" +
                                                                             "import org.drools.ide.common.server.rules.DelegationClass\n" +
                                                                             "import org.drools.ide.common.server.rules.SubClass\n",
                                                                     new ArrayList(),
                                                                     new ArrayList() );
        assertNotNull( eng );

        assertEquals( SuggestionCompletionEngine.TYPE_COMPARABLE,
                      eng.getFieldType( "MotherClass",
                                        "status" ) );

        assertEquals( SuggestionCompletionEngine.TYPE_STRING,
                      eng.getFieldType( "SubClass",
                                        "message" ) );
        assertEquals( SuggestionCompletionEngine.TYPE_COMPARABLE,
                      eng.getFieldType( "SubClass",
                                        "status" ) );

        assertEquals( SuggestionCompletionEngine.TYPE_COMPARABLE,
                      eng.getFieldType( "DelegationClass",
                                        "status" ) );
    }

}
TOP

Related Classes of org.drools.ide.common.server.rules.SuggestionCompletionLoaderTest$MockClassLoader

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.