package com.plectix.simulator.stories; import static org.junit.Assert.assertTrue; import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.Map; import java.util.TreeMap; import java.util.Map.Entry; import org.junit.Test; import org.junit.runners.Parameterized.Parameters; import com.plectix.simulator.OperationModeCollectionGenerator; import com.plectix.simulator.simulator.SimulationArguments.StoryCompressionMode; import com.plectix.simulator.staticanalysis.stories.MarkOfEvent; import com.plectix.simulator.staticanalysis.stories.Stories; import com.plectix.simulator.staticanalysis.stories.compressions.CompressionPassport; import com.plectix.simulator.staticanalysis.stories.compressions.Compressor; import com.plectix.simulator.staticanalysis.stories.storage.AtomicEvent; import com.plectix.simulator.staticanalysis.stories.storage.EventIteratorInterface; import com.plectix.simulator.staticanalysis.stories.storage.StoryStorageException; import com.plectix.simulator.staticanalysis.stories.storage.WireHashKey; import com.plectix.simulator.staticanalysis.stories.storage.WireStorageInterface; public class TestPassportCorrectness extends InitStoriesTests { private static final String separator = File.separator; private static final String path = "test.data" + separator + "stories" // + separator + "simple" + separator; Map<Integer, CompressionPassport> passports; @Parameters public static Collection<Object[]> regExValues() { return OperationModeCollectionGenerator.generate(getAllTestFileNames(path),false); } public TestPassportCorrectness(String fileName, Integer opMode) { super(path, fileName, false, false, true, true, opMode); passports = new TreeMap<Integer, CompressionPassport>(); } @Test public void testAll() throws StoryStorageException { Stories stories = getStories(); for (Entry<Integer, WireStorageInterface> entry : stories .getEventsMapForCurrentStory().entrySet()) { if (entry.getValue().isImportantStory()) { passports.put(entry.getKey(), entry.getValue() .extractPassport()); } } // System.out // .println("\n\n**************************************fileName = " // + fileName); for (CompressionPassport cp : passports.values()) { testPrepare(cp); testEventIterator(cp); testAgentTypeIterator(cp); testAgentWires(cp); testRemoveEventWithMarkDeleted(cp); testSwap(cp); // testSwapAndUndo(cp); } } public void testPrepare(CompressionPassport passport) throws StoryStorageException { testStoragesCorrectness(passport.getStorage()); } public void testEventIterator(CompressionPassport passport) throws StoryStorageException { boolean reverse = false; EventIteratorInterface eventIterator = passport.eventIterator(reverse); LinkedHashSet<Long> eventsSteps = new LinkedHashSet<Long>(); LinkedHashSet<Long> mySteps = new LinkedHashSet<Long>(); for (Map<Long, AtomicEvent<?>> map : passport.getStorage() .getStorageWires().values()) { for (Long l : map.keySet()) eventsSteps.add(l); } Long l = new Long(-2); Long m = l; while (eventIterator.hasNext()) { m = eventIterator.next(); assertTrue(m > l); assertTrue(eventsSteps.contains(m)); mySteps.add(m); l = m; } for (Long k : eventsSteps) { assertTrue(mySteps.contains(k)); } } public void testAgentTypeIterator(CompressionPassport passport) { Iterator<String> agentTypeIterator = passport.agentTypeIterator(); String type; long id; LinkedHashSet<Long> myIds = new LinkedHashSet<Long>(); while (agentTypeIterator.hasNext()) { type = agentTypeIterator.next(); Iterator<Long> agentIterator = passport.agentIterator(type); while (agentIterator.hasNext()) { id = agentIterator.next(); myIds.add(id); } } LinkedHashSet<Long> allIds = new LinkedHashSet<Long>(); for (WireHashKey wk : passport.getStorage().getStorageWires().keySet()) { allIds.add(wk.getAgentId()); assertTrue(myIds.contains(wk.getAgentId())); } for (Long l : myIds) { assertTrue(allIds.contains(l)); } } public void testAgentWires(CompressionPassport passport) { Iterator<String> agentTypeIterator = passport.agentTypeIterator(); String type; long id; LinkedHashMap<String, LinkedHashSet<String>> wiresId = new LinkedHashMap<String, LinkedHashSet<String>>(); LinkedHashSet<String> dangerous = new LinkedHashSet<String>(); LinkedHashSet<String> dangerous2 = new LinkedHashSet<String>(); while (agentTypeIterator.hasNext()) { type = agentTypeIterator.next(); Iterator<Long> agentIterator = passport.agentIterator(type); assertTrue(wiresId.get(type) == null); wiresId.put(type, new LinkedHashSet<String>()); boolean first = true; String idSite; while (agentIterator.hasNext()) { id = agentIterator.next(); ArrayList<WireHashKey> getAgentWires = passport .getAgentWires(id); if (first) { for (WireHashKey wk : getAgentWires) { idSite = wk.getSiteName(); assertTrue(!(wiresId.get(type).contains(idSite) && dangerous.contains(idSite) && dangerous2 .contains(idSite))); if (wiresId.get(type).contains(idSite)) { if (dangerous.contains(idSite)) { dangerous2.add(idSite); } else { dangerous.add(idSite); } } wiresId.get(type).add(idSite); } } else { LinkedHashSet<String> second = new LinkedHashSet<String>(); for (WireHashKey wk : getAgentWires) { idSite = wk.getSiteName(); assertTrue(!(second.contains(idSite) && dangerous.contains(idSite) && dangerous2 .contains(idSite))); if (second.contains(idSite)) { if (dangerous.contains(idSite)) { dangerous2.add(idSite); } else { dangerous.add(idSite); } } second.add(idSite); } // equalsSetInteger(second, wiresId.get(type)); } dangerous.clear(); dangerous2.clear(); first = false; } } ArrayList<WireHashKey> getAgentWires = passport.getAgentWires(0); } private void equalsSetLong(LinkedHashSet<Long> first, LinkedHashSet<Long> second) { for (Long l : first) { assertTrue(second.contains(l)); } for (Long l : second) { assertTrue(first.contains(l)); } } private void equalsSetInteger(LinkedHashSet<Integer> first, LinkedHashSet<Integer> second) { for (Integer l : first) { assertTrue(second.contains(l)); if (!second.contains(l)) { System.out.println((l) + "first"); } } for (Integer li : second) { assertTrue(first.contains(li)); if (!first.contains(li)) { System.out.println((li) + "second"); } } } public void testSwapAgent(CompressionPassport passport) { } public void testUndoSwap(CompressionPassport passport) { } private void testRemoveEventWithMarkDeleted(CompressionPassport passport) throws StoryStorageException { Compressor weak = new Compressor(passport.getStorage()); passport.getStorage().markAllNull(); if (!passport.getStorage().initialEvent().getAtomicEvents().isEmpty()) { passport.getStorage().initialEvent().onlySetMark(MarkOfEvent.KEPT); } weak.execute(StoryCompressionMode.WEAK); passport.getStorage().markAllUnresolvedAsDeleted(); passport.removeEventWithMarkDelete(); // passport.getStorage().markAllUnresolved(); testStoragesCorrectness(passport.getStorage()); } private void testSwap(CompressionPassport passport) { Iterator<String> agentTypeIterator = passport.agentTypeIterator(); String type; long id; LinkedHashSet<Long> myIds = new LinkedHashSet<Long>(); while (agentTypeIterator.hasNext()) { type = agentTypeIterator.next(); Iterator<Long> agentIterator = passport.agentIterator(type); while (agentIterator.hasNext()) { id = agentIterator.next(); myIds.add(id); } } for (long i : myIds) { for (long j : myIds) { if (i == j) continue; passport.isAbleToSwap(i, j); } } } private void testSwapAndUndo(CompressionPassport passport) throws StoryStorageException { Iterator<String> agentTypeIterator = passport.agentTypeIterator(); String type; long id; LinkedHashSet<Long> myIds = new LinkedHashSet<Long>(); while (agentTypeIterator.hasNext()) { type = agentTypeIterator.next(); Iterator<Long> agentIterator = passport.agentIterator(type); while (agentIterator.hasNext()) { id = agentIterator.next(); myIds.add(id); } } int k = 0; for (long i : myIds) { for (long j : myIds) { if (i == j) continue; if (passport.isAbleToSwap(i, j)) { LinkedList<Long> l1 = new LinkedList<Long>(); LinkedList<Long> l2 = new LinkedList<Long>(); l1.add(i); l2.add(j); for (Long l = Long.valueOf(2); l <= passport.getStorage() .observableEvent().getStepId() - 1; l++) { if (k < 1000) { passport.swapAgents(l1, l2, Long .valueOf(l), true); passport.undoSwap(); StoryCorrectness.testCountUnresolvedOnWire(passport .getStorage()); passport.swapAgents(l1, l2, Long .valueOf(l), false); passport.undoSwap(); StoryCorrectness.testCountUnresolvedOnWire(passport .getStorage()); StoryCorrectness.testLinks(passport.getStorage()); k++; } } } } } } private void testStoragesCorrectness(WireStorageInterface storage) throws StoryStorageException { StoryCorrectness.testStorage(storage); StoryCorrectness.testWires(storage); StoryCorrectness.testOfStates(storage); StoryCorrectness.testOfParallelCorrectness(storage); StoryCorrectness.testInternalStatesIterator(storage); StoryCorrectness.testWireWithMinUnresolved(storage); StoryCorrectness.testCompareStorageMaps(storage); StoryCorrectness.testCountUnresolvedOnWire(storage); StoryCorrectness.testLinks(storage); } }