anchor.diff:  transform_opts([{group, Group}|Rest], Acc) -> % @TODO handle ""
       % Input is a list or an atom. It can also be a nested list.
       transform_opts(Rest, [{group, parse_term(Group)}|Acc]);
  +transform_opts([{suite, Suite}|Rest], Acc) ->
  +    transform_opts(Rest, [{suite, split_string(Suite)}|Acc]);
   transform_opts([{Key, Val}|Rest], Acc) when is_list(Val) ->
       % Default to splitting a string on comma, that works fine for both flat
       % lists of which there are many and single-items.
  
positive.code:     CTFirst = rebar_state:get(State, ct_first_files, []),
      {erl_first_files, CTFirst}.
  
  resolve_ct_opts(State, CmdLineOpts) ->
      CTOpts = rebar_state:get(State, ct_opts, []),
      Opts = lists:ukeymerge(1,
                      lists:ukeysort(1, CmdLineOpts),
                      lists:ukeysort(1, CTOpts)),
      %% disable `auto_compile` and remove `dir` from the opts
      [{auto_compile, false}|lists:keydelete(dir, 1, Opts)].
  
  compile_tests(State, TestApps, InDirs) ->
      F = fun(AppInfo) ->
  
negative.code: format_error({failures_running_tests, FailedCount}) ->
      io_lib:format("Failures occured running tests: ~p", [FailedCount]);
  format_error({error_running_tests, Reason}) ->
      io_lib:format("Error running tests: ~p", [Reason]);
  format_error({error_processing_options, Reason}) ->
      io_lib:format("Error processing options: ~p", [Reason]).
  
  run_test(CTOpts, true) ->
      handle_results(ct:run_test(CTOpts));
  