Cli.java

1
package com.github.dakusui.symfonion.cli;
2
3
import com.github.dakusui.symfonion.cli.subcommands.PresetSubcommand;
4
import com.github.dakusui.symfonion.compat.exceptions.CliException;
5
import com.github.dakusui.symfonion.compat.exceptions.SymfonionException;
6
import com.github.dakusui.symfonion.core.Symfonion;
7
import com.github.dakusui.symfonion.song.Bar;
8
import com.github.dakusui.symfonion.song.Measure;
9
import com.github.valid8j.pcond.forms.Predicates;
10
import org.apache.commons.cli.*;
11
12
import java.io.File;
13
import java.io.IOException;
14
import java.io.InputStream;
15
import java.io.PrintStream;
16
import java.util.*;
17
import java.util.function.Predicate;
18
import java.util.regex.Pattern;
19
import java.util.regex.PatternSyntaxException;
20
21
import static com.github.dakusui.symfonion.cli.CliUtils.composeErrMsgForOption;
22
import static com.github.dakusui.symfonion.cli.CliUtils.getSingleOptionValueFromCommandLine;
23
import static java.lang.String.format;
24
25
/**
26
 * A class that models a single CLI invocation.
27
 *
28
 * @param subcommand           A sub command to be executed by this object.
29
 * @param source               A source file to be processed.
30
 * @param sink                 A sink (output) file to which processed result should be written.
31
 * @param routeRequest         An object to specify routing of MIDI signals.
32
 * @param midiInRegexPatterns  An object that maps logical midi input port name to a device name.
33
 * @param midiOutRegexPatterns An object that maps logical midi output port name to a device name.
34
 * @param barFilter            A predicate that filters musical bars.
35
 *                             Used with `-c` and `-p` options.
36
 * @param measureFilter        A predicate that filters musical measures.
37
 *                             Used with `-x` and `-q` options.
38
 * @param partFilter           A predicate that filters parts.
39
 * @param options              An object that models command line options.
40
 * @param symfonion            This application's facade object.
41
 */
42
public record Cli(
43
    Subcommand subcommand,
44
    File source,
45
    File sink,
46
    MidiRouteRequest routeRequest,
47
    /*
48
     * Returns a map that defines MIDI-in port names.
49
     * A key in the returned map is a port name used in a symfonion song file.
50
     * The value associated with it is a regular expression that should specify a MIDI device.
51
     * The regular expression should be defined so that it matches one and only one MIDI-in device available in the system.
52
     */
53
    Map<String, Pattern> midiInRegexPatterns,
54
    /*
55
     * Returns a map that defines MIDI-out port names.
56
     * A key in the returned map is a port name used in a symfonion song file.
57
     * The value associated with it is a regular expression that should specify a MIDI device.
58
     * The regular expression should be defined so that it matches one and only one MIDI-out device available in the system.
59
     */
60
    Map<String, Pattern> midiOutRegexPatterns,
61
    Predicate<Bar> barFilter,
62
    Predicate<Measure> measureFilter,
63
    Predicate<String> partFilter,
64
    Options options,
65
    Symfonion symfonion) {
66
67
  /**
68
   * Invokes this object.
69
   *
70
   * @param stdout A print stream to which the output of the execution goes.
71
   * @param in An input stream from which the executed subcommand reads data.
72
   * @throws IOException A failure detected during execution.
73
   */
74
  public void invoke(PrintStream stdout, InputStream in) throws IOException {
75 1 1. invoke : removed call to com/github/dakusui/symfonion/cli/Subcommand::invoke → KILLED
    this.subcommand().invoke(this, stdout, in);
76
  }
77
78
  /**
79
   * Invokes the **SyMFONION** application with given command line arguments.
80
   *
81
   * @param stdout A print stream to which stdout data are printed.
82
   * @param stderr A print stream to which stderr data are printed.
83
   * @param args Command line arguments.
84
   * @return An exit code.
85
   */
86
  public static int invoke(PrintStream stdout, PrintStream stderr, String... args) {
87
    int ret;
88
    try {
89 1 1. invoke : removed call to com/github/dakusui/symfonion/cli/Cli::invoke → KILLED
      Cli.cli(args).$().invoke(stdout, System.in);
90
      ret = 0;
91
    } catch (ParseException e) {
92 1 1. invoke : removed call to com/github/dakusui/symfonion/cli/Cli::printError → KILLED
      printError(stderr, e);
93
      ret = 1;
94
    } catch (CliException e) {
95 1 1. invoke : removed call to com/github/dakusui/symfonion/cli/Cli::printError → NO_COVERAGE
      printError(stderr, e);
96
      ret = 2;
97
    } catch (SymfonionException e) {
98 1 1. invoke : removed call to com/github/dakusui/symfonion/cli/Cli::printError → KILLED
      printError(stderr, e);
99
      ret = 3;
100
    } catch (IOException e) {
101 1 1. invoke : removed call to java/io/IOException::printStackTrace → NO_COVERAGE
      e.printStackTrace(stderr);
102
      ret = 4;
103
    } catch (Exception e) {
104 1 1. invoke : removed call to java/lang/Exception::printStackTrace → KILLED
      e.printStackTrace(stderr);
105
      ret = 5;
106
    }
107 1 1. invoke : replaced int return with 0 for com/github/dakusui/symfonion/cli/Cli::invoke → KILLED
    return ret;
108
  }
109
110
  /**
111
   * A synonym for `new Builder(String... args)`.
112
   * Prefer this over directly calling `new Builder(String... args)` for readability's sake.
113
   *
114
   * @param args Commandline arguments
115
   * @return A new `Cli.Builder` object
116
   */
117
  public static Builder cli(String... args) {
118 1 1. cli : replaced return value with null for com/github/dakusui/symfonion/cli/Cli::cli → KILLED
    return new Builder(args);
119
  }
120
121
  /**
122
   * The application's entry point.
123
   *
124
   * @param args Given command line arguments.
125
   */
126
  public static void main(String... args) {
127 1 1. main : removed call to java/lang/System::exit → NO_COVERAGE
    System.exit(invoke(System.out, System.err, args));
128
  }
129
130
  /**
131
   * Returns an {@code Options} object which represents the specification of this CLI command.
132
   *
133
   * @return an {@code Options} object for this {@code CLI} class.
134
   */
135
  static Options buildOptions() {
136
    // create `Options` object
137
    Options options = new Options();
138
139
    // //
140
    // Behavior options
141
    options.addOption("V", "version", false, "print the version information.");
142
    options.addOption("h", "help", false, "print the command line usage.");
143
    options.addOption("l", "list", false, "list the available midi devices.");
144
    options.addOption("p", "play", true, "play the specified file using old syntax. deprecated.");
145
    options.addOption("q", "play-song", true, "play the specified file.");
146
    options.addOption("c", "compile", true,
147
                      "compile the specified file to a standard midi file using old syntax. deprecated.");
148
    options.addOption("x", "compile-song", true,
149
                      "compile the specified file to a standard midi file.");
150
    {
151
      Option option = OptionBuilder.create("r");
152 1 1. buildOptions : removed call to org/apache/commons/cli/Option::setLongOpt → SURVIVED
      option.setLongOpt("route");
153 1 1. buildOptions : removed call to org/apache/commons/cli/Option::setValueSeparator → KILLED
      option.setValueSeparator('=');
154 1 1. buildOptions : removed call to org/apache/commons/cli/Option::setArgs → KILLED
      option.setArgs(2);
155 1 1. buildOptions : removed call to org/apache/commons/cli/Option::setDescription → SURVIVED
      option.setDescription("run a midi patch bay.");
156
      options.addOption(option);
157
    }
158
159
    // //
160
    // I/O options
161
    {
162
      Option option = OptionBuilder.create("O");
163 1 1. buildOptions : removed call to org/apache/commons/cli/Option::setValueSeparator → KILLED
      option.setValueSeparator('=');
164 1 1. buildOptions : removed call to org/apache/commons/cli/Option::setArgs → KILLED
      option.setArgs(2);
165 1 1. buildOptions : removed call to org/apache/commons/cli/Option::setDescription → SURVIVED
      option.setDescription("specify midi out port.");
166
      options.addOption(option);
167
    }
168
    {
169
      Option option = OptionBuilder.create("I");
170 1 1. buildOptions : removed call to org/apache/commons/cli/Option::setValueSeparator → KILLED
      option.setValueSeparator('=');
171 1 1. buildOptions : removed call to org/apache/commons/cli/Option::setArgs → KILLED
      option.setArgs(2);
172 1 1. buildOptions : removed call to org/apache/commons/cli/Option::setDescription → SURVIVED
      option.setDescription("specify midi in port.");
173
      options.addOption(option);
174
    }
175
    {
176
      Option option = OptionBuilder.create("o");
177 1 1. buildOptions : removed call to org/apache/commons/cli/Option::setArgs → SURVIVED
      option.setArgs(1);
178 1 1. buildOptions : removed call to org/apache/commons/cli/Option::setDescription → SURVIVED
      option.setDescription("specify a file to which a compiled standard midi file is output.");
179
      options.addOption(option);
180
    }
181
    // bar filter
182
    {
183
      OptionBuilder.withLongOpt("bars");
184
      Option option = OptionBuilder.create();
185 1 1. buildOptions : removed call to org/apache/commons/cli/Option::setArgs → SURVIVED
      option.setArgs(1);
186 1 1. buildOptions : removed call to org/apache/commons/cli/Option::setDescription → SURVIVED
      option.setDescription("specify a filter for bars. bars any of whose labels matches with a given regex will be processed.");
187
      options.addOption(option);
188
    }
189
    // part filter
190
    {
191
      OptionBuilder.withLongOpt("parts");
192
      Option option = OptionBuilder.create();
193 1 1. buildOptions : removed call to org/apache/commons/cli/Option::setArgs → SURVIVED
      option.setArgs(1);
194 1 1. buildOptions : removed call to org/apache/commons/cli/Option::setDescription → SURVIVED
      option.setDescription("specify a filter for parts. parts whose name matches with a given regex will be processed.");
195
      options.addOption(option);
196
    }
197 1 1. buildOptions : replaced return value with null for com/github/dakusui/symfonion/cli/Cli::buildOptions → KILLED
    return options;
198
  }
199
200
  static Symfonion createSymfonion() {
201 1 1. createSymfonion : replaced return value with null for com/github/dakusui/symfonion/cli/Cli::createSymfonion → KILLED
    return new Symfonion();
202
  }
203
204
  static CommandLine parseArgs(Options options, String[] args) throws ParseException {
205
    CommandLineParser parser = new GnuParser();
206
207 1 1. parseArgs : replaced return value with null for com/github/dakusui/symfonion/cli/Cli::parseArgs → KILLED
    return parser.parse(options, args);
208
  }
209
210
  static Map<String, Pattern> parseSpecifiedOptionAsPortNamePatterns(CommandLine cmd, String optionName) throws CliException {
211
    Properties           props = cmd.getOptionProperties(optionName);
212
    Map<String, Pattern> ret   = new HashMap<>();
213
    for (Object key : props.keySet()) {
214
      String portName = key.toString();
215
      String p        = props.getProperty(portName);
216
      try {
217
        ret.put(portName, Pattern.compile(p));
218
      } catch (PatternSyntaxException e) {
219
        throw new CliException(composeErrMsgForOption(format("Regular expression '%s' for '%s' isn't valid.", portName, p), optionName, null), e);
220
      }
221
    }
222 1 1. parseSpecifiedOptionAsPortNamePatterns : replaced return value with Collections.emptyMap for com/github/dakusui/symfonion/cli/Cli::parseSpecifiedOptionAsPortNamePatterns → KILLED
    return ret;
223
  }
224
225
  private static void printError(PrintStream ps, Throwable t) {
226
    ps.printf("symfonion: %s%n", t.getMessage());
227
  }
228
229
  /*
230
   * A builder of {@code Cli} class.
231
   *
232
   * It is encouraged to use {@link Cli#cli(String...)} and {@link Builder#$()} method to create an instance of this `Builder`
233
   * class and the product class `Cli`.
234
   *
235
   * That is,
236
   *
237
   * //@formatter:off
238
   * [source, java]
239
   * ----
240
   * class Example {
241
   *   void example() {
242
   *     Cli cli = cli("-x", "song.json").chain()
243
   *                                     .some()
244
   *                                     .methods()
245
   *                                     .$()
246
   *     cli.invoke();
247
   *   }
248
   * }
249
   * ----
250
   * //@formatter:on
251
   */
252
  public static class Builder {
253
    private final String[]             args;
254
    private       File                 source;
255
    private       File                 sink                 = new File("target/a.midi");
256
    private       MidiRouteRequest     routeRequest         = null;
257
    private       Map<String, Pattern> midiInRegexPatterns  = new HashMap<>();
258
    private       Map<String, Pattern> midiOutRegexPatterns = new HashMap<>();
259
260
    /**
261
     * Creates an object of this class.
262
     * @param args Command line arguments.
263
     */
264
    public Builder(String... args) {
265
      this.args = args;
266
    }
267
268
    /*
269
     * A synonym for {@link Builder#build()}.
270
     *
271
     * Prefer this method over `build` for readability's sake.
272
     *
273
     * @return A new `Cli` object.
274
     * @throws ParseException Failed to parse commandline arguments based on the specification of this application.
275
     * @see Builder#build()
276
     * @see Builder#Builder(String... args)
277
     */
278
    public Cli $() throws ParseException {
279 1 1. $ : replaced return value with null for com/github/dakusui/symfonion/cli/Cli$Builder::$ → KILLED
      return build();
280
    }
281
282
    /**
283
     * Builds a `Cli` object.
284
     *
285
     * @return A new `Cli` object built from values given to this builder.
286
     * @throws ParseException Failed to parse the given arguments.
287
     *
288
     * @see Cli
289
     */
290
    public Cli build() throws ParseException {
291
      Options     options = buildOptions();
292
      CommandLine cmd     = parseArgs(options, args);
293 1 1. build : negated conditional → KILLED
      if (cmd.hasOption('O')) {
294
        this.midiOutRegexPatterns = parseSpecifiedOptionAsPortNamePatterns(cmd, "O");
295
      }
296 1 1. build : negated conditional → KILLED
      if (cmd.hasOption('I')) {
297
        this.midiInRegexPatterns = parseSpecifiedOptionAsPortNamePatterns(cmd, "I");
298
      }
299 1 1. build : negated conditional → KILLED
      if (cmd.hasOption('o')) {
300
        this.sink = new File(getSingleOptionValueFromCommandLine(cmd, "o"));
301
      }
302
      Subcommand subcommand;
303 2 1. build : negated conditional → KILLED
2. build : negated conditional → KILLED
      if (cmd.hasOption("V") || cmd.hasOption("version")) {
304
        subcommand = PresetSubcommand.VERSION;
305 2 1. build : negated conditional → KILLED
2. build : negated conditional → KILLED
      } else if (cmd.hasOption("h") || cmd.hasOption("help")) {
306
        subcommand = PresetSubcommand.HELP;
307 2 1. build : negated conditional → KILLED
2. build : negated conditional → KILLED
      } else if (cmd.hasOption("l") || cmd.hasOption("list")) {
308
        subcommand = PresetSubcommand.LIST;
309 2 1. build : negated conditional → KILLED
2. build : negated conditional → KILLED
      } else if (cmd.hasOption("p") || cmd.hasOption("play")) {
310
        subcommand  = PresetSubcommand.PLAY;
311
        this.source = new File(getSingleOptionValueFromCommandLine(cmd, "p"));
312 2 1. build : negated conditional → KILLED
2. build : negated conditional → KILLED
      } else if (cmd.hasOption("q") || cmd.hasOption("play-song")) {
313
        subcommand  = PresetSubcommand.PLAY_SONG;
314
        this.source = new File(getSingleOptionValueFromCommandLine(cmd, "q"));
315 2 1. build : negated conditional → KILLED
2. build : negated conditional → KILLED
      } else if (cmd.hasOption("c") || cmd.hasOption("compile")) {
316
        subcommand  = PresetSubcommand.COMPILE;
317
        this.source = new File(getSingleOptionValueFromCommandLine(cmd, "c"));
318 2 1. build : negated conditional → KILLED
2. build : negated conditional → KILLED
      } else if (cmd.hasOption("x") || cmd.hasOption("compile-song")) {
319
        subcommand  = PresetSubcommand.COMPILE_SONG;
320
        this.source = new File(getSingleOptionValueFromCommandLine(cmd, "x"));
321 2 1. build : negated conditional → KILLED
2. build : negated conditional → KILLED
      } else if (cmd.hasOption("r") || cmd.hasOption("route")) {
322
        subcommand = PresetSubcommand.ROUTE;
323
        Properties props = cmd.getOptionProperties("r");
324 1 1. build : negated conditional → KILLED
        if (props.size() != 1) {
325
          throw new CliException(composeErrMsgForOption("Route information is not given or specified multiple times.", "r", "route"));
326
        }
327
        this.routeRequest = new MidiRouteRequest(cmd.getOptionValues('r')[0], cmd.getOptionValues('r')[1]);
328
      } else {
329
        @SuppressWarnings("unchecked")
330
        List<String> leftovers = cmd.getArgList();
331 1 1. build : negated conditional → KILLED
        if (leftovers.isEmpty()) {
332
          subcommand = PresetSubcommand.HELP;
333 1 1. build : negated conditional → NO_COVERAGE
        } else if (leftovers.size() == 1) {
334
          subcommand  = PresetSubcommand.PLAY;
335
          this.source = new File(leftovers.getFirst());
336
        } else {
337
          throw new CliException(CliUtils.composeErrMsgForShortOption(format("Unrecognized arguments:%s", leftovers.subList(2, leftovers.size())), "-"));
338
        }
339
      }
340
      Predicate<Bar> barFilter = Predicates.alwaysTrue();
341 2 1. build : negated conditional → NO_COVERAGE
2. build : negated conditional → KILLED
      if (cmd.hasOption("bars") && !Objects.equals("*", cmd.getOptionValue("bars")))
342 4 1. lambda$build$0 : replaced boolean return with false for com/github/dakusui/symfonion/cli/Cli$Builder::lambda$build$0 → NO_COVERAGE
2. lambda$build$1 : replaced boolean return with false for com/github/dakusui/symfonion/cli/Cli$Builder::lambda$build$1 → NO_COVERAGE
3. lambda$build$1 : replaced boolean return with true for com/github/dakusui/symfonion/cli/Cli$Builder::lambda$build$1 → NO_COVERAGE
4. lambda$build$0 : replaced boolean return with true for com/github/dakusui/symfonion/cli/Cli$Builder::lambda$build$0 → NO_COVERAGE
        barFilter = bar -> bar.labels().stream().anyMatch(l -> l.matches(cmd.getOptionValue("bars")));
343
      Predicate<Measure> measureFilter = Predicates.alwaysTrue();
344 2 1. build : negated conditional → SURVIVED
2. build : negated conditional → NO_COVERAGE
      if (cmd.hasOption("ms") && !Objects.equals("*", cmd.getOptionValue("ms")))
345 4 1. lambda$build$3 : replaced boolean return with false for com/github/dakusui/symfonion/cli/Cli$Builder::lambda$build$3 → NO_COVERAGE
2. lambda$build$3 : replaced boolean return with true for com/github/dakusui/symfonion/cli/Cli$Builder::lambda$build$3 → NO_COVERAGE
3. lambda$build$2 : replaced boolean return with true for com/github/dakusui/symfonion/cli/Cli$Builder::lambda$build$2 → NO_COVERAGE
4. lambda$build$2 : replaced boolean return with false for com/github/dakusui/symfonion/cli/Cli$Builder::lambda$build$2 → NO_COVERAGE
        measureFilter = measure -> measure.labels().stream().anyMatch(l -> l.matches(cmd.getOptionValue("ms")));
346
      Predicate<String> partFilter = Predicates.alwaysTrue();
347 2 1. build : negated conditional → NO_COVERAGE
2. build : negated conditional → KILLED
      if (cmd.hasOption("parts") && !Objects.equals("*", cmd.getOptionValue("parts")))
348 3 1. lambda$build$4 : replaced boolean return with true for com/github/dakusui/symfonion/cli/Cli$Builder::lambda$build$4 → NO_COVERAGE
2. lambda$build$4 : negated conditional → NO_COVERAGE
3. lambda$build$4 : negated conditional → NO_COVERAGE
        partFilter = partName -> partName != null && partName.matches(cmd.getOptionValue("parts"));
349 1 1. build : replaced return value with null for com/github/dakusui/symfonion/cli/Cli$Builder::build → KILLED
      return new Cli(subcommand, source, sink, routeRequest, midiInRegexPatterns, midiOutRegexPatterns, barFilter, measureFilter, partFilter, options, createSymfonion());
350
    }
351
  }
352
}

