Skip to content

Commit

Permalink
Get generator support nulls for boxed types
Browse files Browse the repository at this point in the history
  • Loading branch information
nikitin-da committed Jul 21, 2016
1 parent 7d6aa12 commit 06b2cc4
Show file tree
Hide file tree
Showing 14 changed files with 546 additions and 179 deletions.
Expand Up @@ -59,4 +59,18 @@ public static JavaType from(@NotNull TypeMirror typeMirror) {
throw new IllegalArgumentException("Unsupported type: " + typeMirror);
}
}

public boolean isBoxedType() {
switch (this) {
case BOOLEAN_OBJECT:
case SHORT_OBJECT:
case INTEGER_OBJECT:
case LONG_OBJECT:
case FLOAT_OBJECT:
case DOUBLE_OBJECT:
return true;
default:
return false;
}
}
}
Expand Up @@ -154,4 +154,69 @@ public void fromByteArray() {
final TypeMirror typeMirror = mockTypeMirror(null, byte[].class.getCanonicalName());
assertThat(JavaType.from(typeMirror)).isEqualTo(BYTE_ARRAY);
}

@Test
public void booleanObjectIsBoxed() {
assertThat(BOOLEAN_OBJECT.isBoxedType()).isTrue();
}

@Test
public void shortObjectIsBoxed() {
assertThat(SHORT_OBJECT.isBoxedType()).isTrue();
}

@Test
public void integerObjectIsBoxed() {
assertThat(INTEGER_OBJECT.isBoxedType()).isTrue();
}

@Test
public void longObjectIsBoxed() {
assertThat(LONG_OBJECT.isBoxedType()).isTrue();
}

@Test
public void floatObjectIsBoxed() {
assertThat(FLOAT_OBJECT.isBoxedType()).isTrue();
}

@Test
public void doubleObjectIsBoxed() {
assertThat(DOUBLE_OBJECT.isBoxedType()).isTrue();
}

@Test
public void shortPrimitiveIsNotBoxed() {
assertThat(SHORT.isBoxedType()).isFalse();
}

@Test
public void integerPrimitiveIsNotBoxed() {
assertThat(INTEGER.isBoxedType()).isFalse();
}

@Test
public void longPrimitiveIsNotBoxed() {
assertThat(LONG.isBoxedType()).isFalse();
}

@Test
public void floatPrimitiveIsNotBoxed() {
assertThat(FLOAT.isBoxedType()).isFalse();
}

@Test
public void doublePrimitiveIsNotBoxed() {
assertThat(DOUBLE.isBoxedType()).isFalse();
}

@Test
public void stringIsNotBoxed() {
assertThat(STRING.isBoxedType()).isFalse();
}

@Test
public void byteArrayIsNotBoxed() {
assertThat(BYTE_ARRAY.isBoxedType()).isFalse();
}
}
Expand Up @@ -6,6 +6,7 @@
import org.junit.Test;

import rx.Single;
import rx.SingleSubscriber;
import rx.observers.TestSubscriber;

import static org.mockito.Mockito.mock;
Expand Down Expand Up @@ -65,4 +66,35 @@ public void shouldCallOnErrorIfExceptionOccurred() {
verify(preparedOperation, never()).asRxSingle();
verify(preparedOperation, never()).asRxObservable();
}

@Test
public void shouldCallExecuteAsBlockingEvenIfSubscriberAlreadyUnsubscribed() {
//noinspection unchecked
PreparedOperation<Object> preparedOperation = mock(PreparedOperation.class);

//noinspection unchecked
SingleSubscriber<Object> subscriber = new SingleSubscriber() {

@Override
public void onSuccess(Object value) {
// nothing
}

@Override
public void onError(Throwable error) {
// nothing
}
};

subscriber.unsubscribe();

OnSubscribeExecuteAsBlockingSingle
.newInstance(preparedOperation)
.call(subscriber);

// Even if subscriber is unsubscribed when call was done,
// executeAsBlocking() must be called (for example for Put and Delete operations)
// But we should think about skipping call to executeAsBlocking() for Get Operation in same case
verify(preparedOperation).executeAsBlocking();
}
}
Expand Up @@ -99,7 +99,16 @@ private MethodSpec createMapFromCursorMethodSpec(@NotNull StorIOContentResolverT
throw new ProcessingException(columnMeta.element, "Can not generate GetResolver for field");
}

