[jboss-svn-commits] JBL Code SVN: r30589 - labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Dec 11 02:07:28 EST 2009


Author: mark.proctor at jboss.com
Date: 2009-12-11 02:07:28 -0500 (Fri, 11 Dec 2009)
New Revision: 30589

Added:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/TimerAndCalendarTest.java
Modified:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ExecutionFlowControlTest.java
Log:
JBRULES-1944 Timer support
-moved tests out to own file

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ExecutionFlowControlTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ExecutionFlowControlTest.java	2009-12-11 07:01:49 UTC (rev 30588)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ExecutionFlowControlTest.java	2009-12-11 07:07:28 UTC (rev 30589)
@@ -748,902 +748,19 @@
 
     }
 
-    public void testDuration() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_Duration.drl" ) ) );
-        final Package pkg = builder.getPackage();
-
-        RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        ruleBase = SerializationHelper.serializeObject( ruleBase );
-        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
-
-        final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
-                                 list );
-
-        final Cheese brie = new Cheese( "brie",
-                                        12 );
-        final FactHandle brieHandle = workingMemory.insert( brie );
-
-        workingMemory.fireAllRules();
-
-        // now check for update
-        assertEquals( 0,
-                      list.size() );
-
-        // sleep for 300ms
-        Thread.sleep( 300 );
-
-        // now check for update
-        assertEquals( 1,
-                      list.size() );
-
-    }
-
     public void testInsertRetractNoloop() throws Exception {
         // read in the source
         final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_Insert_Retract_Noloop.drl" ) );
         RuleBase ruleBase = loadRuleBase( reader );
-
+    
         ruleBase = SerializationHelper.serializeObject( ruleBase );
         final WorkingMemory wm = ruleBase.newStatefulSession();
         wm.insert( new Cheese( "stilton",
                                15 ) );
-
+    
         wm.fireAllRules();
     }
 
