Uploaded image for project: 'Drools'
  1. Drools
  2. DROOLS-6061

Rewrite TypeDeclarationMergingTest

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Unresolved
    • Icon: Major Major
    • None
    • 7.50.0.Final
    • core engine
    • None
    • Undefined
    • NEW
    • NEW
    • ---
    • ---

      When I rewrite TypeDeclarationMergingTest with new APIs, I get an assertion failure even with standard-drl. It's likely caused by KnowledgeBuilderImpl.getTypeDeclaration() behavior.

      This change in KieUtil might be a clue (with createKieModuleModel(), standard-drl passed the test but it doesn't seem to be right):

           public static KieBuilder getKieBuilderFromResources(final KieBaseTestConfiguration kieBaseTestConfiguration,
                                                               final boolean failIfBuildError, final Resource... resources) {
      -        final KieModuleModel kieModuleModel = createKieModuleModel(kieBaseTestConfiguration.useAlphaNetworkCompiler());
      +        final KieModuleModel kieModuleModel =
      +                getKieModuleModel(kieBaseTestConfiguration, KieSessionTestConfiguration.STATEFUL_REALTIME, new HashMap<>());
      
      @RunWith(Parameterized.class)
      public class TypeDeclarationMergingTest {
      
          private final KieBaseTestConfiguration kieBaseTestConfiguration;
      
          public TypeDeclarationMergingTest(final KieBaseTestConfiguration kieBaseTestConfiguration) {
              this.kieBaseTestConfiguration = kieBaseTestConfiguration;
          }
      
          @Parameterized.Parameters(name = "KieBase type={0}")
          public static Collection<Object[]> getParameters() {
           // TODO: EM failed with testInheritExitenceFromParentClass etc. Not fully sure if the test change is valid. File JIRAs
              return TestParametersUtil.getKieBaseStreamConfigurations(false);
          }
      
          @Test
          public void testMask() {
              TypeDeclaration tdeclr = new TypeDeclaration(CImpl.class.getName() );
              assertEquals( 0, tdeclr.getSetMask() );
      
              tdeclr.setRole( Role.Type.EVENT );
              assertEquals( TypeDeclaration.ROLE_BIT, tdeclr.getSetMask() & TypeDeclaration.ROLE_BIT );
              assertFalse( TypeDeclaration.TYPESAFE_BIT == ( tdeclr.getSetMask() & TypeDeclaration.TYPESAFE_BIT ) );
              assertFalse( TypeDeclaration.FORMAT_BIT == ( tdeclr.getSetMask() & TypeDeclaration.FORMAT_BIT ) );
              
              tdeclr.setTypesafe( false );
              assertEquals( TypeDeclaration.ROLE_BIT, tdeclr.getSetMask() & TypeDeclaration.ROLE_BIT );
              assertEquals( TypeDeclaration.TYPESAFE_BIT, tdeclr.getSetMask() & TypeDeclaration.TYPESAFE_BIT );
              assertFalse( TypeDeclaration.FORMAT_BIT == ( tdeclr.getSetMask() & TypeDeclaration.FORMAT_BIT ) );
              
              tdeclr = new TypeDeclaration(CImpl.class.getName() );
              tdeclr.setTypesafe( true );
              assertFalse( TypeDeclaration.ROLE_BIT == ( tdeclr.getSetMask() & TypeDeclaration.ROLE_BIT ) );
              assertEquals( TypeDeclaration.TYPESAFE_BIT, tdeclr.getSetMask() & TypeDeclaration.TYPESAFE_BIT );
              assertFalse( TypeDeclaration.FORMAT_BIT == ( tdeclr.getSetMask() & TypeDeclaration.FORMAT_BIT ) );
              
              tdeclr.setFormat( Format.POJO );
              assertFalse( TypeDeclaration.ROLE_BIT == ( tdeclr.getSetMask() & TypeDeclaration.ROLE_BIT ) );
              assertEquals( TypeDeclaration.TYPESAFE_BIT, tdeclr.getSetMask() & TypeDeclaration.TYPESAFE_BIT );
              assertEquals( TypeDeclaration.FORMAT_BIT, tdeclr.getSetMask() & TypeDeclaration.FORMAT_BIT );
          }
          
          @Test
          public void testOverrideFromParentClass() {
              // inherits role, but not typesafe
              String str = ""+
                 "package org.drools.mvel.compiler.test \n" +
                 "global java.util.List list \n" +
                 "declare " + CImpl.class.getCanonicalName() + "\n" +
                 "    @typesafe(true)\n" +
                 "    @role(event)\n" +
                 "end\n" +           
                 "declare " + DImpl.class.getCanonicalName() + "\n" +
                 "    @typesafe(false)\n" +
                 "end\n" +
                 "rule r1\n" +
                 "when\n " +
                 "  DImpl()\n" +
                 "then\n" +
                 "end\n";
              KnowledgeBuilderImpl builder = getPackageBuilder( str );
              TypeDeclaration tdecl = builder.getTypeDeclaration( DImpl.class );
              assertEquals( false, tdecl.isTypesafe() );
              assertEquals( Role.Type.EVENT, tdecl.getRole() );
          }
          
          @Test
          public void testInheritNoneExitenceFromParentClass() {
              // inherits role and typesafe
              String str = ""+
                 "package org.drools.mvel.compiler.test \n" +
                 "global java.util.List list \n" +
                 "declare " + CImpl.class.getCanonicalName() + "\n" +
                 "    @typesafe(true)\n" +
                 "    @role(event)\n" +           
                 "end\n";
      
              KnowledgeBuilderImpl builder = getPackageBuilder( str );
              TypeDeclaration tdecl = builder.getTypeDeclaration( DImpl.class );
              assertEquals( true, tdecl.isTypesafe() );
              assertEquals( Role.Type.EVENT, tdecl.getRole() );
          }    
          
          @Test
          public void testInheritExitenceFromParentClass() {
              // inherits role and typesafe
              String str = ""+
                 "package org.drools.mvel.compiler.test \n" +
                 "global java.util.List list \n" +
                 "declare " + CImpl.class.getCanonicalName() + "\n" +
                 "    @typesafe(true)\n" +
                 "    @role(event)\n" +              
                 "end\n" +
                 "declare " + DImpl.class.getCanonicalName() + "\n" +
                 "end\n";
      
              KnowledgeBuilderImpl builder = getPackageBuilder( str );
              TypeDeclaration tdecl = builder.getTypeDeclaration( DImpl.class );
              assertEquals( true, tdecl.isTypesafe() );
              assertEquals( Role.Type.EVENT, tdecl.getRole() );
          }    
          
          @Test
          public void testOverrideFromParentInterface() {
              // inherits role but not typesafe
              String str = ""+
                 "package org.drools.mvel.compiler.test \n" +
                 "global java.util.List list \n" +
                 "declare " + IB.class.getCanonicalName() + "\n" +
                 "    @typesafe(true)\n" +
                 "    @role(event)\n" +              
                 "end\n" +           
                 "declare " + DImpl.class.getCanonicalName() + "\n" +
                 "    @typesafe(false)\n" +
                 "end\n";
              KnowledgeBuilderImpl builder = getPackageBuilder( str );
              TypeDeclaration tdecl = builder.getTypeDeclaration( DImpl.class );
              assertEquals( false, tdecl.isTypesafe() );
              assertEquals( Role.Type.EVENT, tdecl.getRole() );
          }
          
          @Test
          public void testOverrideFromDeeperParentInterface() {
              // inherits role but not typesafe        
              String str = ""+
                 "package org.drools.mvel.compiler.test \n" +
                 "global java.util.List list \n" +
                 "declare " + IA.class.getCanonicalName() + "\n" +
                 "    @typesafe(true)\n" +
                 "    @role(event)\n" +              
                 "end\n" +           
                 "declare " + DImpl.class.getCanonicalName() + "\n" +
                 "    @typesafe(false)\n" +
                 "end\n";
              KnowledgeBuilderImpl builder = getPackageBuilder( str );
              TypeDeclaration tdecl = builder.getTypeDeclaration( DImpl.class );
              assertEquals( false, tdecl.isTypesafe() );
              assertEquals( Role.Type.EVENT, tdecl.getRole() );
          }    
          
          @Test
          public void testOverrideFromDeeperHierarchyParentInterface() {
              // inherits role from and typesafe from the other      
              String str = ""+
                 "package org.drools.mvel.compiler.test \n" +
                 "global java.util.List list \n" +
                 "declare " + IA.class.getCanonicalName() + "\n" +
                 "    @typesafe(true)\n" +
                 "    @role(event)\n" +              
                 "end\n" +         
                 "declare " + IB.class.getCanonicalName() + "\n" +
                 "    @role(fact)\n" +              
                 "end\n" +             
                 "declare " + DImpl.class.getCanonicalName() + "\n" +
                 "end\n";
              KnowledgeBuilderImpl builder = getPackageBuilder( str );
              TypeDeclaration tdecl = builder.getTypeDeclaration( DImpl.class );
              assertEquals( true, tdecl.isTypesafe() );
              assertEquals( Role.Type.FACT, tdecl.getRole() );
          }        
          
          @Test
          public void testInheritNoneExitenceFromParentInterface() {
              // inherits role and typesafe  
              String str = ""+
                 "package org.drools.mvel.compiler.test \n" +
                 "global java.util.List list \n" +
                 "declare " + IB.class.getCanonicalName() + "\n" +
                 "    @typesafe(true)\n" +
                 "    @role(event)\n" +              
                 "end\n";
      
              KnowledgeBuilderImpl builder = getPackageBuilder( str );
              TypeDeclaration tdecl = builder.getTypeDeclaration( DImpl.class );
              assertEquals( true, tdecl.isTypesafe() );
              assertEquals( Role.Type.EVENT, tdecl.getRole() );
          }    
          
          @Test
          public void testInheritExitenceFromParentInterface() {
              // inherits role and typesafe  
              String str = ""+
                 "package org.drools.mvel.compiler.test \n" +
                 "global java.util.List list \n" +
                 "declare " + IB.class.getCanonicalName() + "\n" +
                 "    @typesafe(true)\n" +
                 "    @role(event)\n" +           
                 "end\n" +
                 "declare " + DImpl.class.getCanonicalName() + "\n" +
                 "end\n";
      
              KnowledgeBuilderImpl builder = getPackageBuilder( str );
              TypeDeclaration tdecl = builder.getTypeDeclaration( DImpl.class );
              assertEquals( true, tdecl.isTypesafe() );
              assertEquals( Role.Type.EVENT, tdecl.getRole() );
          }     
          
          @Test
          public void testOverrideFromMixedHierarchyParentInterface() {
              // inherits role from and typesafe from the other      
              String str = ""+
                 "package org.drools.mvel.compiler.test \n" +
                 "global java.util.List list \n" +
                 "declare " + IA.class.getCanonicalName() + "\n" +
                 "    @typesafe(true)\n" +
                 "    @role(event)\n" +              
                 "end\n" +         
                 "declare " + CImpl.class.getCanonicalName() + "\n" +
                 "    @role(fact)\n" +              
                 "end\n" +             
                 "declare " + DImpl.class.getCanonicalName() + "\n" +
                 "end\n";
              KnowledgeBuilderImpl builder = getPackageBuilder( str );
              TypeDeclaration tdecl = builder.getTypeDeclaration( DImpl.class );
              assertEquals( true, tdecl.isTypesafe() );
              assertEquals( Role.Type.FACT, tdecl.getRole() );
          }      
      
          private KnowledgeBuilderImpl getPackageBuilder(String str) {
              KieBuilder kieBuilder = KieUtil.getKieBuilderFromDrls(kieBaseTestConfiguration, true, str);
              InternalKieModule kieModule = (InternalKieModule)kieBuilder.getKieModule();
              return (KnowledgeBuilderImpl)kieModule.getKnowledgeBuilderForKieBase("defaultKieBase");
          }
      
          @Test
          public void testNotOverwritePOJOMetadata() {
              final String eventClassName = PositionAnnotatedEvent.class.getCanonicalName();
              // should add metadata to metadata already defined in POJO
              String str =
                      "package org.drools.mvel.compiler.test \n" +
                      "declare " + eventClassName + "\n" +
                      " @role(event)\n" +
                      "end \n" +
                      "rule 'sample rule' \n" +
                      "when \n" +
                      " " + eventClassName + "( 'value1', 'value2'; ) \n" +
                      "then \n" +
                      "end \n";
      
              KieBuilder kieBuilder = null;
              try {
                  kieBuilder = KieUtil.getKieBuilderFromDrls(kieBaseTestConfiguration, false, str);
              } catch (IndexOutOfBoundsException e) {
                  final String msg = e.getMessage();
                  if ( "Error trying to access field at position 0".equals( msg ) ) {
                      fail( "@Position declared in POJO was ignored." );
                  } else {
                      fail( "Check the test, unexpected error message: " + msg );
                  }
              }
              List<Message> errors = kieBuilder.getResults().getMessages(Message.Level.ERROR);
              assertFalse( "Check the test, unexpected error message: "
                      + errors, !errors.isEmpty());
          }
      
          public static class PositionAnnotatedEvent {
      
              @Position(1)
              private String arg1;
      
              @Position(0)
              private String arg0;
      
              public String getArg1() {
                  return arg1;
              }
      
              public String getArg0() {
                  return arg0;
              }
      
              public void setArg1( String arg1 ) {
                  this.arg1 = arg1;
              }
      
              public void setArg0( String arg0 ) {
                  this.arg0 = arg0;
              }
          }
      }
      

              rhn-support-tkobayas Toshiya Kobayashi
              rhn-support-tkobayas Toshiya Kobayashi
              Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

                Created:
                Updated: