feat(i18n): integrate StorageService for language persistence in LocalizationServiceImpl

This commit is contained in:
extio-de
2025-12-31 13:30:35 +01:00
parent 5a1807d331
commit 7dbe26a5cd
6 changed files with 113 additions and 18 deletions

View File

@@ -10,17 +10,29 @@ import java.io.InputStream;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import de.extio.game_engine.storage.StorageService;
class LocalizationManagerTest {
@Mock
private StorageService storageService;
private LocalizationService localizationManager;
@BeforeEach
void setUp() {
this.localizationManager = new LocalizationServiceImpl();
MockitoAnnotations.openMocks(this);
this.localizationManager = new LocalizationServiceImpl(storageService);
}
@Test
@@ -278,4 +290,39 @@ class LocalizationManagerTest {
assertEquals("Hello", englishGreeting);
assertEquals("Hallo", germanGreeting);
}
@Test
void testPersistCurrentLanguage() {
Localizations localizations = this.localizationManager.getLocalizations();
Language english = new Language("English", "en");
localizations.getLanguagesInfo().put("en", english);
localizations.getLanguages().put("en", new LinkedHashMap<>(Map.of("greeting", "Hello")));
this.localizationManager.setLanguage("en");
verify(storageService).store(List.of("gameEngine"), "currentLanguage", "en");
}
@Test
void testLoadPersistedLanguage() {
when(storageService.loadByPath(String.class, List.of("gameEngine"), "currentLanguage"))
.thenReturn(Optional.of("de"));
// Load localizations with "de"
Localizations localizationsToSave = new Localizations();
Language german = new Language("German", "de");
Map<String, String> germanEntries = new LinkedHashMap<>(Map.of("greeting", "Hallo"));
localizationsToSave.getLanguagesInfo().put("de", german);
localizationsToSave.getLanguages().put("de", germanEntries);
localizationsToSave.setPrefix("i18n.");
localizationsToSave.setCurId(1);
byte[] serialized = de.extio.game_engine.util.ObjectSerialization.serialize(
localizationsToSave, false, false, false, null, digest -> {});
InputStream stream = new ByteArrayInputStream(serialized);
this.localizationManager.load(stream);
assertEquals("de", this.localizationManager.getCurrentLanguage());
}
}

View File

