Skip to content

Commit b3578c1

Browse files
committed
Serializers and tests
1 parent a5b5662 commit b3578c1

File tree

7 files changed

+194
-48
lines changed

7 files changed

+194
-48
lines changed

api-internal/pom.xml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,16 @@
1616
</properties>
1717

1818
<dependencies>
19+
<dependency>
20+
<groupId>org.spongepowered</groupId>
21+
<artifactId>configurate-core</artifactId>
22+
<version>4.2.0</version>
23+
</dependency>
24+
<dependency>
25+
<groupId>org.spongepowered</groupId>
26+
<artifactId>configurate-yaml</artifactId>
27+
<version>4.2.0</version>
28+
</dependency>
1929
<dependency>
2030
<groupId>com.google.code.gson</groupId>
2131
<artifactId>gson</artifactId>
@@ -33,6 +43,20 @@
3343
<version>1.18.30</version>
3444
<scope>provided</scope>
3545
</dependency>
46+
47+
<!-- Testing dependencies -->
48+
<dependency>
49+
<groupId>org.junit.jupiter</groupId>
50+
<artifactId>junit-jupiter</artifactId>
51+
<version>5.11.4</version>
52+
<scope>test</scope>
53+
</dependency>
54+
<dependency>
55+
<groupId>org.mockito</groupId>
56+
<artifactId>mockito-core</artifactId>
57+
<version>5.18.0</version>
58+
<scope>test</scope>
59+
</dependency>
3660
</dependencies>
3761

