Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package com.fasterxml.jackson.databind.records;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.exc.MismatchedInputException;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.fasterxml.jackson.databind.testutil.DatabindTestUtil;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;

// [databind#3580] Enum (de)serialization in conjunction with JsonFormat.Shape.NUMBER_INT
public class EnumJsonPropertyNumberFormatShapeRecord3580Test
extends DatabindTestUtil
{
public record RecordString3580(RecordState3580 state) {}

public record RecordNumber3580(@JsonFormat(shape = JsonFormat.Shape.NUMBER) RecordState3580 state) {}

public record RecordNumberInt3580(@JsonFormat(shape = JsonFormat.Shape.NUMBER_INT) RecordState3580 state) {}

public enum RecordState3580 {
@JsonProperty("17")
OFF,
@JsonProperty("31")
ON,
@JsonProperty("99")
UNKNOWN
}

@Test
public void testEnumStringFormatShapeRecord3580()
throws Exception
{
ObjectMapper mapper = JsonMapper.builder().build();

// Serialize
assertEquals("{\"state\":\"17\"}", mapper.writeValueAsString(new RecordString3580(RecordState3580.OFF))); //
assertEquals("{\"state\":\"31\"}", mapper.writeValueAsString(new RecordString3580(RecordState3580.ON))); //
assertEquals("{\"state\":\"99\"}", mapper.writeValueAsString(new RecordString3580(RecordState3580.UNKNOWN))); //

// Pass Deserialize
assertEquals(RecordState3580.OFF, mapper.readValue("{\"state\":\"17\"}", RecordString3580.class).state); // Pojo[state=OFF]
assertEquals(RecordState3580.ON, mapper.readValue("{\"state\":\"31\"}", RecordString3580.class).state); // Pojo[state=OFF]
assertEquals(RecordState3580.UNKNOWN, mapper.readValue("{\"state\":\"99\"}", RecordString3580.class).state); // Pojo[state=OFF]

// Fail : Try to use ordinal number
assertThrows(MismatchedInputException.class, () -> mapper.readValue("{\"state\":0}", RecordString3580.class));
}


@Test
public void testEnumNumberFormatShapeRecord3580()
throws Exception
{
ObjectMapper mapper = JsonMapper.builder().build();

// Serialize
assertEquals("{\"state\":17}", mapper.writeValueAsString(new RecordNumber3580(RecordState3580.OFF))); //
assertEquals("{\"state\":31}", mapper.writeValueAsString(new RecordNumber3580(RecordState3580.ON))); //
assertEquals("{\"state\":99}", mapper.writeValueAsString(new RecordNumber3580(RecordState3580.UNKNOWN))); //

// Pass Deserialize
assertEquals(RecordState3580.OFF, mapper.readValue("{\"state\":17}", RecordNumber3580.class).state); // Pojo[state=OFF]
assertEquals(RecordState3580.ON, mapper.readValue("{\"state\":31}", RecordNumber3580.class).state); // Pojo[state=OFF]
assertEquals(RecordState3580.UNKNOWN, mapper.readValue("{\"state\":99}", RecordNumber3580.class).state); // Pojo[state=OFF]

// Fail : Try to use ordinal number
assertThrows(MismatchedInputException.class, () -> mapper.readValue("{\"state\":0}", RecordNumber3580.class));
}

@Test
public void testEnumNumberIntFormatShapeRecord3580()
throws Exception
{
ObjectMapper mapper = JsonMapper.builder().build();

// Serialize
assertEquals("{\"state\":17}", mapper.writeValueAsString(new RecordNumberInt3580(RecordState3580.OFF))); //
assertEquals("{\"state\":31}", mapper.writeValueAsString(new RecordNumberInt3580(RecordState3580.ON))); //
assertEquals("{\"state\":99}", mapper.writeValueAsString(new RecordNumberInt3580(RecordState3580.UNKNOWN))); //

// Pass Deserialize
assertEquals(RecordState3580.OFF, mapper.readValue("{\"state\":17}", RecordNumberInt3580.class).state); // Pojo[state=OFF]
assertEquals(RecordState3580.ON, mapper.readValue("{\"state\":31}", RecordNumberInt3580.class).state); // Pojo[state=OFF]
assertEquals(RecordState3580.UNKNOWN, mapper.readValue("{\"state\":99}", RecordNumberInt3580.class).state); // Pojo[state=OFF]

// Fail : Try to use ordinal number
assertThrows(MismatchedInputException.class, () -> mapper.readValue("{\"state\":0}", RecordNumberInt3580.class));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,23 +16,46 @@
public class EnumNumberFormatShapeRecord3580Test
extends DatabindTestUtil
{
public record RecordString3580(RecordState3580 state) {}

public record RecordNumber3580(@JsonFormat(shape = JsonFormat.Shape.NUMBER) RecordState3580 state) {}

public record RecordNumberInt3580(@JsonFormat(shape = JsonFormat.Shape.NUMBER_INT) RecordState3580 state) {}

public enum RecordState3580 {
OFF(17),
ON(31),
UNKNOWN(99);
OFF("17"),
ON("31"),
UNKNOWN("99");

private int value;
private String value;

RecordState3580(int value) { this.value = value; }
RecordState3580(String value) { this.value = value; }

@JsonValue
public int value() {return this.value;}
public String value() {return this.value;}
}

@Test
public void testEnumStringFormatShapeRecord3580()
throws Exception
{
ObjectMapper mapper = JsonMapper.builder().build();

// Serialize
assertEquals("{\"state\":\"17\"}", mapper.writeValueAsString(new RecordString3580(RecordState3580.OFF))); //
assertEquals("{\"state\":\"31\"}", mapper.writeValueAsString(new RecordString3580(RecordState3580.ON))); //
assertEquals("{\"state\":\"99\"}", mapper.writeValueAsString(new RecordString3580(RecordState3580.UNKNOWN))); //

// Pass Deserialize
assertEquals(RecordState3580.OFF, mapper.readValue("{\"state\":\"17\"}", RecordString3580.class).state); // Pojo[state=OFF]
assertEquals(RecordState3580.ON, mapper.readValue("{\"state\":\"31\"}", RecordString3580.class).state); // Pojo[state=OFF]
assertEquals(RecordState3580.UNKNOWN, mapper.readValue("{\"state\":\"99\"}", RecordString3580.class).state); // Pojo[state=OFF]

// Fail : Try to use ordinal number
assertThrows(MismatchedInputException.class, () -> mapper.readValue("{\"state\":0}", RecordString3580.class));
}


@Test
public void testEnumNumberFormatShapeRecord3580()
throws Exception
Expand Down
Loading