@Test(timeout = 10000)
  public void testExprTimeRescheduled() throws Exception {
    String text =
        "package org.kie.test\n"
            + "global java.util.List list\n"
            + "import "
            + FactA.class.getCanonicalName()
            + "\n"
            + "rule r1 timer (expr: f1.field2, f1.field4)\n"
            + "when\n"
            + "    f1 : FactA() \n"
            + "then\n"
            + "    list.add( f1 );\n"
            + "end\n"
            + "\n";

    KieSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
    conf.setOption(ClockTypeOption.get("pseudo"));

    KnowledgeBase kbase = loadKnowledgeBaseFromString(text);
    KieSession ksession = createKnowledgeSession(kbase, conf);

    PseudoClockScheduler timeService =
        (PseudoClockScheduler) ksession.<SessionClock>getSessionClock();
    timeService.advanceTime(new Date().getTime(), TimeUnit.MILLISECONDS);

    List list = new ArrayList();
    ksession.setGlobal("list", list);

    FactA fact1 = new FactA();
    fact1.setField1("f1");
    fact1.setField2(500);
    fact1.setField4(1000);
    FactHandle fh = (FactHandle) ksession.insert(fact1);

    ksession.fireAllRules();
    assertEquals(0, list.size());

    timeService.advanceTime(1100, TimeUnit.MILLISECONDS);
    ksession.fireAllRules();
    assertEquals(1, list.size());
    assertEquals(fact1, list.get(0));

    timeService.advanceTime(1100, TimeUnit.MILLISECONDS);
    ksession.fireAllRules();
    assertEquals(2, list.size());
    assertEquals(fact1, list.get(1));

    timeService.advanceTime(400, TimeUnit.MILLISECONDS);
    ksession.fireAllRules();
    assertEquals(3, list.size());
    assertEquals(fact1, list.get(2));
    list.clear();

    fact1.setField2(300);
    fact1.setField4(2000);
    ksession.update(fh, fact1);

    // 100 has passed of the 1000, from the previous schedule
    // so that should be deducted from the 300 delay above, meaning
    //  we only need to increment another 250
    timeService.advanceTime(250, TimeUnit.MILLISECONDS);
    ksession.fireAllRules();
    assertEquals(1, list.size());
    assertEquals(fact1, list.get(0));
    list.clear();

    timeService.advanceTime(1000, TimeUnit.MILLISECONDS);
    ksession.fireAllRules();
    assertEquals(0, list.size());

    timeService.advanceTime(700, TimeUnit.MILLISECONDS);
    ksession.fireAllRules();
    assertEquals(0, list.size());

    timeService.advanceTime(300, TimeUnit.MILLISECONDS);
    ksession.fireAllRules();
    assertEquals(1, list.size());
  }