/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * 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.kie.workbench.common.widgets.client.datamodel; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import javax.enterprise.inject.Instance; import org.drools.workbench.models.commons.backend.oracle.ProjectDataModelOracleImpl; import org.drools.workbench.models.datamodel.imports.HasImports; import org.drools.workbench.models.datamodel.imports.Import; import org.drools.workbench.models.datamodel.imports.Imports; import org.drools.workbench.models.datamodel.oracle.DataType; import org.drools.workbench.models.datamodel.oracle.MethodInfo; import org.drools.workbench.models.datamodel.oracle.ModelField; import org.drools.workbench.models.datamodel.oracle.PackageDataModelOracle; import org.drools.workbench.models.datamodel.oracle.ProjectDataModelOracle; import org.drools.workbench.models.datamodel.oracle.TypeSource; import org.jboss.errai.common.client.api.Caller; import org.jboss.errai.validation.client.dynamic.DynamicValidator; import org.junit.Test; import org.kie.workbench.common.services.datamodel.backend.server.builder.packages.PackageDataModelOracleBuilder; import org.kie.workbench.common.services.datamodel.backend.server.builder.projects.ClassFactBuilder; import org.kie.workbench.common.services.datamodel.backend.server.builder.projects.FactBuilder; import org.kie.workbench.common.services.datamodel.backend.server.builder.projects.ProjectDataModelOracleBuilder; import org.kie.workbench.common.services.datamodel.model.PackageDataModelOracleBaselinePayload; import org.kie.workbench.common.services.datamodel.service.IncrementalDataModelService; import org.kie.workbench.common.widgets.client.datamodel.testclasses.Product; import org.kie.workbench.common.widgets.client.datamodel.testclasses.TestDataTypes; import org.kie.workbench.common.widgets.client.datamodel.testclasses.TestDelegatedClass; import org.kie.workbench.common.widgets.client.datamodel.testclasses.TestDirectRecursionClass; import org.kie.workbench.common.widgets.client.datamodel.testclasses.TestIndirectRecursionClassA; import org.kie.workbench.common.widgets.client.datamodel.testclasses.TestSubClass; import org.kie.workbench.common.widgets.client.datamodel.testclasses.TestSuperClass; import org.mockito.Mock; import org.uberfire.backend.vfs.Path; import org.uberfire.client.callbacks.Callback; import static org.junit.Assert.*; import static org.mockito.Mockito.*; /** * Tests for the ProjectDataModelOracle */ public class PackageDataModelOracleTest { @Mock private Instance<DynamicValidator> validatorInstance; @Test public void testDataTypes() throws IOException { final ProjectDataModelOracle projectLoader = ProjectDataModelOracleBuilder.newProjectOracleBuilder() .addClass( TestDataTypes.class ) .build(); final PackageDataModelOracle packageLoader = PackageDataModelOracleBuilder.newPackageOracleBuilder( "org.kie.workbench.common.widgets.client.datamodel.testclasses" ).setProjectOracle( projectLoader ).build(); //Emulate server-to-client conversions final Caller<IncrementalDataModelService> service = new MockIncrementalDataModelServiceCaller( packageLoader ); final AsyncPackageDataModelOracle oracle = new AsyncPackageDataModelOracleImpl( service, validatorInstance ); final PackageDataModelOracleBaselinePayload dataModel = new PackageDataModelOracleBaselinePayload(); dataModel.setPackageName( packageLoader.getPackageName() ); dataModel.setModelFields( packageLoader.getProjectModelFields() ); dataModel.setFieldParametersType( packageLoader.getProjectFieldParametersType() ); PackageDataModelOracleTestUtils.populateDataModelOracle( mock( Path.class ), new MockHasImports(), oracle, dataModel ); assertEquals( 1, oracle.getFactTypes().length ); assertEquals( TestDataTypes.class.getSimpleName(), oracle.getFactTypes()[ 0 ] ); oracle.getFieldCompletions( TestDataTypes.class.getSimpleName(), new Callback<ModelField[]>() { @Override public void callback( final ModelField[] fields ) { assertEquals( 20, fields.length ); } } ); assertEquals( DataType.TYPE_THIS, oracle.getFieldType( TestDataTypes.class.getSimpleName(), "this" ) ); assertEquals( DataType.TYPE_STRING, oracle.getFieldType( TestDataTypes.class.getSimpleName(), "fieldString" ) ); assertEquals( DataType.TYPE_BOOLEAN, oracle.getFieldType( TestDataTypes.class.getSimpleName(), "fieldBooleanObject" ) ); assertEquals( DataType.TYPE_DATE, oracle.getFieldType( TestDataTypes.class.getSimpleName(), "fieldDate" ) ); assertEquals( DataType.TYPE_NUMERIC_BIGDECIMAL, oracle.getFieldType( TestDataTypes.class.getSimpleName(), "fieldNumeric" ) ); assertEquals( DataType.TYPE_NUMERIC_BIGDECIMAL, oracle.getFieldType( TestDataTypes.class.getSimpleName(), "fieldBigDecimal" ) ); assertEquals( DataType.TYPE_NUMERIC_BIGINTEGER, oracle.getFieldType( TestDataTypes.class.getSimpleName(), "fieldBigInteger" ) ); assertEquals( DataType.TYPE_NUMERIC_BYTE, oracle.getFieldType( TestDataTypes.class.getSimpleName(), "fieldByteObject" ) ); assertEquals( DataType.TYPE_NUMERIC_DOUBLE, oracle.getFieldType( TestDataTypes.class.getSimpleName(), "fieldDoubleObject" ) ); assertEquals( DataType.TYPE_NUMERIC_FLOAT, oracle.getFieldType( TestDataTypes.class.getSimpleName(), "fieldFloatObject" ) ); assertEquals( DataType.TYPE_NUMERIC_INTEGER, oracle.getFieldType( TestDataTypes.class.getSimpleName(), "fieldIntegerObject" ) ); assertEquals( DataType.TYPE_NUMERIC_LONG, oracle.getFieldType( TestDataTypes.class.getSimpleName(), "fieldLongObject" ) ); assertEquals( DataType.TYPE_NUMERIC_SHORT, oracle.getFieldType( TestDataTypes.class.getSimpleName(), "fieldShortObject" ) ); assertEquals( DataType.TYPE_BOOLEAN, oracle.getFieldType( TestDataTypes.class.getSimpleName(), "fieldBooleanPrimitive" ) ); assertEquals( DataType.TYPE_NUMERIC_BYTE, oracle.getFieldType( TestDataTypes.class.getSimpleName(), "fieldBytePrimitive" ) ); assertEquals( DataType.TYPE_NUMERIC_DOUBLE, oracle.getFieldType( TestDataTypes.class.getSimpleName(), "fieldDoublePrimitive" ) ); assertEquals( DataType.TYPE_NUMERIC_FLOAT, oracle.getFieldType( TestDataTypes.class.getSimpleName(), "fieldFloatPrimitive" ) ); assertEquals( DataType.TYPE_NUMERIC_INTEGER, oracle.getFieldType( TestDataTypes.class.getSimpleName(), "fieldIntegerPrimitive" ) ); assertEquals( DataType.TYPE_NUMERIC_LONG, oracle.getFieldType( TestDataTypes.class.getSimpleName(), "fieldLongPrimitive" ) ); assertEquals( DataType.TYPE_NUMERIC_SHORT, oracle.getFieldType( TestDataTypes.class.getSimpleName(), "fieldShortPrimitive" ) ); } @Test public void testSuperClass() throws IOException { final ProjectDataModelOracle projectLoader = ProjectDataModelOracleBuilder.newProjectOracleBuilder() .addClass( TestSuperClass.class ) .build(); final PackageDataModelOracle packageLoader = PackageDataModelOracleBuilder.newPackageOracleBuilder( "org.kie.workbench.common.widgets.client.datamodel.testclasses" ).setProjectOracle( projectLoader ).build(); //Emulate server-to-client conversions final Caller<IncrementalDataModelService> service = new MockIncrementalDataModelServiceCaller( packageLoader ); final AsyncPackageDataModelOracle oracle = new AsyncPackageDataModelOracleImpl( service, validatorInstance ); final PackageDataModelOracleBaselinePayload dataModel = new PackageDataModelOracleBaselinePayload(); dataModel.setPackageName( packageLoader.getPackageName() ); dataModel.setModelFields( packageLoader.getProjectModelFields() ); dataModel.setFieldParametersType( packageLoader.getProjectFieldParametersType() ); PackageDataModelOracleTestUtils.populateDataModelOracle( mock( Path.class ), new MockHasImports(), oracle, dataModel ); assertEquals( 1, oracle.getFactTypes().length ); assertEquals( TestSuperClass.class.getSimpleName(), oracle.getFactTypes()[ 0 ] ); oracle.getFieldCompletions( TestSuperClass.class.getSimpleName(), new Callback<ModelField[]>() { @Override public void callback( final ModelField[] fields ) { assertEquals( 3, fields.length ); } } ); assertEquals( DataType.TYPE_THIS, oracle.getFieldType( TestSuperClass.class.getSimpleName(), "this" ) ); assertEquals( TestSuperClass.class.getSimpleName(), oracle.getFieldClassName( TestSuperClass.class.getSimpleName(), "this" ) ); assertEquals( DataType.TYPE_STRING, oracle.getFieldType( TestSuperClass.class.getSimpleName(), "field1" ) ); assertEquals( String.class.getName(), oracle.getFieldClassName( TestSuperClass.class.getSimpleName(), "field1" ) ); assertEquals( DataType.TYPE_COLLECTION, oracle.getFieldType( TestSuperClass.class.getSimpleName(), "list" ) ); assertEquals( List.class.getName(), oracle.getFieldClassName( TestSuperClass.class.getSimpleName(), "list" ) ); assertEquals( String.class.getName(), oracle.getParametricFieldType( TestSuperClass.class.getSimpleName(), "list" ) ); } @Test public void testSubClass() throws IOException { final ProjectDataModelOracle projectLoader = ProjectDataModelOracleBuilder.newProjectOracleBuilder() .addClass( TestSubClass.class ) .build(); final PackageDataModelOracle packageLoader = PackageDataModelOracleBuilder.newPackageOracleBuilder( "org.kie.workbench.common.widgets.client.datamodel.testclasses" ).setProjectOracle( projectLoader ).build(); //Emulate server-to-client conversions final Caller<IncrementalDataModelService> service = new MockIncrementalDataModelServiceCaller( packageLoader ); final AsyncPackageDataModelOracle oracle = new AsyncPackageDataModelOracleImpl( service, validatorInstance ); final PackageDataModelOracleBaselinePayload dataModel = new PackageDataModelOracleBaselinePayload(); dataModel.setPackageName( packageLoader.getPackageName() ); dataModel.setModelFields( packageLoader.getProjectModelFields() ); dataModel.setFieldParametersType( packageLoader.getProjectFieldParametersType() ); PackageDataModelOracleTestUtils.populateDataModelOracle( mock( Path.class ), new MockHasImports(), oracle, dataModel ); assertEquals( 1, oracle.getFactTypes().length ); assertEquals( TestSubClass.class.getSimpleName(), oracle.getFactTypes()[ 0 ] ); oracle.getFieldCompletions( TestSubClass.class.getSimpleName(), new Callback<ModelField[]>() { @Override public void callback( final ModelField[] fields ) { assertEquals( 4, fields.length ); for ( ModelField field : fields ) { if ( "this".equals( field.getName() ) ) { assertEquals( ModelField.FIELD_ORIGIN.SELF, field.getOrigin() ); } else if ( "field1".equals( field.getName() ) ) { assertEquals( ModelField.FIELD_ORIGIN.INHERITED, field.getOrigin() ); } else if ( "field2".equals( field.getName() ) ) { assertEquals( ModelField.FIELD_ORIGIN.DECLARED, field.getOrigin() ); } else if ( "list".equals( field.getName() ) ) { assertEquals( ModelField.FIELD_ORIGIN.DELEGATED, field.getOrigin() ); } } } } ); assertEquals( DataType.TYPE_THIS, oracle.getFieldType( TestSubClass.class.getSimpleName(), "this" ) ); assertEquals( TestSubClass.class.getSimpleName(), oracle.getFieldClassName( TestSubClass.class.getSimpleName(), "this" ) ); assertEquals( DataType.TYPE_STRING, oracle.getFieldType( TestSubClass.class.getSimpleName(), "field1" ) ); assertEquals( String.class.getName(), oracle.getFieldClassName( TestSubClass.class.getSimpleName(), "field1" ) ); assertEquals( DataType.TYPE_STRING, oracle.getFieldType( TestSubClass.class.getSimpleName(), "field2" ) ); assertEquals( String.class.getName(), oracle.getFieldClassName( TestSubClass.class.getSimpleName(), "field2" ) ); assertEquals( DataType.TYPE_COLLECTION, oracle.getFieldType( TestSubClass.class.getSimpleName(), "list" ) ); assertEquals( List.class.getName(), oracle.getFieldClassName( TestSubClass.class.getSimpleName(), "list" ) ); assertEquals( String.class.getName(), oracle.getParametricFieldType( TestSubClass.class.getSimpleName(), "list" ) ); } @Test public void testDelegatedClass() throws IOException { final ProjectDataModelOracle projectLoader = ProjectDataModelOracleBuilder.newProjectOracleBuilder() .addClass( TestDelegatedClass.class ) .build(); final PackageDataModelOracle packageLoader = PackageDataModelOracleBuilder.newPackageOracleBuilder( "org.kie.workbench.common.widgets.client.datamodel.testclasses" ).setProjectOracle( projectLoader ).build(); //Emulate server-to-client conversions final Caller<IncrementalDataModelService> service = new MockIncrementalDataModelServiceCaller( packageLoader ); final AsyncPackageDataModelOracle oracle = new AsyncPackageDataModelOracleImpl( service, validatorInstance ); final PackageDataModelOracleBaselinePayload dataModel = new PackageDataModelOracleBaselinePayload(); dataModel.setPackageName( packageLoader.getPackageName() ); dataModel.setModelFields( packageLoader.getProjectModelFields() ); dataModel.setFieldParametersType( packageLoader.getProjectFieldParametersType() ); PackageDataModelOracleTestUtils.populateDataModelOracle( mock( Path.class ), new MockHasImports(), oracle, dataModel ); assertEquals( 1, oracle.getFactTypes().length ); assertEquals( TestDelegatedClass.class.getSimpleName(), oracle.getFactTypes()[ 0 ] ); oracle.getFieldCompletions( TestDelegatedClass.class.getSimpleName(), new Callback<ModelField[]>() { @Override public void callback( final ModelField[] fields ) { assertEquals( 3, fields.length ); for ( ModelField field : fields ) { if ( "this".equals( field.getName() ) ) { assertEquals( ModelField.FIELD_ORIGIN.SELF, field.getOrigin() ); } else if ( "field1".equals( field.getName() ) ) { assertEquals( ModelField.FIELD_ORIGIN.DELEGATED, field.getOrigin() ); } else if ( "list".equals( field.getName() ) ) { assertEquals( ModelField.FIELD_ORIGIN.DELEGATED, field.getOrigin() ); } } } } ); assertEquals( DataType.TYPE_THIS, oracle.getFieldType( TestDelegatedClass.class.getSimpleName(), "this" ) ); assertEquals( TestDelegatedClass.class.getSimpleName(), oracle.getFieldClassName( TestDelegatedClass.class.getSimpleName(), "this" ) ); assertEquals( DataType.TYPE_STRING, oracle.getFieldType( TestDelegatedClass.class.getSimpleName(), "field1" ) ); assertEquals( String.class.getName(), oracle.getFieldClassName( TestDelegatedClass.class.getSimpleName(), "field1" ) ); assertEquals( DataType.TYPE_COLLECTION, oracle.getFieldType( TestDelegatedClass.class.getSimpleName(), "list" ) ); assertEquals( List.class.getName(), oracle.getFieldClassName( TestDelegatedClass.class.getSimpleName(), "list" ) ); assertEquals( String.class.getName(), oracle.getParametricFieldType( TestDelegatedClass.class.getSimpleName(), "list" ) ); } @Test public void testNestedClass() throws IOException { final ProjectDataModelOracle projectLoader = ProjectDataModelOracleBuilder.newProjectOracleBuilder() .addClass( TestSuperClass.NestedClass.class ) .build(); final PackageDataModelOracle packageLoader = PackageDataModelOracleBuilder.newPackageOracleBuilder( "org.kie.workbench.common.widgets.client.datamodel.testclasses" ).setProjectOracle( projectLoader ).build(); //Emulate server-to-client conversions final Caller<IncrementalDataModelService> service = new MockIncrementalDataModelServiceCaller( packageLoader ); final AsyncPackageDataModelOracle oracle = new AsyncPackageDataModelOracleImpl( service, validatorInstance ); final PackageDataModelOracleBaselinePayload dataModel = new PackageDataModelOracleBaselinePayload(); dataModel.setPackageName( packageLoader.getPackageName() ); dataModel.setModelFields( packageLoader.getProjectModelFields() ); dataModel.setFieldParametersType( packageLoader.getProjectFieldParametersType() ); PackageDataModelOracleTestUtils.populateDataModelOracle( mock( Path.class ), new MockHasImports(), oracle, dataModel ); assertEquals( 1, oracle.getFactTypes().length ); assertEquals( "TestSuperClass.NestedClass", oracle.getFactTypes()[ 0 ] ); oracle.getFieldCompletions( "TestSuperClass.NestedClass", new Callback<ModelField[]>() { @Override public void callback( final ModelField[] fields ) { assertEquals( 2, fields.length ); } } ); assertEquals( DataType.TYPE_THIS, oracle.getFieldType( "TestSuperClass.NestedClass", "this" ) ); assertEquals( "TestSuperClass.NestedClass", oracle.getFieldClassName( "TestSuperClass.NestedClass", "this" ) ); assertEquals( DataType.TYPE_STRING, oracle.getFieldType( "TestSuperClass.NestedClass", "nestedField1" ) ); assertEquals( String.class.getName(), oracle.getFieldClassName( "TestSuperClass.NestedClass", "nestedField1" ) ); } @Test public void testImportedNestedClass() throws IOException { final ProjectDataModelOracle projectLoader = ProjectDataModelOracleBuilder.newProjectOracleBuilder() .addClass( TestSuperClass.NestedClass.class ) .build(); final PackageDataModelOracle packageLoader = PackageDataModelOracleBuilder.newPackageOracleBuilder().setProjectOracle( projectLoader ).build(); //Emulate server-to-client conversions final Caller<IncrementalDataModelService> service = new MockIncrementalDataModelServiceCaller( packageLoader ); final AsyncPackageDataModelOracle oracle = new AsyncPackageDataModelOracleImpl( service, validatorInstance ); final PackageDataModelOracleBaselinePayload dataModel = new PackageDataModelOracleBaselinePayload(); dataModel.setPackageName( packageLoader.getPackageName() ); dataModel.setModelFields( packageLoader.getProjectModelFields() ); dataModel.setFieldParametersType( packageLoader.getProjectFieldParametersType() ); final HasImports hasImports = new HasImports() { final Imports imports = new Imports(); { imports.addImport( new Import( "org.kie.workbench.common.widgets.client.datamodel.testclasses.TestSuperClass.NestedClass" ) ); } @Override public Imports getImports() { return imports; } @Override public void setImports( Imports imports ) { } }; PackageDataModelOracleTestUtils.populateDataModelOracle( mock( Path.class ), hasImports, oracle, dataModel ); assertEquals( 1, oracle.getFactTypes().length ); assertEquals( "TestSuperClass.NestedClass", oracle.getFactTypes()[ 0 ] ); oracle.getFieldCompletions( "TestSuperClass.NestedClass", new Callback<ModelField[]>() { @Override public void callback( final ModelField[] fields ) { assertEquals( 2, fields.length ); } } ); assertEquals( DataType.TYPE_THIS, oracle.getFieldType( "TestSuperClass.NestedClass", "this" ) ); assertEquals( "TestSuperClass.NestedClass", oracle.getFieldClassName( "TestSuperClass.NestedClass", "this" ) ); assertEquals( DataType.TYPE_STRING, oracle.getFieldType( "TestSuperClass.NestedClass", "nestedField1" ) ); assertEquals( String.class.getName(), oracle.getFieldClassName( "TestSuperClass.NestedClass", "nestedField1" ) ); } @Test public void testImportedNestedClassMethodInformation() throws IOException { final ProjectDataModelOracle projectLoader = ProjectDataModelOracleBuilder.newProjectOracleBuilder() .addClass( TestSuperClass.NestedClass.class ) .build(); final PackageDataModelOracle packageLoader = PackageDataModelOracleBuilder.newPackageOracleBuilder().setProjectOracle( projectLoader ).build(); //Emulate server-to-client conversions final Caller<IncrementalDataModelService> service = new MockIncrementalDataModelServiceCaller( packageLoader ); final AsyncPackageDataModelOracle oracle = new AsyncPackageDataModelOracleImpl( service, validatorInstance ); final PackageDataModelOracleBaselinePayload dataModel = new PackageDataModelOracleBaselinePayload(); dataModel.setPackageName( packageLoader.getPackageName() ); dataModel.setModelFields( packageLoader.getProjectModelFields() ); dataModel.setMethodInformation( packageLoader.getProjectMethodInformation() ); dataModel.setFieldParametersType( packageLoader.getProjectFieldParametersType() ); final HasImports hasImports = new HasImports() { final Imports imports = new Imports(); { imports.addImport( new Import( "org.kie.workbench.common.widgets.client.datamodel.testclasses.TestSuperClass.NestedClass" ) ); } @Override public Imports getImports() { return imports; } @Override public void setImports( Imports imports ) { } }; PackageDataModelOracleTestUtils.populateDataModelOracle( mock( Path.class ), hasImports, oracle, dataModel ); assertEquals( 1, oracle.getFactTypes().length ); assertEquals( "TestSuperClass.NestedClass", oracle.getFactTypes()[ 0 ] ); oracle.getFieldCompletions( "TestSuperClass.NestedClass", new Callback<ModelField[]>() { @Override public void callback( final ModelField[] fields ) { assertEquals( 2, fields.length ); } } ); oracle.getMethodInfos( "TestSuperClass.NestedClass", new Callback<List<MethodInfo>>() { @Override public void callback( final List<MethodInfo> methodInfos ) { assertNotNull( methodInfos ); assertEquals( 3, methodInfos.size() ); //Use SimpleName as the return type has been imported final MethodInfo mf0 = new MethodInfo( "methodDoingSomethingThatReturnsAnInnerClass", new ArrayList<String>(), "TestSuperClass.NestedClass", null, "TestSuperClass.NestedClass" ); //Use FQCN as the return type has not been imported final MethodInfo mf1 = new MethodInfo( "methodDoingSomethingWithNestedField1", new ArrayList<String>(), String.class, null, DataType.TYPE_STRING ); //Use FQCN as the return type has not been imported final MethodInfo mf2 = new MethodInfo( "methodDoingSomethingThatReturnsAnOuterClass", new ArrayList<String>(), Product.class.getName(), null, Product.class.getName() ); assertTrue( methodInfos.contains( mf0 ) ); assertTrue( methodInfos.contains( mf1 ) ); assertTrue( methodInfos.contains( mf2 ) ); } } ); } @Test public void testImportedNestedClassMethodInformationImportBothTypes() throws IOException { final ProjectDataModelOracle projectLoader = ProjectDataModelOracleBuilder.newProjectOracleBuilder() .addClass( TestSuperClass.NestedClass.class ) .build(); final PackageDataModelOracle packageLoader = PackageDataModelOracleBuilder.newPackageOracleBuilder().setProjectOracle( projectLoader ).build(); //Emulate server-to-client conversions final Caller<IncrementalDataModelService> service = new MockIncrementalDataModelServiceCaller( packageLoader ); final AsyncPackageDataModelOracle oracle = new AsyncPackageDataModelOracleImpl( service, validatorInstance ); final PackageDataModelOracleBaselinePayload dataModel = new PackageDataModelOracleBaselinePayload(); dataModel.setPackageName( packageLoader.getPackageName() ); dataModel.setModelFields( packageLoader.getProjectModelFields() ); dataModel.setMethodInformation( packageLoader.getProjectMethodInformation() ); dataModel.setFieldParametersType( packageLoader.getProjectFieldParametersType() ); final HasImports hasImports = new HasImports() { final Imports imports = new Imports(); { imports.addImport( new Import( "org.kie.workbench.common.widgets.client.datamodel.testclasses.TestSuperClass.NestedClass" ) ); imports.addImport( new Import( "org.kie.workbench.common.widgets.client.datamodel.testclasses.Product" ) ); } @Override public Imports getImports() { return imports; } @Override public void setImports( Imports imports ) { } }; PackageDataModelOracleTestUtils.populateDataModelOracle( mock( Path.class ), hasImports, oracle, dataModel ); assertEquals( 1, oracle.getFactTypes().length ); assertEquals( "TestSuperClass.NestedClass", oracle.getFactTypes()[ 0 ] ); oracle.getFieldCompletions( "TestSuperClass.NestedClass", new Callback<ModelField[]>() { @Override public void callback( final ModelField[] fields ) { assertEquals( 2, fields.length ); } } ); oracle.getMethodInfos( "TestSuperClass.NestedClass", new Callback<List<MethodInfo>>() { @Override public void callback( final List<MethodInfo> methodInfos ) { assertNotNull( methodInfos ); assertEquals( 3, methodInfos.size() ); //Use SimpleName as the return type has been imported final MethodInfo mf0 = new MethodInfo( "methodDoingSomethingThatReturnsAnInnerClass", new ArrayList<String>(), "TestSuperClass.NestedClass", null, "TestSuperClass.NestedClass" ); //Use SimpleName as the return type has been imported final MethodInfo mf1 = new MethodInfo( "methodDoingSomethingThatReturnsAnOuterClass", new ArrayList<String>(), Product.class.getSimpleName(), null, Product.class.getSimpleName() ); //Use FQCN as the return type has not been imported final MethodInfo mf2 = new MethodInfo( "methodDoingSomethingWithNestedField1", new ArrayList<String>(), String.class, null, DataType.TYPE_STRING ); assertTrue( methodInfos.contains( mf0 ) ); assertTrue( methodInfos.contains( mf1 ) ); assertTrue( methodInfos.contains( mf2 ) ); } } ); } @Test public void testImportedNestedClassMethodInformationInPackageScope() throws IOException { final ProjectDataModelOracle projectLoader = ProjectDataModelOracleBuilder.newProjectOracleBuilder() .addClass( TestSuperClass.NestedClass.class ) .build(); final PackageDataModelOracle packageLoader = PackageDataModelOracleBuilder.newPackageOracleBuilder( "org.kie.workbench.common.widgets.client.datamodel.testclasses" ).setProjectOracle( projectLoader ).build(); //Emulate server-to-client conversions final Caller<IncrementalDataModelService> service = new MockIncrementalDataModelServiceCaller( packageLoader ); final AsyncPackageDataModelOracle oracle = new AsyncPackageDataModelOracleImpl( service, validatorInstance ); final PackageDataModelOracleBaselinePayload dataModel = new PackageDataModelOracleBaselinePayload(); dataModel.setPackageName( packageLoader.getPackageName() ); dataModel.setModelFields( packageLoader.getProjectModelFields() ); dataModel.setMethodInformation( packageLoader.getProjectMethodInformation() ); dataModel.setFieldParametersType( packageLoader.getProjectFieldParametersType() ); final HasImports hasImports = new HasImports() { final Imports imports = new Imports(); @Override public Imports getImports() { return imports; } @Override public void setImports( Imports imports ) { } }; PackageDataModelOracleTestUtils.populateDataModelOracle( mock( Path.class ), hasImports, oracle, dataModel ); assertEquals( 1, oracle.getFactTypes().length ); assertEquals( "TestSuperClass.NestedClass", oracle.getFactTypes()[ 0 ] ); oracle.getFieldCompletions( "TestSuperClass.NestedClass", new Callback<ModelField[]>() { @Override public void callback( final ModelField[] fields ) { assertEquals( 2, fields.length ); } } ); oracle.getMethodInfos( "TestSuperClass.NestedClass", new Callback<List<MethodInfo>>() { @Override public void callback( final List<MethodInfo> methodInfos ) { assertNotNull( methodInfos ); assertEquals( 3, methodInfos.size() ); //Use SimpleName as the return type is in the same package represented by the Oracle final MethodInfo mf0 = new MethodInfo( "methodDoingSomethingThatReturnsAnInnerClass", new ArrayList<String>(), "TestSuperClass.NestedClass", null, "TestSuperClass.NestedClass" ); //Use SimpleName as the return type is in the same package represented by the Oracle final MethodInfo mf1 = new MethodInfo( "methodDoingSomethingThatReturnsAnOuterClass", new ArrayList<String>(), Product.class.getSimpleName(), null, Product.class.getSimpleName() ); //Use FQCN as the return type has not been imported final MethodInfo mf2 = new MethodInfo( "methodDoingSomethingWithNestedField1", new ArrayList<String>(), String.class, null, DataType.TYPE_STRING ); assertTrue( methodInfos.contains( mf0 ) ); assertTrue( methodInfos.contains( mf1 ) ); assertTrue( methodInfos.contains( mf2 ) ); } } ); } @Test public void testDirectRecursion() throws Exception { //Build ProjectDMO final ProjectDataModelOracleBuilder projectBuilder = ProjectDataModelOracleBuilder.newProjectOracleBuilder(); final ProjectDataModelOracleImpl projectLoader = new ProjectDataModelOracleImpl(); final ClassFactBuilder cb = new ClassFactBuilder( projectBuilder, new HashMap<String, FactBuilder>(), TestDirectRecursionClass.class, false, TypeSource.JAVA_PROJECT ); cb.build( projectLoader ); //Build PackageDMO final PackageDataModelOracleBuilder packageBuilder = PackageDataModelOracleBuilder.newPackageOracleBuilder( "org.kie.workbench.common.widgets.client.datamodel.testclasses" ); packageBuilder.setProjectOracle( projectLoader ); final PackageDataModelOracle packageLoader = packageBuilder.build(); //Emulate server-to-client conversions final Caller<IncrementalDataModelService> service = new MockIncrementalDataModelServiceCaller( packageLoader ); final AsyncPackageDataModelOracle oracle = new AsyncPackageDataModelOracleImpl( service, validatorInstance ); final PackageDataModelOracleBaselinePayload dataModel = new PackageDataModelOracleBaselinePayload(); dataModel.setPackageName( packageLoader.getPackageName() ); dataModel.setModelFields( packageLoader.getProjectModelFields() ); dataModel.setTypeAnnotations( packageLoader.getProjectTypeAnnotations() ); dataModel.setTypeFieldsAnnotations( packageLoader.getProjectTypeFieldsAnnotations() ); PackageDataModelOracleTestUtils.populateDataModelOracle( mock( Path.class ), new MockHasImports(), oracle, dataModel ); assertEquals( 1, oracle.getFactTypes().length ); assertEquals( "TestDirectRecursionClass", oracle.getFactTypes()[ 0 ] ); oracle.getFieldCompletions( "TestDirectRecursionClass", new Callback<ModelField[]>() { @Override public void callback( final ModelField[] result ) { assertEquals( 2, result.length ); assertEquals( "TestDirectRecursionClass", result[ 0 ].getClassName() ); assertEquals( "recursiveField", result[ 0 ].getName() ); assertEquals( "TestDirectRecursionClass", result[ 1 ].getClassName() ); assertEquals( DataType.TYPE_THIS, result[ 1 ].getName() ); } } ); } @Test public void testIndirectRecursion() throws Exception { //Build ProjectDMO final ProjectDataModelOracleBuilder projectBuilder = ProjectDataModelOracleBuilder.newProjectOracleBuilder(); final ProjectDataModelOracleImpl projectLoader = new ProjectDataModelOracleImpl(); final ClassFactBuilder cb = new ClassFactBuilder( projectBuilder, new HashMap<String, FactBuilder>(), TestIndirectRecursionClassA.class, false, TypeSource.JAVA_PROJECT ); cb.build( projectLoader ); //Build PackageDMO final PackageDataModelOracleBuilder packageBuilder = PackageDataModelOracleBuilder.newPackageOracleBuilder( "org.kie.workbench.common.widgets.client.datamodel.testclasses" ); packageBuilder.setProjectOracle( projectLoader ); final PackageDataModelOracle packageLoader = packageBuilder.build(); //Emulate server-to-client conversions final Caller<IncrementalDataModelService> service = new MockIncrementalDataModelServiceCaller( packageLoader ); final AsyncPackageDataModelOracle oracle = new AsyncPackageDataModelOracleImpl( service, validatorInstance ); final PackageDataModelOracleBaselinePayload dataModel = new PackageDataModelOracleBaselinePayload(); dataModel.setPackageName( packageLoader.getPackageName() ); dataModel.setModelFields( packageLoader.getProjectModelFields() ); dataModel.setTypeAnnotations( packageLoader.getProjectTypeAnnotations() ); dataModel.setTypeFieldsAnnotations( packageLoader.getProjectTypeFieldsAnnotations() ); PackageDataModelOracleTestUtils.populateDataModelOracle( mock( Path.class ), new MockHasImports(), oracle, dataModel ); assertEquals( 1, oracle.getFactTypes().length ); assertEquals( "TestIndirectRecursionClassA", oracle.getFactTypes()[ 0 ] ); oracle.getFieldCompletions( "TestIndirectRecursionClassA", new Callback<ModelField[]>() { @Override public void callback( final ModelField[] result ) { assertEquals( 2, result.length ); assertEquals( "TestIndirectRecursionClassB", result[ 0 ].getClassName() ); assertEquals( "recursiveField", result[ 0 ].getName() ); assertEquals( "TestIndirectRecursionClassA", result[ 1 ].getClassName() ); assertEquals( DataType.TYPE_THIS, result[ 1 ].getName() ); } } ); } }