From 7a4bdbcf3c23a8288f47ba5194dacb1d85078d51 Mon Sep 17 00:00:00 2001 From: "Claudio Maggioni (maggicl)" Date: Wed, 27 May 2020 09:48:32 +0200 Subject: [PATCH] Imported tests from Google --- .../config/RuntimeTypeAdapterFactory.java | 11 + .../RuntimeTypeAdapterFactoryTests.java | 224 ++++++++++++++++++ 2 files changed, 235 insertions(+) create mode 100644 src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/RuntimeTypeAdapterFactoryTests.java diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/RuntimeTypeAdapterFactory.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/RuntimeTypeAdapterFactory.java index c0245d1..40e6a63 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/RuntimeTypeAdapterFactory.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/RuntimeTypeAdapterFactory.java @@ -194,6 +194,17 @@ public final class RuntimeTypeAdapterFactory implements TypeAdapterFactory { return this; } + /** + * Registers {@code type} identified by {@code label}. Labels are case sensitive. + * + * @throws IllegalArgumentException if either {@code type} or {@code label} have already been + * registered on this type adapter. + */ + public RuntimeTypeAdapterFactory registerSubtype(Class type) { + registerSubtype(type, type.getSimpleName()); + return this; + } + private void initMaps( Gson gson, Map> labelToDelegate, diff --git a/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/RuntimeTypeAdapterFactoryTests.java b/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/RuntimeTypeAdapterFactoryTests.java new file mode 100644 index 0000000..e748b9f --- /dev/null +++ b/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/RuntimeTypeAdapterFactoryTests.java @@ -0,0 +1,224 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.config; + +import static org.junit.jupiter.api.Assertions.*; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonParseException; +import com.google.gson.TypeAdapterFactory; +import org.junit.jupiter.api.Test; + +/** + * Copyright (C) 2011 Google Inc. + * + *

Licensed 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. + */ +public final class RuntimeTypeAdapterFactoryTests { + + @Test + public void testRuntimeTypeAdapter() { + RuntimeTypeAdapterFactory rta = + RuntimeTypeAdapterFactory.of(BillingInstrument.class) + .registerSubtype(CreditCard.class); + Gson gson = new GsonBuilder().registerTypeAdapterFactory(rta).create(); + + CreditCard original = new CreditCard("Jesse", 234); + assertEquals( + "{\"type\":\"CreditCard\",\"cvv\":234,\"ownerName\":\"Jesse\"}", + gson.toJson(original, BillingInstrument.class)); + BillingInstrument deserialized = + gson.fromJson( + "{type:'CreditCard',cvv:234,ownerName:'Jesse'}", BillingInstrument.class); + assertEquals("Jesse", deserialized.ownerName); + assertTrue(deserialized instanceof CreditCard); + } + + @Test + public void testRuntimeTypeIsBaseType() { + TypeAdapterFactory rta = + RuntimeTypeAdapterFactory.of(BillingInstrument.class, "type", false) + .registerSubtype(BillingInstrument.class); + Gson gson = new GsonBuilder().registerTypeAdapterFactory(rta).create(); + + BillingInstrument original = new BillingInstrument("Jesse"); + assertEquals( + "{\"type\":\"BillingInstrument\",\"ownerName\":\"Jesse\"}", + gson.toJson(original, BillingInstrument.class)); + BillingInstrument deserialized = + gson.fromJson( + "{type:'BillingInstrument',ownerName:'Jesse'}", BillingInstrument.class); + assertEquals("Jesse", deserialized.ownerName); + } + + @Test + public void testNullBaseType() { + try { + RuntimeTypeAdapterFactory.of(null); + fail(); + } catch (NullPointerException expected) { + } + } + + @Test + public void testNullTypeFieldName() { + try { + RuntimeTypeAdapterFactory.of(BillingInstrument.class, null); + fail(); + } catch (NullPointerException expected) { + } + } + + @Test + public void testNullSubtype() { + RuntimeTypeAdapterFactory rta = + RuntimeTypeAdapterFactory.of(BillingInstrument.class); + try { + rta.registerSubtype(null); + fail(); + } catch (NullPointerException expected) { + } + } + + @Test + public void testNullLabel() { + RuntimeTypeAdapterFactory rta = + RuntimeTypeAdapterFactory.of(BillingInstrument.class); + try { + rta.registerSubtype(CreditCard.class, null); + fail(); + } catch (NullPointerException expected) { + } + } + + @Test + public void testDuplicateSubtype() { + RuntimeTypeAdapterFactory rta = + RuntimeTypeAdapterFactory.of(BillingInstrument.class); + rta.registerSubtype(CreditCard.class, "CC"); + try { + rta.registerSubtype(CreditCard.class, "Visa"); + fail(); + } catch (IllegalArgumentException expected) { + } + } + + @Test + public void testDuplicateLabel() { + RuntimeTypeAdapterFactory rta = + RuntimeTypeAdapterFactory.of(BillingInstrument.class); + rta.registerSubtype(CreditCard.class, "CC"); + try { + rta.registerSubtype(BankTransfer.class, "CC"); + fail(); + } catch (IllegalArgumentException expected) { + } + } + + @Test + public void testDeserializeMissingTypeField() { + TypeAdapterFactory billingAdapter = + RuntimeTypeAdapterFactory.of(BillingInstrument.class) + .registerSubtype(CreditCard.class); + Gson gson = new GsonBuilder().registerTypeAdapterFactory(billingAdapter).create(); + try { + gson.fromJson("{ownerName:'Jesse'}", BillingInstrument.class); + fail(); + } catch (JsonParseException expected) { + } + } + + @Test + public void testDeserializeMissingSubtype() { + TypeAdapterFactory billingAdapter = + RuntimeTypeAdapterFactory.of(BillingInstrument.class) + .registerSubtype(BankTransfer.class); + Gson gson = new GsonBuilder().registerTypeAdapterFactory(billingAdapter).create(); + try { + gson.fromJson("{type:'CreditCard',ownerName:'Jesse'}", BillingInstrument.class); + fail(); + } catch (JsonParseException expected) { + } + } + + @Test + public void testSerializeMissingSubtype() { + TypeAdapterFactory billingAdapter = + RuntimeTypeAdapterFactory.of(BillingInstrument.class) + .registerSubtype(BankTransfer.class); + Gson gson = new GsonBuilder().registerTypeAdapterFactory(billingAdapter).create(); + try { + gson.toJson(new CreditCard("Jesse", 456), BillingInstrument.class); + fail(); + } catch (JsonParseException expected) { + } + } + + @Test + public void testSerializeCollidingTypeFieldName() { + TypeAdapterFactory billingAdapter = + RuntimeTypeAdapterFactory.of(BillingInstrument.class, "cvv") + .registerSubtype(CreditCard.class); + Gson gson = new GsonBuilder().registerTypeAdapterFactory(billingAdapter).create(); + try { + gson.toJson(new CreditCard("Jesse", 456), BillingInstrument.class); + fail(); + } catch (JsonParseException expected) { + } + } + + @Test + public void testSerializeWrappedNullValue() { + TypeAdapterFactory billingAdapter = + RuntimeTypeAdapterFactory.of(BillingInstrument.class) + .registerSubtype(CreditCard.class) + .registerSubtype(BankTransfer.class); + Gson gson = new GsonBuilder().registerTypeAdapterFactory(billingAdapter).create(); + String serialized = + gson.toJson(new BillingInstrumentWrapper(null), BillingInstrumentWrapper.class); + BillingInstrumentWrapper deserialized = + gson.fromJson(serialized, BillingInstrumentWrapper.class); + assertNull(deserialized.instrument); + } + + static class BillingInstrumentWrapper { + BillingInstrument instrument; + + BillingInstrumentWrapper(BillingInstrument instrument) { + this.instrument = instrument; + } + } + + static class BillingInstrument { + private final String ownerName; + + BillingInstrument(String ownerName) { + this.ownerName = ownerName; + } + } + + static class CreditCard extends BillingInstrument { + int cvv; + + CreditCard(String ownerName, int cvv) { + super(ownerName); + this.cvv = cvv; + } + } + + static class BankTransfer extends BillingInstrument { + int bankAccount; + + BankTransfer(String ownerName, int bankAccount) { + super(ownerName); + this.bankAccount = bankAccount; + } + } +}