anchor.diff:  -callback end_per_suite(ct_config()) ->
     term() | {save_config,ct_config()}.
   
  --callback group(ct_groupname()) -> [tuple()].
  +-callback group(ct_groupname()) -> [ct_group_info()].
   
   -callback init_per_group(ct_groupname(), ct_config()) ->
     NewConfig::ct_config() | {skip,Reason::term()}.
  
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: -type ct_groupname() :: atom().
  -type ct_config() :: [{atom(), term()}].
  -type ct_status() :: ok | skipped | failed.
  -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_testcase_ref()]}.
  -type ct_subgroups() ::
          {ct_groupname(), ct_group_props()}
        | {ct_groupname(), ct_group_props(), ct_subgroups()}.
  