1   package pl.edu.agh.cast.editor.operation;
2   
3   import static org.junit.Assert.fail;
4   
5   import java.io.File;
6   import java.io.IOException;
7   import java.util.Collections;
8   import java.util.Date;
9   import java.util.HashMap;
10  import java.util.List;
11  import java.util.Map;
12  
13  import junit.framework.Assert;
14  import junit.framework.JUnit4TestAdapter;
15  
16  import org.junit.Before;
17  import org.junit.Test;
18  
19  import pl.edu.agh.cast.backward.editor.operation.SelectMediatorsOperation;
20  import pl.edu.agh.cast.backward.editor.operation.SelectMediatorsParameters;
21  import pl.edu.agh.cast.backward.editor.operation.SelectMediatorsParameters.SelectMediatorsMode;
22  import pl.edu.agh.cast.model.attributes.NodeAttributeManager;
23  import pl.edu.agh.cast.model.base.DataImporter;
24  import pl.edu.agh.cast.model.base.DataSet;
25  import pl.edu.agh.cast.model.base.Entity;
26  import pl.edu.agh.cast.model.base.IDataSet;
27  import pl.edu.agh.cast.model.base.IEntity;
28  import pl.edu.agh.cast.model.base.IModel;
29  import pl.edu.agh.cast.model.base.Model;
30  import pl.edu.agh.cast.model.base.TimedRelation;
31  import pl.edu.agh.cast.model.visual.backward.Diagram;
32  import pl.edu.agh.cast.model.visual.backward.IDiagram;
33  import pl.edu.agh.cast.model.visual.backward.Node;
34  import pl.edu.agh.cast.schema.command.SelectMediatorsCommand;
35  import pl.edu.agh.cast.schema.util.Messages;
36  
37  /**
38   * TODO move the tests to the SelectMediatorsOperation test
39   * 
40   * @author unknown
41   */
42  public class SelectMediatorsOperationTest {
43  
44  	private static final Map<String, Object> MAIN_ENTITIES_IDS = getMainEntitiesIds();
45  
46  	private IDiagram _diagram;
47  
48  	Node[] _positionedNodes = new Node[6];
49  
50  	DataImporter _importer;
51  
52  	public static junit.framework.Test suite() {
53  		return new JUnit4TestAdapter(SelectMediatorsOperationTest.class);
54  	}
55  
56  	@Before
57  	public void setUp() throws Exception {
58  		IModel model = new Model();
59  		_diagram = new Diagram(model.getDataSets());
60  		_importer = new DataImporter(model);
61  	}
62  
63  	private static Map<String, Object> getMainEntitiesIds() {
64  		HashMap<String, Object> mainEntitiesIds = new HashMap<String, Object>();
65  		mainEntitiesIds.put("0000", null); //$NON-NLS-1$
66  		mainEntitiesIds.put("1111", null); //$NON-NLS-1$
67  		mainEntitiesIds.put("2222", null); //$NON-NLS-1$
68  		mainEntitiesIds.put("3333", null); //$NON-NLS-1$
69  		mainEntitiesIds.put("4444", null); //$NON-NLS-1$
70  		mainEntitiesIds.put("5555", null); //$NON-NLS-1$
71  		mainEntitiesIds.put("6666", null); //$NON-NLS-1$
72  		mainEntitiesIds.put("7777", null); //$NON-NLS-1$
73  		mainEntitiesIds.put("8888", null); //$NON-NLS-1$
74  		mainEntitiesIds.put("9999", null); //$NON-NLS-1$
75  		return mainEntitiesIds;
76  	}
77  
78  	@Test
79  	public void findMediatorsTest() {
80  		buildModel();
81  		SelectMediatorsParameters params = new SelectMediatorsParameters();
82  		SelectMediatorsOperation command = new SelectMediatorsOperation(params,
83  				_diagram.getNodes());
84  		List<Node> execute = command.execute();
85  
86  		Assert.assertTrue(_positionedNodes[2].isMainNode());
87  		Assert.assertFalse(_positionedNodes[3].isMainNode());
88  		Assert.assertTrue(_positionedNodes[4].isMainNode());
89  		Assert.assertFalse(_positionedNodes[5].isMainNode());
90  		Assert.assertFalse(_positionedNodes[1].isMainNode());
91  
92  		Assert.assertEquals(1, execute.size());
93  		Assert.assertEquals(_positionedNodes[1], execute.get(0));
94  	}
95  
96  	@Test
97  	public void findZeroMediators() {
98  		buildModel();
99  		SelectMediatorsParameters params = new SelectMediatorsParameters();
100 		params.setMinEachConnections(3);
101 		SelectMediatorsOperation command = new SelectMediatorsOperation(params,
102 				_diagram.getNodes());
103 		List<Node> execute = command.execute();
104 
105 		Assert.assertTrue(_positionedNodes[2].isMainNode());
106 		Assert.assertFalse(_positionedNodes[3].isMainNode());
107 		Assert.assertTrue(_positionedNodes[4].isMainNode());
108 		Assert.assertFalse(_positionedNodes[5].isMainNode());
109 		Assert.assertFalse(_positionedNodes[1].isMainNode());
110 
111 		Assert.assertEquals(0, execute.size());
112 	}
113 
114 	@Test
115 	public void findMediatorsTest2() {
116 		buildModel();
117 		SelectMediatorsParameters params = new SelectMediatorsParameters();
118 		params.setMode(SelectMediatorsMode.SUM);
119 		params.setMinTotalConnections(6);
120 
121 		SelectMediatorsOperation command = new SelectMediatorsOperation(params,
122 				_diagram.getNodes());
123 		List<Node> execute = command.execute();
124 
125 		Assert.assertTrue(_positionedNodes[2].isMainNode());
126 		Assert.assertFalse(_positionedNodes[3].isMainNode());
127 		Assert.assertTrue(_positionedNodes[4].isMainNode());
128 		Assert.assertFalse(_positionedNodes[5].isMainNode());
129 		Assert.assertFalse(_positionedNodes[1].isMainNode());
130 
131 		Assert.assertEquals(0, execute.size());
132 	}
133 
134 	@Test
135 	public void noMainEntities() {
136 		buildModel();
137 
138 		SelectMediatorsParameters params = new SelectMediatorsParameters();
139 		SelectMediatorsOperation command = new SelectMediatorsOperation(params,
140 				_diagram.getNodes());
141 		command.execute();
142 
143 		_positionedNodes[1].setAttributeValue(
144 				NodeAttributeManager.PERMANENT_ISMAIN, false);
145 		_positionedNodes[2].setAttributeValue(
146 				NodeAttributeManager.PERMANENT_ISMAIN, false);
147 		_positionedNodes[3].setAttributeValue(
148 				NodeAttributeManager.PERMANENT_ISMAIN, false);
149 		_positionedNodes[4].setAttributeValue(
150 				NodeAttributeManager.PERMANENT_ISMAIN, false);
151 		_positionedNodes[5].setAttributeValue(
152 				NodeAttributeManager.PERMANENT_ISMAIN, false);
153 
154 		Assert.assertFalse(_positionedNodes[2].isMainNode());
155 		Assert.assertFalse(_positionedNodes[3].isMainNode());
156 		Assert.assertFalse(_positionedNodes[4].isMainNode());
157 		Assert.assertFalse(_positionedNodes[5].isMainNode());
158 		Assert.assertFalse(_positionedNodes[1].isMainNode());
159 	}
160 
161 	@Test
162 	public void fileBased_p5t10() {
163 
164 		try {
165 			_importer.importDataFromFile(buildFullFilePath("p5t10" //$NON-NLS-1$
166 					+ File.separator + "p5t10_a.txt")); //$NON-NLS-1$
167 			_importer.importDataFromFile(buildFullFilePath("p5t10" //$NON-NLS-1$
168 					+ File.separator + "p5t10_b.txt")); //$NON-NLS-1$
169 			_importer.importDataFromFile(buildFullFilePath("p5t10" //$NON-NLS-1$
170 					+ File.separator + "p5t10_c.txt")); //$NON-NLS-1$
171 		} catch (IOException ex) {
172 			fail("Exception occurred: " + ex.getMessage()); //$NON-NLS-1$
173 		}
174 
175 		validateFileBased();
176 	}
177 
178 	@Test
179 	public void fileBased_p15t20() {
180 
181 		try {
182 			_importer.importDataFromFile(buildFullFilePath("p15t20" //$NON-NLS-1$
183 					+ File.separator + "p15t20_a.txt")); //$NON-NLS-1$
184 			_importer.importDataFromFile(buildFullFilePath("p15t20" //$NON-NLS-1$
185 					+ File.separator + "p15t20_b.txt")); //$NON-NLS-1$
186 			_importer.importDataFromFile(buildFullFilePath("p15t20" //$NON-NLS-1$
187 					+ File.separator + "p15t20_c.txt")); //$NON-NLS-1$
188 		} catch (IOException ex) {
189 			fail("Exception occurred: " + ex.getMessage()); //$NON-NLS-1$
190 		}
191 
192 		validateFileBased();
193 	}
194 
195 	@Test
196 	public void fileBased_p50t200() {
197 		try {
198 			_importer.importDataFromFile(buildFullFilePath("p50t200" //$NON-NLS-1$
199 					+ File.separator + "p50t200_a.txt")); //$NON-NLS-1$
200 			_importer.importDataFromFile(buildFullFilePath("p50t200" //$NON-NLS-1$
201 					+ File.separator + "p50t200_b.txt")); //$NON-NLS-1$
202 			_importer.importDataFromFile(buildFullFilePath("p50t200" //$NON-NLS-1$
203 					+ File.separator + "p50t200_c.txt")); //$NON-NLS-1$
204 		} catch (IOException ex) {
205 			fail("Exception occurred: " + ex.getMessage()); //$NON-NLS-1$
206 		}
207 
208 		validateFileBased();
209 	}
210 
211 	@Test
212 	public void testUndo() {
213 		buildModel();
214 		SelectMediatorsParameters params = new SelectMediatorsParameters();
215 		params.setMode(SelectMediatorsMode.SUM);
216 		params.setMinTotalConnections(1);
217 
218 		SelectMediatorsCommand command = new SelectMediatorsCommand(params,
219 				_diagram.getNodes());
220 		command.execute();
221 
222 		Assert.assertTrue(_positionedNodes[2].isMainNode());
223 		Assert.assertTrue(_positionedNodes[3].isMainNode());
224 		Assert.assertTrue(_positionedNodes[4].isMainNode());
225 		Assert.assertFalse(_positionedNodes[5].isMainNode());
226 		Assert.assertTrue(_positionedNodes[1].isMainNode());
227 
228 		command.undo();
229 
230 		Assert.assertTrue(_positionedNodes[2].isMainNode());
231 		Assert.assertFalse(_positionedNodes[3].isMainNode());
232 		Assert.assertTrue(_positionedNodes[4].isMainNode());
233 		Assert.assertFalse(_positionedNodes[5].isMainNode());
234 		Assert.assertFalse(_positionedNodes[1].isMainNode());
235 	}
236 
237 	@Test
238 	public void TestMessage() {
239 		SelectMediatorsParameters params = new SelectMediatorsParameters();
240 		params.setMode(SelectMediatorsMode.SUM);
241 		params.setMinTotalConnections(1);
242 
243 		SelectMediatorsCommand command = new SelectMediatorsCommand(params,
244 				_diagram.getNodes());
245 		Assert.assertEquals(Messages.SelectMediatorsCommand_0, command
246 				.getLabel());
247 	}
248 
249 	private Node getNodeById(IDiagram model, String id) {
250 		for (Node node : model.getNodes())
251 			if (id.equals(node.getId()))
252 				return node;
253 		return null;
254 	}
255 
256 	private void validateFileBased() {
257 		SelectMediatorsParameters params = new SelectMediatorsParameters();
258 		params.setMinEachConnections(1);
259 
260 		SelectMediatorsOperation command = new SelectMediatorsOperation(params,
261 				_diagram.getNodes());
262 		command.execute();
263 
264 		for (String strEntityId : MAIN_ENTITIES_IDS.keySet()) {
265 			Node node = getNodeById(_diagram, strEntityId);
266 			if (node != null)
267 				Assert
268 						.assertTrue(
269 								node.getId() + " should be a main entity", node.isMainNode()); //$NON-NLS-1$
270 		}
271 
272 		for (Node node : _diagram.getNodes()) {
273 			if (MAIN_ENTITIES_IDS.containsKey(node.getId()))
274 				continue;
275 			boolean isMain = node.isMainNode();
276 			if (isMain)
277 				fail(node.getId() + " should not be a main entity"); //$NON-NLS-1$
278 		}
279 	}
280 
281 	private String buildFullFilePath(String filePath) {
282 		return "src" + File.separator + //$NON-NLS-1$
283 				"test" + File.separator + //$NON-NLS-1$
284 				"resources" + File.separator + //$NON-NLS-1$
285 				"testData" + File.separator + //$NON-NLS-1$
286 				"find_mediators" + File.separator + //$NON-NLS-1$
287 				filePath + File.separator;
288 	}
289 
290 	/**
291 	 * Visualization of this model is in test/testImages/findMediators001.jpg
292 	 */
293 	private void buildModel() {
294 		IDataSet dataSet = new DataSet();
295 		IEntity[] entities = new IEntity[6];
296 		for (int i = 1; i <= 5; i++) {
297 			entities[i] = new Entity(Integer.toString(i));
298 			if (i == 2 || i == 4)
299 				entities[i].setAttribute("IsMain", true); //$NON-NLS-1$
300 		}
301 
302 		dataSet.addRelation(new TimedRelation(entities[1], entities[2],
303 				new Date(1210000000l)));
304 		dataSet.addRelation(new TimedRelation(entities[1], entities[2],
305 				new Date(1220000000l)));
306 		dataSet.addRelation(new TimedRelation(entities[1], entities[4],
307 				new Date(1410000000l)));
308 		dataSet.addRelation(new TimedRelation(entities[1], entities[4],
309 				new Date(1420000000l)));
310 		dataSet.addRelation(new TimedRelation(entities[1], entities[4],
311 				new Date(1430000000l)));
312 		dataSet.addRelation(new TimedRelation(entities[2], entities[3],
313 				new Date(2310000000l)));
314 		dataSet.addRelation(new TimedRelation(entities[2], entities[5],
315 				new Date(2510000000l)));
316 		dataSet.addRelation(new TimedRelation(entities[3], entities[4],
317 				new Date(3410000000l)));
318 
319 		Assert.assertEquals(8, dataSet.getRelations().size());
320 		Assert.assertEquals(5, dataSet.getEntities().size());
321 
322 		_diagram = new Diagram(Collections.singleton(dataSet));
323 
324 		Assert.assertEquals(5, _diagram.getNodes().size());
325 
326 		Map<Integer, Integer> expectedConnGroups = new HashMap<Integer, Integer>();
327 		expectedConnGroups.put(1, 2);
328 		expectedConnGroups.put(2, 3);
329 		expectedConnGroups.put(3, 2);
330 		expectedConnGroups.put(4, 2);
331 		expectedConnGroups.put(5, 1);
332 
333 		for (Node node : _diagram.getNodes()) {
334 			for (int i = 1; i <= 5; i++) {
335 				if (entities[i].getId().equals(node.getId())) {
336 					_positionedNodes[i] = node;
337 					Assert.assertEquals((Integer) node.getConnectionGroups()
338 							.size(), expectedConnGroups.get(i));
339 					break;
340 				}
341 			}
342 		}
343 	}
344 }