Skip to content

Commit

Permalink
Added tests for optional emptiness support with Rx (#308)
Browse files Browse the repository at this point in the history
• Added tests for Optional emptiness support with Rx. 
• No code change was required for these tests to work. 
• Fixes #307
  • Loading branch information
shubhamugare authored and lazaroclapp committed Apr 27, 2019
1 parent 29dd90c commit f8d255c
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 5 deletions.
12 changes: 7 additions & 5 deletions nullaway/src/main/java/com/uber/nullaway/NullAway.java
Expand Up @@ -639,12 +639,14 @@ private Description checkReturnExpression(
return Description.NO_MATCH;
}
if (mayBeNullExpr(state, retExpr)) {
String message = "returning @Nullable expression from method with @NonNull return type";
final ErrorMessage errorMessage =
new ErrorMessage(
MessageTypes.RETURN_NULLABLE,
"returning @Nullable expression from method with @NonNull return type");
handler.onPrepareErrorMessage(retExpr, state, errorMessage);

return errorBuilder.createErrorDescriptionForNullAssignment(
new ErrorMessage(MessageTypes.RETURN_NULLABLE, message),
retExpr,
state.getPath(),
buildDescription(tree));
errorMessage, retExpr, state.getPath(), buildDescription(tree));
}
return Description.NO_MATCH;
}
Expand Down
64 changes: 64 additions & 0 deletions nullaway/src/test/java/com/uber/nullaway/NullAwayTest.java
Expand Up @@ -1551,6 +1551,70 @@ public void OptionalEmptinessUncheckedTest() {
.doTest();
}

@Test
public void OptionalEmptinessRxPositiveTest() {
compilationHelper
.setArgs(
Arrays.asList(
"-d",
temporaryFolder.getRoot().getAbsolutePath(),
"-XepOpt:NullAway:AnnotatedPackages=com.uber,io.reactivex",
"-XepOpt:NullAway:UnannotatedSubPackages=com.uber.lib.unannotated",
"-XepOpt:NullAway:CheckOptionalEmptiness=true"))
.addSourceLines(
"TestPositive.java",
"package com.uber;",
"import java.util.Optional;",
"import io.reactivex.Observable;",
"public class TestPositive {",
" private static boolean perhaps() { return Math.random() > 0.5; }",
" void foo(Observable<Optional<String>> observable) {",
" observable",
" .filter(optional -> optional.isPresent() || perhaps())",
" // BUG: Diagnostic contains: Optional optional can be empty",
" .map(optional -> optional.get().toString());",
" observable",
" .filter(optional -> optional.isPresent() || perhaps())",
" // BUG: Diagnostic contains: Optional optional can be empty",
" .map(optional -> optional.get())",
" .map(irr -> irr.toString());",
" }",
"}")
.doTest();
}

@Test
public void OptionalEmptinessRxNegativeTest() {
compilationHelper
.setArgs(
Arrays.asList(
"-d",
temporaryFolder.getRoot().getAbsolutePath(),
"-XepOpt:NullAway:AnnotatedPackages=com.uber",
"-XepOpt:NullAway:UnannotatedSubPackages=com.uber.lib.unannotated",
"-XepOpt:NullAway:CheckOptionalEmptiness=true"))
.addSourceLines(
"TestNegative.java",
"package com.uber;",
"import java.util.Optional;",
"import io.reactivex.Observable;",
"public class TestNegative {",
" private static boolean perhaps() { return Math.random() > 0.5; }",
" void foo(Observable<Optional<String>> observable) {",
" observable",
" .filter(optional -> optional.isPresent())",
" .map(optional -> optional.get().toString());",
" observable",
" .filter(optional -> optional.isPresent() && perhaps())",
" .map(optional -> optional.get().toString());",
" observable",
" .filter(optional -> optional.isPresent() && perhaps())",
" .map(optional -> optional.get());",
" }",
"}")
.doTest();
}

@Test
public void testCastToNonNull() {
compilationHelper
Expand Down

0 comments on commit f8d255c

Please sign in to comment.