Mutations

75

1.1
Location : invoke
Killed by : com.github.dakusui.symfonion.tests.MalformedTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.MalformedTest]/[method:givenMalformed_emptyFile()]
removed call to com/github/dakusui/symfonion/cli/Subcommand::invoke → KILLED

89

1.1
Location : invoke
Killed by : com.github.dakusui.symfonion.tests.MalformedTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.MalformedTest]/[method:givenMalformed_emptyFile()]
removed call to com/github/dakusui/symfonion/cli/Cli::invoke → KILLED

92

1.1
Location : invoke
Killed by : com.github.dakusui.symfonion.cli.CliTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.cli.CliTest]/[method:givenUnrecognizedOption_whenInvoke_thenExitCode1()]
removed call to com/github/dakusui/symfonion/cli/Cli::printError → KILLED

95

1.1
Location : invoke
Killed by : none
removed call to com/github/dakusui/symfonion/cli/Cli::printError → NO_COVERAGE

98

1.1
Location : invoke
Killed by : com.github.dakusui.symfonion.tests.MalformedTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.MalformedTest]/[method:givenMalformed_emptyFile()]
removed call to com/github/dakusui/symfonion/cli/Cli::printError → KILLED

101

1.1
Location : invoke
Killed by : none
removed call to java/io/IOException::printStackTrace → NO_COVERAGE

