blob: ff9f6695e7b6711a23b57d23ccc2a506960becec [file] [log] [blame]
package org.checkerframework.framework.test;
import java.io.File;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.checkerframework.checker.nullness.qual.Nullable;
/**
* SimpleOptionMap is a very basic Option container. The keys of the Option container are the set of
* Options and the values are the arguments to those options if they exists: e.g.,
*
* <pre>{@code
* Map(
* "-AprintAllQualifiers" => null
* "-classpath" => "myDir1:myDir2"
* )
* }</pre>
*
* This class is mainly used by TestConfigurationBuilder to make working with existing options
* simpler and less error prone. It is not intended for a general Option container because users
* creating tests via source code can more easily manipulate the map whereas a lot of sugar would be
* needed to make this class usable from the command line.
*/
public class SimpleOptionMap {
/** A Map from optionName to arg, where arg is null if the option doesn't require any args. */
private final Map<String, @Nullable String> options = new LinkedHashMap<>();
/**
* Clears the current set of options and copies the input options to this map.
*
* @param options the new options to use for this object
*/
public void setOptions(Map<String, @Nullable String> options) {
this.options.clear();
this.options.putAll(options);
}
/**
* A method to easily add Strings to an option that takes a filepath as an argument.
*
* @param key an option with an argument of the form "arg1[path-separator]arg2..." e.g., "-cp
* myDir:myDir2:myDir3"
* @param toAppend a string to append onto the path or, if the path is null/empty, the argument to
* the option indicated by key
*/
public void addToPathOption(String key, String toAppend) {
if (toAppend == null) {
throw new IllegalArgumentException("Null string appended to sourcePath.");
}
String path = options.get(key);
if (toAppend.startsWith(File.pathSeparator)) {
if (path == null || path.isEmpty()) {
path = toAppend.substring(1, toAppend.length());
} else {
path += toAppend;
}
} else {
if (path == null || path.isEmpty()) {
path = toAppend;
} else {
path += File.pathSeparator + toAppend;
}
}
addOption(key, path);
}
/**
* Adds an option that takes no argument.
*
* @param option the no-argument option to add to this object
*/
public void addOption(String option) {
this.options.put(option, null);
}
/**
* Adds an option that takes an argument.
*
* @param option the option to add to this object
* @param value the argument to the option
*/
public void addOption(String option, String value) {
this.options.put(option, value);
}
/**
* Adds the option only if value is a non-null, non-empty String.
*
* @param option the option to add to this object
* @param value the argument to the option (or null)
*/
public void addOptionIfValueNonEmpty(String option, String value) {
if (value != null && !value.isEmpty()) {
addOption(option, value);
}
}
/**
* Adds all of the options in the given map to this one.
*
* @param options the options to add to this object
*/
public void addOptions(Map<String, @Nullable String> options) {
this.options.putAll(options);
}
public void addOptions(Iterable<String> newOptions) {
Iterator<String> optIter = newOptions.iterator();
while (optIter.hasNext()) {
String opt = optIter.next();
if (this.options.get(opt) != null) {
if (!optIter.hasNext()) {
throw new RuntimeException(
"Expected a value for option: "
+ opt
+ " in option list: "
+ String.join(", ", newOptions));
}
this.options.put(opt, optIter.next());
} else {
this.options.put(opt, null);
}
}
}
/**
* Returns the map that backs this SimpleOptionMap.
*
* @return the options in this object
*/
public Map<String, @Nullable String> getOptions() {
return options;
}
/**
* Creates a "flat" list representation of these options.
*
* @return a list of the string representations of the options in this object
*/
public List<String> getOptionsAsList() {
return TestUtilities.optionMapToList(options);
}
}