001 /**
002 * Copyright 2005-2013 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.rice.krms.impl.repository;
017
018 import org.junit.Test;
019
020 import org.kuali.rice.krad.bo.BusinessObject;
021 import org.kuali.rice.krad.service.SequenceAccessorService;
022 import org.kuali.rice.krms.api.repository.agenda.AgendaItemDefinition;
023 import org.kuali.rice.krms.api.repository.context.ContextDefinition;
024 import org.kuali.rice.krms.api.repository.proposition.PropositionDefinition;
025 import org.kuali.rice.krms.api.repository.proposition.PropositionType;
026 import org.kuali.rice.krms.api.repository.rule.RuleDefinition;
027
028 import java.util.HashMap;
029 import java.util.Iterator;
030 import java.util.LinkedList;
031 import java.util.List;
032 import java.util.Map;
033
034 import static org.junit.Assert.*;
035
036 public class AgendaBoTest {
037
038 public static final String TEST_PREFIX = "AgendaBoTest";
039 @Test
040 public void testCopy() {
041 SequenceAccessorService mapSas = new IncrementalSas();
042 AgendaBo.setSequenceAccessorService(mapSas);
043 AgendaItemBo.setSequenceAccessorService(mapSas);
044 RuleBo.setSequenceAccessorService(mapSas);
045 PropositionBo.setSequenceAccessorService(mapSas);
046
047 ContextBo contextBo = ContextBo.from(ContextDefinition.Builder.create(TEST_PREFIX + "ContextName", TEST_PREFIX + "Namespace").build());
048 contextBo.setId(TEST_PREFIX + "ContextId");
049
050 // AgendaBo agendaBo = AgendaBo.from(AgendaDefinition.Builder.create(TEST_PREFIX + "AgendaId00", TEST_PREFIX + "AgendaName", null, contextBo.getId()));
051 AgendaBo agendaBo = new AgendaBo();
052 agendaBo.setId(TEST_PREFIX + "AgendaId00");
053 agendaBo.setName(TEST_PREFIX + "AgendaName");
054 agendaBo.setContext(contextBo);
055
056 RuleBo ruleBo00 = newTestRuleBo("00");
057 RuleBo ruleBo01 = newTestRuleBo("01");
058 RuleBo ruleBo02 = newTestRuleBo("02");
059 RuleBo ruleBo03 = newTestRuleBo("03");
060 RuleBo ruleBo04 = newTestRuleBo("04");
061 RuleBo ruleBo05 = newTestRuleBo("05");
062 RuleBo ruleBo06 = newTestRuleBo("06");
063
064 List<AgendaItemBo> agendaItemBos = new LinkedList<AgendaItemBo>();
065 AgendaItemBo agendaItemBo00 = newTestAgendaItemBo("00", ruleBo00, agendaBo.getId());
066 agendaItemBos.add(agendaItemBo00);
067 AgendaItemBo agendaItemBo01 = newTestAgendaItemBo("01", ruleBo01, agendaBo.getId());
068 agendaItemBos.add(agendaItemBo01);
069 AgendaItemBo agendaItemBo02 = newTestAgendaItemBo("02", ruleBo02, agendaBo.getId());
070 agendaItemBos.add(agendaItemBo02);
071 AgendaItemBo agendaItemBo03 = newTestAgendaItemBo("03", ruleBo03, agendaBo.getId());
072 agendaItemBos.add(agendaItemBo03);
073 AgendaItemBo agendaItemBo04 = newTestAgendaItemBo("04", ruleBo04, agendaBo.getId());
074 agendaItemBos.add(agendaItemBo04);
075 AgendaItemBo agendaItemBo05 = newTestAgendaItemBo("05", ruleBo05, agendaBo.getId());
076 agendaItemBos.add(agendaItemBo05);
077 AgendaItemBo agendaItemBo06 = newTestAgendaItemBo("06", ruleBo06, agendaBo.getId());
078 agendaItemBos.add(agendaItemBo06);
079
080 // My Fabulous Agenda
081 agendaItemBo00.setWhenTrue(agendaItemBo01);
082 agendaItemBo00.setWhenFalse(agendaItemBo04);
083 agendaItemBo00.setAlways(agendaItemBo05);
084
085 agendaItemBo01.setAlways(agendaItemBo02);
086
087 agendaItemBo02.setWhenFalse(agendaItemBo06);
088 agendaItemBo02.setAlways(agendaItemBo03);
089
090 agendaBo.setFirstItemId(agendaItemBo00.getId());
091
092 agendaBo.setItems(agendaItemBos);
093
094 AgendaBo copiedAgenda = agendaBo.copyAgenda("NewAgendaCopy", "dts123");
095
096 assertFalse(agendaItemBo00.getAgendaId() == null);
097 assertTrue("agendaBo.getItems().size() of " + agendaBo.getItems().size() + " is not equal to copiedAgenda.getItems().size() of "+ copiedAgenda.getItems().size(), agendaBo.getItems().size() == copiedAgenda.getItems().size());
098
099 // Assert that the agenda item ids are 0 - 6
100 boolean[] ids = {false, false, false, false, false, false, false};
101 assertTrue("agendaBo.getItems().size() of " + agendaBo.getItems().size() + " does not match ids.length" + ids.length, agendaBo.getItems().size() == ids.length);
102 Iterator<AgendaItemBo> copiedItems = copiedAgenda.getItems().iterator();
103 int index = 0;
104 while (copiedItems.hasNext()) {
105 try {
106 index = Integer.parseInt(copiedItems.next().getId());
107 ids[index] = true;
108 } catch (IndexOutOfBoundsException e) {
109 fail("copied agenda item id " + index + " is higher than " + ids.length);
110 }
111 }
112 for (int i = 0; i < ids.length; i++) {
113 assertTrue("agenda item id verification of " + i + " is false", ids[i]);
114 }
115
116 // Assert agenda item version numbers are all the same always 0 in unit tests, but IT would have real values
117 copiedItems = copiedAgenda.getItems().iterator();
118 long lastVersion = -1L;
119 long version = -1L;
120 while (copiedItems.hasNext()) {
121 AgendaItemBo agendaItemBo = copiedItems.next();
122 if (agendaItemBo.getVersionNumber() != null) { // if null throws nullpointer in unboxing
123 version = agendaItemBo.getVersionNumber();
124 if (lastVersion == -1L) {
125 lastVersion = version;
126 } else {
127 assertTrue(lastVersion == version);
128 lastVersion = version;
129 }
130 }
131 }
132 }
133
134
135 private RuleBo newTestRuleBo(String testId) {
136 String ruleId = TEST_PREFIX + "RuleId" + testId;
137 PropositionDefinition.Builder prop = PropositionDefinition.Builder.create(TEST_PREFIX + "PropositionId" + testId, PropositionType.SIMPLE.getCode(), ruleId, null, null);
138 RuleDefinition.Builder builder = RuleDefinition.Builder.create(ruleId, ruleId + "Name", TEST_PREFIX + "Namespace", null, prop.getId());
139 builder.setProposition(prop);
140 return RuleBo.from(builder.build());
141 }
142
143 private AgendaItemDefinition.Builder newTestAgendaItem(String testId, RuleBo ruleBo, String agendaId) {
144 return AgendaItemDefinition.Builder.create(TEST_PREFIX + "AgendaItemId" + testId, agendaId);
145 }
146
147 private AgendaItemBo newTestAgendaItemBo(String testId, RuleBo ruleBo, String agendaId) {
148 return AgendaItemBo.from(newTestAgendaItem(testId, ruleBo, agendaId).build());
149 }
150 }
151
152 class IncrementalSas implements SequenceAccessorService {
153 static Map<String, Long> sasMap = new HashMap<String, Long>();
154
155 @Override
156 public Long getNextAvailableSequenceNumber(String sequenceName, Class<? extends BusinessObject> clazz) {
157 return getNextAvailableSequenceNumber(sequenceName + clazz.getCanonicalName());
158 }
159
160 @Override
161 public synchronized Long getNextAvailableSequenceNumber(String sequenceName) {
162 if (sasMap.get(sequenceName) == null) {
163 sasMap.put(sequenceName, 0L);
164 }
165 long l = sasMap.get(sequenceName);
166 sasMap.put(sequenceName, l + 1);
167 return l;
168 }
169 }