104

1.1
Location : invoke
Killed by : com.github.dakusui.symfonion.tests.InvalidJsonErrorTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.InvalidJsonErrorTest]/[method:missingSection_parts()]
removed call to java/lang/Exception::printStackTrace → KILLED

107

1.1
Location : invoke
Killed by : com.github.dakusui.symfonion.cli.CliTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.cli.CliTest]/[method:givenUnrecognizedOption_whenInvoke_thenExitCode1()]
replaced int return with 0 for com/github/dakusui/symfonion/cli/Cli::invoke → KILLED

118

1.1
Location : cli
Killed by : com.github.dakusui.symfonion.cli.CliTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.cli.CliTest]/[method:givenUnrecognizedOption_whenInvoke_thenExitCode1()]
replaced return value with null for com/github/dakusui/symfonion/cli/Cli::cli → KILLED

127

1.1
Location : main
Killed by : none
removed call to java/lang/System::exit → NO_COVERAGE

152

1.1
Location : buildOptions
Killed by : none
removed call to org/apache/commons/cli/Option::setLongOpt → SURVIVED
Covering tests

153

1.1
Location : buildOptions
Killed by : com.github.dakusui.symfonion.tests.cli.subcommands.PatchBayTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.cli.subcommands.PatchBayTest]/[method:whenPatchBay_thenOutputLooksOk()]
removed call to org/apache/commons/cli/Option::setValueSeparator → KILLED

