fix(serialize): prevent unnecessary popping from stack when reading legal number
ci/woodpecker/push/woodpecker Pipeline was successful Details

This commit is contained in:
Johannes Frohnmeyer 2024-04-24 17:42:41 +02:00
parent 38a54455d7
commit d1343208a3
Signed by: Johannes
GPG Key ID: E76429612C2929F4
2 changed files with 80 additions and 1 deletions

View File

@ -206,7 +206,6 @@ public class EmulatedReader extends SerializeReader<MalformedDataException, Emul
if (!(popStack() instanceof DataElement.Primitive.Number result)) {
throw new IllegalStateException("Expected a number");
}
popStack();
if (stackSize > 0) {
pathIndices[stackSize - 1]++;
}

View File

@ -0,0 +1,80 @@
package io.gitlab.jfronny.commons.serialize.test;
import io.gitlab.jfronny.commons.serialize.MalformedDataException;
import io.gitlab.jfronny.commons.serialize.Token;
import io.gitlab.jfronny.commons.serialize.emulated.DataElement;
import io.gitlab.jfronny.commons.serialize.emulated.EmulatedReader;
import io.gitlab.jfronny.commons.serialize.emulated.EmulatedWriter;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class EmulatedReaderTest {
@Test
public void testSimple() throws MalformedDataException {
DataElement.Object del = new DataElement.Object();
del.members().put("type", new DataElement.Primitive.String("boolean"));
del.members().put("default", new DataElement.Primitive.Boolean(true));
del.members().put("reloadType", new DataElement.Primitive.String("Simple"));
EmulatedReader er = new EmulatedReader(del);
assertEquals(Token.BEGIN_OBJECT, er.peek());
er.beginObject();
assertEquals(Token.NAME, er.peek());
assertEquals("type", er.nextName());
assertEquals(Token.STRING, er.peek());
assertEquals("boolean", er.nextString());
assertEquals(Token.NAME, er.peek());
assertEquals("default", er.nextName());
assertEquals(Token.BOOLEAN, er.peek());
assertTrue(er.nextBoolean());
assertEquals(Token.NAME, er.peek());
assertEquals("reloadType", er.nextName());
assertEquals(Token.STRING, er.peek());
assertEquals("Simple", er.nextString());
assertEquals(Token.END_OBJECT, er.peek());
er.endObject();
assertEquals(Token.END_DOCUMENT, er.peek());
}
@Test
public void testSimpleWithoutPeek() throws MalformedDataException {
DataElement.Object del = new DataElement.Object();
del.members().put("type", new DataElement.Primitive.String("boolean"));
del.members().put("default", new DataElement.Primitive.Boolean(true));
del.members().put("reloadType", new DataElement.Primitive.String("Simple"));
EmulatedReader er = new EmulatedReader(del);
er.beginObject();
assertEquals("type", er.nextName());
assertEquals("boolean", er.nextString());
assertEquals("default", er.nextName());
assertTrue(er.nextBoolean());
assertEquals("reloadType", er.nextName());
assertEquals("Simple", er.nextString());
er.endObject();
assertEquals(Token.END_DOCUMENT, er.peek());
}
@Test
public void testTransfer() throws MalformedDataException {
DataElement.Object del = new DataElement.Object();
del.members().put("type", new DataElement.Primitive.String("boolean"));
del.members().put("default", new DataElement.Primitive.Boolean(true));
del.members().put("reloadType", new DataElement.Primitive.String("Simple"));
del.members().put("joe", new DataElement.Primitive.Number(12));
EmulatedReader er = new EmulatedReader(del);
EmulatedWriter ew = new EmulatedWriter();
er.beginObject();
ew.beginObject();
String type = null;
while (er.hasNext()) {
String key;
ew.name(key = er.nextName());
if (key.equals("type")) ew.value(type = er.nextString());
else er.copyTo(ew);
}
er.endObject();
ew.endObject();
assertEquals(del, ew.get());
assertEquals("boolean", type);
}
}