3862
<build>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package at.pavlov.internal.adapters;
2+
3+
import at.pavlov.internal.Key;
4+
import at.pavlov.internal.projectile.definition.CustomProjectileDefinition;
5+
import org.spongepowered.configurate.serialize.TypeSerializerCollection;
6+
7+
public class CannonSerializingManager {
8+
public static final TypeSerializerCollection serializerCollection = TypeSerializerCollection.defaults().childBuilder()
9+
.register(Key.class, new KeySerializer())
10+
.register(CustomProjectileDefinition.class, new CustomProjectileDefinitionSerializer())
11+
.build();
12+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package at.pavlov.internal.adapters;
2+
3+
import at.pavlov.internal.Key;
4+
import at.pavlov.internal.key.registries.Registries;
5+
import at.pavlov.internal.projectile.definition.CustomProjectileDefinition;
6+
import at.pavlov.internal.projectile.definition.ProjectilePhysics;
7+
import org.jetbrains.annotations.NotNull;
8+
import org.spongepowered.configurate.ConfigurationNode;
9+
import org.spongepowered.configurate.serialize.SerializationException;
10+
import org.spongepowered.configurate.serialize.TypeSerializer;
11+
12+
import java.lang.reflect.Type;
13+
14+
public class CustomProjectileDefinitionSerializer implements TypeSerializer<CustomProjectileDefinition> {
15+
16+
@Override
17+
public CustomProjectileDefinition deserialize(@NotNull Type type, ConfigurationNode node) throws SerializationException {
18+
// Use the node's key as the projectile key
19+
Key key = Key.from(node.key().toString()); // top-level key
20+
Key entityKey = Key.from(node.node("entity").getString("SNOWBALL"));
21+
22+
// Get default projectile physics if entityKey not registered
23+
ProjectilePhysics dpd = Registries.DEFAULT_PROJECTILE_DEFINITION_REGISTRY.of(entityKey);
24+
if (dpd == null) {
25+
dpd = ProjectilePhysics.DEFAULT;
26+
}
27+
28+
// Build the CustomProjectileDefinition
29+
return CustomProjectileDefinition.builder()
30+
.key(key)
31+
.entityKey(entityKey)
32+
.constantAcceleration(node.node("constantAcceleration").get(Double.class, dpd.getConstantAcceleration()))
33+
.gravity(node.node("gravity").getDouble(dpd.getGravity()))
34+
.drag(node.node("drag").getDouble(dpd.getDrag()))
35+
.waterDrag(node.node("waterDrag").getDouble(dpd.getWaterDrag()))
36+
.glowing(node.node("glowing").getBoolean(false))
37+
.onFire(node.node("onFire").getBoolean(false))
38+
.charged(node.node("charged").getBoolean(false))
39+
.critical(node.node("critical").getBoolean(false))
40+
.material(Key.from(node.node("material").getString("SNOWBALL")))
41+
.customModelData(node.node("customModelData").get(Integer.class, (Integer) null))
42+
.build();
43+
}
44+
45+
@Override
46+
public void serialize(@NotNull Type type, CustomProjectileDefinition obj, @NotNull ConfigurationNode node) throws SerializationException {
47+
// Not needed, can throw UnsupportedOperationException if you never serialize
48+
throw new UnsupportedOperationException("Serialization not supported for this deserializer");
49+
}
50+
}
51+
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package at.pavlov.internal.adapters;
2+
3+
import at.pavlov.internal.Key;
4+
import org.jetbrains.annotations.NotNull;
5+
import org.spongepowered.configurate.ConfigurationNode;
6+
import org.spongepowered.configurate.serialize.SerializationException;
7+
import org.spongepowered.configurate.serialize.TypeSerializer;
8+
9+
import java.lang.reflect.Type;
10+
11+
public class KeySerializer implements TypeSerializer<Key> {
12+
13+
@Override
14+
public Key deserialize(@NotNull Type type, ConfigurationNode node) throws SerializationException {
15+
String value = node.getString();
16+
if (value == null || !value.contains(":")) {
17+
throw new SerializationException("Invalid Key format, expected namespace:key");
18+
}
19+
String[] parts = value.split(":", 2);
20+
return new Key(parts[0], parts[1]);
21+
}
22+
23+
@Override
24+
public void serialize(@NotNull Type type, Key obj, @NotNull ConfigurationNode node) throws SerializationException {
25+
if (obj == null) return;
26+
node.set(obj.full());
27+
}
28+
}
Lines changed: 17 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,33 @@
11
package at.pavlov.internal.projectile.definition;
22

33
import at.pavlov.internal.Key;
4-
import lombok.AllArgsConstructor;
5-
import lombok.Builder;
6-
import lombok.Getter;
4+
import lombok.*;
75
import org.jetbrains.annotations.Nullable;
6+
import org.spongepowered.configurate.objectmapping.ConfigSerializable;
87

98
@Getter
109
@Builder
10+
@EqualsAndHashCode
11+
@ConfigSerializable
12+
@NoArgsConstructor
1113
@AllArgsConstructor
1214
public class CustomProjectileDefinition implements ProjectilePhysics {
13-
private final Key key; // for the name of the custom projectile definition
14-
private final Key entityKey;
15+
private Key key; // for the name of the custom projectile definition
16+
private Key entityKey;
1517

16-
private final Double constantAcceleration;
18+
private Double constantAcceleration;
1719

18-
private final double gravity;
19-
private final double drag;
20-
private final double waterDrag;
20+
private double gravity;
21+
private double drag;
22+
private double waterDrag;
2123

22-
private final boolean glowing;
24+
private boolean glowing;
2325

24-
private final boolean onFire; // visual fire for projectile
25-
private final boolean charged; // works for wither skeletons
26-
private final boolean critical; // for arrows and tridents
26+
private boolean onFire; // visual fire for projectile
27+
private boolean charged; // works for wither skeletons
28+
private boolean critical; // for arrows and tridents
2729

2830
//for throwable projectiles only
29-
private final @Nullable Key material;
30-
private final @Nullable Integer customModelData;
31-
32-
/*
33-
@Override
34-
public double getGravity() {
35-
return fromKey().getGravity();
36-
}
37-
38-
@Override
39-
public double getDrag() {
40-
return fromKey().getDrag();
41-
}
42-
43-
@Override
44-
public double getWaterDrag() {
45-
return fromKey().getWaterDrag();
46-
}
47-
48-
private @NotNull ProjectilePhysics fromKey() {
49-
DefaultProjectileDefinition value = Registries.DEFAULT_PROJECTILE_DEFINITION_REGISTRY.of(entityKey);
50-
if (value == null) {
51-
return ProjectilePhysics.DEFAULT;
52-
}
53-
54-
return value;
55-
}*/
31+
private @Nullable Key material;
32+
private @Nullable Integer customModelData;
5633
}

api-internal/src/main/java/at/pavlov/internal/projectile/definition/DefaultProjectileDefinition.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
11
package at.pavlov.internal.projectile.definition;
22

33
import at.pavlov.internal.Key;
4-
import lombok.AllArgsConstructor;
5-
import lombok.Builder;
6-
import lombok.Getter;
4+
import lombok.*;
75
import org.jetbrains.annotations.NotNull;
6+
import org.spongepowered.configurate.objectmapping.ConfigSerializable;
87

98
@Getter
109
@Builder
10+
@ConfigSerializable
11+
@EqualsAndHashCode
12+
@NoArgsConstructor
1113
@AllArgsConstructor
1214
public class DefaultProjectileDefinition implements ProjectilePhysics {
13-
private final @NotNull Key key; // for the entity type
14-
private final Double constantAcceleration;
15-
private final double gravity;
16-
private final double drag;
17-
private final double waterDrag;
15+
private @NotNull Key key; // for the entity type
16+
private Double constantAcceleration;
17+
private double gravity;
18+
private double drag;
19+
private double waterDrag;
1820

1921
@Override
2022
public Key getEntityKey() {
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package adapters;
2+
3+
import at.pavlov.internal.Key;
4+
import at.pavlov.internal.adapters.CannonSerializingManager;
5+
import at.pavlov.internal.projectile.definition.DefaultProjectileDefinition;
6+
import org.junit.jupiter.api.Test;
7+
import org.spongepowered.configurate.ConfigurationNode;
8+
import org.spongepowered.configurate.yaml.YamlConfigurationLoader;
9+
10+
import java.nio.file.Files;
11+
import java.nio.file.Path;
12+
13+
import static org.junit.jupiter.api.Assertions.assertEquals;
14+
import static org.junit.jupiter.api.Assertions.assertNotNull;
15+
16+
public class BuilderTypeSerializerTest {
17+
18+
@Test
19+
void testBuilderSerialization() throws Exception {
20+
// Create temp file for YAML loader
21+
Path tempFile = Files.createTempFile("test", ".yml");
22+
23+
// Create YAML loader with custom serializers
24+
YamlConfigurationLoader loader = YamlConfigurationLoader.builder()
25+
.path(tempFile)
26+
.defaultOptions(options -> options.serializers(CannonSerializingManager.serializerCollection))
27+
.build();
28+
29+
// Create an instance using the builder
30+
DefaultProjectileDefinition original = DefaultProjectileDefinition.builder()
31+
.key(Key.mc("test"))
32+
.drag(2.1)
33+
.constantAcceleration(1.2)
34+
.waterDrag(2.4)
35+
.gravity(-1.4)
36+
.build();
37+
38+
// Serialize to a ConfigurationNode
39+
ConfigurationNode node = loader.createNode();
40+
node.set(original);
41+
42+
// Optionally, print YAML for debugging
43+
System.out.println(node);
44+
45+
// Deserialize back
46+
DefaultProjectileDefinition deserialized = node.get(DefaultProjectileDefinition.class);
47+
48+
// Basic assertions
49+
assertNotNull(deserialized, "Deserialized object should not be null");
50+
assertEquals(original, deserialized, "Deserialized object should be equal to original");
51+
}
52+
}

0 commit comments

Comments
 (0)