package org.netbeans.gradle.project.model; import java.nio.file.Path; import java.nio.file.Paths; import org.jtrim.concurrent.ContextAwareWrapper; import org.jtrim.concurrent.ManualTaskExecutor; import org.jtrim.concurrent.TaskExecutor; import org.jtrim.concurrent.TaskExecutors; import org.junit.Test; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.netbeans.gradle.project.util.NbConsumer; import static org.junit.Assert.*; import static org.mockito.Matchers.*; import static org.mockito.Mockito.*; public class LazyProjectModelPersisterFactoryTest { private static void executeAll(ManualTaskExecutor executor) { while (executor.executeCurrentlySubmitted() > 0) { // One more time to execute tasks submitted by the executed tasks. } } private static PersistentModelStore<Object> createLazyStore( PersistentModelStore<Object> wrapped, TaskExecutor persisterExecutor) { LazyPersistentModelStoreFactory<Object> factory = new LazyPersistentModelStoreFactory<>(wrapped, persisterExecutor); return factory.createStore(wrapped); } @Test public void testPersistOne() throws Exception { MemPersistentModelStore<Object> modelStore = new MemPersistentModelStore<>(); ManualTaskExecutor executor = new ManualTaskExecutor(true); PersistentModelStore<Object> persister = createLazyStore(modelStore, executor); Object model = "MyModel"; Path dest = Paths.get("MyTestDest"); persister.persistModel(model, dest); executeAll(executor); Object storedModel = modelStore.tryLoadModel(dest); assertSame("model", model, storedModel); } @Test public void testPersistingOnExecutor() throws Exception { ManualTaskExecutor executor = new ManualTaskExecutor(true); final ContextAwareWrapper contextAwareExecutor = TaskExecutors.contextAware(executor); @SuppressWarnings("unchecked") final NbConsumer<Boolean> modelStorePersistModel = (NbConsumer<Boolean>)mock(NbConsumer.class); @SuppressWarnings("unchecked") PersistentModelStore<Object> modelStore = (PersistentModelStore<Object>)mock(PersistentModelStore.class); doAnswer(new Answer<Object>() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { modelStorePersistModel.accept(contextAwareExecutor.isExecutingInThis()); return null; } }).when(modelStore).persistModel(any(), any(Path.class)); PersistentModelStore<Object> persister = createLazyStore(modelStore, contextAwareExecutor); persister.persistModel("MyModel", Paths.get("MyTestDest")); executeAll(executor); verify(modelStore).persistModel(any(), any(Path.class)); verify(modelStorePersistModel).accept(eq(true)); } @Test public void testGetQueuedModel() throws Exception { MemPersistentModelStore<Object> modelStore = new MemPersistentModelStore<>(); ManualTaskExecutor executor = new ManualTaskExecutor(true); PersistentModelStore<Object> persister = createLazyStore(modelStore, executor); Path dest = Paths.get("MyTestDest"); Object model = "MyModel"; persister.persistModel(model, dest); assertSame("model", model, persister.tryLoadModel(dest)); } @Test public void testOverwrite1() throws Exception { MemPersistentModelStore<Object> modelStore = new MemPersistentModelStore<>(); ManualTaskExecutor executor = new ManualTaskExecutor(true); PersistentModelStore<Object> persister = createLazyStore(modelStore, executor); Object model1 = "MyModel1"; Object model2 = "MyModel2"; Path dest = Paths.get("MyTestDest"); persister.persistModel(model1, dest); persister.persistModel(model2, dest); executeAll(executor); Object storedModel = modelStore.tryLoadModel(dest); assertSame("model", model2, storedModel); } @Test public void testOverwrite2() throws Exception { MemPersistentModelStore<Object> modelStore = new MemPersistentModelStore<>(); ManualTaskExecutor executor = new ManualTaskExecutor(true); PersistentModelStore<Object> persister = createLazyStore(modelStore, executor); Object model1 = "MyModel1"; Object model2 = "MyModel2"; Path dest = Paths.get("MyTestDest"); persister.persistModel(model1, dest); executeAll(executor); persister.persistModel(model2, dest); executeAll(executor); Object storedModel = modelStore.tryLoadModel(dest); assertSame("model", model2, storedModel); } @Test public void testStoreRetrievesFromWrapped() throws Exception { ManualTaskExecutor executor = new ManualTaskExecutor(true); Object model2 = "MyModel2"; @SuppressWarnings("unchecked") PersistentModelStore<Object> modelStore = (PersistentModelStore<Object>)mock(PersistentModelStore.class); doReturn(model2).when(modelStore).tryLoadModel(any(Path.class)); PersistentModelStore<Object> persister = createLazyStore(modelStore, executor); Object model1 = "MyModel1"; Path dest = Paths.get("MyTestDest"); persister.persistModel(model1, dest); executeAll(executor); Object storedModel = persister.tryLoadModel(dest); assertSame("model", model2, storedModel); } }