From d9e17c5100c0bada99f784bd243560c2315fdf65 Mon Sep 17 00:00:00 2001 From: David Blevins Date: Thu, 8 May 2025 15:37:53 -0700 Subject: [PATCH 01/25] Testing symmetry of read/write in Adapter processing --- .../apache/johnzon/jsonb/symmetry/Calls.java | 80 ++++++++++++ .../johnzon/jsonb/symmetry/SymmetryTest.java | 112 +++++++++++++++++ .../StringAdapterOnClassSimpleTest.java | 75 +++++++++++ .../adapter/StringAdapterOnClassTest.java | 92 ++++++++++++++ .../StringAdapterPrecedenceConfigTest.java | 117 ++++++++++++++++++ ...tringAdapterPrecedenceConstructorTest.java | 79 ++++++++++++ .../StringAdapterPrecedenceFieldTest.java | 88 +++++++++++++ .../StringAdapterPrecedenceMethodTest.java | 86 +++++++++++++ 8 files changed, 729 insertions(+) create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/Calls.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/SymmetryTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassSimpleTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConstructorTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceFieldTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceMethodTest.java diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/Calls.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/Calls.java new file mode 100644 index 00000000..83d1b88f --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/Calls.java @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry; + +import java.util.ArrayList; +import java.util.List; + +public class Calls { + + private final List calls = new ArrayList<>(); + + public String called() { + final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); + + if (stackTrace.length > 2) { + final StackTraceElement caller = stackTrace[2]; + final String className = caller.getClassName(); + final String methodName = caller.getMethodName(); + + final int lastDot = className.lastIndexOf('.'); + final int lastDollar = className.lastIndexOf('$'); + final String simpleName; + if (lastDollar == 0 && lastDot == 0) { + simpleName = className; + } else { + final int start = Math.max(lastDollar, lastDot) + 1; + simpleName = className.substring(start); + } + + final String result = simpleName + "." + methodName; + calls.add(result); + return result; + } + return null; + } + + public String called(final Object instance) { + final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); + + if (stackTrace.length > 2) { + final StackTraceElement caller = stackTrace[2]; + final String simpleName = instance.getClass().getSimpleName(); + final String methodName = caller.getMethodName(); + + + final String result = simpleName + "." + methodName; + calls.add(result); + return result; + } + return null; + } + + public List list() { + return new ArrayList<>(calls); + } + + public String get() { + final String result = String.join("\n", calls); + calls.clear(); + return result; + } + + public void reset() { + calls.clear(); + } +} \ No newline at end of file diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/SymmetryTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/SymmetryTest.java new file mode 100644 index 00000000..2bf7a3b7 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/SymmetryTest.java @@ -0,0 +1,112 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry; + +import jakarta.json.bind.Jsonb; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runners.MethodSorters; + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public abstract class SymmetryTest { + + public abstract Jsonb jsonb(); + + public abstract void assertWrite(final Jsonb jsonb); + + public abstract void assertRead(final Jsonb jsonb); + + /** + * Assert a simple write operation + */ + @Test + public void write() throws Exception { + try (final Jsonb jsonb = jsonb()) { + assertWrite(jsonb); + } + } + + /** + * Assert a simple read operation + */ + @Test + public void read() throws Exception { + try (final Jsonb jsonb = jsonb()) { + assertRead(jsonb); + } + } + + /** + * Validate any caching done from a write operation + * leads to a consistent result on any future + * write operations + */ + @Test + public void writeAfterWrite() throws Exception { + try (final Jsonb jsonb = jsonb()) { + assertWrite(jsonb); + assertWrite(jsonb); + assertWrite(jsonb); + assertWrite(jsonb); + } + } + + /** + * Validate any caching done from a read operation + * leads to a consistent result on any future + * read operations + */ + @Test + public void readAfterRead() throws Exception { + try (final Jsonb jsonb = jsonb()) { + assertRead(jsonb); + assertRead(jsonb); + assertRead(jsonb); + assertRead(jsonb); + } + } + + /** + * Validate any caching done from a read operation + * does not alter the expected behavior of a write + * operation + */ + @Test + public void writeAfterRead() throws Exception { + try (final Jsonb jsonb = jsonb()) { + assertRead(jsonb); + assertWrite(jsonb); + assertRead(jsonb); + assertWrite(jsonb); + } + } + + /** + * Validate any caching done from a write operation + * does not alter the expected behavior of a read + * operation + */ + @Test + public void readAfterWrite() throws Exception { + try (final Jsonb jsonb = jsonb()) { + assertWrite(jsonb); + assertRead(jsonb); + assertWrite(jsonb); + assertRead(jsonb); + } + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassSimpleTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassSimpleTest.java new file mode 100644 index 00000000..2aba4ecb --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassSimpleTest.java @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import org.junit.Ignore; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class StringAdapterOnClassSimpleTest extends StringAdapterOnClassTest { + + public Jsonb jsonb() { + return JsonbBuilder.create(); + } + + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final String json = jsonb.toJson(email); + assertEquals("\"test@domain.com:EmailClass.adaptToJson\"", json); + assertEquals("EmailClass.adaptToJson", calls()); + } + + public void assertRead(final Jsonb jsonb) { + final String json = "\"test@domain.com\""; + final Email email = jsonb.fromJson(json, Email.class); + assertEquals("test@domain.com:EmailClass.adaptFromJson", email.toString()); + assertEquals("EmailClass.adaptFromJson", calls()); + } + + /** + * Fails as the adapter is not found + */ + @Test + @Ignore() + @Override + public void read() throws Exception { + super.read(); + } + + /** + * Fails as the adapter is not found + */ + @Test + @Ignore() + @Override + public void readAfterRead() throws Exception { + super.readAfterRead(); + } + + /** + * Fails as the adapter is not found on the first read + */ + @Test + @Ignore() + @Override + public void writeAfterRead() throws Exception { + super.writeAfterRead(); + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassTest.java new file mode 100644 index 00000000..1cb27901 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassTest.java @@ -0,0 +1,92 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter; + +import jakarta.json.bind.adapter.JsonbAdapter; +import jakarta.json.bind.annotation.JsonbTypeAdapter; +import org.apache.johnzon.jsonb.symmetry.Calls; +import org.apache.johnzon.jsonb.symmetry.SymmetryTest; +import org.junit.Before; + +public abstract class StringAdapterOnClassTest extends SymmetryTest { + + protected static final Calls CALLS = new Calls(); + + @Before + public void reset() { + CALLS.reset(); + } + + public static String calls() { + return CALLS.get(); + } + + @JsonbTypeAdapter(Adapter.EmailClass.class) + public static class Email { + final String user; + final String domain; + final String call; + + public Email(final String user, final String domain) { + this(user, domain, null); + } + + public Email(final String user, final String domain, final String call) { + this.user = user; + this.domain = domain; + this.call = call; + } + + @Override + public String toString() { + if (call == null) { + return user + "@" + domain; + } else { + return user + "@" + domain + ":" + call; + } + } + } + + public abstract static class Adapter implements JsonbAdapter { + + @Override + public String adaptToJson(final Email obj) { + return obj.user + "@" + obj.domain + ":" + CALLS.called(this); + } + + @Override + public Email adaptFromJson(final String obj) { + final String[] parts = obj.split("[@:]"); + return new Email(parts[0], parts[1], CALLS.called(this)); + } + + public static final class Method extends Adapter { + } + + public static final class Field extends Adapter { + } + + public static final class Constructor extends Adapter { + } + + public static final class Config extends Adapter { + } + + public static final class EmailClass extends Adapter { + } + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigTest.java new file mode 100644 index 00000000..14483942 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigTest.java @@ -0,0 +1,117 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import org.junit.Ignore; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class StringAdapterPrecedenceConfigTest extends StringAdapterOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":\"test@domain.com\"}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:Config.adaptFromJson}", actual.toString()); + assertEquals("Config.adaptFromJson\n" + + "Contact.", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":\"test@domain.com:Config.adaptToJson\"}", json); + assertEquals("Contact.getEmail\n" + + "Config.adaptToJson", calls()); + } + + public static class Contact { + + private final Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") final Email email) { + CALLS.called(); + this.email = email; + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } + + /** + * Fails as the read behavior is changed if a write is performed first. + */ + @Test + @Ignore + @Override + public void readAfterWrite() throws Exception { + super.readAfterWrite(); + } + + /** + * Write behavior is not symmetrical with read + */ + @Test + @Ignore + @Override + public void write() throws Exception { + super.write(); + } + + /** + * Write behavior is not symmetrical with read + */ + @Test + @Ignore + @Override + public void writeAfterRead() throws Exception { + super.writeAfterRead(); + } + + /** + * Write behavior is not symmetrical with read + */ + @Test + @Ignore + @Override + public void writeAfterWrite() throws Exception { + super.writeAfterWrite(); + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConstructorTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConstructorTest.java new file mode 100644 index 00000000..84ac041d --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConstructorTest.java @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +public class StringAdapterPrecedenceConstructorTest extends StringAdapterOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":\"test@domain.com\"}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:Constructor.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":\"test@domain.com:Method.adaptToJson\"}", json); + assertEquals("" + + "Contact.getEmail\n" + + "Method.adaptToJson", calls()); + } + + public static class Contact { + + @JsonbTypeAdapter(Adapter.Field.class) + private final Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + @JsonbTypeAdapter(Adapter.Method.class) + public Email getEmail() { + CALLS.called(); + return email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceFieldTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceFieldTest.java new file mode 100644 index 00000000..45eea150 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceFieldTest.java @@ -0,0 +1,88 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +/** + * Current behavior is that field injection wins over both method and constructor + */ +public class StringAdapterPrecedenceFieldTest extends StringAdapterOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":\"test@domain.com\"}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:Field.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.\n" + + "Field.adaptFromJson\n" + + "Contact.setEmail", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":\"test@domain.com:Field.adaptToJson\"}", json); + assertEquals("Contact.getEmail\n" + + "Field.adaptToJson", calls()); + } + + public static class Contact { + + @JsonbTypeAdapter(Adapter.Field.class) + private Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + public void setEmail(final Email email) { + CALLS.called(); + this.email = email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } + +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceMethodTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceMethodTest.java new file mode 100644 index 00000000..33a6309e --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceMethodTest.java @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +public class StringAdapterPrecedenceMethodTest extends StringAdapterOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":\"test@domain.com\"}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:Method.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.\n" + + "Method.adaptFromJson\n" + + "Contact.setEmail", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":\"test@domain.com:Method.adaptToJson\"}", json); + assertEquals("Contact.getEmail\n" + + "Method.adaptToJson", calls()); + } + + public static class Contact { + + @JsonbTypeAdapter(Adapter.Field.class) + private Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + @JsonbTypeAdapter(Adapter.Method.class) + public Email getEmail() { + CALLS.called(); + return email; + } + + @JsonbTypeAdapter(Adapter.Method.class) + public void setEmail(final Email email) { + CALLS.called(); + this.email = email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} From f72e2af28ec3bc9e0b2387b36b0a1e1602c8dad8 Mon Sep 17 00:00:00 2001 From: David Blevins Date: Thu, 8 May 2025 16:23:37 -0700 Subject: [PATCH 02/25] Adapter on Field, Getter, Setter, Config, Class and Constructor --- ...ClassGetterSetterFieldConstructorTest.java | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java new file mode 100644 index 00000000..ac9cd91f --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Field + * - Constructor + * - Getter + * - Setter + * - Config + * - Class + * + * Setter wins on read + * Getter wins on write + * + * Constructor adapter is called, but overwritten + */ +public class StringAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest extends StringAdapterOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":\"test@domain.com\"}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:Method.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.\n" + + "Method.adaptFromJson\n" + + "Contact.setEmail", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":\"test@domain.com:Method.adaptToJson\"}", json); + assertEquals("Contact.getEmail\n" + + "Method.adaptToJson", calls()); + } + + public static class Contact { + + @JsonbTypeAdapter(Adapter.Field.class) + private Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + @JsonbTypeAdapter(Adapter.Method.class) + public Email getEmail() { + CALLS.called(); + return email; + } + + @JsonbTypeAdapter(Adapter.Method.class) + public void setEmail(final Email email) { + CALLS.called(); + this.email = email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} From 5284dea28a4c91046f9890393250a1db9c539c4a Mon Sep 17 00:00:00 2001 From: David Blevins Date: Thu, 8 May 2025 16:29:40 -0700 Subject: [PATCH 03/25] Make explicit Getter and Setter adapters --- .../symmetry/adapter/StringAdapterOnClassTest.java | 4 ++-- ...eConfigClassGetterSetterFieldConstructorTest.java | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassTest.java index 1cb27901..1bc0fa52 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassTest.java @@ -74,8 +74,8 @@ public Email adaptFromJson(final String obj) { return new Email(parts[0], parts[1], CALLS.called(this)); } - public static final class Method extends Adapter { - } + public static final class Getter extends Adapter {} + public static final class Setter extends Adapter {} public static final class Field extends Adapter { } diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java index ac9cd91f..b4d9de56 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java @@ -50,10 +50,10 @@ public Jsonb jsonb() { public void assertRead(final Jsonb jsonb) { final String json = "{\"email\":\"test@domain.com\"}"; final Contact actual = jsonb.fromJson(json, Contact.class); - assertEquals("Contact{email=test@domain.com:Method.adaptFromJson}", actual.toString()); + assertEquals("Contact{email=test@domain.com:Setter.adaptFromJson}", actual.toString()); assertEquals("Constructor.adaptFromJson\n" + "Contact.\n" + - "Method.adaptFromJson\n" + + "Setter.adaptFromJson\n" + "Contact.setEmail", calls()); } @@ -64,9 +64,9 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":\"test@domain.com:Method.adaptToJson\"}", json); + assertEquals("{\"email\":\"test@domain.com:Getter.adaptToJson\"}", json); assertEquals("Contact.getEmail\n" + - "Method.adaptToJson", calls()); + "Getter.adaptToJson", calls()); } public static class Contact { @@ -80,13 +80,13 @@ public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.cla this.email = email; } - @JsonbTypeAdapter(Adapter.Method.class) + @JsonbTypeAdapter(Adapter.Getter.class) public Email getEmail() { CALLS.called(); return email; } - @JsonbTypeAdapter(Adapter.Method.class) + @JsonbTypeAdapter(Adapter.Setter.class) public void setEmail(final Email email) { CALLS.called(); this.email = email; From 753da8969e2d1729541dbec209d42c38fd760a8a Mon Sep 17 00:00:00 2001 From: David Blevins Date: Thu, 8 May 2025 16:33:57 -0700 Subject: [PATCH 04/25] Adapter on Field, Getter, Config, Class and Constructor, has a Setter --- ...ssGetterFieldConstructorHasSetterTest.java | 101 ++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java new file mode 100644 index 00000000..03e02485 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java @@ -0,0 +1,101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Config + * - Class + * - Constructor + * - Getter + * - Field + * + * Still has a setter + * + * Outcome + * + * - Field wins on read + * - Getter wins on write + * - Constructor adapter is called, but overwritten + */ +public class StringAdapterPrecedenceConfigClassGetterFieldConstructorHasSetterTest extends StringAdapterOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":\"test@domain.com\"}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:Field.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.\n" + + "Field.adaptFromJson\n" + + "Contact.setEmail", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":\"test@domain.com:Getter.adaptToJson\"}", json); + assertEquals("Contact.getEmail\n" + + "Getter.adaptToJson", calls()); + } + + public static class Contact { + + @JsonbTypeAdapter(Adapter.Field.class) + private Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + @JsonbTypeAdapter(Adapter.Getter.class) + public Email getEmail() { + CALLS.called(); + return email; + } + + public void setEmail(final Email email) { + CALLS.called(); + this.email = email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} From b5d43403d5440fa3ebd171600aa9116e1366e5ff Mon Sep 17 00:00:00 2001 From: David Blevins Date: Thu, 8 May 2025 16:39:59 -0700 Subject: [PATCH 05/25] Adapter on Field, Setter, Config, Class and Constructor, has a Getter --- ...ssSetterFieldConstructorHasGetterTest.java | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java new file mode 100644 index 00000000..ee23769e --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Field + * - Constructor + * - Setter + * - Config + * - Class + * + * Still has a getter + * + * Outcome + * - Setter wins on read + * - Field wins on write + * - Constructor adapter is called, but overwritten + */ +public class StringAdapterPrecedenceConfigClassSetterFieldConstructorHasGetterTest extends StringAdapterOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":\"test@domain.com\"}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:Setter.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.\n" + + "Setter.adaptFromJson\n" + + "Contact.setEmail", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":\"test@domain.com:Field.adaptToJson\"}", json); + assertEquals("Contact.getEmail\n" + + "Field.adaptToJson", calls()); + } + + public static class Contact { + + @JsonbTypeAdapter(Adapter.Field.class) + private Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + @JsonbTypeAdapter(Adapter.Setter.class) + public void setEmail(final Email email) { + CALLS.called(); + this.email = email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} From d2aaa7eaf85c5f6e5aaebc73b8dc19241e3504bd Mon Sep 17 00:00:00 2001 From: David Blevins Date: Thu, 8 May 2025 16:42:58 -0700 Subject: [PATCH 06/25] Adapter on Field, Config, Class and Constructor, has a Getter and Setter --- ...ssFieldConstructorHasGetterSetterTest.java | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java new file mode 100644 index 00000000..7345ffc5 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Field + * - Constructor + * - Config + * - Class + * + * Has + * - Getter + * - Setter + * + * Outcome: + * - Field wins on read + * - Field wins on write + * - Constructor adapter is called, but overwritten + */ +public class StringAdapterPrecedenceConfigClassFieldConstructorHasGetterSetterTest extends StringAdapterOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":\"test@domain.com\"}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:Field.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.\n" + + "Field.adaptFromJson\n" + + "Contact.setEmail", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":\"test@domain.com:Field.adaptToJson\"}", json); + assertEquals("Contact.getEmail\n" + + "Field.adaptToJson", calls()); + } + + public static class Contact { + + @JsonbTypeAdapter(Adapter.Field.class) + private Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + public void setEmail(final Email email) { + CALLS.called(); + this.email = email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} From 6080b905ee4a235c37e367950cbf15b21f5bc878 Mon Sep 17 00:00:00 2001 From: David Blevins Date: Thu, 8 May 2025 16:52:40 -0700 Subject: [PATCH 07/25] Adapter on Field, Config, Class and Constructor, has a Getter and Final Field --- ...eldConstructorHasGetterFinalFieldTest.java | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java new file mode 100644 index 00000000..4392af12 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java @@ -0,0 +1,93 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Field + * - Constructor + * - Config + * - Class + * + * Has + * - Getter + * - Final Field + * + * Outcome: + * - Constructor wins on read + * - Field wins on write + */ +public class StringAdapterPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest extends StringAdapterOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":\"test@domain.com\"}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:Constructor.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":\"test@domain.com:Field.adaptToJson\"}", json); + assertEquals("Contact.getEmail\n" + + "Field.adaptToJson", calls()); + } + + public static class Contact { + + @JsonbTypeAdapter(Adapter.Field.class) + private final Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} From 1b395bf7375b6589f8b3f358b18ddfa7852ffe5f Mon Sep 17 00:00:00 2001 From: David Blevins Date: Thu, 8 May 2025 17:08:34 -0700 Subject: [PATCH 08/25] Adapter on Config, Class and Constructor, has a Getter and Final Field --- ...assConstructorHasGetterFinalFieldTest.java | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java new file mode 100644 index 00000000..3c0f1241 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java @@ -0,0 +1,98 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Constructor + * - Config + * - Class + * + * Has + * - Getter + * - Final Field + * + * Outcome: + * - Constructor wins on read + * - EmailClass wins on write + * + * Question: + * - Should Config win? + * Adapters on the target type itself (Email) are effectively a hardcoded default adapter + * If a user wishes to alter this behavior for a specific operation via the config, why + * not let them? This would be the most (only?) convenient way to change behavior without + * sweeping code change. + */ +public class StringAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest extends StringAdapterOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":\"test@domain.com\"}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:Constructor.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":\"test@domain.com:EmailClass.adaptToJson\"}", json); + assertEquals("Contact.getEmail\n" + + "EmailClass.adaptToJson", calls()); + } + + public static class Contact { + + private final Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} From 908f5f4dd1f2f7e8535bb29884f8e4aa5229e7d2 Mon Sep 17 00:00:00 2001 From: David Blevins Date: Thu, 8 May 2025 17:20:19 -0700 Subject: [PATCH 09/25] Adapter on Config, Class and Constructor, has a Getter and Setter --- ...igClassConstructorHasGetterSetterTest.java | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassConstructorHasGetterSetterTest.java diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassConstructorHasGetterSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassConstructorHasGetterSetterTest.java new file mode 100644 index 00000000..cbfcff46 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassConstructorHasGetterSetterTest.java @@ -0,0 +1,108 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Constructor + * - Config + * - Class + * + * Has + * - Getter + * - Setter + * + * Outcome: + * - EmailClass wins on read + * - EmailClass wins on write + * - Constructor adapter is called, but overwritten + * + * Question: + * - Should Config win on write? + * Adapters on the target type itself (Email) are effectively a hardcoded default adapter + * If a user wishes to alter this behavior for a specific operation via the config, why + * not let them? This would be the most (only?) convenient way to change behavior without + * sweeping code change. + * + * - Shouldn't the constructor win on read? + * Seems like a clear bug + */ +public class StringAdapterPrecedenceConfigClassConstructorHasGetterSetterTest extends StringAdapterOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":\"test@domain.com\"}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:EmailClass.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.\n" + + "EmailClass.adaptFromJson\n" + + "Contact.setEmail", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":\"test@domain.com:EmailClass.adaptToJson\"}", json); + assertEquals("Contact.getEmail\n" + + "EmailClass.adaptToJson", calls()); + } + + public static class Contact { + + private Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + public void setEmail(final Email email) { + CALLS.called(); + this.email = email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} From f9aaa3f110b289d1db1b7e6c938d336f97a8c853 Mon Sep 17 00:00:00 2001 From: David Blevins Date: Thu, 8 May 2025 17:52:49 -0700 Subject: [PATCH 10/25] Fill out scenarios --- .../StringAdapterOnClassDirectTest.java | 75 +++++++++++ .../StringAdapterOnClassSimpleTest.java | 76 ++++++------ ...assConstructorHasGetterFinalFieldTest.java | 2 +- ...dapterPrecedenceConfigClassDirectTest.java | 58 +++++++++ ...ringAdapterPrecedenceConfigClassTest.java} | 41 +++--- .../StringAdapterPrecedenceConfigTest.java | 117 ------------------ ...tringAdapterPrecedenceConstructorTest.java | 79 ------------ .../StringAdapterPrecedenceMethodTest.java | 86 ------------- 8 files changed, 200 insertions(+), 334 deletions(-) create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassDirectTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassDirectTest.java rename johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/{StringAdapterPrecedenceFieldTest.java => StringAdapterPrecedenceConfigClassTest.java} (68%) delete mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigTest.java delete mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConstructorTest.java delete mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceMethodTest.java diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassDirectTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassDirectTest.java new file mode 100644 index 00000000..c025a93f --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassDirectTest.java @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import org.junit.Ignore; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class StringAdapterOnClassDirectTest extends StringAdapterOnClassTest { + + public Jsonb jsonb() { + return JsonbBuilder.create(); + } + + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final String json = jsonb.toJson(email); + assertEquals("\"test@domain.com:EmailClass.adaptToJson\"", json); + assertEquals("EmailClass.adaptToJson", calls()); + } + + public void assertRead(final Jsonb jsonb) { + final String json = "\"test@domain.com\""; + final Email email = jsonb.fromJson(json, Email.class); + assertEquals("test@domain.com:EmailClass.adaptFromJson", email.toString()); + assertEquals("EmailClass.adaptFromJson", calls()); + } + + /** + * Fails as the adapter is not found + */ + @Test + @Ignore() + @Override + public void read() throws Exception { + super.read(); + } + + /** + * Fails as the adapter is not found + */ + @Test + @Ignore() + @Override + public void readAfterRead() throws Exception { + super.readAfterRead(); + } + + /** + * Fails as the adapter is not found on the first read + */ + @Test + @Ignore() + @Override + public void writeAfterRead() throws Exception { + super.writeAfterRead(); + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassSimpleTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassSimpleTest.java index 2aba4ecb..0c0fd9fc 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassSimpleTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassSimpleTest.java @@ -18,8 +18,6 @@ import jakarta.json.bind.Jsonb; import jakarta.json.bind.JsonbBuilder; -import org.junit.Ignore; -import org.junit.Test; import static org.junit.Assert.assertEquals; @@ -29,47 +27,51 @@ public Jsonb jsonb() { return JsonbBuilder.create(); } - public void assertWrite(final Jsonb jsonb) { - final Email email = new Email("test", "domain.com"); - final String json = jsonb.toJson(email); - assertEquals("\"test@domain.com:EmailClass.adaptToJson\"", json); - assertEquals("EmailClass.adaptToJson", calls()); - } - + @Override public void assertRead(final Jsonb jsonb) { - final String json = "\"test@domain.com\""; - final Email email = jsonb.fromJson(json, Email.class); - assertEquals("test@domain.com:EmailClass.adaptFromJson", email.toString()); - assertEquals("EmailClass.adaptFromJson", calls()); + final String json = "{\"email\":\"test@domain.com\"}"; + final StringAdapterPrecedenceConfigClassTest.Contact actual = jsonb.fromJson(json, StringAdapterPrecedenceConfigClassTest.Contact.class); + assertEquals("Contact{email=test@domain.com:EmailClass.adaptFromJson}", actual.toString()); + assertEquals("Contact.\n" + + "EmailClass.adaptFromJson\n" + + "Contact.setEmail", calls()); } - /** - * Fails as the adapter is not found - */ - @Test - @Ignore() @Override - public void read() throws Exception { - super.read(); - } + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final StringAdapterPrecedenceConfigClassTest.Contact contact = new StringAdapterPrecedenceConfigClassTest.Contact(); + contact.setEmail(email); + reset(); - /** - * Fails as the adapter is not found - */ - @Test - @Ignore() - @Override - public void readAfterRead() throws Exception { - super.readAfterRead(); + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":\"test@domain.com:EmailClass.adaptToJson\"}", json); + assertEquals("Contact.getEmail\n" + + "EmailClass.adaptToJson", calls()); } - /** - * Fails as the adapter is not found on the first read - */ - @Test - @Ignore() - @Override - public void writeAfterRead() throws Exception { - super.writeAfterRead(); + public static class Contact { + + private Email email; + + public Contact() { + CALLS.called(); + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + public void setEmail(final Email email) { + CALLS.called(); + this.email = email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } } + } diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java index 3c0f1241..85a8c72e 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java @@ -40,7 +40,7 @@ * - EmailClass wins on write * * Question: - * - Should Config win? + * - Should Config win on write? * Adapters on the target type itself (Email) are effectively a hardcoded default adapter * If a user wishes to alter this behavior for a specific operation via the config, why * not let them? This would be the most (only?) convenient way to change behavior without diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassDirectTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassDirectTest.java new file mode 100644 index 00000000..757f1fbb --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassDirectTest.java @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Config + * - Class + * + * + * Outcome: + * - Config wins on read + * - Config wins on write + */ +public class StringAdapterPrecedenceConfigClassDirectTest extends StringAdapterOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "\"test@domain.com\""; + final Email actual = jsonb.fromJson(json, Email.class); + assertEquals("test@domain.com:Config.adaptFromJson", actual.toString()); + assertEquals("Config.adaptFromJson", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + + final String json = jsonb.toJson(email); + assertEquals("\"test@domain.com:Config.adaptToJson\"", json); + assertEquals("Config.adaptToJson", calls()); + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceFieldTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassTest.java similarity index 68% rename from johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceFieldTest.java rename to johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassTest.java index 45eea150..bac1b24f 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceFieldTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassTest.java @@ -26,9 +26,26 @@ import static org.junit.Assert.assertEquals; /** - * Current behavior is that field injection wins over both method and constructor + * JsonbTypeAdapter on + * - Config + * - Class + * + * Has + * - Getter + * - Final Field + * + * Outcome: + * - EmailClass wins on read + * - EmailClass wins on write + * + * Question: + * - Should Config win on read and write? + * Adapters on the target type itself (Email) are effectively a hardcoded default adapter + * If a user wishes to alter this behavior for a specific operation via the config, why + * not let them? This would be the most (only?) convenient way to change behavior without + * sweeping code change. */ -public class StringAdapterPrecedenceFieldTest extends StringAdapterOnClassTest { +public class StringAdapterPrecedenceConfigClassTest extends StringAdapterOnClassTest { @Override public Jsonb jsonb() { @@ -39,34 +56,31 @@ public Jsonb jsonb() { public void assertRead(final Jsonb jsonb) { final String json = "{\"email\":\"test@domain.com\"}"; final Contact actual = jsonb.fromJson(json, Contact.class); - assertEquals("Contact{email=test@domain.com:Field.adaptFromJson}", actual.toString()); - assertEquals("Constructor.adaptFromJson\n" + - "Contact.\n" + - "Field.adaptFromJson\n" + + assertEquals("Contact{email=test@domain.com:EmailClass.adaptFromJson}", actual.toString()); + assertEquals("Contact.\n" + + "EmailClass.adaptFromJson\n" + "Contact.setEmail", calls()); } @Override public void assertWrite(final Jsonb jsonb) { final Email email = new Email("test", "domain.com"); - final Contact contact = new Contact(email); + final Contact contact = new Contact(); + contact.setEmail(email); reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":\"test@domain.com:Field.adaptToJson\"}", json); + assertEquals("{\"email\":\"test@domain.com:EmailClass.adaptToJson\"}", json); assertEquals("Contact.getEmail\n" + - "Field.adaptToJson", calls()); + "EmailClass.adaptToJson", calls()); } public static class Contact { - @JsonbTypeAdapter(Adapter.Field.class) private Email email; - @JsonbCreator - public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + public Contact() { CALLS.called(); - this.email = email; } public Email getEmail() { @@ -84,5 +98,4 @@ public String toString() { return String.format("Contact{email=%s}", email); } } - } diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigTest.java deleted file mode 100644 index 14483942..00000000 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigTest.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.johnzon.jsonb.symmetry.adapter; - -import jakarta.json.bind.Jsonb; -import jakarta.json.bind.JsonbBuilder; -import jakarta.json.bind.JsonbConfig; -import jakarta.json.bind.annotation.JsonbCreator; -import jakarta.json.bind.annotation.JsonbProperty; -import org.junit.Ignore; -import org.junit.Test; - -import static org.junit.Assert.assertEquals; - -public class StringAdapterPrecedenceConfigTest extends StringAdapterOnClassTest { - - @Override - public Jsonb jsonb() { - return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); - } - - @Override - public void assertRead(final Jsonb jsonb) { - final String json = "{\"email\":\"test@domain.com\"}"; - final Contact actual = jsonb.fromJson(json, Contact.class); - assertEquals("Contact{email=test@domain.com:Config.adaptFromJson}", actual.toString()); - assertEquals("Config.adaptFromJson\n" + - "Contact.", calls()); - } - - @Override - public void assertWrite(final Jsonb jsonb) { - final Email email = new Email("test", "domain.com"); - final Contact contact = new Contact(email); - reset(); - - final String json = jsonb.toJson(contact); - assertEquals("{\"email\":\"test@domain.com:Config.adaptToJson\"}", json); - assertEquals("Contact.getEmail\n" + - "Config.adaptToJson", calls()); - } - - public static class Contact { - - private final Email email; - - @JsonbCreator - public Contact(@JsonbProperty("email") final Email email) { - CALLS.called(); - this.email = email; - } - - public Email getEmail() { - CALLS.called(); - return email; - } - - @Override - public String toString() { - return String.format("Contact{email=%s}", email); - } - } - - /** - * Fails as the read behavior is changed if a write is performed first. - */ - @Test - @Ignore - @Override - public void readAfterWrite() throws Exception { - super.readAfterWrite(); - } - - /** - * Write behavior is not symmetrical with read - */ - @Test - @Ignore - @Override - public void write() throws Exception { - super.write(); - } - - /** - * Write behavior is not symmetrical with read - */ - @Test - @Ignore - @Override - public void writeAfterRead() throws Exception { - super.writeAfterRead(); - } - - /** - * Write behavior is not symmetrical with read - */ - @Test - @Ignore - @Override - public void writeAfterWrite() throws Exception { - super.writeAfterWrite(); - } -} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConstructorTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConstructorTest.java deleted file mode 100644 index 84ac041d..00000000 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConstructorTest.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.johnzon.jsonb.symmetry.adapter; - -import jakarta.json.bind.Jsonb; -import jakarta.json.bind.JsonbBuilder; -import jakarta.json.bind.JsonbConfig; -import jakarta.json.bind.annotation.JsonbCreator; -import jakarta.json.bind.annotation.JsonbProperty; -import jakarta.json.bind.annotation.JsonbTypeAdapter; - -import static org.junit.Assert.assertEquals; - -public class StringAdapterPrecedenceConstructorTest extends StringAdapterOnClassTest { - - @Override - public Jsonb jsonb() { - return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); - } - - @Override - public void assertRead(final Jsonb jsonb) { - final String json = "{\"email\":\"test@domain.com\"}"; - final Contact actual = jsonb.fromJson(json, Contact.class); - assertEquals("Contact{email=test@domain.com:Constructor.adaptFromJson}", actual.toString()); - assertEquals("Constructor.adaptFromJson\n" + - "Contact.", calls()); - } - - @Override - public void assertWrite(final Jsonb jsonb) { - final Email email = new Email("test", "domain.com"); - final Contact contact = new Contact(email); - reset(); - - final String json = jsonb.toJson(contact); - assertEquals("{\"email\":\"test@domain.com:Method.adaptToJson\"}", json); - assertEquals("" + - "Contact.getEmail\n" + - "Method.adaptToJson", calls()); - } - - public static class Contact { - - @JsonbTypeAdapter(Adapter.Field.class) - private final Email email; - - @JsonbCreator - public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { - CALLS.called(); - this.email = email; - } - - @JsonbTypeAdapter(Adapter.Method.class) - public Email getEmail() { - CALLS.called(); - return email; - } - - @Override - public String toString() { - return String.format("Contact{email=%s}", email); - } - } -} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceMethodTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceMethodTest.java deleted file mode 100644 index 33a6309e..00000000 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceMethodTest.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.johnzon.jsonb.symmetry.adapter; - -import jakarta.json.bind.Jsonb; -import jakarta.json.bind.JsonbBuilder; -import jakarta.json.bind.JsonbConfig; -import jakarta.json.bind.annotation.JsonbCreator; -import jakarta.json.bind.annotation.JsonbProperty; -import jakarta.json.bind.annotation.JsonbTypeAdapter; - -import static org.junit.Assert.assertEquals; - -public class StringAdapterPrecedenceMethodTest extends StringAdapterOnClassTest { - - @Override - public Jsonb jsonb() { - return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); - } - - @Override - public void assertRead(final Jsonb jsonb) { - final String json = "{\"email\":\"test@domain.com\"}"; - final Contact actual = jsonb.fromJson(json, Contact.class); - assertEquals("Contact{email=test@domain.com:Method.adaptFromJson}", actual.toString()); - assertEquals("Constructor.adaptFromJson\n" + - "Contact.\n" + - "Method.adaptFromJson\n" + - "Contact.setEmail", calls()); - } - - @Override - public void assertWrite(final Jsonb jsonb) { - final Email email = new Email("test", "domain.com"); - final Contact contact = new Contact(email); - reset(); - - final String json = jsonb.toJson(contact); - assertEquals("{\"email\":\"test@domain.com:Method.adaptToJson\"}", json); - assertEquals("Contact.getEmail\n" + - "Method.adaptToJson", calls()); - } - - public static class Contact { - - @JsonbTypeAdapter(Adapter.Field.class) - private Email email; - - @JsonbCreator - public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { - CALLS.called(); - this.email = email; - } - - @JsonbTypeAdapter(Adapter.Method.class) - public Email getEmail() { - CALLS.called(); - return email; - } - - @JsonbTypeAdapter(Adapter.Method.class) - public void setEmail(final Email email) { - CALLS.called(); - this.email = email; - } - - @Override - public String toString() { - return String.format("Contact{email=%s}", email); - } - } -} From 96987ee7c7bbd4c2c5824183efc775afe991679a Mon Sep 17 00:00:00 2001 From: David Blevins Date: Thu, 8 May 2025 17:55:49 -0700 Subject: [PATCH 11/25] Checkstyle --- .../jsonb/symmetry/adapter/StringAdapterOnClassTest.java | 7 +++++-- .../adapter/StringAdapterPrecedenceConfigClassTest.java | 3 --- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassTest.java index 1bc0fa52..d97ac378 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassTest.java @@ -74,8 +74,11 @@ public Email adaptFromJson(final String obj) { return new Email(parts[0], parts[1], CALLS.called(this)); } - public static final class Getter extends Adapter {} - public static final class Setter extends Adapter {} + public static final class Getter extends Adapter { + } + + public static final class Setter extends Adapter { + } public static final class Field extends Adapter { } diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassTest.java index bac1b24f..7396ee15 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassTest.java @@ -19,9 +19,6 @@ import jakarta.json.bind.Jsonb; import jakarta.json.bind.JsonbBuilder; import jakarta.json.bind.JsonbConfig; -import jakarta.json.bind.annotation.JsonbCreator; -import jakarta.json.bind.annotation.JsonbProperty; -import jakarta.json.bind.annotation.JsonbTypeAdapter; import static org.junit.Assert.assertEquals; From fa950803c3561ed6d00b490b2c9ee1c0f37e510f Mon Sep 17 00:00:00 2001 From: David Blevins Date: Thu, 8 May 2025 17:59:16 -0700 Subject: [PATCH 12/25] Move to string subpackage --- .../adapter/{ => string}/StringAdapterOnClassDirectTest.java | 2 +- .../adapter/{ => string}/StringAdapterOnClassSimpleTest.java | 2 +- .../symmetry/adapter/{ => string}/StringAdapterOnClassTest.java | 2 +- ...PrecedenceConfigClassConstructorHasGetterFinalFieldTest.java | 2 +- ...pterPrecedenceConfigClassConstructorHasGetterSetterTest.java | 2 +- .../StringAdapterPrecedenceConfigClassDirectTest.java | 2 +- ...denceConfigClassFieldConstructorHasGetterFinalFieldTest.java | 2 +- ...recedenceConfigClassFieldConstructorHasGetterSetterTest.java | 2 +- ...recedenceConfigClassGetterFieldConstructorHasSetterTest.java | 2 +- ...erPrecedenceConfigClassGetterSetterFieldConstructorTest.java | 2 +- ...recedenceConfigClassSetterFieldConstructorHasGetterTest.java | 2 +- .../{ => string}/StringAdapterPrecedenceConfigClassTest.java | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) rename johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/{ => string}/StringAdapterOnClassDirectTest.java (97%) rename johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/{ => string}/StringAdapterOnClassSimpleTest.java (97%) rename johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/{ => string}/StringAdapterOnClassTest.java (98%) rename johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/{ => string}/StringAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java (98%) rename johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/{ => string}/StringAdapterPrecedenceConfigClassConstructorHasGetterSetterTest.java (98%) rename johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/{ => string}/StringAdapterPrecedenceConfigClassDirectTest.java (97%) rename johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/{ => string}/StringAdapterPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java (98%) rename johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/{ => string}/StringAdapterPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java (98%) rename johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/{ => string}/StringAdapterPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java (98%) rename johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/{ => string}/StringAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java (98%) rename johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/{ => string}/StringAdapterPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java (98%) rename johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/{ => string}/StringAdapterPrecedenceConfigClassTest.java (98%) diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassDirectTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterOnClassDirectTest.java similarity index 97% rename from johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassDirectTest.java rename to johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterOnClassDirectTest.java index c025a93f..7266a76e 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassDirectTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterOnClassDirectTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.johnzon.jsonb.symmetry.adapter; +package org.apache.johnzon.jsonb.symmetry.adapter.string; import jakarta.json.bind.Jsonb; import jakarta.json.bind.JsonbBuilder; diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassSimpleTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterOnClassSimpleTest.java similarity index 97% rename from johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassSimpleTest.java rename to johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterOnClassSimpleTest.java index 0c0fd9fc..011cab19 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassSimpleTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterOnClassSimpleTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.johnzon.jsonb.symmetry.adapter; +package org.apache.johnzon.jsonb.symmetry.adapter.string; import jakarta.json.bind.Jsonb; import jakarta.json.bind.JsonbBuilder; diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterOnClassTest.java similarity index 98% rename from johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassTest.java rename to johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterOnClassTest.java index d97ac378..3f3ba0e7 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterOnClassTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterOnClassTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.johnzon.jsonb.symmetry.adapter; +package org.apache.johnzon.jsonb.symmetry.adapter.string; import jakarta.json.bind.adapter.JsonbAdapter; import jakarta.json.bind.annotation.JsonbTypeAdapter; diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java similarity index 98% rename from johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java rename to johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java index 85a8c72e..0880bef1 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.johnzon.jsonb.symmetry.adapter; +package org.apache.johnzon.jsonb.symmetry.adapter.string; import jakarta.json.bind.Jsonb; import jakarta.json.bind.JsonbBuilder; diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassConstructorHasGetterSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterPrecedenceConfigClassConstructorHasGetterSetterTest.java similarity index 98% rename from johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassConstructorHasGetterSetterTest.java rename to johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterPrecedenceConfigClassConstructorHasGetterSetterTest.java index cbfcff46..4321370d 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassConstructorHasGetterSetterTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterPrecedenceConfigClassConstructorHasGetterSetterTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.johnzon.jsonb.symmetry.adapter; +package org.apache.johnzon.jsonb.symmetry.adapter.string; import jakarta.json.bind.Jsonb; import jakarta.json.bind.JsonbBuilder; diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassDirectTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterPrecedenceConfigClassDirectTest.java similarity index 97% rename from johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassDirectTest.java rename to johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterPrecedenceConfigClassDirectTest.java index 757f1fbb..40970876 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassDirectTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterPrecedenceConfigClassDirectTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.johnzon.jsonb.symmetry.adapter; +package org.apache.johnzon.jsonb.symmetry.adapter.string; import jakarta.json.bind.Jsonb; import jakarta.json.bind.JsonbBuilder; diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java similarity index 98% rename from johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java rename to johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java index 4392af12..38e03141 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.johnzon.jsonb.symmetry.adapter; +package org.apache.johnzon.jsonb.symmetry.adapter.string; import jakarta.json.bind.Jsonb; import jakarta.json.bind.JsonbBuilder; diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java similarity index 98% rename from johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java rename to johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java index 7345ffc5..cf91f68c 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.johnzon.jsonb.symmetry.adapter; +package org.apache.johnzon.jsonb.symmetry.adapter.string; import jakarta.json.bind.Jsonb; import jakarta.json.bind.JsonbBuilder; diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java similarity index 98% rename from johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java rename to johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java index 03e02485..ac50bf12 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.johnzon.jsonb.symmetry.adapter; +package org.apache.johnzon.jsonb.symmetry.adapter.string; import jakarta.json.bind.Jsonb; import jakarta.json.bind.JsonbBuilder; diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java similarity index 98% rename from johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java rename to johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java index b4d9de56..c0e34f6b 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.johnzon.jsonb.symmetry.adapter; +package org.apache.johnzon.jsonb.symmetry.adapter.string; import jakarta.json.bind.Jsonb; import jakarta.json.bind.JsonbBuilder; diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java similarity index 98% rename from johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java rename to johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java index ee23769e..6182694a 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.johnzon.jsonb.symmetry.adapter; +package org.apache.johnzon.jsonb.symmetry.adapter.string; import jakarta.json.bind.Jsonb; import jakarta.json.bind.JsonbBuilder; diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterPrecedenceConfigClassTest.java similarity index 98% rename from johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassTest.java rename to johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterPrecedenceConfigClassTest.java index 7396ee15..2bcea10d 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/StringAdapterPrecedenceConfigClassTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/string/StringAdapterPrecedenceConfigClassTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.johnzon.jsonb.symmetry.adapter; +package org.apache.johnzon.jsonb.symmetry.adapter.string; import jakarta.json.bind.Jsonb; import jakarta.json.bind.JsonbBuilder; From b8b0dc1e627202a3a4344084b801370481b304ba Mon Sep 17 00:00:00 2001 From: David Blevins Date: Thu, 8 May 2025 18:22:52 -0700 Subject: [PATCH 13/25] Initial setup for Array versions of Adapter Symmetry tests --- .../array/ArrayAdapterOnClassDirectTest.java | 75 ++++++++++++ .../array/ArrayAdapterOnClassSimpleTest.java | 77 +++++++++++++ .../array/ArrayAdapterOnClassTest.java | 95 +++++++++++++++ ...assConstructorHasGetterFinalFieldTest.java | 98 ++++++++++++++++ ...igClassConstructorHasGetterSetterTest.java | 108 ++++++++++++++++++ ...dapterPrecedenceConfigClassDirectTest.java | 58 ++++++++++ ...eldConstructorHasGetterFinalFieldTest.java | 93 +++++++++++++++ ...ssFieldConstructorHasGetterSetterTest.java | 100 ++++++++++++++++ ...ssGetterFieldConstructorHasSetterTest.java | 101 ++++++++++++++++ ...ClassGetterSetterFieldConstructorTest.java | 100 ++++++++++++++++ ...ssSetterFieldConstructorHasGetterTest.java | 100 ++++++++++++++++ ...ArrayAdapterPrecedenceConfigClassTest.java | 98 ++++++++++++++++ 12 files changed, 1103 insertions(+) create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterOnClassDirectTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterOnClassSimpleTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterOnClassTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassConstructorHasGetterSetterTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassDirectTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassTest.java diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterOnClassDirectTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterOnClassDirectTest.java new file mode 100644 index 00000000..78db3085 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterOnClassDirectTest.java @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter.array; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import org.junit.Ignore; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class ArrayAdapterOnClassDirectTest extends ArrayAdapterOnClassTest { + + public Jsonb jsonb() { + return JsonbBuilder.create(); + } + + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final String json = jsonb.toJson(email); + assertEquals("\"test@domain.com:EmailClass.adaptToJson\"", json); + assertEquals("EmailClass.adaptToJson", calls()); + } + + public void assertRead(final Jsonb jsonb) { + final String json = "\"test@domain.com\""; + final Email email = jsonb.fromJson(json, Email.class); + assertEquals("test@domain.com:EmailClass.adaptFromJson", email.toString()); + assertEquals("EmailClass.adaptFromJson", calls()); + } + + /** + * Fails as the adapter is not found + */ + @Test + @Ignore() + @Override + public void read() throws Exception { + super.read(); + } + + /** + * Fails as the adapter is not found + */ + @Test + @Ignore() + @Override + public void readAfterRead() throws Exception { + super.readAfterRead(); + } + + /** + * Fails as the adapter is not found on the first read + */ + @Test + @Ignore() + @Override + public void writeAfterRead() throws Exception { + super.writeAfterRead(); + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterOnClassSimpleTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterOnClassSimpleTest.java new file mode 100644 index 00000000..5419ca7c --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterOnClassSimpleTest.java @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter.array; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; + +import static org.junit.Assert.assertEquals; + +public class ArrayAdapterOnClassSimpleTest extends ArrayAdapterOnClassTest { + + public Jsonb jsonb() { + return JsonbBuilder.create(); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":\"test@domain.com\"}"; + final ArrayAdapterPrecedenceConfigClassTest.Contact actual = jsonb.fromJson(json, ArrayAdapterPrecedenceConfigClassTest.Contact.class); + assertEquals("Contact{email=test@domain.com:EmailClass.adaptFromJson}", actual.toString()); + assertEquals("Contact.\n" + + "EmailClass.adaptFromJson\n" + + "Contact.setEmail", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final ArrayAdapterPrecedenceConfigClassTest.Contact contact = new ArrayAdapterPrecedenceConfigClassTest.Contact(); + contact.setEmail(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":\"test@domain.com:EmailClass.adaptToJson\"}", json); + assertEquals("Contact.getEmail\n" + + "EmailClass.adaptToJson", calls()); + } + + public static class Contact { + + private Email email; + + public Contact() { + CALLS.called(); + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + public void setEmail(final Email email) { + CALLS.called(); + this.email = email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } + +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterOnClassTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterOnClassTest.java new file mode 100644 index 00000000..a163a781 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterOnClassTest.java @@ -0,0 +1,95 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter.array; + +import jakarta.json.bind.adapter.JsonbAdapter; +import jakarta.json.bind.annotation.JsonbTypeAdapter; +import org.apache.johnzon.jsonb.symmetry.Calls; +import org.apache.johnzon.jsonb.symmetry.SymmetryTest; +import org.junit.Before; + +public abstract class ArrayAdapterOnClassTest extends SymmetryTest { + + protected static final Calls CALLS = new Calls(); + + @Before + public void reset() { + CALLS.reset(); + } + + public static String calls() { + return CALLS.get(); + } + + @JsonbTypeAdapter(Adapter.EmailClass.class) + public static class Email { + final String user; + final String domain; + final String call; + + public Email(final String user, final String domain) { + this(user, domain, null); + } + + public Email(final String user, final String domain, final String call) { + this.user = user; + this.domain = domain; + this.call = call; + } + + @Override + public String toString() { + if (call == null) { + return user + "@" + domain; + } else { + return user + "@" + domain + ":" + call; + } + } + } + + public abstract static class Adapter implements JsonbAdapter { + + @Override + public String adaptToJson(final Email obj) { + return obj.user + "@" + obj.domain + ":" + CALLS.called(this); + } + + @Override + public Email adaptFromJson(final String obj) { + final String[] parts = obj.split("[@:]"); + return new Email(parts[0], parts[1], CALLS.called(this)); + } + + public static final class Getter extends Adapter { + } + + public static final class Setter extends Adapter { + } + + public static final class Field extends Adapter { + } + + public static final class Constructor extends Adapter { + } + + public static final class Config extends Adapter { + } + + public static final class EmailClass extends Adapter { + } + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java new file mode 100644 index 00000000..19f673f7 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java @@ -0,0 +1,98 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter.array; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Constructor + * - Config + * - Class + * + * Has + * - Getter + * - Final Field + * + * Outcome: + * - Constructor wins on read + * - EmailClass wins on write + * + * Question: + * - Should Config win on write? + * Adapters on the target type itself (Email) are effectively a hardcoded default adapter + * If a user wishes to alter this behavior for a specific operation via the config, why + * not let them? This would be the most (only?) convenient way to change behavior without + * sweeping code change. + */ +public class ArrayAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest extends ArrayAdapterOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":\"test@domain.com\"}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:Constructor.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":\"test@domain.com:EmailClass.adaptToJson\"}", json); + assertEquals("Contact.getEmail\n" + + "EmailClass.adaptToJson", calls()); + } + + public static class Contact { + + private final Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassConstructorHasGetterSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassConstructorHasGetterSetterTest.java new file mode 100644 index 00000000..5df975bf --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassConstructorHasGetterSetterTest.java @@ -0,0 +1,108 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter.array; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Constructor + * - Config + * - Class + * + * Has + * - Getter + * - Setter + * + * Outcome: + * - EmailClass wins on read + * - EmailClass wins on write + * - Constructor adapter is called, but overwritten + * + * Question: + * - Should Config win on write? + * Adapters on the target type itself (Email) are effectively a hardcoded default adapter + * If a user wishes to alter this behavior for a specific operation via the config, why + * not let them? This would be the most (only?) convenient way to change behavior without + * sweeping code change. + * + * - Shouldn't the constructor win on read? + * Seems like a clear bug + */ +public class ArrayAdapterPrecedenceConfigClassConstructorHasGetterSetterTest extends ArrayAdapterOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":\"test@domain.com\"}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:EmailClass.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.\n" + + "EmailClass.adaptFromJson\n" + + "Contact.setEmail", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":\"test@domain.com:EmailClass.adaptToJson\"}", json); + assertEquals("Contact.getEmail\n" + + "EmailClass.adaptToJson", calls()); + } + + public static class Contact { + + private Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + public void setEmail(final Email email) { + CALLS.called(); + this.email = email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassDirectTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassDirectTest.java new file mode 100644 index 00000000..40272b41 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassDirectTest.java @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter.array; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Config + * - Class + * + * + * Outcome: + * - Config wins on read + * - Config wins on write + */ +public class ArrayAdapterPrecedenceConfigClassDirectTest extends ArrayAdapterOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "\"test@domain.com\""; + final Email actual = jsonb.fromJson(json, Email.class); + assertEquals("test@domain.com:Config.adaptFromJson", actual.toString()); + assertEquals("Config.adaptFromJson", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + + final String json = jsonb.toJson(email); + assertEquals("\"test@domain.com:Config.adaptToJson\"", json); + assertEquals("Config.adaptToJson", calls()); + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java new file mode 100644 index 00000000..663ec34a --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java @@ -0,0 +1,93 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter.array; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Field + * - Constructor + * - Config + * - Class + * + * Has + * - Getter + * - Final Field + * + * Outcome: + * - Constructor wins on read + * - Field wins on write + */ +public class ArrayAdapterPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest extends ArrayAdapterOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":\"test@domain.com\"}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:Constructor.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":\"test@domain.com:Field.adaptToJson\"}", json); + assertEquals("Contact.getEmail\n" + + "Field.adaptToJson", calls()); + } + + public static class Contact { + + @JsonbTypeAdapter(Adapter.Field.class) + private final Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java new file mode 100644 index 00000000..4b43a113 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter.array; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Field + * - Constructor + * - Config + * - Class + * + * Has + * - Getter + * - Setter + * + * Outcome: + * - Field wins on read + * - Field wins on write + * - Constructor adapter is called, but overwritten + */ +public class ArrayAdapterPrecedenceConfigClassFieldConstructorHasGetterSetterTest extends ArrayAdapterOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":\"test@domain.com\"}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:Field.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.\n" + + "Field.adaptFromJson\n" + + "Contact.setEmail", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":\"test@domain.com:Field.adaptToJson\"}", json); + assertEquals("Contact.getEmail\n" + + "Field.adaptToJson", calls()); + } + + public static class Contact { + + @JsonbTypeAdapter(Adapter.Field.class) + private Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + public void setEmail(final Email email) { + CALLS.called(); + this.email = email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java new file mode 100644 index 00000000..58105eb8 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java @@ -0,0 +1,101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter.array; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Config + * - Class + * - Constructor + * - Getter + * - Field + * + * Still has a setter + * + * Outcome + * + * - Field wins on read + * - Getter wins on write + * - Constructor adapter is called, but overwritten + */ +public class ArrayAdapterPrecedenceConfigClassGetterFieldConstructorHasSetterTest extends ArrayAdapterOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":\"test@domain.com\"}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:Field.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.\n" + + "Field.adaptFromJson\n" + + "Contact.setEmail", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":\"test@domain.com:Getter.adaptToJson\"}", json); + assertEquals("Contact.getEmail\n" + + "Getter.adaptToJson", calls()); + } + + public static class Contact { + + @JsonbTypeAdapter(Adapter.Field.class) + private Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + @JsonbTypeAdapter(Adapter.Getter.class) + public Email getEmail() { + CALLS.called(); + return email; + } + + public void setEmail(final Email email) { + CALLS.called(); + this.email = email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java new file mode 100644 index 00000000..012cc12b --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter.array; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Field + * - Constructor + * - Getter + * - Setter + * - Config + * - Class + * + * Setter wins on read + * Getter wins on write + * + * Constructor adapter is called, but overwritten + */ +public class ArrayAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest extends ArrayAdapterOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":\"test@domain.com\"}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:Setter.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.\n" + + "Setter.adaptFromJson\n" + + "Contact.setEmail", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":\"test@domain.com:Getter.adaptToJson\"}", json); + assertEquals("Contact.getEmail\n" + + "Getter.adaptToJson", calls()); + } + + public static class Contact { + + @JsonbTypeAdapter(Adapter.Field.class) + private Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + @JsonbTypeAdapter(Adapter.Getter.class) + public Email getEmail() { + CALLS.called(); + return email; + } + + @JsonbTypeAdapter(Adapter.Setter.class) + public void setEmail(final Email email) { + CALLS.called(); + this.email = email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java new file mode 100644 index 00000000..ad66f48f --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter.array; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Field + * - Constructor + * - Setter + * - Config + * - Class + * + * Still has a getter + * + * Outcome + * - Setter wins on read + * - Field wins on write + * - Constructor adapter is called, but overwritten + */ +public class ArrayAdapterPrecedenceConfigClassSetterFieldConstructorHasGetterTest extends ArrayAdapterOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":\"test@domain.com\"}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:Setter.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.\n" + + "Setter.adaptFromJson\n" + + "Contact.setEmail", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":\"test@domain.com:Field.adaptToJson\"}", json); + assertEquals("Contact.getEmail\n" + + "Field.adaptToJson", calls()); + } + + public static class Contact { + + @JsonbTypeAdapter(Adapter.Field.class) + private Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + @JsonbTypeAdapter(Adapter.Setter.class) + public void setEmail(final Email email) { + CALLS.called(); + this.email = email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassTest.java new file mode 100644 index 00000000..8fa7de55 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassTest.java @@ -0,0 +1,98 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter.array; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Config + * - Class + * + * Has + * - Getter + * - Final Field + * + * Outcome: + * - EmailClass wins on read + * - EmailClass wins on write + * + * Question: + * - Should Config win on read and write? + * Adapters on the target type itself (Email) are effectively a hardcoded default adapter + * If a user wishes to alter this behavior for a specific operation via the config, why + * not let them? This would be the most (only?) convenient way to change behavior without + * sweeping code change. + */ +public class ArrayAdapterPrecedenceConfigClassTest extends ArrayAdapterOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":\"test@domain.com\"}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:EmailClass.adaptFromJson}", actual.toString()); + assertEquals("Contact.\n" + + "EmailClass.adaptFromJson\n" + + "Contact.setEmail", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(); + contact.setEmail(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":\"test@domain.com:EmailClass.adaptToJson\"}", json); + assertEquals("Contact.getEmail\n" + + "EmailClass.adaptToJson", calls()); + } + + public static class Contact { + + private Email email; + + public Contact() { + CALLS.called(); + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + public void setEmail(final Email email) { + CALLS.called(); + this.email = email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} From 800ba5cfc8e7f9ffc75f8faf37fda208ffa852ea Mon Sep 17 00:00:00 2001 From: David Blevins Date: Thu, 8 May 2025 19:41:43 -0700 Subject: [PATCH 14/25] Adjusted Array Adapter Symmetry tests. Some new failures. --- .../array/ArrayAdapterOnClassDirectTest.java | 11 ++++-- .../array/ArrayAdapterOnClassSimpleTest.java | 4 +-- .../array/ArrayAdapterOnClassTest.java | 9 +++-- ...assConstructorHasGetterFinalFieldTest.java | 4 +-- ...igClassConstructorHasGetterSetterTest.java | 4 +-- ...dapterPrecedenceConfigClassDirectTest.java | 34 +++++++++++++++++-- ...eldConstructorHasGetterFinalFieldTest.java | 4 +-- ...ssFieldConstructorHasGetterSetterTest.java | 4 +-- ...ssGetterFieldConstructorHasSetterTest.java | 4 +-- ...ClassGetterSetterFieldConstructorTest.java | 4 +-- ...ssSetterFieldConstructorHasGetterTest.java | 4 +-- ...ArrayAdapterPrecedenceConfigClassTest.java | 4 +-- 12 files changed, 63 insertions(+), 27 deletions(-) diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterOnClassDirectTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterOnClassDirectTest.java index 78db3085..2249feba 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterOnClassDirectTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterOnClassDirectTest.java @@ -32,12 +32,12 @@ public Jsonb jsonb() { public void assertWrite(final Jsonb jsonb) { final Email email = new Email("test", "domain.com"); final String json = jsonb.toJson(email); - assertEquals("\"test@domain.com:EmailClass.adaptToJson\"", json); + assertEquals("[\"test\",\"domain.com\",\"EmailClass.adaptToJson\"]", json); assertEquals("EmailClass.adaptToJson", calls()); } public void assertRead(final Jsonb jsonb) { - final String json = "\"test@domain.com\""; + final String json = "[\"test\",\"domain.com\"]"; final Email email = jsonb.fromJson(json, Email.class); assertEquals("test@domain.com:EmailClass.adaptFromJson", email.toString()); assertEquals("EmailClass.adaptFromJson", calls()); @@ -72,4 +72,11 @@ public void readAfterRead() throws Exception { public void writeAfterRead() throws Exception { super.writeAfterRead(); } + + @Test + @Ignore() + @Override + public void readAfterWrite() throws Exception { + super.readAfterWrite(); + } } diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterOnClassSimpleTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterOnClassSimpleTest.java index 5419ca7c..f1d3913a 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterOnClassSimpleTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterOnClassSimpleTest.java @@ -29,7 +29,7 @@ public Jsonb jsonb() { @Override public void assertRead(final Jsonb jsonb) { - final String json = "{\"email\":\"test@domain.com\"}"; + final String json = "{\"email\":[\"test\",\"domain.com\"]}"; final ArrayAdapterPrecedenceConfigClassTest.Contact actual = jsonb.fromJson(json, ArrayAdapterPrecedenceConfigClassTest.Contact.class); assertEquals("Contact{email=test@domain.com:EmailClass.adaptFromJson}", actual.toString()); assertEquals("Contact.\n" + @@ -45,7 +45,7 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":\"test@domain.com:EmailClass.adaptToJson\"}", json); + assertEquals("{\"email\":[\"test\",\"domain.com\",\"EmailClass.adaptToJson\"]}", json); assertEquals("Contact.getEmail\n" + "EmailClass.adaptToJson", calls()); } diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterOnClassTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterOnClassTest.java index a163a781..dacc75e5 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterOnClassTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterOnClassTest.java @@ -61,16 +61,15 @@ public String toString() { } } - public abstract static class Adapter implements JsonbAdapter { + public abstract static class Adapter implements JsonbAdapter { @Override - public String adaptToJson(final Email obj) { - return obj.user + "@" + obj.domain + ":" + CALLS.called(this); + public String[] adaptToJson(final Email obj) { + return new String[]{obj.user, obj.domain, CALLS.called(this)}; } @Override - public Email adaptFromJson(final String obj) { - final String[] parts = obj.split("[@:]"); + public Email adaptFromJson(final String[] parts) { return new Email(parts[0], parts[1], CALLS.called(this)); } diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java index 19f673f7..ed4e5809 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java @@ -55,7 +55,7 @@ public Jsonb jsonb() { @Override public void assertRead(final Jsonb jsonb) { - final String json = "{\"email\":\"test@domain.com\"}"; + final String json = "{\"email\":[\"test\",\"domain.com\"]}"; final Contact actual = jsonb.fromJson(json, Contact.class); assertEquals("Contact{email=test@domain.com:Constructor.adaptFromJson}", actual.toString()); assertEquals("Constructor.adaptFromJson\n" + @@ -69,7 +69,7 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":\"test@domain.com:EmailClass.adaptToJson\"}", json); + assertEquals("{\"email\":[\"test\",\"domain.com\",\"EmailClass.adaptToJson\"]}", json); assertEquals("Contact.getEmail\n" + "EmailClass.adaptToJson", calls()); } diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassConstructorHasGetterSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassConstructorHasGetterSetterTest.java index 5df975bf..56fda0de 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassConstructorHasGetterSetterTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassConstructorHasGetterSetterTest.java @@ -59,7 +59,7 @@ public Jsonb jsonb() { @Override public void assertRead(final Jsonb jsonb) { - final String json = "{\"email\":\"test@domain.com\"}"; + final String json = "{\"email\":[\"test\",\"domain.com\"]}"; final Contact actual = jsonb.fromJson(json, Contact.class); assertEquals("Contact{email=test@domain.com:EmailClass.adaptFromJson}", actual.toString()); assertEquals("Constructor.adaptFromJson\n" + @@ -75,7 +75,7 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":\"test@domain.com:EmailClass.adaptToJson\"}", json); + assertEquals("{\"email\":[\"test\",\"domain.com\",\"EmailClass.adaptToJson\"]}", json); assertEquals("Contact.getEmail\n" + "EmailClass.adaptToJson", calls()); } diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassDirectTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassDirectTest.java index 40272b41..e3bfd572 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassDirectTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassDirectTest.java @@ -19,6 +19,8 @@ import jakarta.json.bind.Jsonb; import jakarta.json.bind.JsonbBuilder; import jakarta.json.bind.JsonbConfig; +import org.junit.Ignore; +import org.junit.Test; import static org.junit.Assert.assertEquals; @@ -41,7 +43,7 @@ public Jsonb jsonb() { @Override public void assertRead(final Jsonb jsonb) { - final String json = "\"test@domain.com\""; + final String json = "[\"test\",\"domain.com\"]"; final Email actual = jsonb.fromJson(json, Email.class); assertEquals("test@domain.com:Config.adaptFromJson", actual.toString()); assertEquals("Config.adaptFromJson", calls()); @@ -52,7 +54,35 @@ public void assertWrite(final Jsonb jsonb) { final Email email = new Email("test", "domain.com"); final String json = jsonb.toJson(email); - assertEquals("\"test@domain.com:Config.adaptToJson\"", json); + assertEquals("[\"test\",\"domain.com\",\"Config.adaptToJson\"]", json); assertEquals("Config.adaptToJson", calls()); } + + @Test + @Ignore + @Override + public void read() throws Exception { + super.read(); + } + + @Test + @Ignore + @Override + public void readAfterRead() throws Exception { + super.readAfterRead(); + } + + @Test + @Ignore + @Override + public void readAfterWrite() throws Exception { + super.readAfterWrite(); + } + + @Test + @Ignore + @Override + public void writeAfterRead() throws Exception { + super.writeAfterRead(); + } } diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java index 663ec34a..a8fc42c2 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java @@ -49,7 +49,7 @@ public Jsonb jsonb() { @Override public void assertRead(final Jsonb jsonb) { - final String json = "{\"email\":\"test@domain.com\"}"; + final String json = "{\"email\":[\"test\",\"domain.com\"]}"; final Contact actual = jsonb.fromJson(json, Contact.class); assertEquals("Contact{email=test@domain.com:Constructor.adaptFromJson}", actual.toString()); assertEquals("Constructor.adaptFromJson\n" + @@ -63,7 +63,7 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":\"test@domain.com:Field.adaptToJson\"}", json); + assertEquals("{\"email\":[\"test\",\"domain.com\",\"Field.adaptToJson\"]}", json); assertEquals("Contact.getEmail\n" + "Field.adaptToJson", calls()); } diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java index 4b43a113..9856bb57 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java @@ -50,7 +50,7 @@ public Jsonb jsonb() { @Override public void assertRead(final Jsonb jsonb) { - final String json = "{\"email\":\"test@domain.com\"}"; + final String json = "{\"email\":[\"test\",\"domain.com\"]}"; final Contact actual = jsonb.fromJson(json, Contact.class); assertEquals("Contact{email=test@domain.com:Field.adaptFromJson}", actual.toString()); assertEquals("Constructor.adaptFromJson\n" + @@ -66,7 +66,7 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":\"test@domain.com:Field.adaptToJson\"}", json); + assertEquals("{\"email\":[\"test\",\"domain.com\",\"Field.adaptToJson\"]}", json); assertEquals("Contact.getEmail\n" + "Field.adaptToJson", calls()); } diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java index 58105eb8..062b4151 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java @@ -50,7 +50,7 @@ public Jsonb jsonb() { @Override public void assertRead(final Jsonb jsonb) { - final String json = "{\"email\":\"test@domain.com\"}"; + final String json = "{\"email\":[\"test\",\"domain.com\",\"Field.adaptToJson\"]}"; final Contact actual = jsonb.fromJson(json, Contact.class); assertEquals("Contact{email=test@domain.com:Field.adaptFromJson}", actual.toString()); assertEquals("Constructor.adaptFromJson\n" + @@ -66,7 +66,7 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":\"test@domain.com:Getter.adaptToJson\"}", json); + assertEquals("{\"email\":[\"test\",\"domain.com\",\"Getter.adaptToJson\"]}", json); assertEquals("Contact.getEmail\n" + "Getter.adaptToJson", calls()); } diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java index 012cc12b..ace2697c 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java @@ -48,7 +48,7 @@ public Jsonb jsonb() { @Override public void assertRead(final Jsonb jsonb) { - final String json = "{\"email\":\"test@domain.com\"}"; + final String json = "{\"email\":[\"test\",\"domain.com\",\"Getter.adaptToJson\"]}"; final Contact actual = jsonb.fromJson(json, Contact.class); assertEquals("Contact{email=test@domain.com:Setter.adaptFromJson}", actual.toString()); assertEquals("Constructor.adaptFromJson\n" + @@ -64,7 +64,7 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":\"test@domain.com:Getter.adaptToJson\"}", json); + assertEquals("{\"email\":[\"test\",\"domain.com\",\"Getter.adaptToJson\"]}", json); assertEquals("Contact.getEmail\n" + "Getter.adaptToJson", calls()); } diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java index ad66f48f..52eeae73 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java @@ -49,7 +49,7 @@ public Jsonb jsonb() { @Override public void assertRead(final Jsonb jsonb) { - final String json = "{\"email\":\"test@domain.com\"}"; + final String json = "{\"email\":[\"test\",\"domain.com\",\"Field.adaptToJson\"]}"; final Contact actual = jsonb.fromJson(json, Contact.class); assertEquals("Contact{email=test@domain.com:Setter.adaptFromJson}", actual.toString()); assertEquals("Constructor.adaptFromJson\n" + @@ -65,7 +65,7 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":\"test@domain.com:Field.adaptToJson\"}", json); + assertEquals("{\"email\":[\"test\",\"domain.com\",\"Field.adaptToJson\"]}", json); assertEquals("Contact.getEmail\n" + "Field.adaptToJson", calls()); } diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassTest.java index 8fa7de55..f757f7a6 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/array/ArrayAdapterPrecedenceConfigClassTest.java @@ -51,7 +51,7 @@ public Jsonb jsonb() { @Override public void assertRead(final Jsonb jsonb) { - final String json = "{\"email\":\"test@domain.com\"}"; + final String json = "{\"email\":[\"test\",\"domain.com\"]}"; final Contact actual = jsonb.fromJson(json, Contact.class); assertEquals("Contact{email=test@domain.com:EmailClass.adaptFromJson}", actual.toString()); assertEquals("Contact.\n" + @@ -67,7 +67,7 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":\"test@domain.com:EmailClass.adaptToJson\"}", json); + assertEquals("{\"email\":[\"test\",\"domain.com\",\"EmailClass.adaptToJson\"]}", json); assertEquals("Contact.getEmail\n" + "EmailClass.adaptToJson", calls()); } From 0b37c9bb1b24c38a5cf38bdca0384ab3609a0c08 Mon Sep 17 00:00:00 2001 From: David Blevins Date: Fri, 9 May 2025 15:32:25 -0700 Subject: [PATCH 15/25] Base Map Adapter Symmetry tests --- .../map/MapAdapterOnClassDirectTest.java | 75 ++++++++++++ .../map/MapAdapterOnClassSimpleTest.java | 77 +++++++++++++ .../adapter/map/MapAdapterOnClassTest.java | 103 +++++++++++++++++ ...assConstructorHasGetterFinalFieldTest.java | 98 ++++++++++++++++ ...igClassConstructorHasGetterSetterTest.java | 108 ++++++++++++++++++ ...dapterPrecedenceConfigClassDirectTest.java | 58 ++++++++++ ...eldConstructorHasGetterFinalFieldTest.java | 93 +++++++++++++++ ...ssFieldConstructorHasGetterSetterTest.java | 100 ++++++++++++++++ ...ssGetterFieldConstructorHasSetterTest.java | 101 ++++++++++++++++ ...ClassGetterSetterFieldConstructorTest.java | 100 ++++++++++++++++ ...ssSetterFieldConstructorHasGetterTest.java | 100 ++++++++++++++++ .../MapAdapterPrecedenceConfigClassTest.java | 98 ++++++++++++++++ 12 files changed, 1111 insertions(+) create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterOnClassDirectTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterOnClassSimpleTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterOnClassTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassConstructorHasGetterSetterTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassDirectTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassTest.java diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterOnClassDirectTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterOnClassDirectTest.java new file mode 100644 index 00000000..223a7939 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterOnClassDirectTest.java @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter.map; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import org.junit.Ignore; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class MapAdapterOnClassDirectTest extends MapAdapterOnClassTest { + + public Jsonb jsonb() { + return JsonbBuilder.create(); + } + + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final String json = jsonb.toJson(email); + assertEquals("\"test@domain.com:EmailClass.adaptToJson\"", json); + assertEquals("EmailClass.adaptToJson", calls()); + } + + public void assertRead(final Jsonb jsonb) { + final String json = "\"test@domain.com\""; + final Email email = jsonb.fromJson(json, Email.class); + assertEquals("test@domain.com:EmailClass.adaptFromJson", email.toString()); + assertEquals("EmailClass.adaptFromJson", calls()); + } + + /** + * Fails as the adapter is not found + */ + @Test + @Ignore() + @Override + public void read() throws Exception { + super.read(); + } + + /** + * Fails as the adapter is not found + */ + @Test + @Ignore() + @Override + public void readAfterRead() throws Exception { + super.readAfterRead(); + } + + /** + * Fails as the adapter is not found on the first read + */ + @Test + @Ignore() + @Override + public void writeAfterRead() throws Exception { + super.writeAfterRead(); + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterOnClassSimpleTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterOnClassSimpleTest.java new file mode 100644 index 00000000..e762be54 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterOnClassSimpleTest.java @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter.map; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; + +import static org.junit.Assert.assertEquals; + +public class MapAdapterOnClassSimpleTest extends MapAdapterOnClassTest { + + public Jsonb jsonb() { + return JsonbBuilder.create(); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":\"test@domain.com\"}"; + final MapAdapterPrecedenceConfigClassTest.Contact actual = jsonb.fromJson(json, MapAdapterPrecedenceConfigClassTest.Contact.class); + assertEquals("Contact{email=test@domain.com:EmailClass.adaptFromJson}", actual.toString()); + assertEquals("Contact.\n" + + "EmailClass.adaptFromJson\n" + + "Contact.setEmail", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final MapAdapterPrecedenceConfigClassTest.Contact contact = new MapAdapterPrecedenceConfigClassTest.Contact(); + contact.setEmail(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":\"test@domain.com:EmailClass.adaptToJson\"}", json); + assertEquals("Contact.getEmail\n" + + "EmailClass.adaptToJson", calls()); + } + + public static class Contact { + + private Email email; + + public Contact() { + CALLS.called(); + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + public void setEmail(final Email email) { + CALLS.called(); + this.email = email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } + +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterOnClassTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterOnClassTest.java new file mode 100644 index 00000000..396f35d7 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterOnClassTest.java @@ -0,0 +1,103 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter.map; + +import jakarta.json.bind.adapter.JsonbAdapter; +import jakarta.json.bind.annotation.JsonbTypeAdapter; +import org.apache.johnzon.jsonb.symmetry.Calls; +import org.apache.johnzon.jsonb.symmetry.SymmetryTest; +import org.junit.Before; + +import java.util.LinkedHashMap; +import java.util.Map; + +public abstract class MapAdapterOnClassTest extends SymmetryTest { + + protected static final Calls CALLS = new Calls(); + + @Before + public void reset() { + CALLS.reset(); + } + + public static String calls() { + return CALLS.get(); + } + + @JsonbTypeAdapter(Adapter.EmailClass.class) + public static class Email { + final String user; + final String domain; + final String call; + + public Email(final String user, final String domain) { + this(user, domain, null); + } + + public Email(final String user, final String domain, final String call) { + this.user = user; + this.domain = domain; + this.call = call; + } + + @Override + public String toString() { + if (call == null) { + return user + "@" + domain; + } else { + return user + "@" + domain + ":" + call; + } + } + } + + public abstract static class Adapter implements JsonbAdapter> { + + @Override + public Map adaptToJson(final Email obj) { + final LinkedHashMap map = new LinkedHashMap<>(); + map.put("user", obj.user); + map.put("domain", obj.domain); + map.put("call", CALLS.called(this)); + return map; + } + + @Override + public Email adaptFromJson(final Map map) { + return new Email(map.get("user").toString(), + map.get("domain").toString(), + CALLS.called(this)); + } + + public static final class Getter extends Adapter { + } + + public static final class Setter extends Adapter { + } + + public static final class Field extends Adapter { + } + + public static final class Constructor extends Adapter { + } + + public static final class Config extends Adapter { + } + + public static final class EmailClass extends Adapter { + } + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java new file mode 100644 index 00000000..d5df05a5 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java @@ -0,0 +1,98 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter.map; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Constructor + * - Config + * - Class + * + * Has + * - Getter + * - Final Field + * + * Outcome: + * - Constructor wins on read + * - EmailClass wins on write + * + * Question: + * - Should Config win on write? + * Adapters on the target type itself (Email) are effectively a hardcoded default adapter + * If a user wishes to alter this behavior for a specific operation via the config, why + * not let them? This would be the most (only?) convenient way to change behavior without + * sweeping code change. + */ +public class MapAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest extends MapAdapterOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":\"test@domain.com\"}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:Constructor.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":\"test@domain.com:EmailClass.adaptToJson\"}", json); + assertEquals("Contact.getEmail\n" + + "EmailClass.adaptToJson", calls()); + } + + public static class Contact { + + private final Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassConstructorHasGetterSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassConstructorHasGetterSetterTest.java new file mode 100644 index 00000000..6fe8bb21 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassConstructorHasGetterSetterTest.java @@ -0,0 +1,108 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter.map; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Constructor + * - Config + * - Class + * + * Has + * - Getter + * - Setter + * + * Outcome: + * - EmailClass wins on read + * - EmailClass wins on write + * - Constructor adapter is called, but overwritten + * + * Question: + * - Should Config win on write? + * Adapters on the target type itself (Email) are effectively a hardcoded default adapter + * If a user wishes to alter this behavior for a specific operation via the config, why + * not let them? This would be the most (only?) convenient way to change behavior without + * sweeping code change. + * + * - Shouldn't the constructor win on read? + * Seems like a clear bug + */ +public class MapAdapterPrecedenceConfigClassConstructorHasGetterSetterTest extends MapAdapterOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":\"test@domain.com\"}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:EmailClass.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.\n" + + "EmailClass.adaptFromJson\n" + + "Contact.setEmail", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":\"test@domain.com:EmailClass.adaptToJson\"}", json); + assertEquals("Contact.getEmail\n" + + "EmailClass.adaptToJson", calls()); + } + + public static class Contact { + + private Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + public void setEmail(final Email email) { + CALLS.called(); + this.email = email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassDirectTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassDirectTest.java new file mode 100644 index 00000000..15b81a78 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassDirectTest.java @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter.map; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Config + * - Class + * + * + * Outcome: + * - Config wins on read + * - Config wins on write + */ +public class MapAdapterPrecedenceConfigClassDirectTest extends MapAdapterOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "\"test@domain.com\""; + final Email actual = jsonb.fromJson(json, Email.class); + assertEquals("test@domain.com:Config.adaptFromJson", actual.toString()); + assertEquals("Config.adaptFromJson", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + + final String json = jsonb.toJson(email); + assertEquals("\"test@domain.com:Config.adaptToJson\"", json); + assertEquals("Config.adaptToJson", calls()); + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java new file mode 100644 index 00000000..21266139 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java @@ -0,0 +1,93 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter.map; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Field + * - Constructor + * - Config + * - Class + * + * Has + * - Getter + * - Final Field + * + * Outcome: + * - Constructor wins on read + * - Field wins on write + */ +public class MapAdapterPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest extends MapAdapterOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":\"test@domain.com\"}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:Constructor.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":\"test@domain.com:Field.adaptToJson\"}", json); + assertEquals("Contact.getEmail\n" + + "Field.adaptToJson", calls()); + } + + public static class Contact { + + @JsonbTypeAdapter(Adapter.Field.class) + private final Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java new file mode 100644 index 00000000..fc1c2cde --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter.map; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Field + * - Constructor + * - Config + * - Class + * + * Has + * - Getter + * - Setter + * + * Outcome: + * - Field wins on read + * - Field wins on write + * - Constructor adapter is called, but overwritten + */ +public class MapAdapterPrecedenceConfigClassFieldConstructorHasGetterSetterTest extends MapAdapterOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":\"test@domain.com\"}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:Field.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.\n" + + "Field.adaptFromJson\n" + + "Contact.setEmail", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":\"test@domain.com:Field.adaptToJson\"}", json); + assertEquals("Contact.getEmail\n" + + "Field.adaptToJson", calls()); + } + + public static class Contact { + + @JsonbTypeAdapter(Adapter.Field.class) + private Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + public void setEmail(final Email email) { + CALLS.called(); + this.email = email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java new file mode 100644 index 00000000..999cc2c1 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java @@ -0,0 +1,101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter.map; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Config + * - Class + * - Constructor + * - Getter + * - Field + * + * Still has a setter + * + * Outcome + * + * - Field wins on read + * - Getter wins on write + * - Constructor adapter is called, but overwritten + */ +public class MapAdapterPrecedenceConfigClassGetterFieldConstructorHasSetterTest extends MapAdapterOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":\"test@domain.com\"}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:Field.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.\n" + + "Field.adaptFromJson\n" + + "Contact.setEmail", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":\"test@domain.com:Getter.adaptToJson\"}", json); + assertEquals("Contact.getEmail\n" + + "Getter.adaptToJson", calls()); + } + + public static class Contact { + + @JsonbTypeAdapter(Adapter.Field.class) + private Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + @JsonbTypeAdapter(Adapter.Getter.class) + public Email getEmail() { + CALLS.called(); + return email; + } + + public void setEmail(final Email email) { + CALLS.called(); + this.email = email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java new file mode 100644 index 00000000..5f66373f --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter.map; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Field + * - Constructor + * - Getter + * - Setter + * - Config + * - Class + * + * Setter wins on read + * Getter wins on write + * + * Constructor adapter is called, but overwritten + */ +public class MapAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest extends MapAdapterOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":\"test@domain.com\"}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:Setter.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.\n" + + "Setter.adaptFromJson\n" + + "Contact.setEmail", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":\"test@domain.com:Getter.adaptToJson\"}", json); + assertEquals("Contact.getEmail\n" + + "Getter.adaptToJson", calls()); + } + + public static class Contact { + + @JsonbTypeAdapter(Adapter.Field.class) + private Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + @JsonbTypeAdapter(Adapter.Getter.class) + public Email getEmail() { + CALLS.called(); + return email; + } + + @JsonbTypeAdapter(Adapter.Setter.class) + public void setEmail(final Email email) { + CALLS.called(); + this.email = email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java new file mode 100644 index 00000000..31e90c03 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter.map; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Field + * - Constructor + * - Setter + * - Config + * - Class + * + * Still has a getter + * + * Outcome + * - Setter wins on read + * - Field wins on write + * - Constructor adapter is called, but overwritten + */ +public class MapAdapterPrecedenceConfigClassSetterFieldConstructorHasGetterTest extends MapAdapterOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":\"test@domain.com\"}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:Setter.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.\n" + + "Setter.adaptFromJson\n" + + "Contact.setEmail", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":\"test@domain.com:Field.adaptToJson\"}", json); + assertEquals("Contact.getEmail\n" + + "Field.adaptToJson", calls()); + } + + public static class Contact { + + @JsonbTypeAdapter(Adapter.Field.class) + private Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + @JsonbTypeAdapter(Adapter.Setter.class) + public void setEmail(final Email email) { + CALLS.called(); + this.email = email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassTest.java new file mode 100644 index 00000000..34216857 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassTest.java @@ -0,0 +1,98 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.adapter.map; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Config + * - Class + * + * Has + * - Getter + * - Final Field + * + * Outcome: + * - EmailClass wins on read + * - EmailClass wins on write + * + * Question: + * - Should Config win on read and write? + * Adapters on the target type itself (Email) are effectively a hardcoded default adapter + * If a user wishes to alter this behavior for a specific operation via the config, why + * not let them? This would be the most (only?) convenient way to change behavior without + * sweeping code change. + */ +public class MapAdapterPrecedenceConfigClassTest extends MapAdapterOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":\"test@domain.com\"}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:EmailClass.adaptFromJson}", actual.toString()); + assertEquals("Contact.\n" + + "EmailClass.adaptFromJson\n" + + "Contact.setEmail", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(); + contact.setEmail(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":\"test@domain.com:EmailClass.adaptToJson\"}", json); + assertEquals("Contact.getEmail\n" + + "EmailClass.adaptToJson", calls()); + } + + public static class Contact { + + private Email email; + + public Contact() { + CALLS.called(); + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + public void setEmail(final Email email) { + CALLS.called(); + this.email = email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} From c738270fca59ca11127b753a196364c3eb101991 Mon Sep 17 00:00:00 2001 From: David Blevins Date: Fri, 9 May 2025 15:58:30 -0700 Subject: [PATCH 16/25] Adjusted Adapter Symmetry tests, some new failures --- .../map/MapAdapterOnClassDirectTest.java | 35 +---------- .../map/MapAdapterOnClassSimpleTest.java | 4 +- ...assConstructorHasGetterFinalFieldTest.java | 4 +- ...igClassConstructorHasGetterSetterTest.java | 4 +- ...dapterPrecedenceConfigClassDirectTest.java | 60 ++++++++++++++++++- ...eldConstructorHasGetterFinalFieldTest.java | 4 +- ...ssFieldConstructorHasGetterSetterTest.java | 4 +- ...ssGetterFieldConstructorHasSetterTest.java | 4 +- ...ClassGetterSetterFieldConstructorTest.java | 4 +- ...ssSetterFieldConstructorHasGetterTest.java | 4 +- .../MapAdapterPrecedenceConfigClassTest.java | 4 +- 11 files changed, 78 insertions(+), 53 deletions(-) diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterOnClassDirectTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterOnClassDirectTest.java index 223a7939..25b9e06b 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterOnClassDirectTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterOnClassDirectTest.java @@ -23,6 +23,7 @@ import static org.junit.Assert.assertEquals; +@Ignore("java.lang.ClassCastException: Cannot cast sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl to java.lang.Class") public class MapAdapterOnClassDirectTest extends MapAdapterOnClassTest { public Jsonb jsonb() { @@ -32,44 +33,14 @@ public Jsonb jsonb() { public void assertWrite(final Jsonb jsonb) { final Email email = new Email("test", "domain.com"); final String json = jsonb.toJson(email); - assertEquals("\"test@domain.com:EmailClass.adaptToJson\"", json); + assertEquals("{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"EmailClass.adaptToJson\"}", json); assertEquals("EmailClass.adaptToJson", calls()); } public void assertRead(final Jsonb jsonb) { - final String json = "\"test@domain.com\""; + final String json = "{\"user\":\"test\",\"domain\":\"domain.com\"}"; final Email email = jsonb.fromJson(json, Email.class); assertEquals("test@domain.com:EmailClass.adaptFromJson", email.toString()); assertEquals("EmailClass.adaptFromJson", calls()); } - - /** - * Fails as the adapter is not found - */ - @Test - @Ignore() - @Override - public void read() throws Exception { - super.read(); - } - - /** - * Fails as the adapter is not found - */ - @Test - @Ignore() - @Override - public void readAfterRead() throws Exception { - super.readAfterRead(); - } - - /** - * Fails as the adapter is not found on the first read - */ - @Test - @Ignore() - @Override - public void writeAfterRead() throws Exception { - super.writeAfterRead(); - } } diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterOnClassSimpleTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterOnClassSimpleTest.java index e762be54..68281d49 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterOnClassSimpleTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterOnClassSimpleTest.java @@ -29,7 +29,7 @@ public Jsonb jsonb() { @Override public void assertRead(final Jsonb jsonb) { - final String json = "{\"email\":\"test@domain.com\"}"; + final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; final MapAdapterPrecedenceConfigClassTest.Contact actual = jsonb.fromJson(json, MapAdapterPrecedenceConfigClassTest.Contact.class); assertEquals("Contact{email=test@domain.com:EmailClass.adaptFromJson}", actual.toString()); assertEquals("Contact.\n" + @@ -45,7 +45,7 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":\"test@domain.com:EmailClass.adaptToJson\"}", json); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"EmailClass.adaptToJson\"}}", json); assertEquals("Contact.getEmail\n" + "EmailClass.adaptToJson", calls()); } diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java index d5df05a5..66a53bf7 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java @@ -55,7 +55,7 @@ public Jsonb jsonb() { @Override public void assertRead(final Jsonb jsonb) { - final String json = "{\"email\":\"test@domain.com\"}"; + final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; final Contact actual = jsonb.fromJson(json, Contact.class); assertEquals("Contact{email=test@domain.com:Constructor.adaptFromJson}", actual.toString()); assertEquals("Constructor.adaptFromJson\n" + @@ -69,7 +69,7 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":\"test@domain.com:EmailClass.adaptToJson\"}", json); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"EmailClass.adaptToJson\"}}", json); assertEquals("Contact.getEmail\n" + "EmailClass.adaptToJson", calls()); } diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassConstructorHasGetterSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassConstructorHasGetterSetterTest.java index 6fe8bb21..7eeb6d54 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassConstructorHasGetterSetterTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassConstructorHasGetterSetterTest.java @@ -59,7 +59,7 @@ public Jsonb jsonb() { @Override public void assertRead(final Jsonb jsonb) { - final String json = "{\"email\":\"test@domain.com\"}"; + final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; final Contact actual = jsonb.fromJson(json, Contact.class); assertEquals("Contact{email=test@domain.com:EmailClass.adaptFromJson}", actual.toString()); assertEquals("Constructor.adaptFromJson\n" + @@ -75,7 +75,7 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":\"test@domain.com:EmailClass.adaptToJson\"}", json); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"EmailClass.adaptToJson\"}}", json); assertEquals("Contact.getEmail\n" + "EmailClass.adaptToJson", calls()); } diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassDirectTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassDirectTest.java index 15b81a78..1e7c4416 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassDirectTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassDirectTest.java @@ -19,6 +19,8 @@ import jakarta.json.bind.Jsonb; import jakarta.json.bind.JsonbBuilder; import jakarta.json.bind.JsonbConfig; +import org.junit.Ignore; +import org.junit.Test; import static org.junit.Assert.assertEquals; @@ -29,7 +31,7 @@ * * * Outcome: - * - Config wins on read + * - Reads fail * - Config wins on write */ public class MapAdapterPrecedenceConfigClassDirectTest extends MapAdapterOnClassTest { @@ -41,7 +43,7 @@ public Jsonb jsonb() { @Override public void assertRead(final Jsonb jsonb) { - final String json = "\"test@domain.com\""; + final String json = "{\"user\":\"test\",\"domain\":\"domain.com\"}"; final Email actual = jsonb.fromJson(json, Email.class); assertEquals("test@domain.com:Config.adaptFromJson", actual.toString()); assertEquals("Config.adaptFromJson", calls()); @@ -52,7 +54,59 @@ public void assertWrite(final Jsonb jsonb) { final Email email = new Email("test", "domain.com"); final String json = jsonb.toJson(email); - assertEquals("\"test@domain.com:Config.adaptToJson\"", json); + assertEquals("{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"Config.adaptToJson\"}", json); assertEquals("Config.adaptToJson", calls()); } + + /** + * java.lang.ClassCastException: Cannot cast sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl to java.lang.Class + * + * at java.base/java.lang.Class.cast(Class.java:3889) + * at org.apache.johnzon.jsonb.JsonbAccessMode.isReversedAdapter(JsonbAccessMode.java:875) + */ + @Test + @Ignore + @Override + public void read() throws Exception { + super.read(); + } + + /** + * java.lang.ClassCastException: Cannot cast sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl to java.lang.Class + * + * at java.base/java.lang.Class.cast(Class.java:3889) + * at org.apache.johnzon.jsonb.JsonbAccessMode.isReversedAdapter(JsonbAccessMode.java:875) + */ + @Test + @Ignore + @Override + public void readAfterRead() throws Exception { + super.readAfterRead(); + } + + /** + * java.lang.ClassCastException: Cannot cast sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl to java.lang.Class + * + * at java.base/java.lang.Class.cast(Class.java:3889) + * at org.apache.johnzon.jsonb.JsonbAccessMode.isReversedAdapter(JsonbAccessMode.java:875) + */ + @Test + @Ignore + @Override + public void readAfterWrite() throws Exception { + super.readAfterWrite(); + } + + /** + * java.lang.ClassCastException: Cannot cast sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl to java.lang.Class + * + * at java.base/java.lang.Class.cast(Class.java:3889) + * at org.apache.johnzon.jsonb.JsonbAccessMode.isReversedAdapter(JsonbAccessMode.java:875) + */ + @Test + @Ignore + @Override + public void writeAfterRead() throws Exception { + super.writeAfterRead(); + } } diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java index 21266139..581ffa4a 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java @@ -49,7 +49,7 @@ public Jsonb jsonb() { @Override public void assertRead(final Jsonb jsonb) { - final String json = "{\"email\":\"test@domain.com\"}"; + final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; final Contact actual = jsonb.fromJson(json, Contact.class); assertEquals("Contact{email=test@domain.com:Constructor.adaptFromJson}", actual.toString()); assertEquals("Constructor.adaptFromJson\n" + @@ -63,7 +63,7 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":\"test@domain.com:Field.adaptToJson\"}", json); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"Field.adaptToJson\"}}", json); assertEquals("Contact.getEmail\n" + "Field.adaptToJson", calls()); } diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java index fc1c2cde..67e4cab4 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java @@ -50,7 +50,7 @@ public Jsonb jsonb() { @Override public void assertRead(final Jsonb jsonb) { - final String json = "{\"email\":\"test@domain.com\"}"; + final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; final Contact actual = jsonb.fromJson(json, Contact.class); assertEquals("Contact{email=test@domain.com:Field.adaptFromJson}", actual.toString()); assertEquals("Constructor.adaptFromJson\n" + @@ -66,7 +66,7 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":\"test@domain.com:Field.adaptToJson\"}", json); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"Field.adaptToJson\"}}", json); assertEquals("Contact.getEmail\n" + "Field.adaptToJson", calls()); } diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java index 999cc2c1..6ba33d89 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java @@ -50,7 +50,7 @@ public Jsonb jsonb() { @Override public void assertRead(final Jsonb jsonb) { - final String json = "{\"email\":\"test@domain.com\"}"; + final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; final Contact actual = jsonb.fromJson(json, Contact.class); assertEquals("Contact{email=test@domain.com:Field.adaptFromJson}", actual.toString()); assertEquals("Constructor.adaptFromJson\n" + @@ -66,7 +66,7 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":\"test@domain.com:Getter.adaptToJson\"}", json); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"Getter.adaptToJson\"}}", json); assertEquals("Contact.getEmail\n" + "Getter.adaptToJson", calls()); } diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java index 5f66373f..ece34685 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassGetterSetterFieldConstructorTest.java @@ -48,7 +48,7 @@ public Jsonb jsonb() { @Override public void assertRead(final Jsonb jsonb) { - final String json = "{\"email\":\"test@domain.com\"}"; + final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; final Contact actual = jsonb.fromJson(json, Contact.class); assertEquals("Contact{email=test@domain.com:Setter.adaptFromJson}", actual.toString()); assertEquals("Constructor.adaptFromJson\n" + @@ -64,7 +64,7 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":\"test@domain.com:Getter.adaptToJson\"}", json); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"Getter.adaptToJson\"}}", json); assertEquals("Contact.getEmail\n" + "Getter.adaptToJson", calls()); } diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java index 31e90c03..e02f03cd 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java @@ -49,7 +49,7 @@ public Jsonb jsonb() { @Override public void assertRead(final Jsonb jsonb) { - final String json = "{\"email\":\"test@domain.com\"}"; + final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; final Contact actual = jsonb.fromJson(json, Contact.class); assertEquals("Contact{email=test@domain.com:Setter.adaptFromJson}", actual.toString()); assertEquals("Constructor.adaptFromJson\n" + @@ -65,7 +65,7 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":\"test@domain.com:Field.adaptToJson\"}", json); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"Field.adaptToJson\"}}", json); assertEquals("Contact.getEmail\n" + "Field.adaptToJson", calls()); } diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassTest.java index 34216857..b4e5ee13 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassTest.java @@ -51,7 +51,7 @@ public Jsonb jsonb() { @Override public void assertRead(final Jsonb jsonb) { - final String json = "{\"email\":\"test@domain.com\"}"; + final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; final Contact actual = jsonb.fromJson(json, Contact.class); assertEquals("Contact{email=test@domain.com:EmailClass.adaptFromJson}", actual.toString()); assertEquals("Contact.\n" + @@ -67,7 +67,7 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":\"test@domain.com:EmailClass.adaptToJson\"}", json); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"EmailClass.adaptToJson\"}}", json); assertEquals("Contact.getEmail\n" + "EmailClass.adaptToJson", calls()); } From 0cb7333abe4ea148fe4e19e5e7107ea004165524 Mon Sep 17 00:00:00 2001 From: David Blevins Date: Tue, 13 May 2025 10:28:35 -0700 Subject: [PATCH 17/25] Base Serializer/Deserializer Symmetry tests --- .../SerializerOnClassDirectTest.java | 45 +++++++ .../SerializerOnClassSimpleTest.java | 77 +++++++++++ .../serializer/SerializerOnClassTest.java | 127 ++++++++++++++++++ ...assConstructorHasGetterFinalFieldTest.java | 98 ++++++++++++++ ...igClassConstructorHasGetterSetterTest.java | 108 +++++++++++++++ ...alizerPrecedenceConfigClassDirectTest.java | 112 +++++++++++++++ ...eldConstructorHasGetterFinalFieldTest.java | 93 +++++++++++++ ...ssFieldConstructorHasGetterSetterTest.java | 100 ++++++++++++++ ...ssGetterFieldConstructorHasSetterTest.java | 101 ++++++++++++++ ...ClassGetterSetterFieldConstructorTest.java | 100 ++++++++++++++ ...ssSetterFieldConstructorHasGetterTest.java | 100 ++++++++++++++ .../SerializerPrecedenceConfigClassTest.java | 98 ++++++++++++++ 12 files changed, 1159 insertions(+) create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassDirectTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassSimpleTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterSetterTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassDirectTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterSetterFieldConstructorTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassTest.java diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassDirectTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassDirectTest.java new file mode 100644 index 00000000..c481c4a2 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassDirectTest.java @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.serializer; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import org.junit.Ignore; + +import static org.junit.Assert.assertEquals; + +@Ignore("java.lang.ClassCastException: Cannot cast sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl to java.lang.Class") +public class SerializerOnClassDirectTest extends SerializerOnClassTest { + + public Jsonb jsonb() { + return JsonbBuilder.create(); + } + + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final String json = jsonb.toJson(email); + assertEquals("{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"EmailClass.adaptToJson\"}", json); + assertEquals("EmailClass.adaptToJson", calls()); + } + + public void assertRead(final Jsonb jsonb) { + final String json = "{\"user\":\"test\",\"domain\":\"domain.com\"}"; + final Email email = jsonb.fromJson(json, Email.class); + assertEquals("test@domain.com:EmailClass.adaptFromJson", email.toString()); + assertEquals("EmailClass.adaptFromJson", calls()); + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassSimpleTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassSimpleTest.java new file mode 100644 index 00000000..9a0234ca --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassSimpleTest.java @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.serializer; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; + +import static org.junit.Assert.assertEquals; + +public class SerializerOnClassSimpleTest extends SerializerOnClassTest { + + public Jsonb jsonb() { + return JsonbBuilder.create(); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; + final SerializerPrecedenceConfigClassTest.Contact actual = jsonb.fromJson(json, SerializerPrecedenceConfigClassTest.Contact.class); + assertEquals("Contact{email=test@domain.com:EmailClass.adaptFromJson}", actual.toString()); + assertEquals("Contact.\n" + + "EmailClass.adaptFromJson\n" + + "Contact.setEmail", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final SerializerPrecedenceConfigClassTest.Contact contact = new SerializerPrecedenceConfigClassTest.Contact(); + contact.setEmail(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"EmailClass.adaptToJson\"}}", json); + assertEquals("Contact.getEmail\n" + + "EmailClass.adaptToJson", calls()); + } + + public static class Contact { + + private Email email; + + public Contact() { + CALLS.called(); + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + public void setEmail(final Email email) { + CALLS.called(); + this.email = email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } + +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassTest.java new file mode 100644 index 00000000..632b4a9c --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassTest.java @@ -0,0 +1,127 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.serializer; + +import jakarta.json.bind.serializer.DeserializationContext; +import jakarta.json.bind.serializer.JsonbDeserializer; +import jakarta.json.bind.serializer.JsonbSerializer; +import jakarta.json.bind.serializer.SerializationContext; +import jakarta.json.stream.JsonGenerator; +import jakarta.json.stream.JsonParser; +import org.apache.johnzon.jsonb.symmetry.Calls; +import org.apache.johnzon.jsonb.symmetry.SymmetryTest; +import org.junit.Before; + +import java.lang.reflect.Type; + +public abstract class SerializerOnClassTest extends SymmetryTest { + + protected static final Calls CALLS = new Calls(); + + @Before + public void reset() { + CALLS.reset(); + } + + public static String calls() { + return CALLS.get(); + } + + public static class Email { + final String user; + final String domain; + final String call; + + public Email(final String user, final String domain) { + this(user, domain, null); + } + + public Email(final String user, final String domain, final String call) { + this.user = user; + this.domain = domain; + this.call = call; + } + + @Override + public String toString() { + if (call == null) { + return user + "@" + domain; + } else { + return user + "@" + domain + ":" + call; + } + } + } + + public abstract static class Adapter implements JsonbSerializer, JsonbDeserializer { + + @Override + public void serialize(final Email obj, final JsonGenerator generator, final SerializationContext ctx) { + final String call = CALLS.called(this); + generator.writeStartObject(); + generator.write("user", obj.user); + generator.write("domain", obj.domain); + generator.write("call", call); + generator.writeEnd(); + } + + @Override + public Email deserialize(final JsonParser parser, final DeserializationContext ctx, final Type type) { + String user = null; + String domain = null; + + while (parser.hasNext()) { + final JsonParser.Event event = parser.next(); + if (event == JsonParser.Event.KEY_NAME) { + final String key = parser.getString(); + parser.next(); + switch (key) { + case "user": + user = parser.getString(); + break; + case "domain": + domain = parser.getString(); + break; + // skip "call" + } + } else if (event == JsonParser.Event.END_OBJECT) { + break; + } + } + + final String call = CALLS.called(this); + return new Email(user, domain, call); + } + + public static final class Getter extends Adapter { + } + + public static final class Setter extends Adapter { + } + + public static final class Field extends Adapter { + } + + public static final class Constructor extends Adapter { + } + + public static final class Config extends Adapter { + } + + public static final class EmailClass extends Adapter { + } + } +} \ No newline at end of file diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java new file mode 100644 index 00000000..7d94ee94 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java @@ -0,0 +1,98 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.serializer; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Constructor + * - Config + * - Class + * + * Has + * - Getter + * - Final Field + * + * Outcome: + * - Constructor wins on read + * - EmailClass wins on write + * + * Question: + * - Should Config win on write? + * Adapters on the target type itself (Email) are effectively a hardcoded default adapter + * If a user wishes to alter this behavior for a specific operation via the config, why + * not let them? This would be the most (only?) convenient way to change behavior without + * sweeping code change. + */ +public class SerializerPrecedenceConfigClassConstructorHasGetterFinalFieldTest extends SerializerOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:Constructor.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"EmailClass.adaptToJson\"}}", json); + assertEquals("Contact.getEmail\n" + + "EmailClass.adaptToJson", calls()); + } + + public static class Contact { + + private final Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterSetterTest.java new file mode 100644 index 00000000..66cd9dea --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterSetterTest.java @@ -0,0 +1,108 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.serializer; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Constructor + * - Config + * - Class + * + * Has + * - Getter + * - Setter + * + * Outcome: + * - EmailClass wins on read + * - EmailClass wins on write + * - Constructor adapter is called, but overwritten + * + * Question: + * - Should Config win on write? + * Adapters on the target type itself (Email) are effectively a hardcoded default adapter + * If a user wishes to alter this behavior for a specific operation via the config, why + * not let them? This would be the most (only?) convenient way to change behavior without + * sweeping code change. + * + * - Shouldn't the constructor win on read? + * Seems like a clear bug + */ +public class SerializerPrecedenceConfigClassConstructorHasGetterSetterTest extends SerializerOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:EmailClass.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.\n" + + "EmailClass.adaptFromJson\n" + + "Contact.setEmail", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"EmailClass.adaptToJson\"}}", json); + assertEquals("Contact.getEmail\n" + + "EmailClass.adaptToJson", calls()); + } + + public static class Contact { + + private Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + public void setEmail(final Email email) { + CALLS.called(); + this.email = email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassDirectTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassDirectTest.java new file mode 100644 index 00000000..fd85b4fe --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassDirectTest.java @@ -0,0 +1,112 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.serializer; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import org.junit.Ignore; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Config + * - Class + * + * + * Outcome: + * - Reads fail + * - Config wins on write + */ +public class SerializerPrecedenceConfigClassDirectTest extends SerializerOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"user\":\"test\",\"domain\":\"domain.com\"}"; + final Email actual = jsonb.fromJson(json, Email.class); + assertEquals("test@domain.com:Config.adaptFromJson", actual.toString()); + assertEquals("Config.adaptFromJson", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + + final String json = jsonb.toJson(email); + assertEquals("{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"Config.adaptToJson\"}", json); + assertEquals("Config.adaptToJson", calls()); + } + + /** + * java.lang.ClassCastException: Cannot cast sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl to java.lang.Class + * + * at java.base/java.lang.Class.cast(Class.java:3889) + * at org.apache.johnzon.jsonb.JsonbAccessMode.isReversedAdapter(JsonbAccessMode.java:875) + */ + @Test + @Ignore + @Override + public void read() throws Exception { + super.read(); + } + + /** + * java.lang.ClassCastException: Cannot cast sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl to java.lang.Class + * + * at java.base/java.lang.Class.cast(Class.java:3889) + * at org.apache.johnzon.jsonb.JsonbAccessMode.isReversedAdapter(JsonbAccessMode.java:875) + */ + @Test + @Ignore + @Override + public void readAfterRead() throws Exception { + super.readAfterRead(); + } + + /** + * java.lang.ClassCastException: Cannot cast sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl to java.lang.Class + * + * at java.base/java.lang.Class.cast(Class.java:3889) + * at org.apache.johnzon.jsonb.JsonbAccessMode.isReversedAdapter(JsonbAccessMode.java:875) + */ + @Test + @Ignore + @Override + public void readAfterWrite() throws Exception { + super.readAfterWrite(); + } + + /** + * java.lang.ClassCastException: Cannot cast sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl to java.lang.Class + * + * at java.base/java.lang.Class.cast(Class.java:3889) + * at org.apache.johnzon.jsonb.JsonbAccessMode.isReversedAdapter(JsonbAccessMode.java:875) + */ + @Test + @Ignore + @Override + public void writeAfterRead() throws Exception { + super.writeAfterRead(); + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java new file mode 100644 index 00000000..b9a857b1 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java @@ -0,0 +1,93 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.serializer; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Field + * - Constructor + * - Config + * - Class + * + * Has + * - Getter + * - Final Field + * + * Outcome: + * - Constructor wins on read + * - Field wins on write + */ +public class SerializerPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest extends SerializerOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:Constructor.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"Field.adaptToJson\"}}", json); + assertEquals("Contact.getEmail\n" + + "Field.adaptToJson", calls()); + } + + public static class Contact { + + @JsonbTypeAdapter(Adapter.Field.class) + private final Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java new file mode 100644 index 00000000..589bada3 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.serializer; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Field + * - Constructor + * - Config + * - Class + * + * Has + * - Getter + * - Setter + * + * Outcome: + * - Field wins on read + * - Field wins on write + * - Constructor adapter is called, but overwritten + */ +public class SerializerPrecedenceConfigClassFieldConstructorHasGetterSetterTest extends SerializerOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:Field.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.\n" + + "Field.adaptFromJson\n" + + "Contact.setEmail", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"Field.adaptToJson\"}}", json); + assertEquals("Contact.getEmail\n" + + "Field.adaptToJson", calls()); + } + + public static class Contact { + + @JsonbTypeAdapter(Adapter.Field.class) + private Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + public void setEmail(final Email email) { + CALLS.called(); + this.email = email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java new file mode 100644 index 00000000..ae642d9f --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java @@ -0,0 +1,101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.serializer; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Config + * - Class + * - Constructor + * - Getter + * - Field + * + * Still has a setter + * + * Outcome + * + * - Field wins on read + * - Getter wins on write + * - Constructor adapter is called, but overwritten + */ +public class SerializerPrecedenceConfigClassGetterFieldConstructorHasSetterTest extends SerializerOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:Field.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.\n" + + "Field.adaptFromJson\n" + + "Contact.setEmail", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"Getter.adaptToJson\"}}", json); + assertEquals("Contact.getEmail\n" + + "Getter.adaptToJson", calls()); + } + + public static class Contact { + + @JsonbTypeAdapter(Adapter.Field.class) + private Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + @JsonbTypeAdapter(Adapter.Getter.class) + public Email getEmail() { + CALLS.called(); + return email; + } + + public void setEmail(final Email email) { + CALLS.called(); + this.email = email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterSetterFieldConstructorTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterSetterFieldConstructorTest.java new file mode 100644 index 00000000..abbf1804 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterSetterFieldConstructorTest.java @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.serializer; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Field + * - Constructor + * - Getter + * - Setter + * - Config + * - Class + * + * Setter wins on read + * Getter wins on write + * + * Constructor adapter is called, but overwritten + */ +public class SerializerPrecedenceConfigClassGetterSetterFieldConstructorTest extends SerializerOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:Setter.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.\n" + + "Setter.adaptFromJson\n" + + "Contact.setEmail", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"Getter.adaptToJson\"}}", json); + assertEquals("Contact.getEmail\n" + + "Getter.adaptToJson", calls()); + } + + public static class Contact { + + @JsonbTypeAdapter(Adapter.Field.class) + private Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + @JsonbTypeAdapter(Adapter.Getter.class) + public Email getEmail() { + CALLS.called(); + return email; + } + + @JsonbTypeAdapter(Adapter.Setter.class) + public void setEmail(final Email email) { + CALLS.called(); + this.email = email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java new file mode 100644 index 00000000..0f54d32e --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.serializer; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Field + * - Constructor + * - Setter + * - Config + * - Class + * + * Still has a getter + * + * Outcome + * - Setter wins on read + * - Field wins on write + * - Constructor adapter is called, but overwritten + */ +public class SerializerPrecedenceConfigClassSetterFieldConstructorHasGetterTest extends SerializerOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:Setter.adaptFromJson}", actual.toString()); + assertEquals("Constructor.adaptFromJson\n" + + "Contact.\n" + + "Setter.adaptFromJson\n" + + "Contact.setEmail", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"Field.adaptToJson\"}}", json); + assertEquals("Contact.getEmail\n" + + "Field.adaptToJson", calls()); + } + + public static class Contact { + + @JsonbTypeAdapter(Adapter.Field.class) + private Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + @JsonbTypeAdapter(Adapter.Setter.class) + public void setEmail(final Email email) { + CALLS.called(); + this.email = email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassTest.java new file mode 100644 index 00000000..bb2998dc --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassTest.java @@ -0,0 +1,98 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.serializer; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; + +import static org.junit.Assert.assertEquals; + +/** + * JsonbTypeAdapter on + * - Config + * - Class + * + * Has + * - Getter + * - Final Field + * + * Outcome: + * - EmailClass wins on read + * - EmailClass wins on write + * + * Question: + * - Should Config win on read and write? + * Adapters on the target type itself (Email) are effectively a hardcoded default adapter + * If a user wishes to alter this behavior for a specific operation via the config, why + * not let them? This would be the most (only?) convenient way to change behavior without + * sweeping code change. + */ +public class SerializerPrecedenceConfigClassTest extends SerializerOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:EmailClass.adaptFromJson}", actual.toString()); + assertEquals("Contact.\n" + + "EmailClass.adaptFromJson\n" + + "Contact.setEmail", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(); + contact.setEmail(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"EmailClass.adaptToJson\"}}", json); + assertEquals("Contact.getEmail\n" + + "EmailClass.adaptToJson", calls()); + } + + public static class Contact { + + private Email email; + + public Contact() { + CALLS.called(); + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + public void setEmail(final Email email) { + CALLS.called(); + this.email = email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} From 2d9f1ef81930535dec6f5f7aedaaee0da0013dee Mon Sep 17 00:00:00 2001 From: David Blevins Date: Tue, 13 May 2025 10:55:27 -0700 Subject: [PATCH 18/25] Adjusted Serializer/Deserializer Symmetry tests Equivalent to Map Adapter Symmetry tests --- .../SerializerOnClassDirectTest.java | 8 +++--- .../SerializerOnClassSimpleTest.java | 8 +++--- .../serializer/SerializerOnClassTest.java | 4 +++ ...assConstructorHasGetterFinalFieldTest.java | 16 +++++++----- ...igClassConstructorHasGetterSetterTest.java | 19 ++++++++------ ...alizerPrecedenceConfigClassDirectTest.java | 13 ++++++---- ...eldConstructorHasGetterFinalFieldTest.java | 20 +++++++++----- ...ssFieldConstructorHasGetterSetterTest.java | 22 ++++++++++------ ...ssGetterFieldConstructorHasSetterTest.java | 24 ++++++++++------- ...ClassGetterSetterFieldConstructorTest.java | 26 ++++++++++++------- ...ssSetterFieldConstructorHasGetterTest.java | 24 ++++++++++------- .../SerializerPrecedenceConfigClassTest.java | 13 ++++++---- 12 files changed, 122 insertions(+), 75 deletions(-) diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassDirectTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassDirectTest.java index c481c4a2..740df2d8 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassDirectTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassDirectTest.java @@ -32,14 +32,14 @@ public Jsonb jsonb() { public void assertWrite(final Jsonb jsonb) { final Email email = new Email("test", "domain.com"); final String json = jsonb.toJson(email); - assertEquals("{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"EmailClass.adaptToJson\"}", json); - assertEquals("EmailClass.adaptToJson", calls()); + assertEquals("{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"EmailClass.serialize\"}", json); + assertEquals("EmailClass.serialize", calls()); } public void assertRead(final Jsonb jsonb) { final String json = "{\"user\":\"test\",\"domain\":\"domain.com\"}"; final Email email = jsonb.fromJson(json, Email.class); - assertEquals("test@domain.com:EmailClass.adaptFromJson", email.toString()); - assertEquals("EmailClass.adaptFromJson", calls()); + assertEquals("test@domain.com:EmailClass.deserialize", email.toString()); + assertEquals("EmailClass.deserialize", calls()); } } diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassSimpleTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassSimpleTest.java index 9a0234ca..ae62f0ad 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassSimpleTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassSimpleTest.java @@ -31,9 +31,9 @@ public Jsonb jsonb() { public void assertRead(final Jsonb jsonb) { final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; final SerializerPrecedenceConfigClassTest.Contact actual = jsonb.fromJson(json, SerializerPrecedenceConfigClassTest.Contact.class); - assertEquals("Contact{email=test@domain.com:EmailClass.adaptFromJson}", actual.toString()); + assertEquals("Contact{email=test@domain.com:EmailClass.deserialize}", actual.toString()); assertEquals("Contact.\n" + - "EmailClass.adaptFromJson\n" + + "EmailClass.deserialize\n" + "Contact.setEmail", calls()); } @@ -45,9 +45,9 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"EmailClass.adaptToJson\"}}", json); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"EmailClass.serialize\"}}", json); assertEquals("Contact.getEmail\n" + - "EmailClass.adaptToJson", calls()); + "EmailClass.serialize", calls()); } public static class Contact { diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassTest.java index 632b4a9c..d5aceddd 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassTest.java @@ -16,6 +16,8 @@ */ package org.apache.johnzon.jsonb.symmetry.serializer; +import jakarta.json.bind.annotation.JsonbTypeDeserializer; +import jakarta.json.bind.annotation.JsonbTypeSerializer; import jakarta.json.bind.serializer.DeserializationContext; import jakarta.json.bind.serializer.JsonbDeserializer; import jakarta.json.bind.serializer.JsonbSerializer; @@ -41,6 +43,8 @@ public static String calls() { return CALLS.get(); } + @JsonbTypeDeserializer(Adapter.EmailClass.class) + @JsonbTypeSerializer(Adapter.EmailClass.class) public static class Email { final String user; final String domain; diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java index 7d94ee94..90cc80fc 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java @@ -22,6 +22,7 @@ import jakarta.json.bind.annotation.JsonbCreator; import jakarta.json.bind.annotation.JsonbProperty; import jakarta.json.bind.annotation.JsonbTypeAdapter; +import jakarta.json.bind.annotation.JsonbTypeDeserializer; import static org.junit.Assert.assertEquals; @@ -50,15 +51,18 @@ public class SerializerPrecedenceConfigClassConstructorHasGetterFinalFieldTest e @Override public Jsonb jsonb() { - return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + return JsonbBuilder.create(new JsonbConfig() + .withSerializers(new Adapter.Config()) + .withDeserializers(new Adapter.Config()) + ); } @Override public void assertRead(final Jsonb jsonb) { final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; final Contact actual = jsonb.fromJson(json, Contact.class); - assertEquals("Contact{email=test@domain.com:Constructor.adaptFromJson}", actual.toString()); - assertEquals("Constructor.adaptFromJson\n" + + assertEquals("Contact{email=test@domain.com:Constructor.deserialize}", actual.toString()); + assertEquals("Constructor.deserialize\n" + "Contact.", calls()); } @@ -69,9 +73,9 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"EmailClass.adaptToJson\"}}", json); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"EmailClass.serialize\"}}", json); assertEquals("Contact.getEmail\n" + - "EmailClass.adaptToJson", calls()); + "EmailClass.serialize", calls()); } public static class Contact { @@ -79,7 +83,7 @@ public static class Contact { private final Email email; @JsonbCreator - public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + public Contact(@JsonbProperty("email") @JsonbTypeDeserializer(Adapter.Constructor.class) final Email email) { CALLS.called(); this.email = email; } diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterSetterTest.java index 66cd9dea..db30d9d7 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterSetterTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterSetterTest.java @@ -21,7 +21,7 @@ import jakarta.json.bind.JsonbConfig; import jakarta.json.bind.annotation.JsonbCreator; import jakarta.json.bind.annotation.JsonbProperty; -import jakarta.json.bind.annotation.JsonbTypeAdapter; +import jakarta.json.bind.annotation.JsonbTypeDeserializer; import static org.junit.Assert.assertEquals; @@ -54,17 +54,20 @@ public class SerializerPrecedenceConfigClassConstructorHasGetterSetterTest exten @Override public Jsonb jsonb() { - return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + return JsonbBuilder.create(new JsonbConfig() + .withSerializers(new Adapter.Config()) + .withDeserializers(new Adapter.Config()) + ); } @Override public void assertRead(final Jsonb jsonb) { final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; final Contact actual = jsonb.fromJson(json, Contact.class); - assertEquals("Contact{email=test@domain.com:EmailClass.adaptFromJson}", actual.toString()); - assertEquals("Constructor.adaptFromJson\n" + + assertEquals("Contact{email=test@domain.com:EmailClass.deserialize}", actual.toString()); + assertEquals("Constructor.deserialize\n" + "Contact.\n" + - "EmailClass.adaptFromJson\n" + + "EmailClass.deserialize\n" + "Contact.setEmail", calls()); } @@ -75,9 +78,9 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"EmailClass.adaptToJson\"}}", json); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"EmailClass.serialize\"}}", json); assertEquals("Contact.getEmail\n" + - "EmailClass.adaptToJson", calls()); + "EmailClass.serialize", calls()); } public static class Contact { @@ -85,7 +88,7 @@ public static class Contact { private Email email; @JsonbCreator - public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + public Contact(@JsonbProperty("email") @JsonbTypeDeserializer(Adapter.Constructor.class) final Email email) { CALLS.called(); this.email = email; } diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassDirectTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassDirectTest.java index fd85b4fe..37333b93 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassDirectTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassDirectTest.java @@ -38,15 +38,18 @@ public class SerializerPrecedenceConfigClassDirectTest extends SerializerOnClass @Override public Jsonb jsonb() { - return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + return JsonbBuilder.create(new JsonbConfig() + .withSerializers(new Adapter.Config()) + .withDeserializers(new Adapter.Config()) + ); } @Override public void assertRead(final Jsonb jsonb) { final String json = "{\"user\":\"test\",\"domain\":\"domain.com\"}"; final Email actual = jsonb.fromJson(json, Email.class); - assertEquals("test@domain.com:Config.adaptFromJson", actual.toString()); - assertEquals("Config.adaptFromJson", calls()); + assertEquals("test@domain.com:Config.deserialize", actual.toString()); + assertEquals("Config.deserialize", calls()); } @Override @@ -54,8 +57,8 @@ public void assertWrite(final Jsonb jsonb) { final Email email = new Email("test", "domain.com"); final String json = jsonb.toJson(email); - assertEquals("{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"Config.adaptToJson\"}", json); - assertEquals("Config.adaptToJson", calls()); + assertEquals("{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"Config.serialize\"}", json); + assertEquals("Config.serialize", calls()); } /** diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java index b9a857b1..917d39a7 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java @@ -22,6 +22,8 @@ import jakarta.json.bind.annotation.JsonbCreator; import jakarta.json.bind.annotation.JsonbProperty; import jakarta.json.bind.annotation.JsonbTypeAdapter; +import jakarta.json.bind.annotation.JsonbTypeDeserializer; +import jakarta.json.bind.annotation.JsonbTypeSerializer; import static org.junit.Assert.assertEquals; @@ -44,15 +46,18 @@ public class SerializerPrecedenceConfigClassFieldConstructorHasGetterFinalFieldT @Override public Jsonb jsonb() { - return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + return JsonbBuilder.create(new JsonbConfig() + .withSerializers(new Adapter.Config()) + .withDeserializers(new Adapter.Config()) + ); } @Override public void assertRead(final Jsonb jsonb) { final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; final Contact actual = jsonb.fromJson(json, Contact.class); - assertEquals("Contact{email=test@domain.com:Constructor.adaptFromJson}", actual.toString()); - assertEquals("Constructor.adaptFromJson\n" + + assertEquals("Contact{email=test@domain.com:Constructor.deserialize}", actual.toString()); + assertEquals("Constructor.deserialize\n" + "Contact.", calls()); } @@ -63,18 +68,19 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"Field.adaptToJson\"}}", json); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"Field.serialize\"}}", json); assertEquals("Contact.getEmail\n" + - "Field.adaptToJson", calls()); + "Field.serialize", calls()); } public static class Contact { - @JsonbTypeAdapter(Adapter.Field.class) + @JsonbTypeDeserializer(Adapter.Field.class) + @JsonbTypeSerializer(Adapter.Field.class) private final Email email; @JsonbCreator - public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + public Contact(@JsonbProperty("email") @JsonbTypeDeserializer(Adapter.Constructor.class) final Email email) { CALLS.called(); this.email = email; } diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java index 589bada3..f7ba00bd 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java @@ -22,6 +22,8 @@ import jakarta.json.bind.annotation.JsonbCreator; import jakarta.json.bind.annotation.JsonbProperty; import jakarta.json.bind.annotation.JsonbTypeAdapter; +import jakarta.json.bind.annotation.JsonbTypeDeserializer; +import jakarta.json.bind.annotation.JsonbTypeSerializer; import static org.junit.Assert.assertEquals; @@ -45,17 +47,20 @@ public class SerializerPrecedenceConfigClassFieldConstructorHasGetterSetterTest @Override public Jsonb jsonb() { - return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + return JsonbBuilder.create(new JsonbConfig() + .withSerializers(new Adapter.Config()) + .withDeserializers(new Adapter.Config()) + ); } @Override public void assertRead(final Jsonb jsonb) { final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; final Contact actual = jsonb.fromJson(json, Contact.class); - assertEquals("Contact{email=test@domain.com:Field.adaptFromJson}", actual.toString()); - assertEquals("Constructor.adaptFromJson\n" + + assertEquals("Contact{email=test@domain.com:Field.deserialize}", actual.toString()); + assertEquals("Constructor.deserialize\n" + "Contact.\n" + - "Field.adaptFromJson\n" + + "Field.deserialize\n" + "Contact.setEmail", calls()); } @@ -66,18 +71,19 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"Field.adaptToJson\"}}", json); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"Field.serialize\"}}", json); assertEquals("Contact.getEmail\n" + - "Field.adaptToJson", calls()); + "Field.serialize", calls()); } public static class Contact { - @JsonbTypeAdapter(Adapter.Field.class) + @JsonbTypeDeserializer(Adapter.Field.class) + @JsonbTypeSerializer(Adapter.Field.class) private Email email; @JsonbCreator - public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + public Contact(@JsonbProperty("email") @JsonbTypeDeserializer(Adapter.Constructor.class) final Email email) { CALLS.called(); this.email = email; } diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java index ae642d9f..7bbcddf8 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java @@ -22,6 +22,8 @@ import jakarta.json.bind.annotation.JsonbCreator; import jakarta.json.bind.annotation.JsonbProperty; import jakarta.json.bind.annotation.JsonbTypeAdapter; +import jakarta.json.bind.annotation.JsonbTypeDeserializer; +import jakarta.json.bind.annotation.JsonbTypeSerializer; import static org.junit.Assert.assertEquals; @@ -45,17 +47,20 @@ public class SerializerPrecedenceConfigClassGetterFieldConstructorHasSetterTest @Override public Jsonb jsonb() { - return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + return JsonbBuilder.create(new JsonbConfig() + .withSerializers(new Adapter.Config()) + .withDeserializers(new Adapter.Config()) + ); } @Override public void assertRead(final Jsonb jsonb) { final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; final Contact actual = jsonb.fromJson(json, Contact.class); - assertEquals("Contact{email=test@domain.com:Field.adaptFromJson}", actual.toString()); - assertEquals("Constructor.adaptFromJson\n" + + assertEquals("Contact{email=test@domain.com:Field.deserialize}", actual.toString()); + assertEquals("Constructor.deserialize\n" + "Contact.\n" + - "Field.adaptFromJson\n" + + "Field.deserialize\n" + "Contact.setEmail", calls()); } @@ -66,23 +71,24 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"Getter.adaptToJson\"}}", json); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"Getter.serialize\"}}", json); assertEquals("Contact.getEmail\n" + - "Getter.adaptToJson", calls()); + "Getter.serialize", calls()); } public static class Contact { - @JsonbTypeAdapter(Adapter.Field.class) + @JsonbTypeDeserializer(Adapter.Field.class) + @JsonbTypeSerializer(Adapter.Field.class) private Email email; @JsonbCreator - public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + public Contact(@JsonbProperty("email") @JsonbTypeDeserializer(Adapter.Constructor.class) final Email email) { CALLS.called(); this.email = email; } - @JsonbTypeAdapter(Adapter.Getter.class) + @JsonbTypeSerializer(Adapter.Getter.class) public Email getEmail() { CALLS.called(); return email; diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterSetterFieldConstructorTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterSetterFieldConstructorTest.java index abbf1804..9d11d1e5 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterSetterFieldConstructorTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterSetterFieldConstructorTest.java @@ -22,6 +22,8 @@ import jakarta.json.bind.annotation.JsonbCreator; import jakarta.json.bind.annotation.JsonbProperty; import jakarta.json.bind.annotation.JsonbTypeAdapter; +import jakarta.json.bind.annotation.JsonbTypeDeserializer; +import jakarta.json.bind.annotation.JsonbTypeSerializer; import static org.junit.Assert.assertEquals; @@ -43,17 +45,20 @@ public class SerializerPrecedenceConfigClassGetterSetterFieldConstructorTest ext @Override public Jsonb jsonb() { - return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + return JsonbBuilder.create(new JsonbConfig() + .withSerializers(new Adapter.Config()) + .withDeserializers(new Adapter.Config()) + ); } @Override public void assertRead(final Jsonb jsonb) { final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; final Contact actual = jsonb.fromJson(json, Contact.class); - assertEquals("Contact{email=test@domain.com:Setter.adaptFromJson}", actual.toString()); - assertEquals("Constructor.adaptFromJson\n" + + assertEquals("Contact{email=test@domain.com:Setter.deserialize}", actual.toString()); + assertEquals("Constructor.deserialize\n" + "Contact.\n" + - "Setter.adaptFromJson\n" + + "Setter.deserialize\n" + "Contact.setEmail", calls()); } @@ -64,29 +69,30 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"Getter.adaptToJson\"}}", json); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"Getter.serialize\"}}", json); assertEquals("Contact.getEmail\n" + - "Getter.adaptToJson", calls()); + "Getter.serialize", calls()); } public static class Contact { - @JsonbTypeAdapter(Adapter.Field.class) + @JsonbTypeDeserializer(Adapter.Field.class) + @JsonbTypeSerializer(Adapter.Field.class) private Email email; @JsonbCreator - public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + public Contact(@JsonbProperty("email") @JsonbTypeDeserializer(Adapter.Constructor.class) final Email email) { CALLS.called(); this.email = email; } - @JsonbTypeAdapter(Adapter.Getter.class) + @JsonbTypeSerializer(Adapter.Getter.class) public Email getEmail() { CALLS.called(); return email; } - @JsonbTypeAdapter(Adapter.Setter.class) + @JsonbTypeDeserializer(Adapter.Setter.class) public void setEmail(final Email email) { CALLS.called(); this.email = email; diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java index 0f54d32e..201a92ee 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java @@ -22,6 +22,8 @@ import jakarta.json.bind.annotation.JsonbCreator; import jakarta.json.bind.annotation.JsonbProperty; import jakarta.json.bind.annotation.JsonbTypeAdapter; +import jakarta.json.bind.annotation.JsonbTypeDeserializer; +import jakarta.json.bind.annotation.JsonbTypeSerializer; import static org.junit.Assert.assertEquals; @@ -44,17 +46,20 @@ public class SerializerPrecedenceConfigClassSetterFieldConstructorHasGetterTest @Override public Jsonb jsonb() { - return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + return JsonbBuilder.create(new JsonbConfig() + .withSerializers(new Adapter.Config()) + .withDeserializers(new Adapter.Config()) + ); } @Override public void assertRead(final Jsonb jsonb) { final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; final Contact actual = jsonb.fromJson(json, Contact.class); - assertEquals("Contact{email=test@domain.com:Setter.adaptFromJson}", actual.toString()); - assertEquals("Constructor.adaptFromJson\n" + + assertEquals("Contact{email=test@domain.com:Setter.deserialize}", actual.toString()); + assertEquals("Constructor.deserialize\n" + "Contact.\n" + - "Setter.adaptFromJson\n" + + "Setter.deserialize\n" + "Contact.setEmail", calls()); } @@ -65,18 +70,19 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"Field.adaptToJson\"}}", json); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"Field.serialize\"}}", json); assertEquals("Contact.getEmail\n" + - "Field.adaptToJson", calls()); + "Field.serialize", calls()); } public static class Contact { - @JsonbTypeAdapter(Adapter.Field.class) + @JsonbTypeDeserializer(Adapter.Field.class) + @JsonbTypeSerializer(Adapter.Field.class) private Email email; @JsonbCreator - public Contact(@JsonbProperty("email") @JsonbTypeAdapter(Adapter.Constructor.class) final Email email) { + public Contact(@JsonbProperty("email") @JsonbTypeDeserializer(Adapter.Constructor.class) final Email email) { CALLS.called(); this.email = email; } @@ -86,7 +92,7 @@ public Email getEmail() { return email; } - @JsonbTypeAdapter(Adapter.Setter.class) + @JsonbTypeDeserializer(Adapter.Setter.class) public void setEmail(final Email email) { CALLS.called(); this.email = email; diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassTest.java index bb2998dc..bbbc6de6 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassTest.java @@ -46,16 +46,19 @@ public class SerializerPrecedenceConfigClassTest extends SerializerOnClassTest { @Override public Jsonb jsonb() { - return JsonbBuilder.create(new JsonbConfig().withAdapters(new Adapter.Config())); + return JsonbBuilder.create(new JsonbConfig() + .withSerializers(new Adapter.Config()) + .withDeserializers(new Adapter.Config()) + ); } @Override public void assertRead(final Jsonb jsonb) { final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; final Contact actual = jsonb.fromJson(json, Contact.class); - assertEquals("Contact{email=test@domain.com:EmailClass.adaptFromJson}", actual.toString()); + assertEquals("Contact{email=test@domain.com:EmailClass.deserialize}", actual.toString()); assertEquals("Contact.\n" + - "EmailClass.adaptFromJson\n" + + "EmailClass.deserialize\n" + "Contact.setEmail", calls()); } @@ -67,9 +70,9 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"EmailClass.adaptToJson\"}}", json); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"EmailClass.serialize\"}}", json); assertEquals("Contact.getEmail\n" + - "EmailClass.adaptToJson", calls()); + "EmailClass.serialize", calls()); } public static class Contact { From 1f9335ddc9486c06be32e5c07f0ca2cbe483cb80 Mon Sep 17 00:00:00 2001 From: David Blevins Date: Tue, 13 May 2025 11:09:44 -0700 Subject: [PATCH 19/25] Behavior differs from equivalent Adapter test Config adapter does not win in JsonbTypeAdapter test --- ...igClassConstructorHasGetterSetterTest.java | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterSetterTest.java index db30d9d7..17837786 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterSetterTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterSetterTest.java @@ -36,19 +36,15 @@ * - Setter * * Outcome: - * - EmailClass wins on read - * - EmailClass wins on write + * - Config wins on read + * - Config wins on write * - Constructor adapter is called, but overwritten * - * Question: - * - Should Config win on write? - * Adapters on the target type itself (Email) are effectively a hardcoded default adapter - * If a user wishes to alter this behavior for a specific operation via the config, why - * not let them? This would be the most (only?) convenient way to change behavior without - * sweeping code change. + * Inconsistency: + * - Equivalent test for JsonbTypeAdapter the EmailClass adapter wins (likely bug in JsonbTypeAdapter code) * + * Possible bug: * - Shouldn't the constructor win on read? - * Seems like a clear bug */ public class SerializerPrecedenceConfigClassConstructorHasGetterSetterTest extends SerializerOnClassTest { @@ -64,10 +60,10 @@ public Jsonb jsonb() { public void assertRead(final Jsonb jsonb) { final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; final Contact actual = jsonb.fromJson(json, Contact.class); - assertEquals("Contact{email=test@domain.com:EmailClass.deserialize}", actual.toString()); + assertEquals("Contact{email=test@domain.com:Config.deserialize}", actual.toString()); assertEquals("Constructor.deserialize\n" + "Contact.\n" + - "EmailClass.deserialize\n" + + "Config.deserialize\n" + "Contact.setEmail", calls()); } @@ -78,9 +74,9 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"EmailClass.serialize\"}}", json); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"Config.serialize\"}}", json); assertEquals("Contact.getEmail\n" + - "EmailClass.serialize", calls()); + "Config.serialize", calls()); } public static class Contact { From ab90d7b9ba549d4b7dde63d092dbd558a93da9f6 Mon Sep 17 00:00:00 2001 From: David Blevins Date: Tue, 13 May 2025 11:14:17 -0700 Subject: [PATCH 20/25] Behavior differs from equivalent Adapter test Equivalent JsonbTypeAdapter test fails with java.lang.ClassCastException: Cannot cast sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl to java.lang.Class --- .../jsonb/symmetry/serializer/SerializerOnClassDirectTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassDirectTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassDirectTest.java index 740df2d8..b5138fa2 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassDirectTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassDirectTest.java @@ -18,11 +18,9 @@ import jakarta.json.bind.Jsonb; import jakarta.json.bind.JsonbBuilder; -import org.junit.Ignore; import static org.junit.Assert.assertEquals; -@Ignore("java.lang.ClassCastException: Cannot cast sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl to java.lang.Class") public class SerializerOnClassDirectTest extends SerializerOnClassTest { public Jsonb jsonb() { From 88c0bd12f4b4bed7b90c5c25cb87917a635e58cb Mon Sep 17 00:00:00 2001 From: David Blevins Date: Tue, 13 May 2025 11:18:16 -0700 Subject: [PATCH 21/25] Behavior differs from equivalent Adapter test Equivalent JsonbTypeAdapter test EmailClass adapter wins on write --- ...onfigClassConstructorHasGetterFinalFieldTest.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java index 90cc80fc..551bdc1c 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java @@ -40,12 +40,8 @@ * - Constructor wins on read * - EmailClass wins on write * - * Question: - * - Should Config win on write? - * Adapters on the target type itself (Email) are effectively a hardcoded default adapter - * If a user wishes to alter this behavior for a specific operation via the config, why - * not let them? This would be the most (only?) convenient way to change behavior without - * sweeping code change. + * Inconsistency: + * - Equivalent test for JsonbTypeAdapter the EmailClass adapter wins on write (likely bug in JsonbTypeAdapter code) */ public class SerializerPrecedenceConfigClassConstructorHasGetterFinalFieldTest extends SerializerOnClassTest { @@ -73,9 +69,9 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"EmailClass.serialize\"}}", json); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"Config.serialize\"}}", json); assertEquals("Contact.getEmail\n" + - "EmailClass.serialize", calls()); + "Config.serialize", calls()); } public static class Contact { From 99f1ab946533811dae167b9803b69d9a45e11b2c Mon Sep 17 00:00:00 2001 From: David Blevins Date: Tue, 13 May 2025 11:19:58 -0700 Subject: [PATCH 22/25] Behavior differs from equivalent Adapter test Equivalent JsonbTypeAdapter test fails with ClassCastException --- ...alizerPrecedenceConfigClassDirectTest.java | 55 +------------------ 1 file changed, 1 insertion(+), 54 deletions(-) diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassDirectTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassDirectTest.java index 37333b93..2f20e7c6 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassDirectTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassDirectTest.java @@ -19,8 +19,6 @@ import jakarta.json.bind.Jsonb; import jakarta.json.bind.JsonbBuilder; import jakarta.json.bind.JsonbConfig; -import org.junit.Ignore; -import org.junit.Test; import static org.junit.Assert.assertEquals; @@ -31,7 +29,7 @@ * * * Outcome: - * - Reads fail + * - Config wins on read * - Config wins on write */ public class SerializerPrecedenceConfigClassDirectTest extends SerializerOnClassTest { @@ -61,55 +59,4 @@ public void assertWrite(final Jsonb jsonb) { assertEquals("Config.serialize", calls()); } - /** - * java.lang.ClassCastException: Cannot cast sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl to java.lang.Class - * - * at java.base/java.lang.Class.cast(Class.java:3889) - * at org.apache.johnzon.jsonb.JsonbAccessMode.isReversedAdapter(JsonbAccessMode.java:875) - */ - @Test - @Ignore - @Override - public void read() throws Exception { - super.read(); - } - - /** - * java.lang.ClassCastException: Cannot cast sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl to java.lang.Class - * - * at java.base/java.lang.Class.cast(Class.java:3889) - * at org.apache.johnzon.jsonb.JsonbAccessMode.isReversedAdapter(JsonbAccessMode.java:875) - */ - @Test - @Ignore - @Override - public void readAfterRead() throws Exception { - super.readAfterRead(); - } - - /** - * java.lang.ClassCastException: Cannot cast sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl to java.lang.Class - * - * at java.base/java.lang.Class.cast(Class.java:3889) - * at org.apache.johnzon.jsonb.JsonbAccessMode.isReversedAdapter(JsonbAccessMode.java:875) - */ - @Test - @Ignore - @Override - public void readAfterWrite() throws Exception { - super.readAfterWrite(); - } - - /** - * java.lang.ClassCastException: Cannot cast sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl to java.lang.Class - * - * at java.base/java.lang.Class.cast(Class.java:3889) - * at org.apache.johnzon.jsonb.JsonbAccessMode.isReversedAdapter(JsonbAccessMode.java:875) - */ - @Test - @Ignore - @Override - public void writeAfterRead() throws Exception { - super.writeAfterRead(); - } } From d8a2169b54946a98a2af77355d7fe9c05b332a59 Mon Sep 17 00:00:00 2001 From: David Blevins Date: Tue, 13 May 2025 11:23:30 -0700 Subject: [PATCH 23/25] Behavior differs from equivalent Adapter test Equivalent JsonbTypeAdapter test EmailClass adapter wins --- .../SerializerPrecedenceConfigClassTest.java | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassTest.java index bbbc6de6..bd6c7685 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassTest.java @@ -32,15 +32,11 @@ * - Final Field * * Outcome: - * - EmailClass wins on read - * - EmailClass wins on write + * - Config wins on read + * - Config wins on write * - * Question: - * - Should Config win on read and write? - * Adapters on the target type itself (Email) are effectively a hardcoded default adapter - * If a user wishes to alter this behavior for a specific operation via the config, why - * not let them? This would be the most (only?) convenient way to change behavior without - * sweeping code change. + * Inconsistency: + * - Equivalent test for JsonbTypeAdapter the EmailClass adapter wins (likely bug in JsonbTypeAdapter code) */ public class SerializerPrecedenceConfigClassTest extends SerializerOnClassTest { @@ -56,9 +52,9 @@ public Jsonb jsonb() { public void assertRead(final Jsonb jsonb) { final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; final Contact actual = jsonb.fromJson(json, Contact.class); - assertEquals("Contact{email=test@domain.com:EmailClass.deserialize}", actual.toString()); + assertEquals("Contact{email=test@domain.com:Config.deserialize}", actual.toString()); assertEquals("Contact.\n" + - "EmailClass.deserialize\n" + + "Config.deserialize\n" + "Contact.setEmail", calls()); } @@ -70,9 +66,9 @@ public void assertWrite(final Jsonb jsonb) { reset(); final String json = jsonb.toJson(contact); - assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"EmailClass.serialize\"}}", json); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"Config.serialize\"}}", json); assertEquals("Contact.getEmail\n" + - "EmailClass.serialize", calls()); + "Config.serialize", calls()); } public static class Contact { From 8cd01e48bd834252bcd968fd36558d66e4e4004a Mon Sep 17 00:00:00 2001 From: David Blevins Date: Tue, 13 May 2025 11:36:19 -0700 Subject: [PATCH 24/25] Add Scenarios, adjust comments --- ...assConstructorHasGetterFinalFieldTest.java | 90 ++++++++++++++++ ...ceClassConstructorHasGetterSetterTest.java | 100 ++++++++++++++++++ ...assConstructorHasGetterFinalFieldTest.java | 4 +- ...eldConstructorHasGetterFinalFieldTest.java | 2 +- ...ssFieldConstructorHasGetterSetterTest.java | 2 +- ...ssGetterFieldConstructorHasSetterTest.java | 2 +- ...ClassGetterSetterFieldConstructorTest.java | 2 +- ...ssSetterFieldConstructorHasGetterTest.java | 2 +- .../SerializerPrecedenceConfigClassTest.java | 2 +- 9 files changed, 198 insertions(+), 8 deletions(-) create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceClassConstructorHasGetterFinalFieldTest.java create mode 100644 johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceClassConstructorHasGetterSetterTest.java diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceClassConstructorHasGetterFinalFieldTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceClassConstructorHasGetterFinalFieldTest.java new file mode 100644 index 00000000..c89ca9d5 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceClassConstructorHasGetterFinalFieldTest.java @@ -0,0 +1,90 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.serializer; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeDeserializer; + +import static org.junit.Assert.assertEquals; + +/** + * Adapter on + * - Constructor + * - Class + * + * Has + * - Getter + * - Final Field + * + * Outcome: + * - Constructor wins on read + * - Email wins on write + */ +public class SerializerPrecedenceClassConstructorHasGetterFinalFieldTest extends SerializerOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:Constructor.deserialize}", actual.toString()); + assertEquals("Constructor.deserialize\n" + + "Contact.", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"EmailClass.serialize\"}}", json); + assertEquals("Contact.getEmail\n" + + "EmailClass.serialize", calls()); + } + + public static class Contact { + + private final Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeDeserializer(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceClassConstructorHasGetterSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceClassConstructorHasGetterSetterTest.java new file mode 100644 index 00000000..52d43c79 --- /dev/null +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceClassConstructorHasGetterSetterTest.java @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.johnzon.jsonb.symmetry.serializer; + +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeDeserializer; + +import static org.junit.Assert.assertEquals; + +/** + * Adapters on + * - Constructor + * - Class + * + * Has + * - Getter + * - Setter + * + * Outcome: + * - EmailClass wins on read + * - EmailClass wins on write + * - Constructor adapter is called, but overwritten + * + * Possible bug: + * - Shouldn't the constructor win on read? + */ +public class SerializerPrecedenceClassConstructorHasGetterSetterTest extends SerializerOnClassTest { + + @Override + public Jsonb jsonb() { + return JsonbBuilder.create(); + } + + @Override + public void assertRead(final Jsonb jsonb) { + final String json = "{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\"}}"; + final Contact actual = jsonb.fromJson(json, Contact.class); + assertEquals("Contact{email=test@domain.com:EmailClass.deserialize}", actual.toString()); + assertEquals("Constructor.deserialize\n" + + "Contact.\n" + + "EmailClass.deserialize\n" + + "Contact.setEmail", calls()); + } + + @Override + public void assertWrite(final Jsonb jsonb) { + final Email email = new Email("test", "domain.com"); + final Contact contact = new Contact(email); + reset(); + + final String json = jsonb.toJson(contact); + assertEquals("{\"email\":{\"user\":\"test\",\"domain\":\"domain.com\",\"call\":\"EmailClass.serialize\"}}", json); + assertEquals("Contact.getEmail\n" + + "EmailClass.serialize", calls()); + } + + public static class Contact { + + private Email email; + + @JsonbCreator + public Contact(@JsonbProperty("email") @JsonbTypeDeserializer(Adapter.Constructor.class) final Email email) { + CALLS.called(); + this.email = email; + } + + public Email getEmail() { + CALLS.called(); + return email; + } + + public void setEmail(final Email email) { + CALLS.called(); + this.email = email; + } + + @Override + public String toString() { + return String.format("Contact{email=%s}", email); + } + } +} diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java index 551bdc1c..eb58f856 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java @@ -27,7 +27,7 @@ import static org.junit.Assert.assertEquals; /** - * JsonbTypeAdapter on + * Adapter on * - Constructor * - Config * - Class @@ -38,7 +38,7 @@ * * Outcome: * - Constructor wins on read - * - EmailClass wins on write + * - Config wins on write * * Inconsistency: * - Equivalent test for JsonbTypeAdapter the EmailClass adapter wins on write (likely bug in JsonbTypeAdapter code) diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java index 917d39a7..be88f346 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java @@ -28,7 +28,7 @@ import static org.junit.Assert.assertEquals; /** - * JsonbTypeAdapter on + * Adapter on * - Field * - Constructor * - Config diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java index f7ba00bd..72fab17b 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java @@ -28,7 +28,7 @@ import static org.junit.Assert.assertEquals; /** - * JsonbTypeAdapter on + * Adapter on * - Field * - Constructor * - Config diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java index 7bbcddf8..81bbba8d 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java @@ -28,7 +28,7 @@ import static org.junit.Assert.assertEquals; /** - * JsonbTypeAdapter on + * Adapter on * - Config * - Class * - Constructor diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterSetterFieldConstructorTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterSetterFieldConstructorTest.java index 9d11d1e5..39e32b09 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterSetterFieldConstructorTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterSetterFieldConstructorTest.java @@ -28,7 +28,7 @@ import static org.junit.Assert.assertEquals; /** - * JsonbTypeAdapter on + * Adapter on * - Field * - Constructor * - Getter diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java index 201a92ee..92ea9128 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java @@ -28,7 +28,7 @@ import static org.junit.Assert.assertEquals; /** - * JsonbTypeAdapter on + * Adapter on * - Field * - Constructor * - Setter diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassTest.java index bd6c7685..768c673e 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassTest.java @@ -23,7 +23,7 @@ import static org.junit.Assert.assertEquals; /** - * JsonbTypeAdapter on + * Adapter on * - Config * - Class * From e91eff0fd46cc81e4ab0ac7dd0e05cad9c7af2d7 Mon Sep 17 00:00:00 2001 From: David Blevins Date: Tue, 13 May 2025 12:07:22 -0700 Subject: [PATCH 25/25] Checkstyle --- .../adapter/map/MapAdapterOnClassDirectTest.java | 1 - ...apAdapterPrecedenceConfigClassDirectTest.java | 16 ++++++++-------- .../serializer/SerializerOnClassTest.java | 1 + ...eClassConstructorHasGetterFinalFieldTest.java | 1 - ...denceClassConstructorHasGetterSetterTest.java | 1 - ...gClassConstructorHasGetterFinalFieldTest.java | 1 - ...sFieldConstructorHasGetterFinalFieldTest.java | 1 - ...ClassFieldConstructorHasGetterSetterTest.java | 1 - ...ClassGetterFieldConstructorHasSetterTest.java | 1 - ...figClassGetterSetterFieldConstructorTest.java | 1 - ...ClassSetterFieldConstructorHasGetterTest.java | 1 - 11 files changed, 9 insertions(+), 17 deletions(-) diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterOnClassDirectTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterOnClassDirectTest.java index 25b9e06b..a8905462 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterOnClassDirectTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterOnClassDirectTest.java @@ -19,7 +19,6 @@ import jakarta.json.bind.Jsonb; import jakarta.json.bind.JsonbBuilder; import org.junit.Ignore; -import org.junit.Test; import static org.junit.Assert.assertEquals; diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassDirectTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassDirectTest.java index 1e7c4416..3d59920d 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassDirectTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/adapter/map/MapAdapterPrecedenceConfigClassDirectTest.java @@ -61,8 +61,8 @@ public void assertWrite(final Jsonb jsonb) { /** * java.lang.ClassCastException: Cannot cast sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl to java.lang.Class * - * at java.base/java.lang.Class.cast(Class.java:3889) - * at org.apache.johnzon.jsonb.JsonbAccessMode.isReversedAdapter(JsonbAccessMode.java:875) + * at java.base/java.lang.Class.cast(Class.java:3889) + * at org.apache.johnzon.jsonb.JsonbAccessMode.isReversedAdapter(JsonbAccessMode.java:875) */ @Test @Ignore @@ -74,8 +74,8 @@ public void read() throws Exception { /** * java.lang.ClassCastException: Cannot cast sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl to java.lang.Class * - * at java.base/java.lang.Class.cast(Class.java:3889) - * at org.apache.johnzon.jsonb.JsonbAccessMode.isReversedAdapter(JsonbAccessMode.java:875) + * at java.base/java.lang.Class.cast(Class.java:3889) + * at org.apache.johnzon.jsonb.JsonbAccessMode.isReversedAdapter(JsonbAccessMode.java:875) */ @Test @Ignore @@ -87,8 +87,8 @@ public void readAfterRead() throws Exception { /** * java.lang.ClassCastException: Cannot cast sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl to java.lang.Class * - * at java.base/java.lang.Class.cast(Class.java:3889) - * at org.apache.johnzon.jsonb.JsonbAccessMode.isReversedAdapter(JsonbAccessMode.java:875) + * at java.base/java.lang.Class.cast(Class.java:3889) + * at org.apache.johnzon.jsonb.JsonbAccessMode.isReversedAdapter(JsonbAccessMode.java:875) */ @Test @Ignore @@ -100,8 +100,8 @@ public void readAfterWrite() throws Exception { /** * java.lang.ClassCastException: Cannot cast sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl to java.lang.Class * - * at java.base/java.lang.Class.cast(Class.java:3889) - * at org.apache.johnzon.jsonb.JsonbAccessMode.isReversedAdapter(JsonbAccessMode.java:875) + * at java.base/java.lang.Class.cast(Class.java:3889) + * at org.apache.johnzon.jsonb.JsonbAccessMode.isReversedAdapter(JsonbAccessMode.java:875) */ @Test @Ignore diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassTest.java index d5aceddd..a008e8a6 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerOnClassTest.java @@ -100,6 +100,7 @@ public Email deserialize(final JsonParser parser, final DeserializationContext c domain = parser.getString(); break; // skip "call" + default: //ignore } } else if (event == JsonParser.Event.END_OBJECT) { break; diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceClassConstructorHasGetterFinalFieldTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceClassConstructorHasGetterFinalFieldTest.java index c89ca9d5..1c635c62 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceClassConstructorHasGetterFinalFieldTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceClassConstructorHasGetterFinalFieldTest.java @@ -18,7 +18,6 @@ import jakarta.json.bind.Jsonb; import jakarta.json.bind.JsonbBuilder; -import jakarta.json.bind.JsonbConfig; import jakarta.json.bind.annotation.JsonbCreator; import jakarta.json.bind.annotation.JsonbProperty; import jakarta.json.bind.annotation.JsonbTypeDeserializer; diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceClassConstructorHasGetterSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceClassConstructorHasGetterSetterTest.java index 52d43c79..ae2c5193 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceClassConstructorHasGetterSetterTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceClassConstructorHasGetterSetterTest.java @@ -18,7 +18,6 @@ import jakarta.json.bind.Jsonb; import jakarta.json.bind.JsonbBuilder; -import jakarta.json.bind.JsonbConfig; import jakarta.json.bind.annotation.JsonbCreator; import jakarta.json.bind.annotation.JsonbProperty; import jakarta.json.bind.annotation.JsonbTypeDeserializer; diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java index eb58f856..234b0376 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassConstructorHasGetterFinalFieldTest.java @@ -21,7 +21,6 @@ import jakarta.json.bind.JsonbConfig; import jakarta.json.bind.annotation.JsonbCreator; import jakarta.json.bind.annotation.JsonbProperty; -import jakarta.json.bind.annotation.JsonbTypeAdapter; import jakarta.json.bind.annotation.JsonbTypeDeserializer; import static org.junit.Assert.assertEquals; diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java index be88f346..7df7b86a 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterFinalFieldTest.java @@ -21,7 +21,6 @@ import jakarta.json.bind.JsonbConfig; import jakarta.json.bind.annotation.JsonbCreator; import jakarta.json.bind.annotation.JsonbProperty; -import jakarta.json.bind.annotation.JsonbTypeAdapter; import jakarta.json.bind.annotation.JsonbTypeDeserializer; import jakarta.json.bind.annotation.JsonbTypeSerializer; diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java index 72fab17b..d48e6d73 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassFieldConstructorHasGetterSetterTest.java @@ -21,7 +21,6 @@ import jakarta.json.bind.JsonbConfig; import jakarta.json.bind.annotation.JsonbCreator; import jakarta.json.bind.annotation.JsonbProperty; -import jakarta.json.bind.annotation.JsonbTypeAdapter; import jakarta.json.bind.annotation.JsonbTypeDeserializer; import jakarta.json.bind.annotation.JsonbTypeSerializer; diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java index 81bbba8d..a309d339 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterFieldConstructorHasSetterTest.java @@ -21,7 +21,6 @@ import jakarta.json.bind.JsonbConfig; import jakarta.json.bind.annotation.JsonbCreator; import jakarta.json.bind.annotation.JsonbProperty; -import jakarta.json.bind.annotation.JsonbTypeAdapter; import jakarta.json.bind.annotation.JsonbTypeDeserializer; import jakarta.json.bind.annotation.JsonbTypeSerializer; diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterSetterFieldConstructorTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterSetterFieldConstructorTest.java index 39e32b09..d906f214 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterSetterFieldConstructorTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassGetterSetterFieldConstructorTest.java @@ -21,7 +21,6 @@ import jakarta.json.bind.JsonbConfig; import jakarta.json.bind.annotation.JsonbCreator; import jakarta.json.bind.annotation.JsonbProperty; -import jakarta.json.bind.annotation.JsonbTypeAdapter; import jakarta.json.bind.annotation.JsonbTypeDeserializer; import jakarta.json.bind.annotation.JsonbTypeSerializer; diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java index 92ea9128..3ded7faf 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/symmetry/serializer/SerializerPrecedenceConfigClassSetterFieldConstructorHasGetterTest.java @@ -21,7 +21,6 @@ import jakarta.json.bind.JsonbConfig; import jakarta.json.bind.annotation.JsonbCreator; import jakarta.json.bind.annotation.JsonbProperty; -import jakarta.json.bind.annotation.JsonbTypeAdapter; import jakarta.json.bind.annotation.JsonbTypeDeserializer; import jakarta.json.bind.annotation.JsonbTypeSerializer;