[rules-dev] writing unit tests

Leonardo Gomes leonardo.f.gomes at gmail.com
Tue May 17 03:44:54 EDT 2011


I totally agree, except for the inline DRL :)

If it's a big enough DRL (let's say +3 rules), isn't it easier to have
something on the lines of the existing integration tests inside
drools-compiler? With the drl in the resources folder.

I know that people say "a test is not a unit test if it touches the
filesystem", but as long as Java doesn't support a proper way of inlining
XML </> (or DRL in this case, or different text formats in the general
case), like Scala does, I personally think it's easier and more readable to
have a separate file.

My 5 cents.

Leo.


On Tue, May 17, 2011 at 4:16 AM, Mark Proctor <mproctor at codehaus.org> wrote:

> It's great when people attach unit tests to jiras, it would be ever
> better if they are just cut nad paste single files, rather than entire
> projects, which take more time for us to fiddle with. Also please do try
> and pair your actual program "main" examples down to minimal unit tests
> of the actual problem. If you suspect the problem is MVEL, then please
> do a minimal MVEL test, without Drools.
>
> Put static classes in the same file, put rules in a concatenated string.
> This means testing is as easy as cut and paste for us, and it can be
> easily added to existing test classes. For example, from MiscTest.
>
>
>     public static class A {
>         private String field1;
>         private String field2;
>
>         public A(String field1,
>                  String field2) {
>             this.field1 = field1;
>             this.field2 = field2;
>         }
>
>         public String getField1() {
>             return field1;
>         }
>
>         public void setField1( String field1 ) {
>             this.field1 = field1;
>         }
>
>         public String getField2() {
>             return field2;
>         }
>
>         public void setField2( String field2 ) {
>             this.field2 = field2;
>         }
>
>         public String toString() {
>             return "A) " + field1 + ":" + field2;
>         }
>     }
>
>     @Test
>     public void testExistsIterativeModifyBug() {
>         // JBRULES-2809
>         // This bug occurs when a tuple is modified, the remove/add
> puts it onto the memory end
>         // However before this was done it would attempt to find the
> next tuple, starting from itself
>         // This meant it would just re-add itself as the blocker, but
> then be moved to end of the memory
>         // If this tuple was then removed or changed, the blocked was
> unable to check previous tuples.
>
>         String str = "";
>         str += "package org.simple \n";
>         str += "import " + A.class.getCanonicalName() + "\n";
>         str += "global java.util.List list \n";
>         str += "rule xxx \n";
>         str += "when \n";
>         str += "  $f1 : A() \n";
>         str += "    exists A(this != $f1, eval(field2 ==
> $f1.getField2())) \n";
>         str += "    eval( !$f1.getField1().equals(\"1\") ) \n";
>         str += "then \n";
>         str += "  list.add($f1); \n";
>         str += "end  \n";
>
>         KnowledgeBase kbase = loadKnowledgeBaseFromString( str );
>
>         StatefulKnowledgeSession ksession =
> kbase.newStatefulKnowledgeSession();
>         List list = new ArrayList();
>         ksession.setGlobal( "list",
>                             list );
>
>         A a1 = new A( "2",
>                       "2" );
>         A a2 = new A( "1",
>                       "2" );
>         A a3 = new A( "1",
>                       "2" );
>
>         FactHandle fa1 = (FactHandle) ksession.insert( a1 );
>         FactHandle fa2 = (FactHandle) ksession.insert( a2 );
>         FactHandle fa3 = (FactHandle) ksession.insert( a3 );
>
>         // a2, a3 are blocked by a1
>         // modify a1, so that a1,a3 are now blocked by a2
>         a1.setField2( "1" ); // Do
>         ksession.update( fa1,
>                          a1 );
>         a1.setField2( "2" ); // Undo
>         ksession.update( fa1,
>                          a1 );
>
>         // modify a2, so that a1,a2 are now blocked by a3
>         a2.setField2( "1" ); // Do
>         ksession.update( fa2,
>                          a2 );
>         a2.setField2( "2" ); // Undo
>         ksession.update( fa2,
>                          a2 );
>
>         // modify a3 to cycle, so that it goes on the memory end, but
> in a previous bug still blocked a1
>         ksession.update( fa3,
>                          a3 );
>
>         a3.setField2( "1" ); // Do
>         ksession.update( fa3,
>                          a3 );
>         ksession.fireAllRules();
>         assertEquals( 1,
>                       list.size() ); // a2 should still be blocked by
> a1, but bug from previous update hanging onto blocked
>
>         ksession.dispose();
>     }
>
> _______________________________________________
> rules-dev mailing list
> rules-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-dev/attachments/20110517/8122c4e1/attachment.html 


More information about the rules-dev mailing list