1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.kuali.rice.krms.framework;
17
18 import static junit.framework.Assert.assertFalse;
19 import static junit.framework.Assert.assertNotNull;
20 import static junit.framework.Assert.assertTrue;
21
22 import java.util.Arrays;
23 import java.util.Collection;
24 import java.util.Collections;
25 import java.util.HashMap;
26 import java.util.List;
27 import java.util.Map;
28
29 import org.junit.Before;
30 import org.junit.Test;
31 import org.kuali.rice.krms.api.engine.EngineResults;
32 import org.kuali.rice.krms.api.engine.ExecutionOptions;
33 import org.kuali.rice.krms.api.engine.ExecutionFlag;
34 import org.kuali.rice.krms.api.engine.Facts;
35 import org.kuali.rice.krms.api.engine.SelectionCriteria;
36 import org.kuali.rice.krms.api.engine.Term;
37 import org.kuali.rice.krms.api.engine.TermResolver;
38 import org.kuali.rice.krms.api.repository.agenda.AgendaDefinition;
39 import org.kuali.rice.krms.framework.engine.Action;
40 import org.kuali.rice.krms.framework.engine.Agenda;
41 import org.kuali.rice.krms.framework.engine.BasicAgenda;
42 import org.kuali.rice.krms.framework.engine.BasicAgendaTree;
43 import org.kuali.rice.krms.framework.engine.BasicAgendaTreeEntry;
44 import org.kuali.rice.krms.framework.engine.BasicContext;
45 import org.kuali.rice.krms.framework.engine.BasicRule;
46 import org.kuali.rice.krms.framework.engine.CollectionOfComparablesTermBasedProposition;
47 import org.kuali.rice.krms.framework.engine.CollectionOperator;
48 import org.kuali.rice.krms.framework.engine.Context;
49 import org.kuali.rice.krms.framework.engine.ContextProvider;
50 import org.kuali.rice.krms.framework.engine.Proposition;
51 import org.kuali.rice.krms.framework.engine.ProviderBasedEngine;
52 import org.kuali.rice.krms.framework.engine.ResultLogger;
53 import org.kuali.rice.krms.framework.engine.Rule;
54 import org.kuali.rice.krms.framework.engine.expression.ComparisonOperator;
55
56 public class CollectionOfComparablesTermBasedPropositionTest {
57 private static final ResultLogger LOG = ResultLogger.getInstance();
58
59
60 @Before
61 public void setUp() {
62 ActionMock.resetActionsFired();
63 }
64
65 @Test
66 public void allPropositionTest() {
67
68
69
70
71 assertRuleTrue(Arrays.asList(100f, 1000f), CollectionOperator.ALL, ComparisonOperator.GREATER_THAN, 1f);
72
73 assertRuleTrue(Arrays.asList(100f), CollectionOperator.ALL, ComparisonOperator.GREATER_THAN, 1f);
74
75 assertRuleTrue(Arrays.<Float>asList(), CollectionOperator.ALL, ComparisonOperator.GREATER_THAN, 1f);
76
77
78 assertRuleFalse(Arrays.asList(100f, 1000f), CollectionOperator.ALL, ComparisonOperator.GREATER_THAN, 10000f);
79 assertRuleFalse(Arrays.asList(100f, 1000f), CollectionOperator.ALL, ComparisonOperator.GREATER_THAN, 500f);
80 assertRuleFalse(Arrays.asList(1000f, 100f), CollectionOperator.ALL, ComparisonOperator.GREATER_THAN, 500f);
81 assertRuleFalse(Arrays.asList(100f), CollectionOperator.ALL, ComparisonOperator.GREATER_THAN, 10000f);
82
83 }
84
85 @Test
86 public void oneOrMorePropositionTest() {
87
88
89
90
91 assertRuleTrue(Arrays.asList(100f, 1000f), CollectionOperator.ONE_OR_MORE, ComparisonOperator.GREATER_THAN, 500f);
92 assertRuleTrue(Arrays.asList(1000f, 100f), CollectionOperator.ONE_OR_MORE, ComparisonOperator.GREATER_THAN, 500f);
93 assertRuleTrue(Arrays.asList(1000f), CollectionOperator.ONE_OR_MORE, ComparisonOperator.GREATER_THAN, 500f);
94
95
96 assertRuleFalse(Arrays.asList(1000f, 2000f), CollectionOperator.ONE_OR_MORE, ComparisonOperator.GREATER_THAN, 5000f);
97 assertRuleFalse(Arrays.asList(2000f, 1000f), CollectionOperator.ONE_OR_MORE, ComparisonOperator.GREATER_THAN, 5000f);
98 assertRuleFalse(Arrays.asList(1000f), CollectionOperator.ONE_OR_MORE, ComparisonOperator.GREATER_THAN, 5000f);
99 assertRuleFalse(Arrays.<Float>asList(), CollectionOperator.ONE_OR_MORE, ComparisonOperator.GREATER_THAN, 5000f);
100
101 }
102
103 @Test
104 public void nonePropositionTest() {
105
106
107
108
109 assertRuleTrue(Arrays.asList(100f, 1000f), CollectionOperator.NONE, ComparisonOperator.GREATER_THAN, 5000f);
110 assertRuleTrue(Arrays.asList(1000f), CollectionOperator.NONE, ComparisonOperator.GREATER_THAN, 5000f);
111 assertRuleTrue(Arrays.<Float>asList(), CollectionOperator.NONE, ComparisonOperator.GREATER_THAN, 5000f);
112
113
114 assertRuleFalse(Arrays.asList(1000f, 7000f), CollectionOperator.NONE, ComparisonOperator.GREATER_THAN, 5000f);
115 assertRuleFalse(Arrays.asList(7000f, 1000f), CollectionOperator.NONE, ComparisonOperator.GREATER_THAN, 5000f);
116 assertRuleFalse(Arrays.asList(7000f), CollectionOperator.NONE, ComparisonOperator.GREATER_THAN, 5000f);
117
118 }
119
120
121
122
123 private void execute(Agenda agenda, TermResolver ... termResolvers) {
124 Map<String, String> contextQualifiers = new HashMap<String, String>();
125 contextQualifiers.put("docTypeName", "Proposal");
126
127 List<TermResolver<?>> testResolvers = Arrays.<TermResolver<?>>asList(termResolvers);
128
129 Context context = new BasicContext(Arrays.asList(agenda), testResolvers);
130 ContextProvider contextProvider = new ManualContextProvider(context);
131
132 SelectionCriteria selectionCriteria = SelectionCriteria.createCriteria(null, contextQualifiers,
133 Collections.singletonMap(AgendaDefinition.Constants.EVENT, "test"));
134
135 ProviderBasedEngine engine = new ProviderBasedEngine();
136 engine.setContextProvider(contextProvider);
137
138
139 ExecutionOptions executionOptions = new ExecutionOptions().setFlag(ExecutionFlag.LOG_EXECUTION, true);
140
141 EngineResults results = engine.execute(selectionCriteria, Facts.EMPTY_FACTS, executionOptions);
142 assertNotNull(results);
143 }
144
145 private void assertRuleTrue(List<Float> termValue,
146 CollectionOperator collectionOper,
147 ComparisonOperator comparisonOper, Float compareValue) {
148 assertRule(termValue, collectionOper, comparisonOper, compareValue, true);
149 }
150
151 private void assertRuleFalse(List<Float> termValue,
152 CollectionOperator collectionOper,
153 ComparisonOperator comparisonOper, Float compareValue) {
154 assertRule(termValue, collectionOper, comparisonOper, compareValue, false);
155 }
156
157 private void assertRule(List<Float> termValue,
158 CollectionOperator collectionOper,
159 ComparisonOperator comparisonOper, Float compareValue, boolean assertTrue) {
160
161 boolean actionFired = executeTestAgenda(termValue, collectionOper, comparisonOper, compareValue).actionFired();
162
163 if (assertTrue) {
164 assertTrue(actionFired);
165 } else {
166 assertFalse(actionFired);
167 }
168
169 ActionMock.resetActionsFired();
170 }
171
172
173
174
175
176
177
178
179
180
181 private ActionMock executeTestAgenda(List<Float> termValue,
182 CollectionOperator collectionOper,
183 ComparisonOperator comparisonOper, Float compareValue) {
184 Term expensesTerm = new Term("expenses");
185 TermResolver<Collection<Float>> expensesResolver = new TermResolverMock<Collection<Float>>(expensesTerm.getName(), termValue);
186
187 Proposition prop1 = new CollectionOfComparablesTermBasedProposition(collectionOper, comparisonOper, expensesTerm, compareValue);
188 ActionMock prop1Action = new ActionMock("prop1Action");
189
190 Rule rule = new BasicRule("ALL", prop1, Collections.<Action>singletonList(prop1Action));
191
192 BasicAgendaTree agendaTree = new BasicAgendaTree(new BasicAgendaTreeEntry(rule));
193 Agenda agenda = new BasicAgenda(Collections.singletonMap(AgendaDefinition.Constants.EVENT, "test"), agendaTree);
194
195 execute(agenda, expensesResolver);
196 return prop1Action;
197 }
198
199 }