154

1.1
Location : buildOptions
Killed by : com.github.dakusui.symfonion.tests.cli.subcommands.PatchBayTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.cli.subcommands.PatchBayTest]/[method:whenPatchBay_thenOutputLooksOk()]
removed call to org/apache/commons/cli/Option::setArgs → KILLED

155

1.1
Location : buildOptions
Killed by : none
removed call to org/apache/commons/cli/Option::setDescription → SURVIVED
Covering tests

163

1.1
Location : buildOptions
Killed by : com.github.dakusui.symfonion.tests.CliTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.CliTest]/[method:outportOption_02()]
removed call to org/apache/commons/cli/Option::setValueSeparator → KILLED

164

1.1
Location : buildOptions
Killed by : com.github.dakusui.symfonion.tests.CliTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.CliTest]/[method:outportOption_02()]
removed call to org/apache/commons/cli/Option::setArgs → KILLED

165

1.1
Location : buildOptions
Killed by : none
removed call to org/apache/commons/cli/Option::setDescription → SURVIVED
Covering tests

170

1.1
Location : buildOptions
Killed by : com.github.dakusui.symfonion.tests.CliTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.CliTest]/[method:inportOption_02()]
removed call to org/apache/commons/cli/Option::setValueSeparator → KILLED

171

1.1
Location : buildOptions
Killed by : com.github.dakusui.symfonion.cli.CliTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.cli.CliTest]/[method:givenInvalidDevicePatterns_whenParseSpecifiedOptions_thenErrorThrown()]
removed call to org/apache/commons/cli/Option::setArgs → KILLED