-    public void testDurationWithNoLoop() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_Duration_with_NoLoop.drl" ) ) );
-        final Package pkg = builder.getPackage();
-
-        RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        ruleBase = SerializationHelper.serializeObject( ruleBase );
-        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
-
-        final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
-                                 list );
-
-        final Cheese brie = new Cheese( "brie",
-                                        12 );
-        final FactHandle brieHandle = workingMemory.insert( brie );
-
-        workingMemory.fireAllRules();
-
-        // now check for update
-        assertEquals( 0,
-                      list.size() );
-
-        // sleep for 300ms
-        Thread.sleep( 300 );
-
-        // now check for update
-        assertEquals( 1,
-                      list.size() );
-    }
-
-    public void testDurationMemoryLeakonRepeatedUpdate() throws Exception {
-        String str = "";
-        str += "package org.drools.test\n";
-        str += "import org.drools.Alarm\n";
-        str += "global java.util.List list;";
-        str += "rule \"COMPTEUR\"\n";
-        str += "  timer 50\n";
-        str += "  when\n";
-        str += "    $alarm : Alarm( number < 5 )\n";
-        str += "  then\n";
-        str += "    $alarm.incrementNumber();\n";
-        str += "    list.add( $alarm );\n";
-        str += "    update($alarm);\n";
-        str += "end\n";
-
-        PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new StringReader( str ) );
-
-        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
-        ruleBase.addPackage( builder.getPackage() );
-
-        StatefulSession session = ruleBase.newStatefulSession();
-        List list = new ArrayList();
-        session.setGlobal( "list",
-                           list );
-        session.insert( new Alarm() );
-
-        session.fireAllRules();
-
-        Thread.sleep( 1000 );
-
-        assertEquals( 5,
-                      list.size() );
-        assertEquals( 0,
-                      session.getAgenda().getScheduledActivations().length );
-    }
-    
-    public void testNoProtocolIntervalTimer() throws Exception {
-        String str = "";
-        str += "package org.simple \n";
-        str += "global java.util.List list \n";
-        str += "rule xxx \n";
-        str += "  duration (30s 10s) ";
-        str += "when \n";
-        str += "then \n";
-        str += "  list.add(\"fired\"); \n";
-        str += "end  \n";
-
-        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
-                      ResourceType.DRL );
-
-        if ( kbuilder.hasErrors() ) {
-            System.out.println( kbuilder.getErrors() );
-            assertTrue( kbuilder.hasErrors() );
-        }
-
-        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
-        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
-
-        KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
-        conf.setOption( ClockTypeOption.get( "pseudo" ) );
-        
-        List list = new ArrayList();
-        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession( conf, null );
-        PseudoClockScheduler timeService = ( PseudoClockScheduler ) ksession.getSessionClock();
-        timeService.advanceTime( new Date().getTime(), TimeUnit.MILLISECONDS );
-        
-        ksession.setGlobal( "list", list );
-        
-        ksession.fireAllRules();        
-        assertEquals( 0, list.size() );
-        
-        timeService.advanceTime( 20, TimeUnit.SECONDS );
-        ksession.fireAllRules();        
-        assertEquals( 0, list.size() );
-        
-        timeService.advanceTime( 15, TimeUnit.SECONDS );
-        ksession.fireAllRules();        
-        assertEquals( 1, list.size() );   
-        
-        timeService.advanceTime( 3, TimeUnit.SECONDS );
-        ksession.fireAllRules();        
-        assertEquals( 1, list.size() );  
-        
-        timeService.advanceTime( 2, TimeUnit.SECONDS );
-        ksession.fireAllRules();        
-        assertEquals( 2, list.size() ); 
-        
-        timeService.advanceTime( 10, TimeUnit.SECONDS );
-        ksession.fireAllRules();        
-        assertEquals( 3, list.size() );                   
-    }
-    
-    public void testIntervalTimer() throws Exception {
-        String str = "";
-        str += "package org.simple \n";
-        str += "global java.util.List list \n";
-        str += "rule xxx \n";
-        str += "  timer (int:30s 10s) ";
-        str += "when \n";
-        str += "then \n";
-        str += "  list.add(\"fired\"); \n";
-        str += "end  \n";
-
-        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
-                      ResourceType.DRL );
-
-        if ( kbuilder.hasErrors() ) {
-            System.out.println( kbuilder.getErrors() );
-            assertTrue( kbuilder.hasErrors() );
-        }
-
-        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
-        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
-
-        KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
-        conf.setOption( ClockTypeOption.get( "pseudo" ) );
-        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession( conf, null );
-        
-        List list = new ArrayList();
-
-        PseudoClockScheduler timeService = ( PseudoClockScheduler ) ksession.getSessionClock();
-        timeService.advanceTime( new Date().getTime(), TimeUnit.MILLISECONDS );
-        
-        ksession.setGlobal( "list", list );
-        
-        ksession.fireAllRules();        
-        assertEquals( 0, list.size() );
-        
-        timeService.advanceTime( 20, TimeUnit.SECONDS );
-        ksession.fireAllRules();        
-        assertEquals( 0, list.size() );
-        
-        timeService.advanceTime( 15, TimeUnit.SECONDS );
-        ksession.fireAllRules();        
-        assertEquals( 1, list.size() );   
-        
-        timeService.advanceTime( 3, TimeUnit.SECONDS );
-        ksession.fireAllRules();        
-        assertEquals( 1, list.size() );  
-        
-        timeService.advanceTime( 2, TimeUnit.SECONDS );
-        ksession.fireAllRules();        
-        assertEquals( 2, list.size() ); 
-        
-        timeService.advanceTime( 10, TimeUnit.SECONDS );
-        ksession.fireAllRules();        
-        assertEquals( 3, list.size() );                   
-    }    
-    
-    public void testCronTimer() throws Exception {
-        String str = "";
-        str += "package org.simple \n";
-        str += "global java.util.List list \n";
-        str += "rule xxx \n";
-        str += "  timer (cron:15 * * * * ?) ";
-        str += "when \n";
-        str += "then \n";
-        str += "  list.add(\"fired\"); \n";
-        str += "end  \n";
-
-        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
-                      ResourceType.DRL );
-
-        if ( kbuilder.hasErrors() ) {
-            System.out.println( kbuilder.getErrors() );
-            assertTrue( kbuilder.hasErrors() );
-        }
-
-        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
-        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
-
-        KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
-        conf.setOption( ClockTypeOption.get( "pseudo" ) );
-        
-        List list = new ArrayList();
-        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession( conf, null );
-        PseudoClockScheduler timeService = ( PseudoClockScheduler ) ksession.getSessionClock();
-        DateFormat df = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss.SSSZ" );
-        Date date = df.parse( "2009-01-01T00:00:00.000-0000" );
-        
-        timeService.advanceTime( date.getTime(), TimeUnit.MILLISECONDS );
-        
-        ksession.setGlobal( "list", list );
-  
-        ksession.fireAllRules();        
-        assertEquals( 0, list.size() ); 
-                
-        timeService.advanceTime( 10, TimeUnit.SECONDS );
-        ksession.fireAllRules();        
-        assertEquals( 0, list.size() ); 
-                 
-        timeService.advanceTime( 10, TimeUnit.SECONDS );            
-        ksession.fireAllRules();        
-        assertEquals( 1, list.size() ); 
-        
-        timeService.advanceTime( 30, TimeUnit.SECONDS );   
-        ksession.fireAllRules();        
-        assertEquals( 1, list.size() ); 
-        
-        timeService.advanceTime( 30, TimeUnit.SECONDS );  
-        ksession.fireAllRules();        
-        assertEquals( 2, list.size() );                   
-    }        
-    
-    public void testCalendarNormalRuleSingleCalendar() throws Exception {
-        String str = "";
-        str += "package org.simple \n";
-        str += "global java.util.List list \n";
-        str += "rule xxx \n";
-        str += "  calendars \"cal1\"\n";
-        str += "when \n";
-        str += "  String()\n";
-        str += "then \n";
-        str += "  list.add(\"fired\"); \n";
-        str += "end  \n";
-
-        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
-                      ResourceType.DRL );
-
-        if ( kbuilder.hasErrors() ) {
-            System.out.println( kbuilder.getErrors() );
-            assertTrue( kbuilder.hasErrors() );
-        }
-
-        Calendar calFalse = new Calendar() {
-            public boolean isTimeIncluded(long timestamp) {
-                return false;
-            }           
-        };
-        
-        Calendar calTrue = new Calendar() {
-            public boolean isTimeIncluded(long timestamp) {
-                return true;
-            }           
-        };        
-        
-        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
-        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );              
-
-        KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
-        conf.setOption( ClockTypeOption.get( "pseudo" ) );
-        
-        List list = new ArrayList();
-        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession( conf, null );
-        PseudoClockScheduler timeService = ( PseudoClockScheduler ) ksession.getSessionClock();
-        DateFormat df = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss.SSSZ" );
-        Date date = df.parse( "2009-01-01T00:00:00.000-0000" );
-        
-        ksession.getCalendars().set( "cal1", calTrue );
-        
-        timeService.advanceTime( date.getTime(), TimeUnit.MILLISECONDS );     
-        ksession.setGlobal( "list", list );        
-        ksession.insert( "o1" );        
-        ksession.fireAllRules();        
-        assertEquals( 1, list.size() ); 
-                
-        timeService.advanceTime( 10, TimeUnit.SECONDS );
-        ksession.insert( "o2" );
-        ksession.fireAllRules();        
-        assertEquals( 2, list.size() ); 
-        
-        ksession.getCalendars().set( "cal1", calFalse );        
-        timeService.advanceTime( 10, TimeUnit.SECONDS );        
-        ksession.insert( "o3" );
-        ksession.fireAllRules();        
-        assertEquals( 2, list.size() ); 
-        
-        ksession.getCalendars().set( "cal1", calTrue );        
-        timeService.advanceTime( 30, TimeUnit.SECONDS );
-        ksession.insert( "o4" );
-        ksession.fireAllRules();        
-        assertEquals( 3, list.size() );                    
-    }   
-    
-    public void testCalendarNormalRuleMultipleCalendars() throws Exception {
-        String str = "";
-        str += "package org.simple \n";
-        str += "global java.util.List list \n";
-        str += "rule xxx \n";
-        str += "  calendars \"cal1\", \"cal2\"\n";      
-        str += "when \n";
-        str += "  String()\n";
-        str += "then \n";
-        str += "  list.add(\"fired\"); \n";
-        str += "end  \n";
-
-        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
-                      ResourceType.DRL );
-
-        if ( kbuilder.hasErrors() ) {
-            System.out.println( kbuilder.getErrors() );
-            assertTrue( kbuilder.hasErrors() );
-        }
-
-        Calendar calFalse = new Calendar() {
-            public boolean isTimeIncluded(long timestamp) {
-                return false;
-            }           
-        };
-        
-        Calendar calTrue = new Calendar() {
-            public boolean isTimeIncluded(long timestamp) {
-                return true;
-            }           
-        };        
-        
-        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
-        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );              
-
-        KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
-        conf.setOption( ClockTypeOption.get( "pseudo" ) );
-        
-        List list = new ArrayList();
-        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession( conf, null );
-        PseudoClockScheduler timeService = ( PseudoClockScheduler ) ksession.getSessionClock();
-        DateFormat df = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss.SSSZ" );
-        Date date = df.parse( "2009-01-01T00:00:00.000-0000" );
-        
-        ksession.getCalendars().set( "cal1", calTrue );
-        ksession.getCalendars().set( "cal2", calTrue );
-        
-        timeService.advanceTime( date.getTime(), TimeUnit.MILLISECONDS );     
-        ksession.setGlobal( "list", list );        
-        ksession.insert( "o1" );        
-        ksession.fireAllRules();        
-        assertEquals( 1, list.size() ); 
-
-        ksession.getCalendars().set( "cal2", calFalse );        
-        timeService.advanceTime( 10, TimeUnit.SECONDS );
-        ksession.insert( "o2" );
-        ksession.fireAllRules();        
-        assertEquals( 1, list.size() ); 
-                
-        ksession.getCalendars().set( "cal1", calFalse );            
-        timeService.advanceTime( 10, TimeUnit.SECONDS );    
-        ksession.insert( "o3" );
-        ksession.fireAllRules();        
-        assertEquals( 1, list.size() ); 
-        
-        ksession.getCalendars().set( "cal1", calTrue );
-        ksession.getCalendars().set( "cal2", calTrue );        
-        timeService.advanceTime( 30, TimeUnit.SECONDS );
-        ksession.insert( "o4" );
-        ksession.fireAllRules();        
-        assertEquals( 2, list.size() );                    
-    }      
-    
-    public void testCalendarsWithCron() throws Exception {
-        String str = "";
-        str += "package org.simple \n";
-        str += "global java.util.List list \n";
-        str += "rule xxx \n";
-        str += "  calendars \"cal1\", \"cal2\"\n";           
-        str += "  timer (cron:15 * * * * ?) ";
-        str += "when \n";
-        str += "then \n";
-        str += "  list.add(\"fired\"); \n";
-        str += "end  \n";
-
-        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
-                      ResourceType.DRL );
-
-        if ( kbuilder.hasErrors() ) {
-            System.out.println( kbuilder.getErrors() );
-            assertTrue( kbuilder.hasErrors() );
-        }      
-        
-        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
-        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
-
-        KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
-        conf.setOption( ClockTypeOption.get( "pseudo" ) );
-        
-        List list = new ArrayList();
-        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession( conf, null );
-        PseudoClockScheduler timeService = ( PseudoClockScheduler ) ksession.getSessionClock();
-        DateFormat df = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss.SSSZ" );
-        Date date = df.parse( "2009-01-01T00:00:00.000-0000" );
-        
-        timeService.advanceTime( date.getTime(), TimeUnit.MILLISECONDS );
-        
-        final Date date1 = new Date( date.getTime() +  (15 * 1000) );
-        final Date date2 = new Date( date1.getTime() + (60 * 1000) );
-        final Date date3 = new Date( date2.getTime() + (60 * 1000) );
-        final Date date4 = new Date( date3.getTime() + (60 * 1000) );
-        
-        Calendar cal1 = new Calendar() {
-            public boolean isTimeIncluded(long timestamp) {
-                if ( timestamp == date1.getTime() ) {
-                    return true;
-                } else if ( timestamp == date4.getTime() ) {
-                    return false;
-                } else {
-                    return true;
-                }
-            }           
-        };  
-        
-        Calendar cal2 = new Calendar() {
-            public boolean isTimeIncluded(long timestamp) {
-               if ( timestamp == date2.getTime() ) {
-                    return false;
-                }  else if ( timestamp == date3.getTime() ) {
-                    return true;
-                } else {
-                    return true;
-                }
-            }           
-        };          
-        
-        ksession.getCalendars().set( "cal1", cal1 );
-        ksession.getCalendars().set( "cal2", cal2 );
-        
-        ksession.setGlobal( "list", list );
-                         
-        ksession.fireAllRules();
-        timeService.advanceTime( 20, TimeUnit.SECONDS );       
-        assertEquals( 1, list.size() ); 
-                      
-        timeService.advanceTime( 60, TimeUnit.SECONDS );                      
-        assertEquals( 1, list.size() ); 
-             
-        timeService.advanceTime( 60, TimeUnit.SECONDS );                  
-        assertEquals( 2, list.size() ); 
-        
-        timeService.advanceTime( 60, TimeUnit.SECONDS );         
-        assertEquals( 2, list.size() );  
-
-        timeService.advanceTime( 60, TimeUnit.SECONDS );         
-        assertEquals( 3, list.size() );  
-        
-        timeService.advanceTime( 60, TimeUnit.SECONDS );         
-        assertEquals( 4, list.size() );          
-    }   
-    
-    public void testCalendarsWithIntervals() throws Exception {
-        String str = "";
-        str += "package org.simple \n";
-        str += "global java.util.List list \n";
-        str += "rule xxx \n";
-        str += "  calendars \"cal1\", \"cal2\"\n";           
-        str += "  timer (15s 60s) "; //int: protocol is assumed
-        str += "when \n";
-        str += "then \n";
-        str += "  list.add(\"fired\"); \n";
-        str += "end  \n";
-
-        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
-                      ResourceType.DRL );
-
-        if ( kbuilder.hasErrors() ) {
-            System.out.println( kbuilder.getErrors() );
-            assertTrue( kbuilder.hasErrors() );
-        }      
-        
-        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
-        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
-
-        KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
-        conf.setOption( ClockTypeOption.get( "pseudo" ) );
-        
-        List list = new ArrayList();
-        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession( conf, null );
-        PseudoClockScheduler timeService = ( PseudoClockScheduler ) ksession.getSessionClock();
-        DateFormat df = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss.SSSZ" );
-        Date date = df.parse( "2009-01-01T00:00:00.000-0000" );
-        
-        timeService.advanceTime( date.getTime(), TimeUnit.MILLISECONDS );
-        
-        final Date date1 = new Date( date.getTime() +  (15 * 1000) );
-        final Date date2 = new Date( date1.getTime() + (60 * 1000) );
-        final Date date3 = new Date( date2.getTime() + (60 * 1000) );
-        final Date date4 = new Date( date3.getTime() + (60 * 1000) );
-        
-        Calendar cal1 = new Calendar() {
-            public boolean isTimeIncluded(long timestamp) {
-                if ( timestamp == date1.getTime() ) {
-                    return true;
-                } else if ( timestamp == date4.getTime() ) {
-                    return false;
-                } else {
-                    return true;
-                }
-            }           
-        };  
-        
-        Calendar cal2 = new Calendar() {
-            public boolean isTimeIncluded(long timestamp) {
-               if ( timestamp == date2.getTime() ) {
-                    return false;
-                }  else if ( timestamp == date3.getTime() ) {
-                    return true;
-                } else {
-                    return true;
-                }
-            }           
-        };          
-        
-        ksession.getCalendars().set( "cal1", cal1 );
-        ksession.getCalendars().set( "cal2", cal2 );
-        
-        ksession.setGlobal( "list", list );
-                         
-        ksession.fireAllRules();
-        timeService.advanceTime( 20, TimeUnit.SECONDS );       
-        assertEquals( 1, list.size() ); 
-                      
-        timeService.advanceTime( 60, TimeUnit.SECONDS );                      
-        assertEquals( 1, list.size() ); 
-             
-        timeService.advanceTime( 60, TimeUnit.SECONDS );                  
-        assertEquals( 2, list.size() ); 
-        
-        timeService.advanceTime( 60, TimeUnit.SECONDS );         
-        assertEquals( 2, list.size() );  
-
-        timeService.advanceTime( 60, TimeUnit.SECONDS );         
-        assertEquals( 3, list.size() );  
-        
-        timeService.advanceTime( 60, TimeUnit.SECONDS );         
-        assertEquals( 4, list.size() );          
-    }     
-    
-    public void testCalendarsWithIntervalsAndStartAndEnd() throws Exception {
-        String str = "";
-        str += "package org.simple \n";
-        str += "global java.util.List list \n";
-        str += "rule xxx \n";
-        str += "  calendars \"cal1\"\n";           
-        str += "  timer (0d 1d start=3-JAN-2010 end=5-JAN-2010) "; //int: protocol is assumed
-        str += "when \n";
-        str += "then \n";
-        str += "  list.add(\"fired\"); \n";
-        str += "end  \n";
-
-        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
-                      ResourceType.DRL );
-
-        if ( kbuilder.hasErrors() ) {
-            System.out.println( kbuilder.getErrors() );
-            assertTrue( kbuilder.hasErrors() );
-        }      
-        
-        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
-        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
-
-        KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
-        conf.setOption( ClockTypeOption.get( "pseudo" ) );
-        
-        List list = new ArrayList();
-        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession( conf, null );
-        PseudoClockScheduler timeService = ( PseudoClockScheduler ) ksession.getSessionClock();
-        DateFormat df = new SimpleDateFormat( "dd-MMM-yyyy" );
-        Date date = df.parse( "1-JAN-2010" );      
-        
-        Calendar cal1 = new Calendar() {
-            public boolean isTimeIncluded(long timestamp) {
-                return true;
-            }           
-        };  
-        
-        long oneDay = 60 * 60 * 24;        
-        ksession.getCalendars().set( "cal1", cal1 );        
-        ksession.setGlobal( "list", list );
-        
-        timeService.advanceTime( date.getTime(), TimeUnit.MILLISECONDS );                           
-        ksession.fireAllRules();
-        assertEquals( 0, list.size() ); 
-        
-        timeService.advanceTime( oneDay, TimeUnit.SECONDS ); 
-        assertEquals( 0, list.size() ); 
-                      
-        timeService.advanceTime( oneDay, TimeUnit.SECONDS );  // day 3
-        assertEquals( 1, list.size() ); 
-             
-        timeService.advanceTime( oneDay, TimeUnit.SECONDS );                  
-        assertEquals( 2, list.size() ); 
-        
-        timeService.advanceTime( oneDay, TimeUnit.SECONDS );   // day 5    
-        assertEquals( 3, list.size() );     
-
-        timeService.advanceTime( oneDay, TimeUnit.SECONDS );               
-        assertEquals( 3, list.size() );  
-    }
-    
-    public void testCalendarsWithIntervalsAndStartAndLimit() throws Exception {
-        String str = "";
-        str += "package org.simple \n";
-        str += "global java.util.List list \n";
-        str += "rule xxx \n";
-        str += "  calendars \"cal1\"\n";           
-        str += "  timer (0d 1d start=3-JAN-2010 repeat-limit=4) "; //int: protocol is assumed
-        str += "when \n";
-        str += "then \n";
-        str += "  list.add(\"fired\"); \n";
-        str += "end  \n";
-
-        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
-                      ResourceType.DRL );
-
-        if ( kbuilder.hasErrors() ) {
-            System.out.println( kbuilder.getErrors() );
-            assertTrue( kbuilder.hasErrors() );
-        }      
-        
-        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
-        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
-
-        KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
-        conf.setOption( ClockTypeOption.get( "pseudo" ) );
-        
-        List list = new ArrayList();
-        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession( conf, null );
-        PseudoClockScheduler timeService = ( PseudoClockScheduler ) ksession.getSessionClock();
-        DateFormat df = new SimpleDateFormat( "dd-MMM-yyyy" );
-        Date date = df.parse( "1-JAN-2010" );      
-        
-        Calendar cal1 = new Calendar() {
-            public boolean isTimeIncluded(long timestamp) {
-                return true;
-            }           
-        };  
-        
-        long oneDay = 60 * 60 * 24;        
-        ksession.getCalendars().set( "cal1", cal1 );        
-        ksession.setGlobal( "list", list );
-        
-        timeService.advanceTime( date.getTime(), TimeUnit.MILLISECONDS );                           
-        ksession.fireAllRules();
-        assertEquals( 0, list.size() ); 
-        
-        timeService.advanceTime( oneDay, TimeUnit.SECONDS ); 
-        assertEquals( 0, list.size() ); 
-                      
-        timeService.advanceTime( oneDay, TimeUnit.SECONDS ); // day 3  
-        assertEquals( 1, list.size() ); 
-             
-        timeService.advanceTime( oneDay, TimeUnit.SECONDS );                 
-        assertEquals( 2, list.size() ); 
-        
-        timeService.advanceTime( oneDay, TimeUnit.SECONDS );   // day 5    
-        assertEquals( 3, list.size() );     
-
-        timeService.advanceTime( oneDay, TimeUnit.SECONDS );               
-        assertEquals( 3, list.size() );  
-    }    
-    
-    public void testCalendarsWithCronAndStartAndEnd() throws Exception {
-        String str = "";
-        str += "package org.simple \n";
-        str += "global java.util.List list \n";
-        str += "rule xxx \n";
-        str += "  calendars \"cal1\"\n";           
-        str += "  timer (cron: 0 0 0 * * ? start=3-JAN-2010 end=5-JAN-2010) ";
-        str += "when \n";
-        str += "then \n";
-        str += "  list.add(\"fired\"); \n";
-        str += "end  \n";
-
-        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
-                      ResourceType.DRL );
-
-        if ( kbuilder.hasErrors() ) {
-            System.out.println( kbuilder.getErrors() );
-            assertTrue( kbuilder.hasErrors() );
-        }      
-        
-        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
-        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
-
-        KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
-        conf.setOption( ClockTypeOption.get( "pseudo" ) );
-        
-        List list = new ArrayList();
-        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession( conf, null );
-        PseudoClockScheduler timeService = ( PseudoClockScheduler ) ksession.getSessionClock();
-        DateFormat df = new SimpleDateFormat( "dd-MMM-yyyy" );
-        Date date = df.parse( "1-JAN-2010" );
-        
-        Calendar cal1 = new Calendar() {
-            public boolean isTimeIncluded(long timestamp) {
-                return true;
-            }           
-        };  
-        
-        long oneDay = 60 * 60 * 24;        
-        ksession.getCalendars().set( "cal1", cal1 );        
-        ksession.setGlobal( "list", list );
-        
-        timeService.advanceTime( date.getTime(), TimeUnit.MILLISECONDS );                           
-        ksession.fireAllRules();
-        assertEquals( 0, list.size() ); 
-        
-        timeService.advanceTime( oneDay, TimeUnit.SECONDS ); 
-        assertEquals( 0, list.size() ); 
-                      
-        timeService.advanceTime( oneDay, TimeUnit.SECONDS ); // day 3  
-        assertEquals( 1, list.size() ); 
-             
-        timeService.advanceTime( oneDay, TimeUnit.SECONDS );
-        assertEquals( 2, list.size() ); 
-        
-        timeService.advanceTime( oneDay, TimeUnit.SECONDS );   // day 5  
-        assertEquals( 3, list.size() );     
-
-        timeService.advanceTime( oneDay, TimeUnit.SECONDS );              
-        assertEquals( 3, list.size() );  
-    }    
-
-    public void testCalendarsWithCronAndStartAndLimit() throws Exception {
-        String str = "";
-        str += "package org.simple \n";
-        str += "global java.util.List list \n";
-        str += "rule xxx \n";
-        str += "  calendars \"cal1\"\n";           
-        str += "  timer (cron: 0 0 0 * * ? start=3-JAN-2010 repeat-limit=4) "; 
-        str += "when \n";
-        str += "then \n";
-        str += "  list.add(\"fired\"); \n";
-        str += "end  \n";
-
-        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
-                      ResourceType.DRL );
-
-        if ( kbuilder.hasErrors() ) {
-            System.out.println( kbuilder.getErrors() );
-            assertTrue( kbuilder.hasErrors() );
-        }      
-        
-        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
-        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
-
-        KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
-        conf.setOption( ClockTypeOption.get( "pseudo" ) );
-        
-        List list = new ArrayList();
-        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession( conf, null );
-        PseudoClockScheduler timeService = ( PseudoClockScheduler ) ksession.getSessionClock();
-        DateFormat df = new SimpleDateFormat( "dd-MMM-yyyy" );
-        Date date = df.parse( "1-JAN-2010" );      
-        
-        Calendar cal1 = new Calendar() {
-            public boolean isTimeIncluded(long timestamp) {
-                return true;
-            }           
-        };  
-        
-        long oneDay = 60 * 60 * 24;        
-        ksession.getCalendars().set( "cal1", cal1 );        
-        ksession.setGlobal( "list", list );
-        
-        timeService.advanceTime( date.getTime(), TimeUnit.MILLISECONDS );                           
-        ksession.fireAllRules();
-        assertEquals( 0, list.size() ); 
-        
-        timeService.advanceTime( oneDay, TimeUnit.SECONDS ); 
-        assertEquals( 0, list.size() ); 
-                      
-        timeService.advanceTime( oneDay, TimeUnit.SECONDS ); // day 3  
-        assertEquals( 1, list.size() ); 
-             
-        timeService.advanceTime( oneDay, TimeUnit.SECONDS );                 
-        assertEquals( 2, list.size() ); 
-        
-        timeService.advanceTime( oneDay, TimeUnit.SECONDS );   // day 5    
-        assertEquals( 3, list.size() );     
-
-        timeService.advanceTime( oneDay, TimeUnit.SECONDS );               
-        assertEquals( 3, list.size() );  
-    }        
-    
-    public void testFireRuleAfterDuration() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_FireRuleAfterDuration.drl" ) ) );
-        final Package pkg = builder.getPackage();
-
-        RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        ruleBase = SerializationHelper.serializeObject( ruleBase );
-        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
-
-        final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
-                                 list );
-
-        final Cheese brie = new Cheese( "brie",
-                                        12 );
-        final FactHandle brieHandle = workingMemory.insert( brie );
-
-        workingMemory.fireAllRules();
-
-        // now check for update
-        assertEquals( 0,
-                      list.size() );
-
-        // sleep for 300ms
-        Thread.sleep( 300 );
-
-        workingMemory.fireAllRules();
-
-        // now check for update
-        assertEquals( 2,
-                      list.size() );
-
-    }
-
     public void testUpdateNoLoop() throws Exception {
         // JBRULES-780, throws a NullPointer or infinite loop if there is an issue
         final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_UpdateNoloop.drl" ) );

Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/TimerAndCalendarTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/TimerAndCalendarTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/TimerAndCalendarTest.java	2009-12-11 07:07:28 UTC (rev 30589)
@@ -0,0 +1,932 @@
+package org.drools.integrationtests;
+
+import java.io.InputStreamReader;
+import java.io.StringReader;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import junit.framework.TestCase;
+
+import org.drools.Alarm;
+import org.drools.Cheese;
+import org.drools.FactHandle;
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.RuleBase;
+import org.drools.RuleBaseConfiguration;
+import org.drools.RuleBaseFactory;
+import org.drools.StatefulSession;
+import org.drools.WorkingMemory;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.compiler.PackageBuilder;
+import org.drools.io.ResourceFactory;
+import org.drools.rule.Package;
+import org.drools.runtime.KnowledgeSessionConfiguration;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.conf.ClockTypeOption;
+import org.drools.time.Calendar;
+import org.drools.time.impl.PseudoClockScheduler;
+
+public class TimerAndCalendarTest extends TestCase {
+    protected RuleBase getRuleBase() throws Exception {
+
+        return RuleBaseFactory.newRuleBase( RuleBase.RETEOO,
+                                            null );
+    }
+
+    protected RuleBase getRuleBase(final RuleBaseConfiguration config) throws Exception {
+
+        return RuleBaseFactory.newRuleBase( RuleBase.RETEOO,
+                                            config );
+    }
+    
+    public void testDuration() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_Duration.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+
+        final List list = new ArrayList();
+        workingMemory.setGlobal( "list",
+                                 list );
+
+        final Cheese brie = new Cheese( "brie",
+                                        12 );
+        final FactHandle brieHandle = workingMemory.insert( brie );
+
+        workingMemory.fireAllRules();
+
+        // now check for update
+        assertEquals( 0,
+                      list.size() );
+
+        // sleep for 300ms
+        Thread.sleep( 300 );
+
+        // now check for update
+        assertEquals( 1,
+                      list.size() );
+
+    }
+
+    public void testDurationWithNoLoop() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_Duration_with_NoLoop.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+
+        final List list = new ArrayList();
+        workingMemory.setGlobal( "list",
+                                 list );
+
+        final Cheese brie = new Cheese( "brie",
+                                        12 );
+        final FactHandle brieHandle = workingMemory.insert( brie );
+
+        workingMemory.fireAllRules();
+
+        // now check for update
+        assertEquals( 0,
+                      list.size() );
+
+        // sleep for 300ms
+        Thread.sleep( 300 );
+
+        // now check for update
+        assertEquals( 1,
+                      list.size() );
+    }
+
+    public void testDurationMemoryLeakonRepeatedUpdate() throws Exception {
+        String str = "";
+        str += "package org.drools.test\n";
+        str += "import org.drools.Alarm\n";
+        str += "global java.util.List list;";
+        str += "rule \"COMPTEUR\"\n";
+        str += "  timer 50\n";
+        str += "  when\n";
+        str += "    $alarm : Alarm( number < 5 )\n";
+        str += "  then\n";
+        str += "    $alarm.incrementNumber();\n";
+        str += "    list.add( $alarm );\n";
+        str += "    update($alarm);\n";
+        str += "end\n";
+
+        PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new StringReader( str ) );
+
+        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+        ruleBase.addPackage( builder.getPackage() );
+
+        StatefulSession session = ruleBase.newStatefulSession();
+        List list = new ArrayList();
+        session.setGlobal( "list",
+                           list );
+        session.insert( new Alarm() );
+
+        session.fireAllRules();
+
+        Thread.sleep( 1000 );
+
+        assertEquals( 5,
+                      list.size() );
+        assertEquals( 0,
+                      session.getAgenda().getScheduledActivations().length );
+    }
+    
+    public void testFireRuleAfterDuration() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_FireRuleAfterDuration.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        ruleBase = SerializationHelper.serializeObject( ruleBase );
+        final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+
+        final List list = new ArrayList();
+        workingMemory.setGlobal( "list",
+                                 list );
+
+        final Cheese brie = new Cheese( "brie",
+                                        12 );
+        final FactHandle brieHandle = workingMemory.insert( brie );
+
+        workingMemory.fireAllRules();
+
+        // now check for update
+        assertEquals( 0,
+                      list.size() );
+
+        // sleep for 300ms
+        Thread.sleep( 300 );
+
+        workingMemory.fireAllRules();
+
+        // now check for update
+        assertEquals( 2,
+                      list.size() );
+
+    }    
+    
+    public void testNoProtocolIntervalTimer() throws Exception {
+        String str = "";
+        str += "package org.simple \n";
+        str += "global java.util.List list \n";
+        str += "rule xxx \n";
+        str += "  duration (30s 10s) ";
+        str += "when \n";
+        str += "then \n";
+        str += "  list.add(\"fired\"); \n";
+        str += "end  \n";
+
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRL );
+
+        if ( kbuilder.hasErrors() ) {
+            System.out.println( kbuilder.getErrors() );
+            assertTrue( kbuilder.hasErrors() );
+        }
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
+        conf.setOption( ClockTypeOption.get( "pseudo" ) );
+        
+        List list = new ArrayList();
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession( conf, null );
+        PseudoClockScheduler timeService = ( PseudoClockScheduler ) ksession.getSessionClock();
+        timeService.advanceTime( new Date().getTime(), TimeUnit.MILLISECONDS );
+        
+        ksession.setGlobal( "list", list );
+        
+        ksession.fireAllRules();        
+        assertEquals( 0, list.size() );
+        
+        timeService.advanceTime( 20, TimeUnit.SECONDS );
+        ksession.fireAllRules();        
+        assertEquals( 0, list.size() );
+        
+        timeService.advanceTime( 15, TimeUnit.SECONDS );
+        ksession.fireAllRules();        
+        assertEquals( 1, list.size() );   
+        
+        timeService.advanceTime( 3, TimeUnit.SECONDS );
+        ksession.fireAllRules();        
+        assertEquals( 1, list.size() );  
+        
+        timeService.advanceTime( 2, TimeUnit.SECONDS );
+        ksession.fireAllRules();        
+        assertEquals( 2, list.size() ); 
+        
+        timeService.advanceTime( 10, TimeUnit.SECONDS );
+        ksession.fireAllRules();        
+        assertEquals( 3, list.size() );                   
+    }
+    
+    public void testIntervalTimer() throws Exception {
+        String str = "";
+        str += "package org.simple \n";
+        str += "global java.util.List list \n";
+        str += "rule xxx \n";
+        str += "  timer (int:30s 10s) ";
+        str += "when \n";
+        str += "then \n";
+        str += "  list.add(\"fired\"); \n";
+        str += "end  \n";
+
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRL );
+
+        if ( kbuilder.hasErrors() ) {
+            System.out.println( kbuilder.getErrors() );
+            assertTrue( kbuilder.hasErrors() );
+        }
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
+        conf.setOption( ClockTypeOption.get( "pseudo" ) );
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession( conf, null );
+        
+        List list = new ArrayList();
+
+        PseudoClockScheduler timeService = ( PseudoClockScheduler ) ksession.getSessionClock();
+        timeService.advanceTime( new Date().getTime(), TimeUnit.MILLISECONDS );
+        
+        ksession.setGlobal( "list", list );
+        
+        ksession.fireAllRules();        
+        assertEquals( 0, list.size() );
+        
+        timeService.advanceTime( 20, TimeUnit.SECONDS );
+        ksession.fireAllRules();        
+        assertEquals( 0, list.size() );
+        
+        timeService.advanceTime( 15, TimeUnit.SECONDS );
+        ksession.fireAllRules();        
+        assertEquals( 1, list.size() );   
+        
+        timeService.advanceTime( 3, TimeUnit.SECONDS );
+        ksession.fireAllRules();        
+        assertEquals( 1, list.size() );  
+        
+        timeService.advanceTime( 2, TimeUnit.SECONDS );
+        ksession.fireAllRules();        
+        assertEquals( 2, list.size() ); 
+        
+        timeService.advanceTime( 10, TimeUnit.SECONDS );
+        ksession.fireAllRules();        
+        assertEquals( 3, list.size() );                   
+    }    
+    
+    public void testCronTimer() throws Exception {
+        String str = "";
+        str += "package org.simple \n";
+        str += "global java.util.List list \n";
+        str += "rule xxx \n";
+        str += "  timer (cron:15 * * * * ?) ";
+        str += "when \n";
+        str += "then \n";
+        str += "  list.add(\"fired\"); \n";
+        str += "end  \n";
+
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRL );
+
+        if ( kbuilder.hasErrors() ) {
+            System.out.println( kbuilder.getErrors() );
+            assertTrue( kbuilder.hasErrors() );
+        }
+
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
+        conf.setOption( ClockTypeOption.get( "pseudo" ) );
+        
+        List list = new ArrayList();
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession( conf, null );
+        PseudoClockScheduler timeService = ( PseudoClockScheduler ) ksession.getSessionClock();
+        DateFormat df = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss.SSSZ" );
+        Date date = df.parse( "2009-01-01T00:00:00.000-0000" );
+        
+        timeService.advanceTime( date.getTime(), TimeUnit.MILLISECONDS );
+        
+        ksession.setGlobal( "list", list );
+  
+        ksession.fireAllRules();        
+        assertEquals( 0, list.size() ); 
+                
+        timeService.advanceTime( 10, TimeUnit.SECONDS );
+        ksession.fireAllRules();        
+        assertEquals( 0, list.size() ); 
+                 
+        timeService.advanceTime( 10, TimeUnit.SECONDS );            
+        ksession.fireAllRules();        
+        assertEquals( 1, list.size() ); 
+        
+        timeService.advanceTime( 30, TimeUnit.SECONDS );   
+        ksession.fireAllRules();        
+        assertEquals( 1, list.size() ); 
+        
+        timeService.advanceTime( 30, TimeUnit.SECONDS );  
+        ksession.fireAllRules();        
+        assertEquals( 2, list.size() );                   
+    }        
+    
+    public void testCalendarNormalRuleSingleCalendar() throws Exception {
+        String str = "";
+        str += "package org.simple \n";
+        str += "global java.util.List list \n";
+        str += "rule xxx \n";
+        str += "  calendars \"cal1\"\n";
+        str += "when \n";
+        str += "  String()\n";
+        str += "then \n";
+        str += "  list.add(\"fired\"); \n";
+        str += "end  \n";
+
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRL );
+
+        if ( kbuilder.hasErrors() ) {
+            System.out.println( kbuilder.getErrors() );
+            assertTrue( kbuilder.hasErrors() );
+        }
+
+        Calendar calFalse = new Calendar() {
+            public boolean isTimeIncluded(long timestamp) {
+                return false;
+            }           
+        };
+        
+        Calendar calTrue = new Calendar() {
+            public boolean isTimeIncluded(long timestamp) {
+                return true;
+            }           
+        };        
+        
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );              
+
+        KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
+        conf.setOption( ClockTypeOption.get( "pseudo" ) );
+        
+        List list = new ArrayList();
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession( conf, null );
+        PseudoClockScheduler timeService = ( PseudoClockScheduler ) ksession.getSessionClock();
+        DateFormat df = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss.SSSZ" );
+        Date date = df.parse( "2009-01-01T00:00:00.000-0000" );
+        
+        ksession.getCalendars().set( "cal1", calTrue );
+        
+        timeService.advanceTime( date.getTime(), TimeUnit.MILLISECONDS );     
+        ksession.setGlobal( "list", list );        
+        ksession.insert( "o1" );        
+        ksession.fireAllRules();        
+        assertEquals( 1, list.size() ); 
+                
+        timeService.advanceTime( 10, TimeUnit.SECONDS );
+        ksession.insert( "o2" );
+        ksession.fireAllRules();        
+        assertEquals( 2, list.size() ); 
+        
+        ksession.getCalendars().set( "cal1", calFalse );        
+        timeService.advanceTime( 10, TimeUnit.SECONDS );        
+        ksession.insert( "o3" );
+        ksession.fireAllRules();        
+        assertEquals( 2, list.size() ); 
+        
+        ksession.getCalendars().set( "cal1", calTrue );        
+        timeService.advanceTime( 30, TimeUnit.SECONDS );
+        ksession.insert( "o4" );
+        ksession.fireAllRules();        
+        assertEquals( 3, list.size() );                    
+    }   
+    
+    public void testCalendarNormalRuleMultipleCalendars() throws Exception {
+        String str = "";
+        str += "package org.simple \n";
+        str += "global java.util.List list \n";
+        str += "rule xxx \n";
+        str += "  calendars \"cal1\", \"cal2\"\n";      
+        str += "when \n";
+        str += "  String()\n";
+        str += "then \n";
+        str += "  list.add(\"fired\"); \n";
+        str += "end  \n";
+
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRL );
+
+        if ( kbuilder.hasErrors() ) {
+            System.out.println( kbuilder.getErrors() );
+            assertTrue( kbuilder.hasErrors() );
+        }
+
+        Calendar calFalse = new Calendar() {
+            public boolean isTimeIncluded(long timestamp) {
+                return false;
+            }           
+        };
+        
+        Calendar calTrue = new Calendar() {
+            public boolean isTimeIncluded(long timestamp) {
+                return true;
+            }           
+        };        
+        
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );              
+
+        KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
+        conf.setOption( ClockTypeOption.get( "pseudo" ) );
+        
+        List list = new ArrayList();
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession( conf, null );
+        PseudoClockScheduler timeService = ( PseudoClockScheduler ) ksession.getSessionClock();
+        DateFormat df = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss.SSSZ" );
+        Date date = df.parse( "2009-01-01T00:00:00.000-0000" );
+        
+        ksession.getCalendars().set( "cal1", calTrue );
+        ksession.getCalendars().set( "cal2", calTrue );
+        
+        timeService.advanceTime( date.getTime(), TimeUnit.MILLISECONDS );     
+        ksession.setGlobal( "list", list );        
+        ksession.insert( "o1" );        
+        ksession.fireAllRules();        
+        assertEquals( 1, list.size() ); 
+
+        ksession.getCalendars().set( "cal2", calFalse );        
+        timeService.advanceTime( 10, TimeUnit.SECONDS );
+        ksession.insert( "o2" );
+        ksession.fireAllRules();        
+        assertEquals( 1, list.size() ); 
+                
+        ksession.getCalendars().set( "cal1", calFalse );            
+        timeService.advanceTime( 10, TimeUnit.SECONDS );    
+        ksession.insert( "o3" );
+        ksession.fireAllRules();        
+        assertEquals( 1, list.size() ); 
+        
+        ksession.getCalendars().set( "cal1", calTrue );
+        ksession.getCalendars().set( "cal2", calTrue );        
+        timeService.advanceTime( 30, TimeUnit.SECONDS );
+        ksession.insert( "o4" );
+        ksession.fireAllRules();        
+        assertEquals( 2, list.size() );                    
+    }      
+    
+    public void testCalendarsWithCron() throws Exception {
+        String str = "";
+        str += "package org.simple \n";
+        str += "global java.util.List list \n";
+        str += "rule xxx \n";
+        str += "  calendars \"cal1\", \"cal2\"\n";           
+        str += "  timer (cron:15 * * * * ?) ";
+        str += "when \n";
+        str += "then \n";
+        str += "  list.add(\"fired\"); \n";
+        str += "end  \n";
+
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRL );
+
+        if ( kbuilder.hasErrors() ) {
+            System.out.println( kbuilder.getErrors() );
+            assertTrue( kbuilder.hasErrors() );
+        }      
+        
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
+        conf.setOption( ClockTypeOption.get( "pseudo" ) );
+        
+        List list = new ArrayList();
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession( conf, null );
+        PseudoClockScheduler timeService = ( PseudoClockScheduler ) ksession.getSessionClock();
+        DateFormat df = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss.SSSZ" );
+        Date date = df.parse( "2009-01-01T00:00:00.000-0000" );
+        
+        timeService.advanceTime( date.getTime(), TimeUnit.MILLISECONDS );
+        
+        final Date date1 = new Date( date.getTime() +  (15 * 1000) );
+        final Date date2 = new Date( date1.getTime() + (60 * 1000) );
+        final Date date3 = new Date( date2.getTime() + (60 * 1000) );
+        final Date date4 = new Date( date3.getTime() + (60 * 1000) );
+        
+        Calendar cal1 = new Calendar() {
+            public boolean isTimeIncluded(long timestamp) {
+                if ( timestamp == date1.getTime() ) {
+                    return true;
+                } else if ( timestamp == date4.getTime() ) {
+                    return false;
+                } else {
+                    return true;
+                }
+            }           
+        };  
+        
+        Calendar cal2 = new Calendar() {
+            public boolean isTimeIncluded(long timestamp) {
+               if ( timestamp == date2.getTime() ) {
+                    return false;
+                }  else if ( timestamp == date3.getTime() ) {
+                    return true;
+                } else {
+                    return true;
+                }
+            }           
+        };          
+        
+        ksession.getCalendars().set( "cal1", cal1 );
+        ksession.getCalendars().set( "cal2", cal2 );
+        
+        ksession.setGlobal( "list", list );
+                         
+        ksession.fireAllRules();
+        timeService.advanceTime( 20, TimeUnit.SECONDS );       
+        assertEquals( 1, list.size() ); 
+                      
+        timeService.advanceTime( 60, TimeUnit.SECONDS );                      
+        assertEquals( 1, list.size() ); 
+             
+        timeService.advanceTime( 60, TimeUnit.SECONDS );                  
+        assertEquals( 2, list.size() ); 
+        
+        timeService.advanceTime( 60, TimeUnit.SECONDS );         
+        assertEquals( 2, list.size() );  
+
+        timeService.advanceTime( 60, TimeUnit.SECONDS );         
+        assertEquals( 3, list.size() );  
+        
+        timeService.advanceTime( 60, TimeUnit.SECONDS );         
+        assertEquals( 4, list.size() );          
+    }   
+    
+    public void testCalendarsWithIntervals() throws Exception {
+        String str = "";
+        str += "package org.simple \n";
+        str += "global java.util.List list \n";
+        str += "rule xxx \n";
+        str += "  calendars \"cal1\", \"cal2\"\n";           
+        str += "  timer (15s 60s) "; //int: protocol is assumed
+        str += "when \n";
+        str += "then \n";
+        str += "  list.add(\"fired\"); \n";
+        str += "end  \n";
+
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRL );
+
+        if ( kbuilder.hasErrors() ) {
+            System.out.println( kbuilder.getErrors() );
+            assertTrue( kbuilder.hasErrors() );
+        }      
+        
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
+        conf.setOption( ClockTypeOption.get( "pseudo" ) );
+        
+        List list = new ArrayList();
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession( conf, null );
+        PseudoClockScheduler timeService = ( PseudoClockScheduler ) ksession.getSessionClock();
+        DateFormat df = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss.SSSZ" );
+        Date date = df.parse( "2009-01-01T00:00:00.000-0000" );
+        
+        timeService.advanceTime( date.getTime(), TimeUnit.MILLISECONDS );
+        
+        final Date date1 = new Date( date.getTime() +  (15 * 1000) );
+        final Date date2 = new Date( date1.getTime() + (60 * 1000) );
+        final Date date3 = new Date( date2.getTime() + (60 * 1000) );
+        final Date date4 = new Date( date3.getTime() + (60 * 1000) );
+        
+        Calendar cal1 = new Calendar() {
+            public boolean isTimeIncluded(long timestamp) {
+                if ( timestamp == date1.getTime() ) {
+                    return true;
+                } else if ( timestamp == date4.getTime() ) {
+                    return false;
+                } else {
+                    return true;
+                }
+            }           
+        };  
+        
+        Calendar cal2 = new Calendar() {
+            public boolean isTimeIncluded(long timestamp) {
+               if ( timestamp == date2.getTime() ) {
+                    return false;
+                }  else if ( timestamp == date3.getTime() ) {
+                    return true;
+                } else {
+                    return true;
+                }
+            }           
+        };          
+        
+        ksession.getCalendars().set( "cal1", cal1 );
+        ksession.getCalendars().set( "cal2", cal2 );
+        
+        ksession.setGlobal( "list", list );
+                         
+        ksession.fireAllRules();
+        timeService.advanceTime( 20, TimeUnit.SECONDS );       
+        assertEquals( 1, list.size() ); 
+                      
+        timeService.advanceTime( 60, TimeUnit.SECONDS );                      
+        assertEquals( 1, list.size() ); 
+             
+        timeService.advanceTime( 60, TimeUnit.SECONDS );                  
+        assertEquals( 2, list.size() ); 
+        
+        timeService.advanceTime( 60, TimeUnit.SECONDS );         
+        assertEquals( 2, list.size() );  
+
+        timeService.advanceTime( 60, TimeUnit.SECONDS );         
+        assertEquals( 3, list.size() );  
+        
+        timeService.advanceTime( 60, TimeUnit.SECONDS );         
+        assertEquals( 4, list.size() );          
+    }     
+    
+    public void testCalendarsWithIntervalsAndStartAndEnd() throws Exception {
+        String str = "";
+        str += "package org.simple \n";
+        str += "global java.util.List list \n";
+        str += "rule xxx \n";
+        str += "  calendars \"cal1\"\n";           
+        str += "  timer (0d 1d start=3-JAN-2010 end=5-JAN-2010) "; //int: protocol is assumed
+        str += "when \n";
+        str += "then \n";
+        str += "  list.add(\"fired\"); \n";
+        str += "end  \n";
+
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRL );
+
+        if ( kbuilder.hasErrors() ) {
+            System.out.println( kbuilder.getErrors() );
+            assertTrue( kbuilder.hasErrors() );
+        }      
+        
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
+        conf.setOption( ClockTypeOption.get( "pseudo" ) );
+        
+        List list = new ArrayList();
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession( conf, null );
+        PseudoClockScheduler timeService = ( PseudoClockScheduler ) ksession.getSessionClock();
+        DateFormat df = new SimpleDateFormat( "dd-MMM-yyyy" );
+        Date date = df.parse( "1-JAN-2010" );      
+        
+        Calendar cal1 = new Calendar() {
+            public boolean isTimeIncluded(long timestamp) {
+                return true;
+            }           
+        };  
+        
+        long oneDay = 60 * 60 * 24;        
+        ksession.getCalendars().set( "cal1", cal1 );        
+        ksession.setGlobal( "list", list );
+        
+        timeService.advanceTime( date.getTime(), TimeUnit.MILLISECONDS );                           
+        ksession.fireAllRules();
+        assertEquals( 0, list.size() ); 
+        
+        timeService.advanceTime( oneDay, TimeUnit.SECONDS ); 
+        assertEquals( 0, list.size() ); 
+                      
+        timeService.advanceTime( oneDay, TimeUnit.SECONDS );  // day 3
+        assertEquals( 1, list.size() ); 
+             
+        timeService.advanceTime( oneDay, TimeUnit.SECONDS );                  
+        assertEquals( 2, list.size() ); 
+        
+        timeService.advanceTime( oneDay, TimeUnit.SECONDS );   // day 5    
+        assertEquals( 3, list.size() );     
+
+        timeService.advanceTime( oneDay, TimeUnit.SECONDS );               
+        assertEquals( 3, list.size() );  
+    }
+    
+    public void testCalendarsWithIntervalsAndStartAndLimit() throws Exception {
+        String str = "";
+        str += "package org.simple \n";
+        str += "global java.util.List list \n";
+        str += "rule xxx \n";
+        str += "  calendars \"cal1\"\n";           
+        str += "  timer (0d 1d start=3-JAN-2010 repeat-limit=4) "; //int: protocol is assumed
+        str += "when \n";
+        str += "then \n";
+        str += "  list.add(\"fired\"); \n";
+        str += "end  \n";
+
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRL );
+
+        if ( kbuilder.hasErrors() ) {
+            System.out.println( kbuilder.getErrors() );
+            assertTrue( kbuilder.hasErrors() );
+        }      
+        
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
+        conf.setOption( ClockTypeOption.get( "pseudo" ) );
+        
+        List list = new ArrayList();
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession( conf, null );
+        PseudoClockScheduler timeService = ( PseudoClockScheduler ) ksession.getSessionClock();
+        DateFormat df = new SimpleDateFormat( "dd-MMM-yyyy" );
+        Date date = df.parse( "1-JAN-2010" );      
+        
+        Calendar cal1 = new Calendar() {
+            public boolean isTimeIncluded(long timestamp) {
+                return true;
+            }           
+        };  
+        
+        long oneDay = 60 * 60 * 24;        
+        ksession.getCalendars().set( "cal1", cal1 );        
+        ksession.setGlobal( "list", list );
+        
+        timeService.advanceTime( date.getTime(), TimeUnit.MILLISECONDS );                           
+        ksession.fireAllRules();
+        assertEquals( 0, list.size() ); 
+        
+        timeService.advanceTime( oneDay, TimeUnit.SECONDS ); 
+        assertEquals( 0, list.size() ); 
+                      
+        timeService.advanceTime( oneDay, TimeUnit.SECONDS ); // day 3  
+        assertEquals( 1, list.size() ); 
+             
+        timeService.advanceTime( oneDay, TimeUnit.SECONDS );                 
+        assertEquals( 2, list.size() ); 
+        
+        timeService.advanceTime( oneDay, TimeUnit.SECONDS );   // day 5    
+        assertEquals( 3, list.size() );     
+
+        timeService.advanceTime( oneDay, TimeUnit.SECONDS );               
+        assertEquals( 3, list.size() );  
+    }    
+    
+    public void testCalendarsWithCronAndStartAndEnd() throws Exception {
+        String str = "";
+        str += "package org.simple \n";
+        str += "global java.util.List list \n";
+        str += "rule xxx \n";
+        str += "  calendars \"cal1\"\n";           
+        str += "  timer (cron: 0 0 0 * * ? start=3-JAN-2010 end=5-JAN-2010) ";
+        str += "when \n";
+        str += "then \n";
+        str += "  list.add(\"fired\"); \n";
+        str += "end  \n";
+
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRL );
+
+        if ( kbuilder.hasErrors() ) {
+            System.out.println( kbuilder.getErrors() );
+            assertTrue( kbuilder.hasErrors() );
+        }      
+        
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
+        conf.setOption( ClockTypeOption.get( "pseudo" ) );
+        
+        List list = new ArrayList();
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession( conf, null );
+        PseudoClockScheduler timeService = ( PseudoClockScheduler ) ksession.getSessionClock();
+        DateFormat df = new SimpleDateFormat( "dd-MMM-yyyy" );
+        Date date = df.parse( "1-JAN-2010" );
+        
+        Calendar cal1 = new Calendar() {
+            public boolean isTimeIncluded(long timestamp) {
+                return true;
+            }           
+        };  
+        
+        long oneDay = 60 * 60 * 24;        
+        ksession.getCalendars().set( "cal1", cal1 );        
+        ksession.setGlobal( "list", list );
+        
+        timeService.advanceTime( date.getTime(), TimeUnit.MILLISECONDS );                           
+        ksession.fireAllRules();
+        assertEquals( 0, list.size() ); 
+        
+        timeService.advanceTime( oneDay, TimeUnit.SECONDS ); 
+        assertEquals( 0, list.size() ); 
+                      
+        timeService.advanceTime( oneDay, TimeUnit.SECONDS ); // day 3  
+        assertEquals( 1, list.size() ); 
+             
+        timeService.advanceTime( oneDay, TimeUnit.SECONDS );
+        assertEquals( 2, list.size() ); 
+        
+        timeService.advanceTime( oneDay, TimeUnit.SECONDS );   // day 5  
+        assertEquals( 3, list.size() );     
+
+        timeService.advanceTime( oneDay, TimeUnit.SECONDS );              
+        assertEquals( 3, list.size() );  
+    }    
+
+    public void testCalendarsWithCronAndStartAndLimit() throws Exception {
+        String str = "";
+        str += "package org.simple \n";
+        str += "global java.util.List list \n";
+        str += "rule xxx \n";
+        str += "  calendars \"cal1\"\n";           
+        str += "  timer (cron: 0 0 0 * * ? start=3-JAN-2010 repeat-limit=4) "; 
+        str += "when \n";
+        str += "then \n";
+        str += "  list.add(\"fired\"); \n";
+        str += "end  \n";
+
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+        kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+                      ResourceType.DRL );
+
+        if ( kbuilder.hasErrors() ) {
+            System.out.println( kbuilder.getErrors() );
+            assertTrue( kbuilder.hasErrors() );
+        }      
+        
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+        KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
+        conf.setOption( ClockTypeOption.get( "pseudo" ) );
+        
+        List list = new ArrayList();
+        StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession( conf, null );
+        PseudoClockScheduler timeService = ( PseudoClockScheduler ) ksession.getSessionClock();
+        DateFormat df = new SimpleDateFormat( "dd-MMM-yyyy" );
+        Date date = df.parse( "1-JAN-2010" );      
+        
+        Calendar cal1 = new Calendar() {
+            public boolean isTimeIncluded(long timestamp) {
+                return true;
+            }           
+        };  
+        
+        long oneDay = 60 * 60 * 24;        
+        ksession.getCalendars().set( "cal1", cal1 );        
+        ksession.setGlobal( "list", list );
+        
+        timeService.advanceTime( date.getTime(), TimeUnit.MILLISECONDS );                           
+        ksession.fireAllRules();
+        assertEquals( 0, list.size() ); 
+        
+        timeService.advanceTime( oneDay, TimeUnit.SECONDS ); 
+        assertEquals( 0, list.size() ); 
+                      
+        timeService.advanceTime( oneDay, TimeUnit.SECONDS ); // day 3  
+        assertEquals( 1, list.size() ); 
+             
+        timeService.advanceTime( oneDay, TimeUnit.SECONDS );                 
+        assertEquals( 2, list.size() ); 
+        
+        timeService.advanceTime( oneDay, TimeUnit.SECONDS );   // day 5    
+        assertEquals( 3, list.size() );     
+
+        timeService.advanceTime( oneDay, TimeUnit.SECONDS );               
+        assertEquals( 3, list.size() );  
+    }        
+    
+}



More information about the jboss-svn-commits mailing list