Ein Regelattribut, das eine Zeitlinie von Werten zurückgibt, sollte ähnlich wie primitive (also nicht zeitlinienbezogene) Werte mit JUnit-Tests überprüft werden.
Zur Vereinfachung der Tests müssen Sie nicht überprüfen, ob der Ausdruck "timelineoperation" (siehe timelineoperation) die Datumsangaben für Änderungen korrekt kumuliert (es sei denn, Sie wünschen eine solche Überprüfung). Zur weiteren Vereinfachung der Tests können Sie generell Eingabezeitlinien verwenden, die immer einen konstanten Wert haben.
Im folgenden Beispiel wird ein Regelattribut zugrunde gelegt, das (mit Zeitlinienverfahren) die Summe aus einer Liste von Werten berechnet:
<?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"> <!-- The timelines to total --> <Attribute name="inputNumberTimelines"> <type> <javaclass name="List"> <javaclass name="curam.creole.value.Timeline"> <javaclass name="Number"/> </javaclass> </javaclass> </type> <derivation> <specified/> </derivation> </Attribute> <!-- The resultant total --> <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>
Sie können nun einen einfachen Test schreiben, der Eingabezeitlinien verwendet, die für den gesamten Zeitraum einen konstanten Wert enthalten:
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); // use input values that do not vary over time 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)); // check that the resultant timeline is 6 forever CREOLETestHelper.assertEquals(new Timeline<Number>(6), totalizer.totalTimeline().getValue()); } }
In manchen Situationen - wenn Sie beispielsweise einen eigenen Algorithmus für die Datumsänderung geschrieben haben oder grundsätzlich überprüfen müssen, ob die Datumsangaben für Änderungen von Eingabezeitlinien in den resultierenden Zeitlinien präzise wiedergegeben werden - gibt es andere Strategien, die Sie je nach Anforderung verfolgen können:
Sie können überprüfen, ob die resultierende Zeitlinie einem erwarteten Zeitlinienwert exakt entspricht. (Die Gleichheitssemantik der Klasse Timeline funktioniert wie erwartet - zwei Zeitlinien gelten als gleich, wenn sie exakt dieselbe Gruppe von Intervallen enthalten, die Werte aus den beiden Zeitlinien also für jedes mögliche Datum identisch sind.)
Sie können überprüfen, ob die resultierende Zeitlinie den Wert enthält, den Sie für bestimmte Datumsangaben erwarten.
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); // use input values that vary over time 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)); // strictly check the exact value of the resultant timeline 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); // use input values that vary over time 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)); /* * Do not strictly check that the resultant timeline is exactly * as expected - instead check the resultant timeline's value * on particular dates. * * It is possible that the timeline has incorrect values on * other dates, but depending on the purpose of your test, you * may wish to trade strictness for improved readability. */ 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"))); } }