172

1.1
Location : buildOptions
Killed by : none
removed call to org/apache/commons/cli/Option::setDescription → SURVIVED
Covering tests

177

1.1
Location : buildOptions
Killed by : none
removed call to org/apache/commons/cli/Option::setArgs → SURVIVED
Covering tests

178

1.1
Location : buildOptions
Killed by : none
removed call to org/apache/commons/cli/Option::setDescription → SURVIVED
Covering tests

185

1.1
Location : buildOptions
Killed by : none
removed call to org/apache/commons/cli/Option::setArgs → SURVIVED
Covering tests

186

1.1
Location : buildOptions
Killed by : none
removed call to org/apache/commons/cli/Option::setDescription → SURVIVED
Covering tests

193

1.1
Location : buildOptions
Killed by : none
removed call to org/apache/commons/cli/Option::setArgs → SURVIVED
Covering tests

194

1.1
Location : buildOptions
Killed by : none
removed call to org/apache/commons/cli/Option::setDescription → SURVIVED
Covering tests

197

1.1
Location : buildOptions
Killed by : com.github.dakusui.symfonion.cli.CliTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.cli.CliTest]/[method:givenValidDevicePatterns_whenParseSpecifiedOptions_thenParsed()]
replaced return value with null for com/github/dakusui/symfonion/cli/Cli::buildOptions → KILLED