@@ -16,6 +16,9 @@ import java.util.Optional;
import org.junit.jupiter.api.Test;
import de.extio.game_engine.renderer.g2d.G2DRenderer;
import de.extio.game_engine.renderer.g2d.G2DRendererControl;
import de.extio.game_engine.renderer.model.options.UiOptions;
import de.extio.game_engine.resource.StaticResource;
import de.extio.game_engine.resource.StaticResourceService;
import de.extio.game_engine.storage.StorageService;
@@ -42,7 +45,7 @@ public class G2DThemeManagerTest {
}
@Test
void loadsLastUsedThemeFromStorageOnConstruction() {
void loadsLastUsedThemeFromStorage() {
final StaticResourceService staticResourceService = org.mockito.Mockito.mock(StaticResourceService.class);
final StorageService storageService = org.mockito.Mockito.mock(StorageService.class);
final PatternRenderer patternRenderer = org.mockito.Mockito.mock(PatternRenderer.class);
@@ -50,7 +53,7 @@ public class G2DThemeManagerTest {
final Theme defaultTheme = theme("Default");
final Theme persistedTheme = theme("Persisted");
when(storageService.loadByPath(eq(Theme.class), eq(List.of("gameEngine", "themes")), eq("lastTheme")))
when(storageService.loadByPath(eq(Theme.class), eq(List.of("gameEngine")), eq("lastTheme")))
.thenReturn(Optional.of(persistedTheme));
final var manager = new G2DThemeManager(
@@ -59,19 +62,21 @@ public class G2DThemeManagerTest {
List.of(patternRenderer),
Map.of("defaultKey", defaultTheme),
"defaultKey");
manager.setCurrentTheme((Theme) null);
assertEquals("Persisted", manager.getCurrentTheme().getName());
assertTrue(manager.getAvailableThemeNames().contains("Persisted"));
}
@Test
void setCurrentThemePersistsLastThemeObject() {
final StaticResourceService staticResourceService = org.mockito.Mockito.mock(StaticResourceService.class);
final StorageService storageService = org.mockito.Mockito.mock(StorageService.class);
final PatternRenderer patternRenderer = org.mockito.Mockito.mock(PatternRenderer.class);
when(storageService.loadByPath(eq(Theme.class), eq(List.of("gameEngine", "themes")), eq("lastTheme")))
when(storageService.loadByPath(eq(Theme.class), eq(List.of("gameEngine")), eq("lastTheme")))
.thenReturn(Optional.empty());
final PatternRenderer patternRenderer = org.mockito.Mockito.mock(PatternRenderer.class);
final G2DRendererControl g2dRendererControl = org.mockito.Mockito.mock(G2DRendererControl.class);
when(g2dRendererControl.getUiOptions()).thenReturn(new UiOptions());
final G2DRenderer g2dRenderer = org.mockito.Mockito.mock(G2DRenderer.class);
final Theme defaultTheme = theme("Default");
final var manager = new G2DThemeManager(
@@ -80,11 +85,13 @@ public class G2DThemeManagerTest {
List.of(patternRenderer),
Map.of("defaultKey", defaultTheme),
"defaultKey");
manager.setG2dRendererControl(g2dRendererControl);
manager.setG2dRenderer(g2dRenderer);
final Theme selected = theme("Selected");
manager.setCurrentTheme(selected);
verify(storageService).store(eq(List.of("gameEngine", "themes")), eq("lastTheme"), eq(selected));
verify(storageService).store(eq(List.of("gameEngine")), eq("lastTheme"), eq(selected));
assertTrue(manager.getAvailableThemeNames().contains("Selected"));
}
@@ -94,7 +101,7 @@ public class G2DThemeManagerTest {
final StorageService storageService = org.mockito.Mockito.mock(StorageService.class);
final PatternRenderer patternRenderer = org.mockito.Mockito.mock(PatternRenderer.class);
when(storageService.loadByPath(eq(Theme.class), eq(List.of("gameEngine", "themes")), eq("lastTheme")))
when(storageService.loadByPath(eq(Theme.class), eq(List.of("gameEngine")), eq("lastTheme")))
.thenReturn(Optional.empty());
final Theme defaultTheme = theme("Default");
@@ -106,7 +113,7 @@ public class G2DThemeManagerTest {
"defaultKey");
final Theme loaded = theme("FromStorage");
when(storageService.loadByPath(eq(Theme.class), eq(List.of("gameEngine", "themes")), eq("FromStorage")))
when(storageService.loadByPath(eq(Theme.class), eq(List.of("gameEngine")), eq("FromStorage")))
.thenReturn(Optional.of(loaded));
final Optional<Theme> result = manager.loadThemeFromStorage("FromStorage");
@@ -121,7 +128,7 @@ public class G2DThemeManagerTest {
final StorageService storageService = org.mockito.Mockito.mock(StorageService.class);
final PatternRenderer patternRenderer = org.mockito.Mockito.mock(PatternRenderer.class);
when(storageService.loadByPath(eq(Theme.class), eq(List.of("gameEngine", "themes")), eq("lastTheme")))
when(storageService.loadByPath(eq(Theme.class), eq(List.of("gameEngine")), eq("lastTheme")))
.thenReturn(Optional.empty());
final Theme defaultTheme = theme("Default");
@@ -149,7 +156,7 @@ public class G2DThemeManagerTest {
final StorageService storageService = org.mockito.Mockito.mock(StorageService.class);
final PatternRenderer patternRenderer = org.mockito.Mockito.mock(PatternRenderer.class);
when(storageService.loadByPath(eq(Theme.class), eq(List.of("gameEngine", "themes")), eq("lastTheme")))
when(storageService.loadByPath(eq(Theme.class), eq(List.of("gameEngine")), eq("lastTheme")))
.thenReturn(Optional.empty());
final Theme defaultTheme = theme("Default");
@@ -163,7 +170,7 @@ public class G2DThemeManagerTest {
final Theme themeToSave = theme("UserTheme");
manager.saveThemeToStorage(themeToSave);
verify(storageService).store(eq(List.of("gameEngine", "themes")), eq("UserTheme"), eq(themeToSave));
verify(storageService).store(eq(List.of("gameEngine")), eq("UserTheme"), eq(themeToSave));
}
@Test
@@ -204,7 +211,7 @@ public class G2DThemeManagerTest {
final StorageService storageService = org.mockito.Mockito.mock(StorageService.class);
final PatternRenderer patternRenderer = org.mockito.Mockito.mock(PatternRenderer.class);
when(storageService.loadByPath(eq(Theme.class), eq(List.of("gameEngine", "themes")), eq("lastTheme")))
when(storageService.loadByPath(eq(Theme.class), eq(List.of("gameEngine")), eq("lastTheme")))
.thenReturn(Optional.empty());
final Theme defaultTheme = theme("Default");