END_TEST


START_TEST (detect_smart_no)
{
    OSyncError *error = NULL;

    OSyncFormatEnv *env = osync_format_env_new(&error);
    fail_unless(error == NULL);

    OSyncObjFormat *format1 = osync_objformat_new("Format1", "Type1", &error);
    OSyncObjFormat *format2 = osync_objformat_new("Format2", "Type1", &error);
    fail_unless(error == NULL);

    OSyncFormatConverter *conv = osync_converter_new_detector(format2, format1, detect_false, &error);
    fail_unless(error == NULL);

    osync_format_env_register_converter(env, conv, &error);

    mark_point();

    OSyncData *data = osync_data_new("test", 5, format2, &error);
    fail_unless(error == NULL);

    OSyncObjFormat *result = osync_format_env_detect_objformat(env, data);
    fail_unless(!result);
    fail_unless(osync_data_get_objformat(data) == format2);

    osync_data_unref(data);
    osync_format_env_unref(env);
}
OSyncObjFormat *osync_format_env_detect_objformat_full(OSyncFormatEnv *env, OSyncData *input, OSyncError **error)
{
  OSyncObjFormat *detected_format = NULL;
  OSyncData *new_data = NULL;
  GList *d = NULL;
	
  osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, env, input, error);
	
  /* Make a copy of the data */
  new_data = osync_data_clone(input, error);
  if (!new_data)
    goto error;

  /* Detect the format while DECAP the change as far as possible.
     Each DECAP triggers a new detection.
  */
  while (TRUE) {
    OSyncFormatConverter *converter = NULL;
    if ((detected_format = osync_format_env_detect_objformat(env, new_data))) {
      /* We detected the format. So we replace the original format. */
      osync_data_set_objformat(new_data, detected_format);
    } else
      detected_format = osync_data_get_objformat(new_data);
    /* Try to decap the change */
    for (d = env->converters; d; d = d->next) {
      converter = d->data;
      if (osync_converter_matches(converter, new_data) && osync_converter_get_type(converter) == OSYNC_CONVERTER_DECAP) {
        /* Run the decap */
        if (!osync_converter_invoke(converter, new_data, NULL, error)) {
          osync_error_set(error, OSYNC_ERROR_GENERIC, "Unable to decap the change");
          goto error_free_data;
        }
				
        break;
      } else
        converter = NULL;
    }
		
    /* We couldnt find a decap, so we quit. */
    if (!converter)
      break;
  }
  osync_data_unref(new_data);
	
  osync_trace(TRACE_EXIT, "%s: %p", __func__, detected_format);
  return detected_format;

 error_free_data:
  osync_data_unref(new_data);
 error:
  osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error));
  return NULL;
}