201

1.1
Location : createSymfonion
Killed by : com.github.dakusui.symfonion.tests.InvalidJsonErrorTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.InvalidJsonErrorTest]/[method:invalid_array()]
replaced return value with null for com/github/dakusui/symfonion/cli/Cli::createSymfonion → KILLED

207

1.1
Location : parseArgs
Killed by : com.github.dakusui.symfonion.cli.CliTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.cli.CliTest]/[method:givenValidDevicePatterns_whenParseSpecifiedOptions_thenParsed()]
replaced return value with null for com/github/dakusui/symfonion/cli/Cli::parseArgs → KILLED

222

1.1
Location : parseSpecifiedOptionAsPortNamePatterns
Killed by : com.github.dakusui.symfonion.tests.CliTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.CliTest]/[method:inportOption_02()]
replaced return value with Collections.emptyMap for com/github/dakusui/symfonion/cli/Cli::parseSpecifiedOptionAsPortNamePatterns → KILLED

279

1.1
Location : $
Killed by : com.github.dakusui.symfonion.tests.MalformedTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.MalformedTest]/[method:givenMalformed_emptyFile()]
replaced return value with null for com/github/dakusui/symfonion/cli/Cli$Builder::$ → KILLED

293

1.1
Location : build
Killed by : com.github.dakusui.symfonion.tests.CliTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.CliTest]/[method:outportOption_02()]
negated conditional → KILLED

296

1.1
Location : build
Killed by : com.github.dakusui.symfonion.tests.CliTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.CliTest]/[method:inportOption_02()]
negated conditional → KILLED

299

1.1
Location : build
Killed by : com.github.dakusui.symfonion.tests.CliTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.CliTest]/[method:help_01()]
negated conditional → KILLED

303

1.1
Location : build
Killed by : com.github.dakusui.symfonion.tests.CliTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.CliTest]/[method:help_01()]
negated conditional → KILLED

2.2
Location : build
Killed by : com.github.dakusui.symfonion.tests.CliTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.CliTest]/[method:help_01()]
negated conditional → KILLED

305

1.1
Location : build
Killed by : com.github.dakusui.symfonion.tests.CliTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.CliTest]/[method:compile_01()]
negated conditional → KILLED

2.2
Location : build
Killed by : com.github.dakusui.symfonion.tests.CliTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.CliTest]/[method:compile_01()]
negated conditional → KILLED

307

1.1
Location : build
Killed by : com.github.dakusui.symfonion.tests.CliTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.CliTest]/[method:compile_01()]
negated conditional → KILLED

2.2
Location : build
Killed by : com.github.dakusui.symfonion.tests.CliTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.CliTest]/[method:compile_01()]
negated conditional → KILLED

309

1.1
Location : build
Killed by : com.github.dakusui.symfonion.tests.CliTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.CliTest]/[method:compile_01()]
negated conditional → KILLED

2.2
Location : build
Killed by : com.github.dakusui.symfonion.tests.CliTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.CliTest]/[method:compile_01()]
negated conditional → KILLED

312

1.1
Location : build
Killed by : com.github.dakusui.symfonion.tests.CliTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.CliTest]/[method:compile_01()]
negated conditional → KILLED

2.2
Location : build
Killed by : com.github.dakusui.symfonion.tests.CliTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.CliTest]/[method:compile_01()]
negated conditional → KILLED

315

1.1
Location : build
Killed by : com.github.dakusui.symfonion.tests.CliTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.CliTest]/[method:compile_01()]
negated conditional → KILLED

2.2
Location : build
Killed by : com.github.dakusui.symfonion.tests.CliTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.CliTest]/[method:compile_01()]
negated conditional → KILLED

318

1.1
Location : build
Killed by : com.github.dakusui.symfonion.tests.cli.subcommands.VersionTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.cli.subcommands.VersionTest]/[method:whenExecuteVersion_thenWorksFind()]
negated conditional → KILLED

