aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/test/java/com
diff options
context:
space:
mode:
authorGravatar fwe <fwe@google.com>2017-08-25 22:12:32 +0200
committerGravatar Vladimir Moskva <vladmos@google.com>2017-08-28 16:08:24 +0200
commit0047fdcb4f9afc69ad8891169810bd752f28dd17 (patch)
tree544c2ad3d0170e00c04b6671d1e9b1dbe3554c0c /src/test/java/com
parent363413110f3a63a11d900864be1852adbaed2899 (diff)
Refactoring: OptionsParser now uses the visitor pattern to iterate over Blaze options.
This change is in preparation for unknown commit which also needs to iterate over all options, but has to execute a different action than getOptionsCompletion(). As a result, applying the visitor patterns helps to avoid duplicate iteration code. PiperOrigin-RevId: 166515117
Diffstat (limited to 'src/test/java/com')
-rw-r--r--src/test/java/com/google/devtools/common/options/OptionsParserTest.java82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/test/java/com/google/devtools/common/options/OptionsParserTest.java b/src/test/java/com/google/devtools/common/options/OptionsParserTest.java
index 01084ab1af..f8a0d5effe 100644
--- a/src/test/java/com/google/devtools/common/options/OptionsParserTest.java
+++ b/src/test/java/com/google/devtools/common/options/OptionsParserTest.java
@@ -39,8 +39,11 @@ import java.nio.file.StandardOpenOption;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
+import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@@ -2132,4 +2135,83 @@ public class OptionsParserTest {
assertThat(data1).isEqualTo(data2);
}
+
+ /** Dummy options for testing getHelpCompletion() and visitOptions(). */
+ public static class CompletionOptions extends OptionsBase implements Serializable {
+ @Option(
+ name = "secret",
+ documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
+ effectTags = {OptionEffectTag.NO_OP},
+ defaultValue = "false"
+ )
+ public boolean secret;
+
+ @Option(
+ name = "b",
+ documentationCategory = OptionDocumentationCategory.LOGGING,
+ effectTags = {OptionEffectTag.NO_OP},
+ defaultValue = "false"
+ )
+ public boolean b;
+
+ @Option(
+ name = "a",
+ documentationCategory = OptionDocumentationCategory.QUERY,
+ effectTags = {OptionEffectTag.NO_OP},
+ defaultValue = "false"
+ )
+ public boolean a;
+ }
+
+ @Test
+ public void getOptionsCompletionShouldFilterUndocumentedOptions() throws Exception {
+ OptionsParser parser = OptionsParser.newOptionsParser(CompletionOptions.class);
+ assertThat(parser.getOptionsCompletion().split("\n"))
+ .isEqualTo(new String[] {"--a", "--noa", "--b", "--nob"});
+ }
+
+ @Test
+ public void visitOptionsShouldFailWithoutPredicate() throws Exception {
+ checkThatVisitOptionsThrowsNullPointerException(null, option -> {}, "Missing predicate.");
+ }
+
+ @Test
+ public void visitOptionsShouldFailWithoutVisitor() throws Exception {
+ checkThatVisitOptionsThrowsNullPointerException(option -> true, null, "Missing visitor.");
+ }
+
+ private void checkThatVisitOptionsThrowsNullPointerException(
+ Predicate<OptionDefinition> predicate,
+ Consumer<OptionDefinition> visitor,
+ String expectedMessage)
+ throws Exception {
+ try {
+ OptionsParser.newOptionsParser(CompletionOptions.class).visitOptions(predicate, visitor);
+ fail("Expected a NullPointerException.");
+ } catch (NullPointerException ex) {
+ assertThat(ex).hasMessageThat().isEqualTo(expectedMessage);
+ }
+ }
+
+ @Test
+ public void visitOptionsShouldReturnAllOptionsInOrder() throws Exception {
+ assertThat(visitOptionsToCollectTheirNames(option -> true)).containsExactly("a", "b", "secret");
+ }
+
+ @Test
+ public void visitOptionsShouldObeyPredicate() throws Exception {
+ assertThat(visitOptionsToCollectTheirNames(option -> false)).isEmpty();
+ assertThat(visitOptionsToCollectTheirNames(option -> option.getOptionName().length() > 1))
+ .containsExactly("secret");
+ }
+
+ private List<String> visitOptionsToCollectTheirNames(Predicate<OptionDefinition> predicate) {
+ List<String> names = new LinkedList<>();
+ Consumer<OptionDefinition> visitor = option -> names.add(option.getOptionName());
+
+ OptionsParser parser = OptionsParser.newOptionsParser(CompletionOptions.class);
+ parser.visitOptions(predicate, visitor);
+
+ return names;
+ }
}