Un attribut de règle qui renvoie une chronologie de valeurs doit être testé dans vos tests JUnit de manière similaire aux tests de valeurs primitives (non chronologiques).
Pour simplifier vos tests, vous n'avez pas besoin de vérifier que timelineoperation cumule correctement les dates de changement (sauf si vous le souhaitez). Pour ne pas compliquer vos tests, vous pouvez généralement utiliser des chronologies d'entrée dont la valeur reste constante.
Par exemple, imaginons que vous disposez d'un attribut de règle qui calcule le total (de manière chronologique) à partir d'une liste de nombres :
<?xml version="1.0" encoding="UTF-8"?> <RuleSet name="Example_NumberSumTimeline" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation= "http://www.curamsoftware.com/CreoleRulesSchema.xsd"> <Class name="Totalizer"> <!-- Les chronologies à cumuler --> <Attribute name="inputNumberTimelines"> <type> <javaclass name="List"> <javaclass name="curam.creole.value.Timeline"> <javaclass name="Number"/> </javaclass> </javaclass> </type> <derivation> <specified/> </derivation> </Attribute> <!-- Le total obtenu --> <Attribute name="totalTimeline"> <type> <javaclass name="curam.creole.value.Timeline"> <javaclass name="Number"/> </javaclass> </type> <derivation> <timelineoperation> <sum> <dynamiclist> <list> <reference attribute="inputNumberTimelines"/> </list> <listitemexpression> <intervalvalue> <current/> </intervalvalue> </listitemexpression> </dynamiclist> </sum> </timelineoperation> </derivation> </Attribute> </Class> </RuleSet>
...vous pouvez alors écrire un test simple qui utilise des chronologies d'entrée dont la valeur reste constante :
package curam.creole.example; import java.util.Arrays; import junit.framework.TestCase; import curam.creole.calculator.CREOLETestHelper; import curam.creole.execution.session.RecalculationsProhibited; import curam.creole.execution.session.Session; import curam.creole.execution.session.Session_Factory; import curam.creole.execution.session.StronglyTypedRuleObjectFactory; import curam.creole.ruleclass.Example_NumberSumTimeline.impl.Totalizer; import curam.creole.ruleclass.Example_NumberSumTimeline.impl.Totalizer_Factory; import curam.creole.storage.inmemory.InMemoryDataStorage; import curam.creole.value.Timeline; public class TestForeverValuedTimelines extends TestCase { public void testNumberSumTimeline() { final Session session = Session_Factory.getFactory().newInstance( new RecalculationsProhibited(), new InMemoryDataStorage( new StronglyTypedRuleObjectFactory())); final Totalizer totalizer = Totalizer_Factory.getFactory().newInstance(session); // utiliser des valeurs d'entrée qui ne varient pas au fil du temps final Timeline<Number> inputTimeline1 = new Timeline<Number>(1); final Timeline<Number> inputTimeline2 = new Timeline<Number>(2); final Timeline<Number> inputTimeline3 = new Timeline<Number>(3); totalizer.inputNumberTimelines().specifyValue( Arrays.asList(inputTimeline1, inputTimeline2, inputTimeline3)); // vérifier que la chronologie obtenue est toujours égale à 6 CREOLETestHelper.assertEquals(new Timeline<Number>(6), totalizer.totalTimeline().getValue()); } }
Dans certains cas, par exemple lorsque vous avez créé votre propre algorithme de déplacement de date, ou que vous avez vraiment besoin de vérifier que les dates de changement des chronologies d'entrée sont répercutées correctement dans les chronologies obtenues, il existe différentes approches que vous pouvez adopter selon vos besoins :
Vous devez vérifier que la chronologie obtenue est exactement égale à une valeur chronologique attendue. (La sémantique d'égalité de la classe Timeline se comporte de manière prévisible : deux chronologies sont égales si elles contiennent exactement le même ensemble d'intervalles, c'est-à-dire si les valeurs issues de ces deux chronologies sont identiques pour chaque date possible).
Vous pouvez vérifier que la chronologie obtenue comporte la valeur que vous attendez à des dates particulières.
package curam.creole.example; import java.util.Arrays; import junit.framework.TestCase; import curam.creole.calculator.CREOLETestHelper; import curam.creole.execution.session.RecalculationsProhibited; import curam.creole.execution.session.Session; import curam.creole.execution.session.Session_Factory; import curam.creole.execution.session.StronglyTypedRuleObjectFactory; import curam.creole.ruleclass.Example_NumberSumTimeline.impl.Totalizer; import curam.creole.ruleclass.Example_NumberSumTimeline.impl.Totalizer_Factory; import curam.creole.storage.inmemory.InMemoryDataStorage; import curam.creole.value.Interval; import curam.creole.value.Timeline; import curam.util.type.Date; public class TestStrictTimelineChecking extends TestCase { public void testNumberSumTimeline() { final Session session = Session_Factory.getFactory().newInstance( new RecalculationsProhibited(), new InMemoryDataStorage( new StronglyTypedRuleObjectFactory())); final Totalizer totalizer = Totalizer_Factory.getFactory().newInstance(session); // utiliser des valeurs d'entrée qui varient au fil du temps final Timeline<Number> inputTimeline1 = new Timeline<Number>(Arrays.asList( new Interval<Number>(null, 1), new Interval<Number>(Date.fromISO8601("20010101"), 1.1) )); final Timeline<Number> inputTimeline2 = new Timeline<Number>(Arrays.asList( new Interval<Number>(null, 2), new Interval<Number>(Date.fromISO8601("20020101"), 2.2) )); final Timeline<Number> inputTimeline3 = new Timeline<Number>(Arrays.asList( new Interval<Number>(null, 3), new Interval<Number>(Date.fromISO8601("20030101"), 3.3) )); totalizer.inputNumberTimelines().specifyValue( Arrays.asList(inputTimeline1, inputTimeline2, inputTimeline3)); // vérifier soigneusement la valeur exacte de la chronologie obtenue CREOLETestHelper.assertEquals( new Timeline<Number>(Arrays.asList( new Interval<Number>(null, 6), new Interval<Number>(Date.fromISO8601("20010101"), 6.1), new Interval<Number>(Date.fromISO8601("20020101"), 6.3), new Interval<Number>(Date.fromISO8601("20030101"), 6.6) )), totalizer.totalTimeline().getValue()); } }
package curam.creole.example; import java.util.Arrays; import junit.framework.TestCase; import curam.creole.calculator.CREOLETestHelper; import curam.creole.execution.session.RecalculationsProhibited; import curam.creole.execution.session.Session; import curam.creole.execution.session.Session_Factory; import curam.creole.execution.session.StronglyTypedRuleObjectFactory; import curam.creole.ruleclass.Example_NumberSumTimeline.impl.Totalizer; import curam.creole.ruleclass.Example_NumberSumTimeline.impl.Totalizer_Factory; import curam.creole.storage.inmemory.InMemoryDataStorage; import curam.creole.value.Interval; import curam.creole.value.Timeline; import curam.util.type.Date; public class TestLaxTimelineChecking extends TestCase { public void testNumberSumTimeline() { final Session session = Session_Factory.getFactory().newInstance( new RecalculationsProhibited(), new InMemoryDataStorage( new StronglyTypedRuleObjectFactory())); final Totalizer totalizer = Totalizer_Factory.getFactory().newInstance(session); // utiliser des valeurs d'entrée qui varient au fil du temps final Timeline<Number> inputTimeline1 = new Timeline<Number>(Arrays.asList( new Interval<Number>(null, 1), new Interval<Number>(Date.fromISO8601("20010101"), 1.1) )); final Timeline<Number> inputTimeline2 = new Timeline<Number>(Arrays.asList( new Interval<Number>(null, 2), new Interval<Number>(Date.fromISO8601("20020101"), 2.2) )); final Timeline<Number> inputTimeline3 = new Timeline<Number>(Arrays.asList( new Interval<Number>(null, 3), new Interval<Number>(Date.fromISO8601("20030101"), 3.3) )); totalizer.inputNumberTimelines().specifyValue( Arrays.asList(inputTimeline1, inputTimeline2, inputTimeline3)); /* * Ne pas vérifier de manière stricte que la chronologie obtenue est exactement * conforme à vos prévisions, mais vérifier la valeur de la chronologie obtenue * à des dates particulières. * * Il est possible que la chronologie contienne des valeurs incorrectes à * d'autres dates, mais selon le but de votre test, vous * pouvez privilégier la lisibilité à la précision des données. */ final Timeline<? extends Number> resultantTimeline = totalizer.totalTimeline().getValue(); CREOLETestHelper.assertEquals(6.1, resultantTimeline.valueOn(Date.fromISO8601("20010101"))); CREOLETestHelper.assertEquals(6.6, resultantTimeline.valueOn(Date.fromISO8601("20130101"))); } }