Storage was replaced by FileSystem

This commit is contained in:
Robert Vokac 2024-10-12 09:11:14 +02:00
parent b07fcd2a47
commit e49692818e
Signed by: robertvokac
GPG Key ID: FB9CE8E20AADA55F
9 changed files with 88 additions and 89 deletions

View File

@ -22,7 +22,7 @@ package com.pixelgamelibrary.backend.libgdx;
import com.pixelgamelibrary.api.audio.Music; import com.pixelgamelibrary.api.audio.Music;
import com.pixelgamelibrary.api.audio.Sound; import com.pixelgamelibrary.api.audio.Sound;
import com.pixelgamelibrary.api.interfaces.Audio; import com.pixelgamelibrary.api.interfaces.Audio;
import com.pixelgamelibrary.api.files.FileHandle; import com.pixelgamelibrary.api.files.File;
/** /**
* *
@ -31,12 +31,12 @@ import com.pixelgamelibrary.api.files.FileHandle;
public class AudioLibGDXImpl implements Audio { public class AudioLibGDXImpl implements Audio {
@Override @Override
public Sound newSound(FileHandle fileHandle) { public Sound newSound(File fileHandle) {
throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
} }
@Override @Override
public Music newMusic(FileHandle fileHandle) { public Music newMusic(File fileHandle) {
throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
} }

View File

@ -19,47 +19,47 @@
/////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////
package com.pixelgamelibrary.backend.libgdx; package com.pixelgamelibrary.backend.libgdx;
import com.pixelgamelibrary.backend.libgdx.files.StorageFactory; import com.pixelgamelibrary.backend.libgdx.files.FileSystemFactory;
import com.pixelgamelibrary.api.files.Storage;
import com.pixelgamelibrary.api.interfaces.Files; import com.pixelgamelibrary.api.interfaces.Files;
import com.pixelgamelibrary.backend.libgdx.files.AssetsLibGDXStorage; import com.pixelgamelibrary.backend.libgdx.files.AssetsLibGDXFileSystem;
import com.pixelgamelibrary.api.files.FileSystem;
/** /**
* *
* @author robertvokac * @author robertvokac
*/ */
public class FilesLibGDXImpl implements Files { public class FilesLibGDXImpl implements Files {
Storage assetsStorage = null; FileSystem assetsFileSystem = null;
@Override @Override
public Storage localStorage() { public FileSystem localFileSystem() {
return StorageFactory.getStorage(); return FileSystemFactory.getFileSystem();
} }
@Override @Override
public Storage assetsStorage() { public FileSystem assetsFileSystem() {
if(assetsStorage == null) { if(assetsFileSystem == null) {
assetsStorage = new AssetsLibGDXStorage(); assetsFileSystem = new AssetsLibGDXFileSystem();
} }
return assetsStorage; } return assetsFileSystem; }
@Override @Override
public Storage externalStorage() { public FileSystem externalFileSystem() {
throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
} }
@Override @Override
public Storage relativeStorage() { public FileSystem relativeFileSystem() {
throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
} }
@Override @Override
public Storage absoluteStorage() { public FileSystem absoluteFileSystem() {
throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
} }
@Override @Override
public Storage tmpStorage() { public FileSystem tmpFileSystem() {
throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
} }

View File

@ -25,10 +25,10 @@ import com.pixelgamelibrary.api.Platform;
* *
* @author robertvokac * @author robertvokac
*/ */
public class AndroidStorage extends DesktopAndroidStorage { public class AndroidFileSystem extends DesktopAndroidFileSystem {
public AndroidStorage(String storageName) { public AndroidFileSystem(String FileSystemName) {
super(storageName); super(FileSystemName);
} }
@Override @Override

View File

@ -7,24 +7,24 @@ import com.pixelgamelibrary.api.Pixel;
import com.pixelgamelibrary.api.Platform; import com.pixelgamelibrary.api.Platform;
import com.pixelgamelibrary.api.files.FileType; import com.pixelgamelibrary.api.files.FileType;
import com.pixelgamelibrary.api.files.RegularFileType; import com.pixelgamelibrary.api.files.RegularFileType;
import com.pixelgamelibrary.api.files.Storage; import com.pixelgamelibrary.api.files.FileSystemType;
import com.pixelgamelibrary.api.files.StorageType;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import lombok.Getter; import lombok.Getter;
import com.pixelgamelibrary.api.files.FileSystem;
/** /**
* *
* @author robertvokac * @author robertvokac
*/ */
public class AssetsLibGDXStorage implements Storage { public class AssetsLibGDXFileSystem implements FileSystem {
private boolean isProbablyTeaVM = false; private boolean isProbablyTeaVM = false;
@Getter @Getter
private final AssetsTxt assets; private final AssetsTxt assets;
private String workingDirectory = "/"; private String workingDirectory = "/";
public AssetsLibGDXStorage() { public AssetsLibGDXFileSystem() {
assets = new AssetsTxt(readAssetsTxt()); assets = new AssetsTxt(readAssetsTxt());
} }
@ -231,8 +231,8 @@ public class AssetsLibGDXStorage implements Storage {
} }
@Override @Override
public StorageType getStorageType() { public FileSystemType getFileSystemType() {
return StorageType.ASSETS; return FileSystemType.ASSETS;
} }
} }

View File

@ -23,29 +23,29 @@ import com.badlogic.gdx.Gdx;
import com.pixelgamelibrary.api.Pixel; import com.pixelgamelibrary.api.Pixel;
import com.pixelgamelibrary.api.files.FileType; import com.pixelgamelibrary.api.files.FileType;
import com.pixelgamelibrary.api.files.RegularFileType; import com.pixelgamelibrary.api.files.RegularFileType;
import com.pixelgamelibrary.api.files.Storage; import com.pixelgamelibrary.api.files.FileException;
import com.pixelgamelibrary.api.files.StorageException; import com.pixelgamelibrary.api.files.FileSystemType;
import com.pixelgamelibrary.api.files.StorageType;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import com.pixelgamelibrary.api.files.FileSystem;
/** /**
* *
* @author robertvokac * @author robertvokac
*/ */
public abstract class DesktopAndroidStorage implements Storage { public abstract class DesktopAndroidFileSystem implements FileSystem {
private String workingDirectory = "/"; private String workingDirectory = "/";
private final String storageName; private final String fileSystemName;
public DesktopAndroidStorage(String storageName) { public DesktopAndroidFileSystem(String FileSystemName) {
if (storageName == null || storageName.trim().isEmpty()) { if (FileSystemName == null || FileSystemName.trim().isEmpty()) {
var msg = "storageName == null || storageName.trim().isEmpty()"; var msg = "fileSystemName == null || fileSystemName.trim().isEmpty()";
Pixel.app().error(msg); Pixel.app().error(msg);
throw new StorageException(msg); throw new FileException(msg);
} }
this.storageName = storageName; this.fileSystemName = FileSystemName;
com.badlogic.gdx.files.FileHandle rootFileHandle = createLibGdxFileHandle("/"); com.badlogic.gdx.files.FileHandle rootFileHandle = createLibGdxFileHandle("/");
if (!rootFileHandle.exists()) { if (!rootFileHandle.exists()) {
rootFileHandle.mkdirs(); rootFileHandle.mkdirs();
@ -67,9 +67,9 @@ public abstract class DesktopAndroidStorage implements Storage {
com.badlogic.gdx.files.FileHandle createLibGdxFileHandle(String path) { com.badlogic.gdx.files.FileHandle createLibGdxFileHandle(String path) {
if (path.equals("/")) { if (path.equals("/")) {
return Gdx.files.local(storageName); return Gdx.files.local(fileSystemName);
} else { } else {
return Gdx.files.local(storageName + "/" + path); return Gdx.files.local(fileSystemName + "/" + path);
} }
} }
@ -145,7 +145,7 @@ public abstract class DesktopAndroidStorage implements Storage {
return fileHandle.readBytes(); return fileHandle.readBytes();
} catch (Exception ex) { } catch (Exception ex) {
Pixel.app().error(ex.getMessage()); Pixel.app().error(ex.getMessage());
throw new StorageException(ex.getMessage()); throw new FileException(ex.getMessage());
} }
} }
@ -277,7 +277,7 @@ public abstract class DesktopAndroidStorage implements Storage {
} }
@Override @Override
public StorageType getStorageType() { public FileSystemType getFileSystemType() {
throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
} }

View File

@ -25,10 +25,10 @@ import com.pixelgamelibrary.api.Platform;
* *
* @author robertvokac * @author robertvokac
*/ */
public class DesktopStorage extends DesktopAndroidStorage { public class DesktopFileSystem extends DesktopAndroidFileSystem {
public DesktopStorage(String storageName) { public DesktopFileSystem(String fileSystemName) {
super(storageName); super(fileSystemName);
} }
@Override @Override

View File

@ -21,42 +21,42 @@ package com.pixelgamelibrary.backend.libgdx.files;
import com.pixelgamelibrary.api.Pixel; import com.pixelgamelibrary.api.Pixel;
import com.pixelgamelibrary.api.Platform; import com.pixelgamelibrary.api.Platform;
import com.pixelgamelibrary.api.files.Storage; import com.pixelgamelibrary.api.files.FileException;
import com.pixelgamelibrary.api.files.StorageException; import com.pixelgamelibrary.api.files.FileSystem;
/** /**
* *
* @author robertvokac * @author robertvokac
*/ */
public class StorageFactory { public class FileSystemFactory {
private StorageFactory() { private FileSystemFactory() {
//Not meant to be instantiated. //Not meant to be instantiated.
} }
private static Storage storage = null; private static FileSystem fs = null;
public static Storage getStorage() { public static FileSystem getFileSystem() {
final Platform platform = Pixel.app().getPlatform(); final Platform platform = Pixel.app().getPlatform();
// if (storage == null) { // if (fs == null) {
// storage = new PreferencesStorage(); // fs = new PreferencesFileSystem();
// }//todo fixme // }//todo fixme
if (storage == null) { if (fs == null) {
final String appName = Pixel.app().getAppName(); final String appName = Pixel.app().getAppName();
if (platform.isDesktop()) { if (platform.isDesktop()) {
storage = new DesktopStorage(appName); fs = new DesktopFileSystem(appName);
} }
if (platform.isAndroid()) { if (platform.isAndroid()) {
storage = new AndroidStorage(appName); fs = new AndroidFileSystem(appName);
} }
if (platform.isWeb()) { if (platform.isWeb()) {
storage = new PreferencesStorage(appName); fs = new PreferencesFileSystem(appName);
} }
} }
if (storage == null) { if (fs == null) {
throw new StorageException("Platform is not supported: " + platform); throw new FileException("Platform is not supported: " + platform);
} }
return storage; return fs;
} }
} }

View File

@ -22,28 +22,28 @@ package com.pixelgamelibrary.backend.libgdx.files;
import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Preferences; import com.badlogic.gdx.Preferences;
import com.pixelgamelibrary.api.Platform; import com.pixelgamelibrary.api.Platform;
import com.pixelgamelibrary.api.files.map.MapStorage; import com.pixelgamelibrary.api.files.map.MapFileSystem;
/** /**
* *
* @author robertvokac * @author robertvokac
*/ */
public class PreferencesStorage extends MapStorage { public class PreferencesFileSystem extends MapFileSystem {
public Platform getPlatform() { public Platform getPlatform() {
return Platform.WEB; return Platform.WEB;
} }
public PreferencesStorage() { public PreferencesFileSystem() {
this("com.pixelgamelibrary.backend.libgdx.storage.PreferencesStorage"); this("com.pixelgamelibrary.backend.libgdx.files.PreferencesFileSystem");
} }
public PreferencesStorage(String preferencesName) { public PreferencesFileSystem(String preferencesName) {
this(Gdx.app.getPreferences(preferencesName)); this(Gdx.app.getPreferences(preferencesName));
} }
public PreferencesStorage(Preferences preferences) { public PreferencesFileSystem(Preferences preferences) {
super(new SimpleLocalStorageMap(preferences)); super(new SimpleLocalStorageMap(preferences));
} }

View File

@ -1,13 +1,12 @@
package com.pixelgamelibrary.backend.libgdx.files; package com.pixelgamelibrary.backend.libgdx.files;
import com.pixelgamelibrary.backend.libgdx.files.DesktopAndroidStorage;
import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.files.FileHandle;
import com.pixelgamelibrary.api.Pixel; import com.pixelgamelibrary.api.Pixel;
import com.pixelgamelibrary.api.Platform; import com.pixelgamelibrary.api.Platform;
import com.pixelgamelibrary.api.interfaces.PixelBackend; import com.pixelgamelibrary.api.interfaces.PixelBackend;
import com.pixelgamelibrary.api.files.RegularFileType; import com.pixelgamelibrary.api.files.RegularFileType;
import com.pixelgamelibrary.api.files.StorageException; import com.pixelgamelibrary.api.files.FileException;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.mockito.Mockito; import org.mockito.Mockito;
@ -33,9 +32,9 @@ import com.pixelgamelibrary.api.app.ClipBoard;
import com.pixelgamelibrary.api.app.LogLevel; import com.pixelgamelibrary.api.app.LogLevel;
import com.pixelgamelibrary.api.app.Preferences; import com.pixelgamelibrary.api.app.Preferences;
class DesktopAndroidStorageTest { class DesktopAndroidFileSystemTest {
private DesktopAndroidStorage storage; private DesktopAndroidFileSystem fs;
private FileHandle mockFileHandle; private FileHandle mockFileHandle;
// //
@ -217,7 +216,7 @@ class DesktopAndroidStorageTest {
// //
storage = new DesktopAndroidStorage("testStorage") { fs = new DesktopAndroidFileSystem("testFileSystem") {
protected FileHandle createLibGdxFileHandle(String path) { protected FileHandle createLibGdxFileHandle(String path) {
return mockFileHandle; return mockFileHandle;
} }
@ -230,8 +229,8 @@ class DesktopAndroidStorageTest {
} }
@Test @Test
void testConstructor_NullStorageName_ShouldThrowException() { void testConstructor_NullFileSystemName_ShouldThrowException() {
Exception exception = assertThrows(StorageException.class, () -> new DesktopAndroidStorage(null) { Exception exception = assertThrows(FileException.class, () -> new DesktopAndroidFileSystem(null) {
protected FileHandle createLibGdxFileHandle(String path) { protected FileHandle createLibGdxFileHandle(String path) {
return mock(FileHandle.class); return mock(FileHandle.class);
@ -242,37 +241,37 @@ class DesktopAndroidStorageTest {
throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
} }
}); });
assertEquals("storageName == null || storageName.trim().isEmpty()", exception.getMessage()); assertEquals("fileSystemName == null || fileSystemName.trim().isEmpty()", exception.getMessage());
} }
@Test @Test
void testChangeDirectory_NonExistingDirectory_ShouldReturnErrorMessage() { void testChangeDirectory_NonExistingDirectory_ShouldReturnErrorMessage() {
when(mockFileHandle.exists()).thenReturn(false); when(mockFileHandle.exists()).thenReturn(false);
String result = storage.changeDirectory("nonExistingDir"); String result = fs.changeDirectory("nonExistingDir");
assertEquals("Directory does not exist: nonExistingDir", result); assertEquals("Directory does not exist: nonExistingDir", result);
} }
@Disabled @Test @Disabled @Test
void testCreateDirectory_ExistingDirectory_ShouldReturnWarning() { void testCreateDirectory_ExistingDirectory_ShouldReturnWarning() {
when(storage.createLibGdxFileHandle(anyString())).thenReturn(mockFileHandle); when(fs.createLibGdxFileHandle(anyString())).thenReturn(mockFileHandle);
when(mockFileHandle.exists()).thenReturn(true); when(mockFileHandle.exists()).thenReturn(true);
String result = storage.createDirectory("existingDir"); String result = fs.createDirectory("existingDir");
assertEquals("Directory already exists: existingDir", result); assertEquals("Directory already exists: existingDir", result);
} }
@Test @Test
void testCreateDirectory_NewDirectory_ShouldCreateDirectory() { void testCreateDirectory_NewDirectory_ShouldCreateDirectory() {
when(mockFileHandle.exists()).thenReturn(false); when(mockFileHandle.exists()).thenReturn(false);
String result = storage.createDirectory("newDir"); String result = fs.createDirectory("newDir");
assertEquals("", result); assertEquals("", result);
verify(mockFileHandle, times(2)).mkdirs(); verify(mockFileHandle, times(2)).mkdirs();
} }
@Test @Test
void testTouch_ShouldCreateFile() { void testTouch_ShouldCreateFile() {
String result = storage.touch("testFile.txt"); String result = fs.touch("testFile.txt");
assertEquals("", result); assertEquals("", result);
verify(mockFileHandle).writeString("", false); verify(mockFileHandle).writeString("", false);
} }
@ -280,21 +279,21 @@ class DesktopAndroidStorageTest {
@Test @Test
void testRemove_ShouldDeleteFile() { void testRemove_ShouldDeleteFile() {
when(mockFileHandle.delete()).thenReturn(true); when(mockFileHandle.delete()).thenReturn(true);
boolean result = storage.remove("testFile.txt"); boolean result = fs.remove("testFile.txt");
assertTrue(result); assertTrue(result);
verify(mockFileHandle).delete(); verify(mockFileHandle).delete();
} }
@Test @Test
void testMove_ShouldMoveFile() { void testMove_ShouldMoveFile() {
storage.move("sourceFile.txt", "targetFile.txt"); fs.move("sourceFile.txt", "targetFile.txt");
verify(mockFileHandle).moveTo(mockFileHandle); verify(mockFileHandle).moveTo(mockFileHandle);
} }
@Test @Test
void testReadString_ShouldReturnFileContent() { void testReadString_ShouldReturnFileContent() {
when(mockFileHandle.readString()).thenReturn("File content"); when(mockFileHandle.readString()).thenReturn("File content");
String result = storage.readString("testFile.txt"); String result = fs.readString("testFile.txt");
assertEquals("File content", result); assertEquals("File content", result);
} }
@ -304,13 +303,13 @@ class DesktopAndroidStorageTest {
when(mockFileHandle.read()).thenReturn(mockInputStream); when(mockFileHandle.read()).thenReturn(mockInputStream);
when(mockInputStream.readAllBytes()).thenReturn(new byte[]{1, 2, 3}); when(mockInputStream.readAllBytes()).thenReturn(new byte[]{1, 2, 3});
byte[] result = storage.readBytes("testFile.bin"); byte[] result = fs.readBytes("testFile.bin");
assertArrayEquals(new byte[]{1, 2, 3}, result); assertArrayEquals(new byte[]{1, 2, 3}, result);
} }
@Test @Test
void testWriteString_ShouldWriteToFile() { void testWriteString_ShouldWriteToFile() {
String result = storage.writeString("testFile.txt", "Hello World"); String result = fs.writeString("testFile.txt", "Hello World");
assertEquals("", result); assertEquals("", result);
verify(mockFileHandle).writeString("Hello World", false); verify(mockFileHandle).writeString("Hello World", false);
} }
@ -318,19 +317,19 @@ class DesktopAndroidStorageTest {
@Test @Test
void testExists_ShouldReturnTrueIfFileExists() { void testExists_ShouldReturnTrueIfFileExists() {
when(mockFileHandle.exists()).thenReturn(true); when(mockFileHandle.exists()).thenReturn(true);
assertTrue(storage.exists("testFile.txt")); assertTrue(fs.exists("testFile.txt"));
} }
@Test @Test
void testIsDirectory_ShouldReturnTrueForDirectory() { void testIsDirectory_ShouldReturnTrueForDirectory() {
when(mockFileHandle.isDirectory()).thenReturn(true); when(mockFileHandle.isDirectory()).thenReturn(true);
assertTrue(storage.isDirectory("testDir")); assertTrue(fs.isDirectory("testDir"));
} }
@Test @Test
void testIsFile_ShouldReturnTrueForFile() { void testIsFile_ShouldReturnTrueForFile() {
when(mockFileHandle.isDirectory()).thenReturn(false); when(mockFileHandle.isDirectory()).thenReturn(false);
assertTrue(storage.isFile("testFile.txt")); assertTrue(fs.isFile("testFile.txt"));
} }
@Disabled @Test @Disabled @Test
@ -338,25 +337,25 @@ class DesktopAndroidStorageTest {
when(mockFileHandle.isDirectory()).thenReturn(true); when(mockFileHandle.isDirectory()).thenReturn(true);
when(mockFileHandle.name()).thenReturn("root"); when(mockFileHandle.name()).thenReturn("root");
String result = storage.debug(); String result = fs.debug();
assertEquals("root\n", result); assertEquals("root\n", result);
} }
@Test @Test
void testRemoveDirectory_ShouldReturnTrueIfDirectoryDeleted() { void testRemoveDirectory_ShouldReturnTrueIfDirectoryDeleted() {
when(mockFileHandle.deleteDirectory()).thenReturn(true); when(mockFileHandle.deleteDirectory()).thenReturn(true);
assertTrue(storage.removeDirectory("testDir")); assertTrue(fs.removeDirectory("testDir"));
} }
@Test @Test
void testGetRegularFileType_ShouldReturnTextForTextFile() { void testGetRegularFileType_ShouldReturnTextForTextFile() {
when(mockFileHandle.readString()).thenReturn("This is text"); when(mockFileHandle.readString()).thenReturn("This is text");
assertEquals(RegularFileType.TEXT, storage.getRegularFileType("testFile.txt")); assertEquals(RegularFileType.TEXT, fs.getRegularFileType("testFile.txt"));
} }
@Disabled @Test @Disabled @Test
void testGetRegularFileType_ShouldReturnBinaryForBinaryFile() { void testGetRegularFileType_ShouldReturnBinaryForBinaryFile() {
when(mockFileHandle.readString()).thenThrow(new RuntimeException()); when(mockFileHandle.readString()).thenThrow(new RuntimeException());
assertEquals(RegularFileType.BINARY, storage.getRegularFileType("testFile.bin")); assertEquals(RegularFileType.BINARY, fs.getRegularFileType("testFile.bin"));
} }
} }