2.2
Location : build
Killed by : com.github.dakusui.symfonion.tests.cli.subcommands.VersionTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.cli.subcommands.VersionTest]/[method:whenExecuteVersion_thenWorksFind()]
negated conditional → KILLED

321

1.1
Location : build
Killed by : com.github.dakusui.symfonion.tests.cli.subcommands.VersionTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.cli.subcommands.VersionTest]/[method:whenExecuteVersion_thenWorksFind()]
negated conditional → KILLED

2.2
Location : build
Killed by : com.github.dakusui.symfonion.tests.cli.subcommands.VersionTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.cli.subcommands.VersionTest]/[method:whenExecuteVersion_thenWorksFind()]
negated conditional → KILLED

324

1.1
Location : build
Killed by : com.github.dakusui.symfonion.tests.cli.subcommands.PatchBayTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.cli.subcommands.PatchBayTest]/[method:whenPatchBay_thenOutputLooksOk()]
negated conditional → KILLED

331

1.1
Location : build
Killed by : com.github.dakusui.symfonion.tests.cli.subcommands.VersionTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.cli.subcommands.VersionTest]/[method:whenExecuteVersion_thenWorksFind()]
negated conditional → KILLED

333

1.1
Location : build
Killed by : none
negated conditional → NO_COVERAGE

341

1.1
Location : build
Killed by : none
negated conditional → NO_COVERAGE

2.2
Location : build
Killed by : com.github.dakusui.symfonion.tests.InvalidJsonErrorTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.InvalidJsonErrorTest]/[method:missingSection_parts()]
negated conditional → KILLED

342

1.1
Location : lambda$build$0
Killed by : none
replaced boolean return with false for com/github/dakusui/symfonion/cli/Cli$Builder::lambda$build$0 → NO_COVERAGE

2.2
Location : lambda$build$1
Killed by : none
replaced boolean return with false for com/github/dakusui/symfonion/cli/Cli$Builder::lambda$build$1 → NO_COVERAGE

3.3
Location : lambda$build$1
Killed by : none
replaced boolean return with true for com/github/dakusui/symfonion/cli/Cli$Builder::lambda$build$1 → NO_COVERAGE

4.4
Location : lambda$build$0
Killed by : none
replaced boolean return with true for com/github/dakusui/symfonion/cli/Cli$Builder::lambda$build$0 → NO_COVERAGE

344

1.1
Location : build
Killed by : none
negated conditional → SURVIVED
Covering tests

2.2
Location : build
Killed by : none
negated conditional → NO_COVERAGE

345

1.1
Location : lambda$build$3
Killed by : none
replaced boolean return with false for com/github/dakusui/symfonion/cli/Cli$Builder::lambda$build$3 → NO_COVERAGE

2.2
Location : lambda$build$3
Killed by : none
replaced boolean return with true for com/github/dakusui/symfonion/cli/Cli$Builder::lambda$build$3 → NO_COVERAGE

3.3
Location : lambda$build$2
Killed by : none
replaced boolean return with true for com/github/dakusui/symfonion/cli/Cli$Builder::lambda$build$2 → NO_COVERAGE

4.4
Location : lambda$build$2
Killed by : none
replaced boolean return with false for com/github/dakusui/symfonion/cli/Cli$Builder::lambda$build$2 → NO_COVERAGE

347

1.1
Location : build
Killed by : com.github.dakusui.symfonion.tests.ReferenceErrorTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.ReferenceErrorTest]/[method:missingNoteMap()]
negated conditional → KILLED

2.2
Location : build
Killed by : none
negated conditional → NO_COVERAGE

348

1.1
Location : lambda$build$4
Killed by : none
replaced boolean return with true for com/github/dakusui/symfonion/cli/Cli$Builder::lambda$build$4 → NO_COVERAGE

2.2
Location : lambda$build$4
Killed by : none
negated conditional → NO_COVERAGE

3.3
Location : lambda$build$4
Killed by : none
negated conditional → NO_COVERAGE

349

1.1
Location : build
Killed by : com.github.dakusui.symfonion.tests.CliTest.[engine:junit-jupiter]/[class:com.github.dakusui.symfonion.tests.CliTest]/[method:help_01()]
replaced return value with null for com/github/dakusui/symfonion/cli/Cli$Builder::build → KILLED

Active mutators

Tests examined


Report generated by PIT 1.19.1