package org.wikipedia.json; import android.net.Uri; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import com.google.gson.Gson; import com.google.gson.annotations.SerializedName; import org.junit.Test; import org.junit.runner.RunWith; import org.wikipedia.Constants; import org.wikipedia.json.annotations.Required; import org.wikipedia.model.BaseModel; import org.wikipedia.test.TestRunner; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.nullValue; import static org.junit.Assert.assertThat; import static org.wikipedia.json.GsonMarshaller.marshal; import static org.wikipedia.json.GsonUnmarshaller.unmarshal; @RunWith(TestRunner.class) public class RequiredFieldsCheckOnReadTypeAdapterFactoryTest { private final Gson gson = GsonUtil.getDefaultGsonBuilder().serializeNulls().create(); @Test public void testRequireNonNull() { RequiredModel expected = new RequiredModel(); expected.field = 1; RequiredModel result = unmarshal(gson, RequiredModel.class, marshal(gson, expected)); assertThat(result, is(expected)); } @Test public void testRequireNull() { RequiredModel model = new RequiredModel(); RequiredModel result = unmarshal(gson, RequiredModel.class, marshal(gson, model)); assertThat(result, nullValue()); } @Test public void testRequireMissing() { RequiredModel result = unmarshal(gson, RequiredModel.class, "{}"); assertThat(result, nullValue()); } @Test public void testOptionalNonNull() { OptionalModel expected = new OptionalModel(); expected.field = 1; OptionalModel result = unmarshal(gson, OptionalModel.class, marshal(gson, expected)); assertThat(result, is(expected)); } @Test public void testOptionalNull() { OptionalModel expected = new OptionalModel(); OptionalModel result = unmarshal(gson, OptionalModel.class, marshal(gson, expected)); assertThat(result, is(expected)); } @Test public void testOptionalMissing() { OptionalModel expected = new OptionalModel(); OptionalModel result = unmarshal(gson, OptionalModel.class, "{}"); assertThat(result, is(expected)); } @Test public void testRequiredTypeAdapterNonNull() { RequiredTypeAdapterModel expected = new RequiredTypeAdapterModel(); expected.uri = Uri.parse(Constants.WIKIPEDIA_URL); RequiredTypeAdapterModel result = unmarshal(gson, RequiredTypeAdapterModel.class, marshal(gson, expected)); assertThat(result, is(expected)); } @Test public void testRequiredTypeAdapterNull() { RequiredTypeAdapterModel expected = new RequiredTypeAdapterModel(); RequiredTypeAdapterModel result = unmarshal(gson, RequiredTypeAdapterModel.class, marshal(gson, expected)); assertThat(result, nullValue()); } @Test public void testRequiredTypeAdapterMissing() { RequiredTypeAdapterModel result = unmarshal(gson, RequiredTypeAdapterModel.class, "{}"); assertThat(result, nullValue()); } @Test public void testOptionalTypeAdapterNonNull() { OptionalTypeAdapterModel expected = new OptionalTypeAdapterModel(); expected.uri = Uri.parse(Constants.WIKIPEDIA_URL); OptionalTypeAdapterModel result = unmarshal(gson, OptionalTypeAdapterModel.class, marshal(gson, expected)); assertThat(result, is(expected)); } @Test public void testOptionalTypeAdapterNull() { OptionalTypeAdapterModel expected = new OptionalTypeAdapterModel(); OptionalTypeAdapterModel result = unmarshal(gson, OptionalTypeAdapterModel.class, marshal(gson, expected)); assertThat(result, is(expected)); } @Test public void testOptionalTypeAdapterMissing() { OptionalTypeAdapterModel expected = new OptionalTypeAdapterModel(); OptionalTypeAdapterModel result = unmarshal(gson, OptionalTypeAdapterModel.class, "{}"); assertThat(result, is(expected)); } @Test public void testRequiredSerializedNameNonNull() { SerializedNameModel expected = new SerializedNameModel(); expected.bar = "hello world"; SerializedNameModel result = unmarshal(gson, SerializedNameModel.class, marshal(gson, expected)); assertThat(result, is(expected)); } @Test public void testRequiredSerializedNameNull() { SerializedNameModel expected = new SerializedNameModel(); SerializedNameModel result = unmarshal(gson, SerializedNameModel.class, marshal(gson, expected)); assertThat(result, nullValue()); } @Test public void testRequiredSerializedNameMissing() { SerializedNameModel result = unmarshal(gson, SerializedNameModel.class, "{}"); assertThat(result, nullValue()); } @Test public void testComposedValid() { RequiredModel required = new RequiredModel(); required.field = 1; OptionalModel optional = new OptionalModel(); ComposedModel expected = new ComposedModel(); expected.required = required; expected.optional = optional; ComposedModel result = unmarshal(gson, ComposedModel.class, marshal(gson, expected)); assertThat(result, is(expected)); } @Test public void testComposedInvalid() { RequiredModel required = new RequiredModel(); OptionalModel optional = new OptionalModel(); ComposedModel aggregated = new ComposedModel(); aggregated.required = required; aggregated.optional = optional; ComposedModel result = unmarshal(gson, ComposedModel.class, marshal(gson, aggregated)); assertThat(result, nullValue()); } private static class RequiredModel extends BaseModel { @SuppressWarnings("NullableProblems") @Required @NonNull private Integer field; } private static class OptionalModel extends BaseModel { @Nullable private Integer field; } private static class ComposedModel extends BaseModel { @SuppressWarnings("NullableProblems") @Required @NonNull private RequiredModel required; @Nullable private OptionalModel optional; } private static class RequiredTypeAdapterModel extends BaseModel { @SuppressWarnings("NullableProblems") @Required @NonNull private Uri uri; } private static class OptionalTypeAdapterModel extends BaseModel { @Nullable private Uri uri; } private static class SerializedNameModel extends BaseModel { @SuppressWarnings("NullableProblems") @SerializedName("foo") @Required @NonNull private String bar; } }