| Index: client/deps/ibusclient/src/ibusclient.cc
|
| diff --git a/client/deps/ibusclient/src/ibusclient.cc b/client/deps/ibusclient/src/ibusclient.cc
|
| index 6c14069fae1c441856cd329a50d50eaf81780905..eabed340b322f966e9e831fb9ccc00d1cf7c123a 100644
|
| --- a/client/deps/ibusclient/src/ibusclient.cc
|
| +++ b/client/deps/ibusclient/src/ibusclient.cc
|
| @@ -6,6 +6,7 @@
|
| #include <glib.h>
|
| #include <ibus.h>
|
| #include <stdio.h>
|
| +#include <stdlib.h>
|
| #include <string>
|
|
|
| namespace {
|
| @@ -15,9 +16,44 @@ const gchar kDummyConfigName[] = "ccc";
|
|
|
| const gboolean kDummyValueBoolean = TRUE;
|
| const gint kDummyValueInt = 12345;
|
| -const gdouble kDummyValueDouble = 12345.54321;
|
| +const gdouble kDummyValueDouble = 2345.5432;
|
| const gchar kDummyValueString[] = "dummy value";
|
|
|
| +const size_t kArraySize = 3;
|
| +const gboolean kDummyValueBooleanArray[kArraySize] = { FALSE, TRUE, FALSE };
|
| +const gint kDummyValueIntArray[kArraySize] = { 123, 234, 345 };
|
| +const gdouble kDummyValueDoubleArray[kArraySize] = { 111.22, 333.44, 555.66 };
|
| +const gchar* kDummyValueStringArray[kArraySize] = {
|
| + "DUMMY_VALUE 1", "DUMMY_VALUE 2", "DUMMY_VALUE 3",
|
| +};
|
| +
|
| +// Converts |list_type_string| into its element type (e.g. "int_list" to "int").
|
| +std::string GetElementType(const std::string& list_type_string) {
|
| + const std::string suffix = "_list";
|
| + if (list_type_string.length() > suffix.length()) {
|
| + return list_type_string.substr(
|
| + 0, list_type_string.length() - suffix.length());
|
| + }
|
| + return list_type_string;
|
| +}
|
| +
|
| +// Converts |type_string| into GType.
|
| +GType GetGValueTypeFromStringOrDie(const std::string& type_string) {
|
| + if (type_string == "boolean") {
|
| + return G_TYPE_BOOLEAN;
|
| + } else if (type_string == "int") {
|
| + return G_TYPE_INT;
|
| + } else if (type_string == "double") {
|
| + return G_TYPE_DOUBLE;
|
| + } else if (type_string == "string") {
|
| + return G_TYPE_STRING;
|
| + } else if (GetElementType(type_string) != type_string) {
|
| + return G_TYPE_VALUE_ARRAY;
|
| + }
|
| + printf("FAIL (unknown type: %s)\n", type_string.c_str());
|
| + abort();
|
| +}
|
| +
|
| // Unsets a dummy value from ibus config service.
|
| void UnsetConfigAndPrintResult(IBusConfig* ibus_config) {
|
| if (ibus_config_unset(ibus_config, kDummySection, kDummyConfigName)) {
|
| @@ -34,22 +70,41 @@ void SetConfigAndPrintResult(
|
| IBusConfig* ibus_config, const std::string& type_string) {
|
| GValue gvalue = {0};
|
|
|
| - if (type_string == "boolean") {
|
| - g_value_init(&gvalue, G_TYPE_BOOLEAN);
|
| + const GType gtype = GetGValueTypeFromStringOrDie(type_string);
|
| + g_value_init(&gvalue, gtype);
|
| + if (gtype == G_TYPE_BOOLEAN) {
|
| g_value_set_boolean(&gvalue, kDummyValueBoolean);
|
| - } else if (type_string == "int") {
|
| - g_value_init(&gvalue, G_TYPE_INT);
|
| + } else if (gtype == G_TYPE_INT) {
|
| g_value_set_int(&gvalue, kDummyValueInt);
|
| - } else if (type_string == "double") {
|
| - g_value_init(&gvalue, G_TYPE_DOUBLE);
|
| + } else if (gtype == G_TYPE_DOUBLE) {
|
| g_value_set_double(&gvalue, kDummyValueDouble);
|
| - } else if (type_string == "string") {
|
| - g_value_init(&gvalue, G_TYPE_STRING);
|
| + } else if (gtype == G_TYPE_STRING) {
|
| g_value_set_string(&gvalue, kDummyValueString);
|
| - } else {
|
| - printf("FAIL (unknown type: %s)\n", type_string.c_str());
|
| - return;
|
| - }
|
| + } else if (gtype == G_TYPE_VALUE_ARRAY) {
|
| + // Process list types.
|
| + GValueArray* array = g_value_array_new(kArraySize);
|
| +
|
| + const GType element_gtype
|
| + = GetGValueTypeFromStringOrDie(GetElementType(type_string));
|
| + g_assert(element_gtype != G_TYPE_VALUE_ARRAY);
|
| +
|
| + for (size_t i = 0; i < kArraySize; ++i) {
|
| + GValue tmp = {0};
|
| + g_value_init(&tmp, element_gtype);
|
| + if (element_gtype == G_TYPE_BOOLEAN) {
|
| + g_value_set_boolean(&tmp, kDummyValueBooleanArray[i]);
|
| + } else if (element_gtype == G_TYPE_INT) {
|
| + g_value_set_int(&tmp, kDummyValueIntArray[i]);
|
| + } else if (element_gtype == G_TYPE_DOUBLE) {
|
| + g_value_set_double(&tmp, kDummyValueDoubleArray[i]);
|
| + } else if (element_gtype == G_TYPE_STRING) {
|
| + g_value_set_string(&tmp, kDummyValueStringArray[i]);
|
| + }
|
| + g_value_array_append(array, &tmp);
|
| + }
|
| +
|
| + g_value_take_boxed(&gvalue, array);
|
| + }
|
|
|
| if (ibus_config_set_value(
|
| ibus_config, kDummySection, kDummyConfigName, &gvalue)) {
|
| @@ -70,35 +125,76 @@ void GetConfigAndPrintResult(
|
| return;
|
| }
|
|
|
| - if (type_string == "boolean") {
|
| - if ((G_VALUE_TYPE(&gvalue) != G_TYPE_BOOLEAN) ||
|
| - (g_value_get_boolean(&gvalue) != kDummyValueBoolean)) {
|
| - printf("FAIL (type/value mismatch)\n");
|
| + const GType gtype = GetGValueTypeFromStringOrDie(type_string);
|
| + if (G_VALUE_TYPE(&gvalue) != gtype) {
|
| + printf("FAIL (type mismatch)\n");
|
| + return;
|
| + }
|
| +
|
| + if (gtype== G_TYPE_BOOLEAN) {
|
| + if (g_value_get_boolean(&gvalue) != kDummyValueBoolean) {
|
| + printf("FAIL (value mismatch)\n");
|
| return;
|
| }
|
| - } else if (type_string == "int") {
|
| - if ((G_VALUE_TYPE(&gvalue) != G_TYPE_INT) ||
|
| - (g_value_get_int(&gvalue) != kDummyValueInt)) {
|
| - printf("FAIL (type/value mismatch)\n");
|
| + } else if (gtype == G_TYPE_INT) {
|
| + if (g_value_get_int(&gvalue) != kDummyValueInt) {
|
| + printf("FAIL (value mismatch)\n");
|
| return;
|
| }
|
| - } else if (type_string == "double") {
|
| - if ((G_VALUE_TYPE(&gvalue) != G_TYPE_DOUBLE) ||
|
| - // We allow errors for double values.
|
| - (g_value_get_double(&gvalue) < kDummyValueDouble - 0.001) ||
|
| - (g_value_get_double(&gvalue) > kDummyValueDouble + 0.001)) {
|
| - printf("FAIL (type/value mismatch)\n");
|
| + } else if (gtype == G_TYPE_DOUBLE) {
|
| + if (g_value_get_double(&gvalue) != kDummyValueDouble) {
|
| + // Note: ibus-gconf does not pass this test since it converts a double
|
| + // value into string to store it on GConf storage. If you want to use
|
| + // desktopui_IBusTest against ibus-gconf, you have to rewrite the
|
| + // condition to allow errors.
|
| + printf("FAIL (value mismatch)\n");
|
| return;
|
| }
|
| - } else if (type_string == "string") {
|
| - if ((G_VALUE_TYPE(&gvalue) != G_TYPE_STRING) ||
|
| - (g_value_get_string(&gvalue) != std::string(kDummyValueString))) {
|
| - printf("FAIL (type/value mismatch)\n");
|
| + } else if (gtype == G_TYPE_STRING) {
|
| + if (g_value_get_string(&gvalue) != std::string(kDummyValueString)) {
|
| + printf("FAIL (value mismatch)\n");
|
| return;
|
| }
|
| - } else {
|
| - printf("FAIL (unknown type: %s)\n", type_string.c_str());
|
| - return;
|
| + } else if (gtype == G_TYPE_VALUE_ARRAY) {
|
| + // Process list types
|
| + GValueArray* array
|
| + = reinterpret_cast<GValueArray*>(g_value_get_boxed(&gvalue));
|
| + if (!array || (array->n_values != kArraySize)) {
|
| + printf("FAIL (invalid array)\n");
|
| + return;
|
| + }
|
| +
|
| + const GType element_gtype
|
| + = GetGValueTypeFromStringOrDie(GetElementType(type_string));
|
| + g_assert(element_gtype != G_TYPE_VALUE_ARRAY);
|
| +
|
| + for (size_t i = 0; i < kArraySize; ++i) {
|
| + const GValue* element = &(array->values[i]);
|
| + if (G_VALUE_TYPE(element) != element_gtype) {
|
| + printf("FAIL (list type mismatch)\n");
|
| + return;
|
| + }
|
| + bool match = false;
|
| + if ((element_gtype == G_TYPE_BOOLEAN) &&
|
| + (g_value_get_boolean(element) == kDummyValueBooleanArray[i])) {
|
| + match = true;
|
| + } else if ((element_gtype == G_TYPE_INT) &&
|
| + (g_value_get_int(element) == kDummyValueIntArray[i])) {
|
| + match = true;
|
| + } else if ((element_gtype == G_TYPE_DOUBLE) &&
|
| + (g_value_get_double(element) == kDummyValueDoubleArray[i])) {
|
| + // See my comment about ibus-gconf above.
|
| + match = true;
|
| + } else if ((element_gtype == G_TYPE_STRING) &&
|
| + (g_value_get_string(element)
|
| + == std::string(kDummyValueStringArray[i]))) {
|
| + match = true;
|
| + }
|
| + if (!match) {
|
| + printf("FAIL (value mismatch)\n");
|
| + return;
|
| + }
|
| + }
|
| }
|
|
|
| printf("OK\n");
|
| @@ -120,14 +216,15 @@ void PrintUsage(const char* argv0) {
|
| printf("check_reachable Check if ibus-daemon is reachable\n");
|
| printf("list_engines List engine names (all engines)\n");
|
| printf("list_active_engines List active engine names\n");
|
| - // TODO(yusukes): Add tests for array of {bool, int, double, string}.
|
| // TODO(yusukes): Add 2 parameters, config_key and config_value, to
|
| // set_config and get_config commands.
|
| - printf("set_config (boolean|int|double|string)\n"
|
| + printf("set_config (boolean|int|double|string|\n"
|
| + " boolean_list|int_list|double_list|string_list)\n"
|
| " Set a dummy value to ibus config service\n");
|
| - printf("get_config (boolean|int|double|string)\n"
|
| + printf("get_config (boolean|int|double|string\n"
|
| + " boolean_list|int_list|double_list|string_list)\n"
|
| " Get a dummy value from ibus config service\n");
|
| - // TODO(yusukes): Add config_key parameter.
|
| + // TODO(yusukes): Add config_key parameter to unset_config.
|
| printf("unset_config Unset a dummy value from ibus config service\n");
|
| }
|
|
|
|
|