package org.jabref.logic.openoffice; import java.net.URISyntaxException; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.jabref.logic.layout.LayoutFormatterPreferences; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.mockito.Answers; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class StyleLoaderTest { private static int numberOfInternalStyles = 2; private StyleLoader loader; private OpenOfficePreferences preferences; private LayoutFormatterPreferences layoutPreferences; private Charset encoding; @Before public void setUp() { preferences = mock(OpenOfficePreferences.class, Answers.RETURNS_DEEP_STUBS); layoutPreferences = mock(LayoutFormatterPreferences.class, Answers.RETURNS_DEEP_STUBS); encoding = StandardCharsets.UTF_8; } @Test(expected = NullPointerException.class) public void throwNPEWithNullPreferences() { loader = new StyleLoader(null, layoutPreferences, mock(Charset.class)); fail(); } @Test(expected = NullPointerException.class) public void throwNPEWithNullLayoutPreferences() { loader = new StyleLoader(mock(OpenOfficePreferences.class), null, mock(Charset.class)); fail(); } @Test(expected = NullPointerException.class) public void throwNPEWithNullCharset() { loader = new StyleLoader(mock(OpenOfficePreferences.class), layoutPreferences, null); fail(); } @Test public void testGetStylesWithEmptyExternal() { preferences.setExternalStyles(Collections.emptyList()); loader = new StyleLoader(preferences, layoutPreferences, encoding); assertEquals(2, loader.getStyles().size()); } @Test public void testAddStyleLeadsToOneMoreStyle() throws URISyntaxException { preferences.setExternalStyles(Collections.emptyList()); loader = new StyleLoader(preferences, layoutPreferences, encoding); String filename = Paths.get(StyleLoader.class.getResource(StyleLoader.DEFAULT_AUTHORYEAR_STYLE_PATH).toURI()) .toFile().getPath(); loader.addStyleIfValid(filename); assertEquals(numberOfInternalStyles + 1, loader.getStyles().size()); } @Test public void testAddInvalidStyleLeadsToNoMoreStyle() { preferences.setExternalStyles(Collections.emptyList()); loader = new StyleLoader(preferences, layoutPreferences, encoding); int beforeAdding = loader.getStyles().size(); loader.addStyleIfValid("DefinitelyNotAValidFileNameOrWeAreExtremelyUnlucky"); assertEquals(beforeAdding, loader.getStyles().size()); } @Test public void testInitalizeWithOneExternalFile() throws URISyntaxException { String filename = Paths.get(StyleLoader.class.getResource(StyleLoader.DEFAULT_AUTHORYEAR_STYLE_PATH).toURI()) .toFile().getPath(); when(preferences.getExternalStyles()).thenReturn(Collections.singletonList(filename)); loader = new StyleLoader(preferences, layoutPreferences, encoding); assertEquals(numberOfInternalStyles + 1, loader.getStyles().size()); } @Test public void testInitalizeWithIncorrectExternalFile() { preferences.setExternalStyles(Collections.singletonList("DefinitelyNotAValidFileNameOrWeAreExtremelyUnlucky")); loader = new StyleLoader(preferences, layoutPreferences, encoding); assertEquals(numberOfInternalStyles, loader.getStyles().size()); } @Test public void testInitalizeWithOneExternalFileRemoveStyle() throws URISyntaxException { String filename = Paths.get(StyleLoader.class.getResource(StyleLoader.DEFAULT_AUTHORYEAR_STYLE_PATH).toURI()) .toFile().getPath(); when(preferences.getExternalStyles()).thenReturn(Collections.singletonList(filename)); loader = new StyleLoader(preferences, layoutPreferences, encoding); List<OOBibStyle> toremove = new ArrayList<>(); int beforeRemoving = loader.getStyles().size(); for (OOBibStyle style : loader.getStyles()) { if (!style.isFromResource()) { toremove.add(style); } } for (OOBibStyle style : toremove) { assertTrue(loader.removeStyle(style)); } assertEquals(beforeRemoving - 1, loader.getStyles().size()); } @Test @Ignore("This tests the preferences that are mocked away") public void testInitalizeWithOneExternalFileRemoveStyleUpdatesPreferences() throws URISyntaxException { String filename = Paths.get(StyleLoader.class.getResource(StyleLoader.DEFAULT_AUTHORYEAR_STYLE_PATH).toURI()) .toFile().getPath(); when(preferences.getExternalStyles()).thenReturn(Collections.singletonList(filename)); loader = new StyleLoader(preferences, layoutPreferences, encoding); List<OOBibStyle> toremove = new ArrayList<>(); for (OOBibStyle style : loader.getStyles()) { if (!style.isFromResource()) { toremove.add(style); } } for (OOBibStyle style : toremove) { assertTrue(loader.removeStyle(style)); } assertTrue(preferences.getExternalStyles().isEmpty()); } @Test public void testAddSameStyleTwiceLeadsToOneMoreStyle() throws URISyntaxException { preferences.setExternalStyles(Collections.emptyList()); loader = new StyleLoader(preferences, layoutPreferences, encoding); int beforeAdding = loader.getStyles().size(); String filename = Paths.get(StyleLoader.class.getResource(StyleLoader.DEFAULT_AUTHORYEAR_STYLE_PATH).toURI()) .toFile().getPath(); loader.addStyleIfValid(filename); loader.addStyleIfValid(filename); assertEquals(beforeAdding + 1, loader.getStyles().size()); } @Test(expected = NullPointerException.class) public void testAddNullStyleThrowsNPE() { loader = new StyleLoader(preferences, layoutPreferences, encoding); loader.addStyleIfValid(null); fail(); } @Test public void testGetDefaultUsedStyleWhenEmpty() { when(preferences.getCurrentStyle()).thenReturn(StyleLoader.DEFAULT_AUTHORYEAR_STYLE_PATH); preferences.clearCurrentStyle(); loader = new StyleLoader(preferences, layoutPreferences, encoding); OOBibStyle style = loader.getUsedStyle(); assertTrue(style.isValid()); assertEquals(StyleLoader.DEFAULT_AUTHORYEAR_STYLE_PATH, style.getPath()); assertEquals(StyleLoader.DEFAULT_AUTHORYEAR_STYLE_PATH, preferences.getCurrentStyle()); } @Test public void testGetStoredUsedStyle() { when(preferences.getCurrentStyle()).thenReturn(StyleLoader.DEFAULT_NUMERICAL_STYLE_PATH); loader = new StyleLoader(preferences, layoutPreferences, encoding); OOBibStyle style = loader.getUsedStyle(); assertTrue(style.isValid()); assertEquals(StyleLoader.DEFAULT_NUMERICAL_STYLE_PATH, style.getPath()); assertEquals(StyleLoader.DEFAULT_NUMERICAL_STYLE_PATH, preferences.getCurrentStyle()); } @Test @Ignore("This tests the preferences that are mocked away") public void testGtDefaultUsedStyleWhenIncorrect() { when(preferences.getCurrentStyle()).thenReturn("ljlkjlkjnljnvdlsjniuhwelfhuewfhlkuewhfuwhelu"); loader = new StyleLoader(preferences, layoutPreferences, encoding); OOBibStyle style = loader.getUsedStyle(); assertTrue(style.isValid()); assertEquals(StyleLoader.DEFAULT_AUTHORYEAR_STYLE_PATH, style.getPath()); assertEquals(StyleLoader.DEFAULT_AUTHORYEAR_STYLE_PATH, preferences.getCurrentStyle()); } @Test public void testRemoveInternalStyleReturnsFalseAndDoNotRemove() { preferences.setExternalStyles(Collections.emptyList()); loader = new StyleLoader(preferences, layoutPreferences, encoding); List<OOBibStyle> toremove = new ArrayList<>(); for (OOBibStyle style : loader.getStyles()) { if (style.isFromResource()) { toremove.add(style); } } assertFalse(loader.removeStyle(toremove.get(0))); assertEquals(numberOfInternalStyles, loader.getStyles().size()); } }