Пример #1
0
void
test_near_geo_point(gpointer data)
{
  grn_id id;
  int offset, limit;
  const GList *expected_keys;
  GList *actual_keys = NULL;
  grn_table_sort_key keys[2];
  grn_obj base, base_string, location;

  create_geo_table(cut_take_printf(" [\"%s\"],\n"
                                   " [\"%s\"],\n"
                                   " [\"%s\"],\n"
                                   " [\"%s\"],\n"
                                   " [\"%s\"],\n"
                                   " [\"%s\"],\n"
                                   " [\"%s\"],\n"
                                   " [\"%s\"],\n"
                                   " [\"%s\"],\n"
                                   " [\"%s\"],\n"
                                   " [\"%s\"],\n"
                                   " [\"%s\"],\n"
                                   " [\"%s\"],\n"
                                   " [\"%s\"],\n"
                                   " [\"%s\"]",
                                   TAKEN_POINT(0, 0, 0,
                                               180, 0, 0),
                                   TAKEN_POINT(0, 0, 0,
                                               -179, -59, -59),
                                   TAKEN_POINT(-1, -1, -1,
                                               180, 0, 0),
                                   TAKEN_POINT(2, 1, 1,
                                               180, 0, 0),
                                   TAKEN_POINT(-2, -1, -1,
                                               -179, -59, -59),
                                   TAKEN_POINT(1, 2, 1,
                                               -179, -59, -59),
                                   TAKEN_POINT(90, 0, 0,
                                               0, 0, 0),
                                   TAKEN_POINT(-90, 0, 0,
                                               1, 0, 0),
                                   TAKEN_POINT(1, 0, 0,
                                               1, 0, 0),
                                   TAKEN_POINT(1, 1, 0,
                                               1, 1, 0),
                                   TAKEN_POINT(1, 1, 1,
                                               1, 1, 1),
                                   TAKEN_POINT(-1, 0, 0,
                                               1, 1, 1),
                                   TAKEN_POINT(-1, -1, -1,
                                               0, 0, 0),
                                   TAKEN_POINT(-1, -2, -1,
                                               -1, -1, -1),
                                   TAKEN_POINT(1, 1, 10,
                                               -1, -1, -1)));

  result = grn_table_create(context, NULL, 0, NULL, GRN_TABLE_NO_KEY,
                            NULL, table);
  grn_test_assert_context(context);

  GRN_TEXT_INIT(&base_string, 0);
  GRN_TEXT_SETS(context, &base_string, gcut_data_get_string(data, "base"));
  GRN_WGS84_GEO_POINT_INIT(&base, 0);
  grn_obj_cast(context, &base_string, &base, FALSE);
  GRN_OBJ_FIN(context, &base_string);

  offset = gcut_data_get_int(data, "offset");
  if (offset > 0) {
    cut_omit("geo sort doesn't support offset yet.");
  }
  limit = gcut_data_get_int(data, "limit");
  keys[0].key = column;
  keys[0].flags = GRN_TABLE_SORT_GEO;
  keys[0].offset = 0;
  keys[1].key = &base;
  keys[1].flags = 0;
  keys[1].offset = 0;
  grn_table_sort(context, table, offset, limit, result, keys, 2);
  GRN_OBJ_FIN(context, &base);
  grn_test_assert_context(context);
  cursor = grn_table_cursor_open(context, result,
                                 NULL, 0, NULL, 0, 0, -1,
                                 GRN_CURSOR_ASCENDING);
  grn_test_assert_context(context);
  GRN_WGS84_GEO_POINT_INIT(&location, 0);
  while ((id = grn_table_cursor_next(context, cursor))) {
    gint32 *key;
    int key_size;
    gint latitude, longitude;

    key_size = grn_table_cursor_get_value(context, cursor, (void **)&key);
    GRN_BULK_REWIND(&location);
    grn_obj_get_value(context, column, *key, &location);
    GRN_GEO_POINT_VALUE(&location, latitude, longitude);
    actual_keys = g_list_append(actual_keys,
                                inspect_point(latitude, longitude));
  }
  GRN_OBJ_FIN(context, &location);
  gcut_take_list(actual_keys, g_free);

  expected_keys = gcut_data_get_pointer(data, "expected");
  gcut_assert_equal_list_string(expected_keys, actual_keys);
}
Пример #2
0
void
data_text_otoj(void)
{
#define ADD_DATUM(label, expected, type, ...)                   \
  gcut_add_datum(label,                                         \
                 "expected", G_TYPE_STRING, expected,           \
                 "type", G_TYPE_INT, type,                      \
                 __VA_ARGS__);

  ADD_DATUM("Void", "", GRN_DB_VOID, NULL);
  ADD_DATUM("Bool", "true", GRN_DB_BOOL,
            "value", G_TYPE_BOOLEAN, TRUE,
            NULL);
  ADD_DATUM("Bool", "false", GRN_DB_BOOL,
            "value", G_TYPE_BOOLEAN, FALSE,
            NULL);
  ADD_DATUM("Int8 (min)", cut_take_printf("%d", INT8_MIN), GRN_DB_INT8,
            "value", G_TYPE_INT, INT8_MIN,
            NULL);
  ADD_DATUM("Int8 (max)", cut_take_printf("%d", INT8_MAX), GRN_DB_INT8,
            "value", G_TYPE_INT, INT8_MAX,
            NULL);
  ADD_DATUM("UInt8 (min)", "0", GRN_DB_UINT8,
            "value", G_TYPE_UINT, 0,
            NULL);
  ADD_DATUM("UInt8 (max)", cut_take_printf("%u", UINT8_MAX), GRN_DB_UINT8,
            "value", G_TYPE_UINT, UINT8_MAX,
            NULL);
  ADD_DATUM("Int16 (min)", cut_take_printf("%d", INT16_MIN), GRN_DB_INT16,
            "value", G_TYPE_INT, INT16_MIN,
            NULL);
  ADD_DATUM("Int16 (max)", cut_take_printf("%d", INT16_MAX), GRN_DB_INT16,
            "value", G_TYPE_INT, INT16_MAX,
            NULL);
  ADD_DATUM("UInt16 (min)", "0", GRN_DB_UINT16,
            "value", G_TYPE_UINT, 0,
            NULL);
  ADD_DATUM("UInt16 (max)", cut_take_printf("%u", UINT16_MAX), GRN_DB_UINT16,
            "value", G_TYPE_UINT, UINT16_MAX,
            NULL);
  ADD_DATUM("Int32 (min)", cut_take_printf("%d", INT32_MIN), GRN_DB_INT32,
            "value", G_TYPE_INT, INT32_MIN,
            NULL);
  ADD_DATUM("Int32 (max)", cut_take_printf("%d", INT32_MAX), GRN_DB_INT32,
            "value", G_TYPE_INT, INT32_MAX,
            NULL);
  ADD_DATUM("UInt32 (min)", "0", GRN_DB_UINT32,
            "value", G_TYPE_UINT, 0,
            NULL);
  ADD_DATUM("UInt32 (max)", cut_take_printf("%u", UINT32_MAX), GRN_DB_UINT32,
            "value", G_TYPE_UINT, UINT32_MAX,
            NULL);
  ADD_DATUM("Int64 (min)",
            cut_take_printf("%" G_GINT64_FORMAT, INT64_MIN), GRN_DB_INT64,
            "value", G_TYPE_INT64, INT64_MIN,
            NULL);
  ADD_DATUM("Int64 (max)",
            cut_take_printf("%" G_GINT64_FORMAT, INT64_MAX), GRN_DB_INT64,
            "value", G_TYPE_INT64, INT64_MAX,
            NULL);
  ADD_DATUM("UInt64 (min)", "0", GRN_DB_UINT64,
            "value", G_TYPE_UINT64, G_GUINT64_CONSTANT(0),
            NULL);
  ADD_DATUM("UInt64 (max)",
            cut_take_printf("%" G_GUINT64_FORMAT, UINT64_MAX), GRN_DB_UINT64,
            "value", G_TYPE_UINT64, UINT64_MAX,
            NULL);
  ADD_DATUM("Float", cut_take_printf("%g", 2.9), GRN_DB_FLOAT,
            "value", G_TYPE_DOUBLE, 2.9,
            NULL);
  ADD_DATUM("Time", "1271053050.21148", GRN_DB_TIME,
            "value", G_TYPE_INT64, GRN_TIME_PACK(1271053050, 211479),
            NULL);
  ADD_DATUM("ShortText",
            "\"\\\"'\\\\aAzZ09 \\n\\t\\r日本語\"", GRN_DB_SHORT_TEXT,
            "value", G_TYPE_STRING, "\"'\\aAzZ09 \n\t\r日本語",
            NULL);
  ADD_DATUM("Text",
            "\"\\\"'\\\\aAzZ09 \\n\\t\\r日本語\"", GRN_DB_TEXT,
            "value", G_TYPE_STRING, "\"'\\aAzZ09 \n\t\r日本語",
            NULL);
  ADD_DATUM("LongText",
            "\"\\\"'\\\\aAzZ09 \\n\\t\\r日本語\"", GRN_DB_LONG_TEXT,
            "value", G_TYPE_STRING, "\"'\\aAzZ09 \n\t\r日本語",
            NULL);
  ADD_DATUM("TokyoGeoPoint", "\"35681396x139766049\"", GRN_DB_TOKYO_GEO_POINT,
            "latitude", G_TYPE_INT, 35681396,
            "longitude", G_TYPE_INT, 139766049,
            NULL);
  ADD_DATUM("WGS84GeoPoint", "\"36032548x140164867\"", GRN_DB_WGS84_GEO_POINT,
            "latitude", G_TYPE_INT, 36032548,
            "longitude", G_TYPE_INT, 140164867,
            NULL);

  /* FIXME* unknown bulk */
  /* FIXME: GRN_UVECTOR */
  /* FIXME: GRN_VECTOR */
  /* FIXME: table with format */
  /* FIXME: table without format */
  /* FIXME: grn_text_atoj */

#undef ADD_DATUM
}
Пример #3
0
const gchar *
grn_rc_to_string(grn_rc rc)
{
  switch (rc) {
  case GRN_SUCCESS:
    return "GRN_SUCCESS";
  case GRN_END_OF_DATA:
    return "GRN_END_OF_DATA";
  case GRN_UNKNOWN_ERROR:
    return "GRN_UNKNOWN_ERROR";
  case GRN_OPERATION_NOT_PERMITTED:
    return "GRN_OPERATION_NOT_PERMITTED";
  case GRN_NO_SUCH_FILE_OR_DIRECTORY:
    return "GRN_NO_SUCH_FILE_OR_DIRECTORY";
  case GRN_NO_SUCH_PROCESS:
    return "GRN_NO_SUCH_PROCESS";
  case GRN_INTERRUPTED_FUNCTION_CALL:
    return "GRN_INTERRUPTED_FUNCTION_CALL";
  case GRN_INPUT_OUTPUT_ERROR:
    return "GRN_INPUT_OUTPUT_ERROR";
  case GRN_NO_SUCH_DEVICE_OR_ADDRESS:
    return "GRN_NO_SUCH_DEVICE_OR_ADDRESS";
  case GRN_ARG_LIST_TOO_LONG:
    return "GRN_ARG_LIST_TOO_LONG";
  case GRN_EXEC_FORMAT_ERROR:
    return "GRN_EXEC_FORMAT_ERROR";
  case GRN_BAD_FILE_DESCRIPTOR:
    return "GRN_BAD_FILE_DESCRIPTOR";
  case GRN_NO_CHILD_PROCESSES:
    return "GRN_NO_CHILD_PROCESSES";
  case GRN_RESOURCE_TEMPORARILY_UNAVAILABLE:
    return "GRN_RESOURCE_TEMPORARILY_UNAVAILABLE";
  case GRN_NOT_ENOUGH_SPACE:
    return "GRN_NOT_ENOUGH_SPACE";
  case GRN_PERMISSION_DENIED:
    return "GRN_PERMISSION_DENIED";
  case GRN_BAD_ADDRESS:
    return "GRN_BAD_ADDRESS";
  case GRN_RESOURCE_BUSY:
    return "GRN_RESOURCE_BUSY";
  case GRN_FILE_EXISTS:
    return "GRN_FILE_EXISTS";
  case GRN_IMPROPER_LINK:
    return "GRN_IMPROPER_LINK";
  case GRN_NO_SUCH_DEVICE:
    return "GRN_NO_SUCH_DEVICE";
  case GRN_NOT_A_DIRECTORY:
    return "GRN_NOT_A_DIRECTORY";
  case GRN_IS_A_DIRECTORY:
    return "GRN_IS_A_DIRECTORY";
  case GRN_INVALID_ARGUMENT:
    return "GRN_INVALID_ARGUMENT";
  case GRN_TOO_MANY_OPEN_FILES_IN_SYSTEM:
    return "GRN_TOO_MANY_OPEN_FILES_IN_SYSTEM";
  case GRN_TOO_MANY_OPEN_FILES:
    return "GRN_TOO_MANY_OPEN_FILES";
  case GRN_INAPPROPRIATE_I_O_CONTROL_OPERATION:
    return "GRN_INAPPROPRIATE_I_O_CONTROL_OPERATION";
  case GRN_FILE_TOO_LARGE:
    return "GRN_FILE_TOO_LARGE";
  case GRN_NO_SPACE_LEFT_ON_DEVICE:
    return "GRN_NO_SPACE_LEFT_ON_DEVICE";
  case GRN_INVALID_SEEK:
    return "GRN_INVALID_SEEK";
  case GRN_READ_ONLY_FILE_SYSTEM:
    return "GRN_READ_ONLY_FILE_SYSTEM";
  case GRN_TOO_MANY_LINKS:
    return "GRN_TOO_MANY_LINKS";
  case GRN_BROKEN_PIPE:
    return "GRN_BROKEN_PIPE";
  case GRN_DOMAIN_ERROR:
    return "GRN_DOMAIN_ERROR";
  case GRN_RESULT_TOO_LARGE:
    return "GRN_RESULT_TOO_LARGE";
  case GRN_RESOURCE_DEADLOCK_AVOIDED:
    return "GRN_RESOURCE_DEADLOCK_AVOIDED";
  case GRN_NO_MEMORY_AVAILABLE:
    return "GRN_NO_MEMORY_AVAILABLE";
  case GRN_FILENAME_TOO_LONG:
    return "GRN_FILENAME_TOO_LONG";
  case GRN_NO_LOCKS_AVAILABLE:
    return "GRN_NO_LOCKS_AVAILABLE";
  case GRN_FUNCTION_NOT_IMPLEMENTED:
    return "GRN_FUNCTION_NOT_IMPLEMENTED";
  case GRN_DIRECTORY_NOT_EMPTY:
    return "GRN_DIRECTORY_NOT_EMPTY";
  case GRN_ILLEGAL_BYTE_SEQUENCE:
    return "GRN_ILLEGAL_BYTE_SEQUENCE";
  case GRN_SOCKET_NOT_INITIALIZED:
    return "GRN_SOCKET_NOT_INITIALIZED";
  case GRN_OPERATION_WOULD_BLOCK:
    return "GRN_OPERATION_WOULD_BLOCK";
  case GRN_ADDRESS_IS_NOT_AVAILABLE:
    return "GRN_ADDRESS_IS_NOT_AVAILABLE";
  case GRN_NETWORK_IS_DOWN:
    return "GRN_NETWORK_IS_DOWN";
  case GRN_NO_BUFFER:
    return "GRN_NO_BUFFER";
  case GRN_SOCKET_IS_ALREADY_CONNECTED:
    return "GRN_SOCKET_IS_ALREADY_CONNECTED";
  case GRN_SOCKET_IS_NOT_CONNECTED:
    return "GRN_SOCKET_IS_NOT_CONNECTED";
  case GRN_SOCKET_IS_ALREADY_SHUTDOWNED:
    return "GRN_SOCKET_IS_ALREADY_SHUTDOWNED";
  case GRN_OPERATION_TIMEOUT:
    return "GRN_OPERATION_TIMEOUT";
  case GRN_CONNECTION_REFUSED:
    return "GRN_CONNECTION_REFUSED";
  case GRN_RANGE_ERROR:
    return "GRN_RANGE_ERROR";
  case GRN_TOKENIZER_ERROR:
    return "GRN_TOKENIZER_ERROR";
  case GRN_FILE_CORRUPT:
    return "GRN_FILE_CORRUPT";
  case GRN_INVALID_FORMAT:
    return "GRN_INVALID_FORMAT";
  case GRN_OBJECT_CORRUPT:
    return "GRN_OBJECT_CORRUPT";
  case GRN_TOO_MANY_SYMBOLIC_LINKS:
    return "GRN_TOO_MANY_SYMBOLIC_LINKS";
  case GRN_NOT_SOCKET:
    return "GRN_NOT_SOCKET";
  case GRN_OPERATION_NOT_SUPPORTED:
    return "GRN_OPERATION_NOT_SUPPORTED";
  case GRN_ADDRESS_IS_IN_USE:
    return "GRN_ADDRESS_IS_IN_USE";
  case GRN_ZLIB_ERROR:
    return "GRN_ZLIB_ERROR";
  case GRN_LZO_ERROR:
    return "GRN_LZO_ERROR";
  case GRN_STACK_OVER_FLOW:
    return "GRN_STACK_OVER_FLOW";
  case GRN_SYNTAX_ERROR:
    return "GRN_SYNTAX_ERROR";
  case GRN_RETRY_MAX:
    return "GRN_RETRY_MAX";
  case GRN_INCOMPATIBLE_FILE_FORMAT:
    return "GRN_INCOMPATIBLE_FILE_FORMAT";
  case GRN_UPDATE_NOT_ALLOWED:
    return "GRN_UPDATE_NOT_ALLOWED";
  default:
    return cut_take_printf("GRN_UNKNOWN_STATUS (%d)", rc);
  }
}
Пример #4
0
void
test_help_all (void)
{
    const gchar *format;
    const gchar *help_all_message;

    format =
        "Usage:" LINE_FEED_CODE
        "  %s [OPTION...] TEST_DIRECTORY" LINE_FEED_CODE
        "  %s --mode=analyze [OPTION...] LOG_DIRECTORY" LINE_FEED_CODE
        "  %s --mode=play [OPTION...] LOG_FILE" LINE_FEED_CODE
        "" LINE_FEED_CODE
        "Help Options:" LINE_FEED_CODE
#if GLIB_CHECK_VERSION(2, 21, 0)
        "  -h, --help                                        Show help options" LINE_FEED_CODE
#else
        "  -?, --help                                        Show help options" LINE_FEED_CODE
#endif
        "  --help-all                                        Show all help options" LINE_FEED_CODE
        "  --help-stream                                     Show stream options" LINE_FEED_CODE
        "  --help-report                                     Show report options" LINE_FEED_CODE
        "  --help-ui                                         Show UI options" LINE_FEED_CODE
        "  --help-console-ui                                 Show console UI options" LINE_FEED_CODE
#ifdef HAVE_GTK
        "  --help-gtk                                        Show GTK+ Options" LINE_FEED_CODE
#endif
        "" LINE_FEED_CODE
        "Stream Options" LINE_FEED_CODE
        "  --stream=[xml]                                    Specify stream" LINE_FEED_CODE
        "  --stream-fd=FILE_DESCRIPTOR                       Stream to FILE_DESCRIPTOR (default: stdout)" LINE_FEED_CODE
        "  --stream-directory=DIRECTORY                      Stream to a file under DIRECTORY (default: none)" LINE_FEED_CODE
        "  --stream-log-directory=DIRECTORY                  Obsoleted. Use --stream-directory instead" LINE_FEED_CODE
        "" LINE_FEED_CODE
        "Report Options" LINE_FEED_CODE
#if defined(HAVE_PANGO_CAIRO) && defined(HAVE_CAIRO_PDF)
        "  --pdf-report=FILE                                 Set filename of pdf report" LINE_FEED_CODE
#endif
        "  --xml-report=FILE                                 Set filename of xml report" LINE_FEED_CODE
        "" LINE_FEED_CODE
        "UI Options" LINE_FEED_CODE
#ifdef HAVE_GTK
        "  -u, --ui=[console|gtk]                            Specify UI" LINE_FEED_CODE
#else
        "  -u, --ui=[console]                                Specify UI" LINE_FEED_CODE
#endif
        "" LINE_FEED_CODE
        "Console UI Options" LINE_FEED_CODE
        "  -v, --verbose=[s|silent|n|normal|v|verbose]       Set verbose level" LINE_FEED_CODE
        "  -c, --color=[yes|true|no|false|auto]              Output log with colors" LINE_FEED_CODE
        "  --notify=[yes|true|no|false|auto]                 Notify test result" LINE_FEED_CODE
        "  --show-detail-immediately=[yes|true|no|false]     Show test detail immediately" LINE_FEED_CODE
        "" LINE_FEED_CODE
#ifdef HAVE_GTK
        "GTK+ Options" LINE_FEED_CODE
        "  --class=CLASS                                     Program class as used by the window manager" LINE_FEED_CODE
        "  --gtk-name=NAME                                   Program name as used by the window manager" LINE_FEED_CODE
        "  --screen=SCREEN                                   X screen to use" LINE_FEED_CODE
#  ifdef HAVE_GTK_ENABLE_DEBUG
        "  --gdk-debug=FLAGS                                 GDK debugging flags to set" LINE_FEED_CODE
        "  --gdk-no-debug=FLAGS                              GDK debugging flags to unset" LINE_FEED_CODE
#  endif
#  ifdef GDK_WINDOWING_X11
        "  --sync                                            Make X calls synchronous" LINE_FEED_CODE
#  elif defined(GDK_WINDOWING_WIN32)
        "  --sync                                            Don't batch GDI requests" LINE_FEED_CODE
        "  --no-wintab                                       Don't use the Wintab API for tablet support" LINE_FEED_CODE
        "  --ignore-wintab                                   Same as --no-wintab" LINE_FEED_CODE
        "  --use-wintab                                      Do use the Wintab API [default]" LINE_FEED_CODE
        "  --max-colors=COLORS                               Size of the palette in 8 bit mode" LINE_FEED_CODE
#  endif
        "  --gtk-module=MODULES                              Load additional GTK+ modules" LINE_FEED_CODE
        "  --g-fatal-warnings                                Make all warnings fatal" LINE_FEED_CODE
#  ifdef HAVE_GTK_ENABLE_DEBUG
        "  --gtk-debug=FLAGS                                 GTK+ debugging flags to set" LINE_FEED_CODE
        "  --gtk-no-debug=FLAGS                              GTK+ debugging flags to unset" LINE_FEED_CODE
#  endif
        "" LINE_FEED_CODE
#endif
        "Application Options:" LINE_FEED_CODE
        "  --version                                         Show version" LINE_FEED_CODE
        "  --mode=[test|analyze|play]                        Set run mode (default: test)" LINE_FEED_CODE
        "  -s, --source-directory=DIRECTORY                  Set directory of source code" LINE_FEED_CODE
        "  -n, --name=TEST_NAME                              Specify tests" LINE_FEED_CODE
        "  -t, --test-case=TEST_CASE_NAME                    Specify test cases" LINE_FEED_CODE
        "  -m, --multi-thread                                Run test cases and iterated tests with multi-thread" LINE_FEED_CODE
        "  --max-threads=MAX_THREADS                         Run test cases and iterated tests with MAX_THREADS threads concurrently at a maximum (default: 10; -1 is no limit)" LINE_FEED_CODE
        "  --disable-signal-handling                         Disable signal handling" LINE_FEED_CODE
        "  --test-case-order=[none|name|name-desc]           Sort test case by. Default is 'none'." LINE_FEED_CODE
        "  --exclude-file=FILE                               Skip files" LINE_FEED_CODE
        "  --exclude-directory=DIRECTORY                     Skip directories" LINE_FEED_CODE
        "  --fatal-failures                                  Treat failures as fatal problem" LINE_FEED_CODE
        "  --keep-opening-modules                            Keep opening loaded modules to resolve symbols for debugging" LINE_FEED_CODE
        "  --enable-convenience-attribute-definition         Enable convenience but danger '#{ATTRIBUTE_NAME}_#{TEST_NAME - 'test_' PREFIX}' attribute set function" LINE_FEED_CODE
        "  --stop-before-test                                Set breakpoints at each line which invokes test. You can step into a test function with your debugger easily." LINE_FEED_CODE
#ifdef HAVE_GTK
        "  --display=DISPLAY                                 X display to use" LINE_FEED_CODE
#endif
        "" LINE_FEED_CODE;

    help_all_message = cut_take_printf(format,
                                       g_get_prgname(),
                                       g_get_prgname(),
                                       g_get_prgname());

    cut_assert(run_cutter("--help-all"));
    cut_assert_exit_success();
    cut_assert_equal_string(help_all_message, stdout_string);
}
void
test_near_geo_point(gpointer data)
{
  grn_id id;
  int min_size, offset, limit, flags;
  grn_obj max_string, max;
  const GList *expected_keys;
  GList *actual_keys = NULL;

  create_geo_point_table(
    cut_take_printf(" [\"%s\"],"
                    " [\"%s\"],"
                    " [\"%s\"],"
                    " [\"%s\"],"
                    " [\"%s\"],"
                    " [\"%s\"],"
                    " [\"%s\"],"
                    " [\"%s\"],"
                    " [\"%s\"]",
                    TAKEN_POINT(1, 2, 3,
                                4, 5, 6),
                    TAKEN_POINT(1, 2, 3,
                                7, 8, 9),
                    TAKEN_POINT(7, 8, 9,
                                4, 5, 6),
                    TAKEN_POINT(89, 59, 59,
                                179, 59, 59),
                    TAKEN_POINT(89, 59, 59,
                                179, -59, -59),
                    TAKEN_POINT(88, 58, 58,
                                178, 58, 58),
                    TAKEN_POINT(-89, -59, -59,
                                -179, -59, -59),
                    TAKEN_POINT(-89, -59, -59,
                                179, 59, 59),
                    TAKEN_POINT(-88, -58, -58,
                                -178, -58, -58)));

  min_size = gcut_data_get_int(data, "min-size");
  GRN_TEXT_INIT(&max_string, 0);
  GRN_TEXT_PUTS(context, &max_string, gcut_data_get_string(data, "max"));
  GRN_WGS84_GEO_POINT_INIT(&max, 0);
  grn_obj_cast(context, &max_string, &max, FALSE);
  grn_obj_unlink(context, &max_string);
  offset = gcut_data_get_int(data, "offset");
  limit = gcut_data_get_int(data, "limit");
  flags = gcut_data_get_int(data, "flags");
  cursor = grn_table_cursor_open(context, table,
                                 NULL, min_size,
                                 GRN_BULK_HEAD(&max), GRN_BULK_VSIZE(&max),
                                 offset, limit,
                                 flags | GRN_CURSOR_PREFIX);
  grn_obj_unlink(context, &max);
  grn_test_assert_context(context);
  while ((id = grn_table_cursor_next(context, cursor))) {
    grn_geo_point *key;
    int key_size;

    key_size = grn_table_cursor_get_key(context, cursor, (void **)&key);
    actual_keys = g_list_append(actual_keys,
                                g_strdup_printf("%dx%d",
                                                key->latitude,
                                                key->longitude));
  }
  gcut_take_list(actual_keys, g_free);

  expected_keys = gcut_data_get_pointer(data, "expected");
  gcut_assert_equal_list_string(expected_keys, actual_keys);
}