final boolean isBoxed = javaType.isBoxedType();
if (isBoxed) { // otherwise -> if primitive and value from cursor null -> fail early
builder.beginControlFlow("if(!cursor.isNull($L))", columnIndex);
}

builder.addStatement("object.$L = cursor.$L", columnMeta.fieldName, getFromCursor);

if (isBoxed) {
builder.endControlFlow();
}
}

return builder
Expand Down
@@ -1,22 +1,58 @@
package com.pushtorefresh.storio.contentresolver.annotations.processor.generate;

import com.pushtorefresh.storio.common.annotations.processor.introspection.JavaType;
import com.pushtorefresh.storio.contentresolver.annotations.StorIOContentResolverColumn;
import com.pushtorefresh.storio.contentresolver.annotations.StorIOContentResolverType;
import com.pushtorefresh.storio.contentresolver.annotations.processor.introspection.StorIOContentResolverColumnMeta;
import com.pushtorefresh.storio.contentresolver.annotations.processor.introspection.StorIOContentResolverTypeMeta;
import com.squareup.javapoet.JavaFile;

import org.jetbrains.annotations.NotNull;
import org.junit.Test;

import java.io.IOException;

import javax.lang.model.type.TypeKind;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

public class GetResolverGeneratorTest {

@NotNull
private static final String PART_PACKAGE = "package com.test;\n\n";

@NotNull
private static final String PART_IMPORT =
"import android.database.Cursor;\n" +
"import android.support.annotation.NonNull;\n" +
"import com.pushtorefresh.storio.contentresolver.operations.get.DefaultGetResolver;\n" +
"import java.lang.Override;\n" +
"\n";

@NotNull
private static final String PART_CLASS =
"/**\n" +
" * Generated resolver for Get Operation\n" +
" */\n" +
"public class TestItemStorIOContentResolverGetResolver extends DefaultGetResolver<TestItem> {\n";

@NotNull
private static final String PART_MAP_FROM_CURSOR_WITHOUT_NULL_CHECK =
" /**\n" +
" * {@inheritDoc}\n" +
" */\n" +
" @Override\n" +
" @NonNull\n" +
" public TestItem mapFromCursor(@NonNull Cursor cursor) {\n" +
" TestItem object = new TestItem();\n" +
"\n" +
" object.field1 = cursor.getInt(cursor.getColumnIndex(\"column1\")) == 1;\n" +
" object.field2 = cursor.getString(cursor.getColumnIndex(\"column2\"));\n" +
"\n" +
" return object;\n" +
" }\n";

@Test
public void generateJavaFileTest() throws IOException {
final StorIOContentResolverType storIOContentResolverType = mock(StorIOContentResolverType.class);
Expand All @@ -29,60 +65,107 @@ public void generateJavaFileTest() throws IOException {
storIOContentResolverType
);

final StorIOContentResolverColumn storIOContentResolverColumn1 = mock(StorIOContentResolverColumn.class);
when(storIOContentResolverColumn1.name()).thenReturn("column1");

//noinspection ConstantConditions
final StorIOContentResolverColumnMeta storIOContentResolverColumnMeta1 = new StorIOContentResolverColumnMeta(
null,
null,
final StorIOContentResolverColumnMeta storIOContentResolverColumnMeta1 = TestFactory.createColumnMetaMock(
TestFactory.createElementMock(TypeKind.BOOLEAN),
"column1",
"field1",
JavaType.BOOLEAN,
storIOContentResolverColumn1
true,
false,
JavaType.BOOLEAN
);
storIOContentResolverTypeMeta.columns.put("column1", storIOContentResolverColumnMeta1);

final StorIOContentResolverColumn storIOContentResolverColumn2 = mock(StorIOContentResolverColumn.class);
when(storIOContentResolverColumn2.name()).thenReturn("column2");
final StorIOContentResolverColumnMeta storIOContentResolverColumnMeta2 = TestFactory.createColumnMetaMock(
TestFactory.createElementMock(TypeKind.OTHER),
"column2",
"field2",
false,
false,
JavaType.STRING
);
storIOContentResolverTypeMeta.columns.put("column2", storIOContentResolverColumnMeta2);

//noinspection ConstantConditions
final StorIOContentResolverColumnMeta storIOContentResolverColumnMeta2 = new StorIOContentResolverColumnMeta(
null,
null,
final JavaFile javaFile = new GetResolverGenerator().generateJavaFile(storIOContentResolverTypeMeta);
final StringBuilder out = new StringBuilder();
javaFile.writeTo(out);

checkFile(out.toString(),
PART_PACKAGE,
PART_IMPORT,
PART_CLASS,
PART_MAP_FROM_CURSOR_WITHOUT_NULL_CHECK);
}

@Test
public void checksForNullIfBoxedType() throws IOException {
final StorIOContentResolverType storIOContentResolverType = mock(StorIOContentResolverType.class);

when(storIOContentResolverType.uri()).thenReturn("content://test");

final StorIOContentResolverTypeMeta storIOContentResolverTypeMeta = new StorIOContentResolverTypeMeta(
"TestItem",
"com.test",
storIOContentResolverType
);

final StorIOContentResolverColumnMeta storIOContentResolverColumnMeta1 = TestFactory.createColumnMetaMock(
TestFactory.createElementMock(TypeKind.BOOLEAN),
"column1",
"field1",
true,
false,
JavaType.BOOLEAN
);
storIOContentResolverTypeMeta.columns.put("column1", storIOContentResolverColumnMeta1);

final StorIOContentResolverColumnMeta storIOContentResolverColumnMeta2 = TestFactory.createColumnMetaMock(
TestFactory.createElementMock(TypeKind.OTHER),
"column2",
"field2",
JavaType.STRING,
storIOContentResolverColumn2
false,
false,
JavaType.INTEGER_OBJECT // boxed type
);
storIOContentResolverTypeMeta.columns.put("column2", storIOContentResolverColumnMeta2);

final JavaFile javaFile = new GetResolverGenerator().generateJavaFile(storIOContentResolverTypeMeta);
final StringBuilder out = new StringBuilder();
javaFile.writeTo(out);

assertThat(out.toString()).isEqualTo("package com.test;\n" +
"\n" +
"import android.database.Cursor;\n" +
"import android.support.annotation.NonNull;\n" +
"import com.pushtorefresh.storio.contentresolver.operations.get.DefaultGetResolver;\n" +
"import java.lang.Override;\n" +
"\n" +
"/**\n" +
" * Generated resolver for Get Operation\n" +
" */\n" +
"public class TestItemStorIOContentResolverGetResolver extends DefaultGetResolver<TestItem> {\n" +
checkFile(out.toString(),
PART_PACKAGE,
PART_IMPORT,
PART_CLASS,
" /**\n" +
" * {@inheritDoc}\n" +
" */\n" +
" @Override\n" +
" @NonNull\n" +
" public TestItem mapFromCursor(@NonNull Cursor cursor) {\n" +
" TestItem object = new TestItem();\n" +
"\n" +
" object.field1 = cursor.getInt(cursor.getColumnIndex(\"column1\")) == 1;\n" +
" object.field2 = cursor.getString(cursor.getColumnIndex(\"column2\"));\n" +
"\n" +
" return object;\n" +
" }\n" +
"}\n");
" * {@inheritDoc}\n" +
" */\n" +
" @Override\n" +
" @NonNull\n" +
" public TestItem mapFromCursor(@NonNull Cursor cursor) {\n" +
" TestItem object = new TestItem();\n" +
"\n" +
" object.field1 = cursor.getInt(cursor.getColumnIndex(\"column1\")) == 1;\n" +
" if(!cursor.isNull(cursor.getColumnIndex(\"column2\"))) {\n" +
" object.field2 = cursor.getInt(cursor.getColumnIndex(\"column2\"));\n" +
" }\n" +
"\n" +
" return object;\n" +
" }\n"
);
}

private void checkFile(
@NotNull String actualFile,
@NotNull String partPackage,
@NotNull String partImport,
@NotNull String partClass,
@NotNull String partMapFromCursor
) {
assertThat(actualFile).isEqualTo(
partPackage +
partImport +
partClass +
partMapFromCursor +
"}\n");
}
}

0 comments on commit 06b2cc4

Please sign in to comment.