diff --git a/src/test/java/io/github/syst3ms/skriptparser/variables/RamStorage.java b/src/test/java/io/github/syst3ms/skriptparser/variables/RamStorage.java index cd844199..ff0fa92f 100644 --- a/src/test/java/io/github/syst3ms/skriptparser/variables/RamStorage.java +++ b/src/test/java/io/github/syst3ms/skriptparser/variables/RamStorage.java @@ -1,21 +1,32 @@ package io.github.syst3ms.skriptparser.variables; +import com.google.gson.JsonParser; +import com.google.gson.stream.JsonReader; + import io.github.syst3ms.skriptparser.file.FileSection; import io.github.syst3ms.skriptparser.log.SkriptLogger; +import io.github.syst3ms.skriptparser.types.Type; +import io.github.syst3ms.skriptparser.types.TypeManager; +import io.github.syst3ms.skriptparser.types.changers.TypeSerializer; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; import java.io.IOException; +import java.io.StringReader; import java.util.HashMap; import java.util.Map; +import java.util.Optional; public class RamStorage extends VariableStorage { public static final Map VARIABLES = new HashMap<>(); + public static RamStorage SELF; public RamStorage(SkriptLogger logger) { super(logger, "ram"); + SELF = this; } @Override @@ -42,6 +53,21 @@ protected File getFile(String fileName) { return null; } + @Override + public Optional deserialize(@NotNull String typeName, @NotNull byte[] value) { + if (value == null || typeName == null) + throw new IllegalArgumentException("value and/or typeName cannot be null"); + Type type = TypeManager.getByExactName(typeName).orElse(null); + if (type == null) + throw new UnsupportedOperationException("Class '" + value.getClass().getName() + "' cannot be deserialized. No type registered."); + TypeSerializer serializer = type.getSerializer().orElse(null); + if (serializer == null) + throw new UnsupportedOperationException("Class '" + value.getClass().getName() + "' cannot be deserialized. No type serializer."); + String json = new String(value); + JsonReader reader = gson.newJsonReader(new StringReader(json)); + return Optional.ofNullable(serializer.deserialize(gson, JsonParser.parseReader(reader))); + } + @Override protected boolean save(String name, @Nullable String type, @Nullable byte[] value) { if (type == null || value == null) { diff --git a/src/test/java/io/github/syst3ms/skriptparser/variables/VariablesTest.java b/src/test/java/io/github/syst3ms/skriptparser/variables/VariablesTest.java index 35829225..9ef0d16b 100644 --- a/src/test/java/io/github/syst3ms/skriptparser/variables/VariablesTest.java +++ b/src/test/java/io/github/syst3ms/skriptparser/variables/VariablesTest.java @@ -44,14 +44,20 @@ public void setupVariables() { @Test public void testVariables() throws InterruptedException { Thread.sleep(1); - assert RamStorage.VARIABLES.containsKey("test") : Arrays.toString(RamStorage.VARIABLES.keySet().toArray(String[]::new)); + assert RamStorage.VARIABLES.containsKey("test"); Optional object = Variables.getVariable("test", null, false); assert object.isPresent(); assert object.get().equals("Hello World!"); Variables.setVariable("test", "Hello New World!", null, false); + Thread.sleep(1); Optional newObject = Variables.getVariable("test", null, false); assert newObject.isPresent(); assert newObject.get().equals("Hello New World!"); + assert RamStorage.VARIABLES.containsKey("test"); + SerializedVariable variable = RamStorage.VARIABLES.get("test"); + Optional value = RamStorage.SELF.deserialize(variable.value.type, variable.value.data); + assert value.isPresent(); + assert value.get().equals("Hello New World!") : value.get(); } }