package fi.vincit.jmobster.util; /* * Copyright 2012-2013 Juha Siponen * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import fi.vincit.jmobster.processor.ModelFactory; import fi.vincit.jmobster.processor.ModelProcessor; import fi.vincit.jmobster.processor.languages.LanguageContext; import fi.vincit.jmobster.processor.model.Model; import fi.vincit.jmobster.util.itemprocessor.ItemStatus; import fi.vincit.jmobster.util.writer.DataWriter; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.Arrays; import java.util.Collection; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import static org.junit.internal.matchers.IsCollectionContaining.hasItems; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.*; public class BaseModelCacheTest { public static class TestModelCache extends BaseModelCache<LanguageContext<DataWriter>, DataWriter> { public TestModelCache(ModelProcessor<LanguageContext<DataWriter>, DataWriter> modelGenerator, ModelFactory modelFactory) { super(modelGenerator, modelFactory); } } @Mock ModelProcessor modelProcessor; @Mock ModelFactory modelFactory; @Mock LanguageContext languageContext; @Mock DataWriter dataWriter; private Model testModel; private static Collection TEST_CLASSES = Arrays.asList(TestModel.class); @Before public void init() { MockitoAnnotations.initMocks(this); initMocks(); } private TestModelCache getModelCache() { TestModelCache modelCache = new TestModelCache(modelProcessor, modelFactory); return modelCache; } public static class TestModel { } private void initMocks() { testModel = mock(Model.class); when(testModel.getName()).thenReturn("TestModel"); Collection<Model> models = Arrays.asList(testModel); when(modelFactory.createAll(TEST_CLASSES)).thenReturn(models); when(modelProcessor.getLanguageContext()).thenReturn(languageContext); when(languageContext.getWriter()).thenReturn(dataWriter); when(dataWriter.toString()).thenReturn("Test_Model", "Test_Model_2"); } @Test(expected = IllegalArgumentException.class) public void testGetModel_NoneFound() { TestModelCache modelCache = getModelCache(); modelCache.getModelByNameAndGroupClasses("test"); } @Test public void testGetModel_FoundForFirstTime() { TestModelCache modelCache = getModelCache(); modelCache.addModels(TEST_CLASSES); String generatedModel = modelCache.getModelByNameAndGroupClasses("TestModel"); assertThat(generatedModel, is("Test_Model")); verify(modelProcessor).doProcessModel(eq(testModel), any(ItemStatus.class)); } @Test public void testGetModel_GotFromCache() { TestModelCache modelCache = getModelCache(); modelCache.addModels(TEST_CLASSES); String generatedModel1 = modelCache.getModelByNameAndGroupClasses("TestModel"); String generatedModel2 = modelCache.getModelByNameAndGroupClasses("TestModel"); assertThat(generatedModel1, is("Test_Model")); assertThat(generatedModel2, is("Test_Model")); verify(modelProcessor).doProcessModel(eq(testModel), any(ItemStatus.class)); } @Test public void testClearModelCache() { TestModelCache modelCache = getModelCache(); modelCache.addModels(TEST_CLASSES); String generatedModel1 = modelCache.getModelByNameAndGroupClasses("TestModel"); modelCache.clearModelCache(); String generatedModel2 = modelCache.getModelByNameAndGroupClasses("TestModel"); assertThat(generatedModel1, is("Test_Model")); assertThat(generatedModel2, is("Test_Model_2")); verify(modelProcessor, times(2)).doProcessModel(eq(testModel), any(ItemStatus.class)); } @Test(expected = IllegalArgumentException.class) public void testClearModelCacheAndModels() { TestModelCache modelCache = getModelCache(); modelCache.addModels(TEST_CLASSES); modelCache.getModelByNameAndGroupClasses("TestModel"); modelCache.clearModelCacheAndModels(); modelCache.getModelByNameAndGroupClasses("TestModel"); } @Test public void testGetModelNames() { TestModelCache modelCache = getModelCache(); modelCache.addModels(TEST_CLASSES); assertThat(modelCache.getModelNames(), hasItems("TestModel") ); } }