anchor.diff:  -type ct_groupname() :: atom().
   -type ct_config() :: [{atom(), term()}].
   -type ct_status() :: ok | skipped | failed.
  --type ct_group_props() :: [term()].
  +-type ct_group_props() :: [parallel | sequence | ct_shuffle() | {ct_group_repeat_type(), ct_test_repeat()}] | default.
  +-type ct_shuffle() :: shuffle | {shuffle, ct_shuffle_seed()}.
  +-type ct_shuffle_seed() :: {integer(), integer(), integer()}.
  +-type ct_group_repeat_type() ::
  +        repeat
  +      | repeat_until_all_ok
  +      | repeat_until_all_fail
  +      | repeat_until_any_ok
  +      | repeat_until_any_fail.
  +-type ct_test_repeat() ::
  +        integer()
  +      | forever.
   -type ct_groupdef() ::
           {ct_groupname(), ct_group_props(),
  -         [ct_testname() | ct_groupdef() | {group,ct_groupname()}]}.
  +         [ct_testname() | ct_groupdef() | {group, ct_groupname()} | ct_testcase_ref()]}.
   -type ct_subgroups() ::
           {ct_groupname(), ct_group_props()}
         | {ct_groupname(), ct_group_props(), ct_subgroups()}.
  
positive.code:         {group, ct_groupname()}
        | {group, ct_groupname(), ct_group_props()}
        | {group, ct_groupname(), ct_group_props(), ct_subgroups()}.
  
  -callback all() -> [ct_testname() | ct_groupref()]
                   | {skip, Reason::term()}.
  
  -callback groups() -> [ct_groupdef()].
  
  -callback suite() -> [tuple()].
  
  -callback init_per_suite(ct_config()) ->
    NewConfig::ct_config() | {skip,Reason::term()}
  
negative.code: -callback end_per_suite(ct_config()) ->
    term() | {save_config,ct_config()}.
  
  -callback group(ct_groupname()) -> [ct_group_info()].
  
  -callback init_per_group(ct_groupname(), ct_config()) ->
    NewConfig::ct_config() | {skip,Reason::term()}.
  