+ check_and_free (g_variant_new_parsed ("{%s:%i}", "one", 1), "{'one': 1}");
+
+ if (g_test_undefined ())
+ {
+ do_failed_test ("/gvariant/parse/subprocess/bad-format-char",
+ "*GVariant format string*");
+
+ do_failed_test ("/gvariant/parse/subprocess/bad-format-string",
+ "*can not parse as*");
+
+ do_failed_test ("/gvariant/parse/subprocess/bad-args",
+ "*expected GVariant of type 'i'*");
+ }
+}
+
+static void
+test_floating (void)
+{
+ GVariant *value;
+
+ value = g_variant_new_int32 (42);
+ g_assert (g_variant_is_floating (value));
+ g_variant_ref_sink (value);
+ g_assert (!g_variant_is_floating (value));
+ g_variant_unref (value);
+}
+
+static void
+test_bytestring (void)
+{
+ const gchar *test_string = "foo,bar,baz,quux,\xffoooo";
+ GVariant *value;
+ gchar **strv;
+ gchar *str;
+ const gchar *const_str;
+ GVariant *untrusted_empty;
+
+ strv = g_strsplit (test_string, ",", 0);
+
+ value = g_variant_new_bytestring_array ((const gchar **) strv, -1);
+ g_assert (g_variant_is_floating (value));
+ g_strfreev (strv);
+
+ str = g_variant_print (value, FALSE);
+ g_variant_unref (value);
+
+ value = g_variant_parse (NULL, str, NULL, NULL, NULL);
+ g_free (str);
+
+ strv = g_variant_dup_bytestring_array (value, NULL);
+ g_variant_unref (value);
+
+ str = g_strjoinv (",", strv);
+ g_strfreev (strv);
+
+ g_assert_cmpstr (str, ==, test_string);
+ g_free (str);
+
+ strv = g_strsplit (test_string, ",", 0);
+ value = g_variant_new ("(^aay^a&ay^ay^&ay)",
+ strv, strv, strv[0], strv[0]);
+ g_strfreev (strv);
+
+ g_variant_get_child (value, 0, "^a&ay", &strv);
+ str = g_strjoinv (",", strv);
+ g_free (strv);
+ g_assert_cmpstr (str, ==, test_string);
+ g_free (str);
+
+ g_variant_get_child (value, 0, "^aay", &strv);
+ str = g_strjoinv (",", strv);
+ g_strfreev (strv);
+ g_assert_cmpstr (str, ==, test_string);
+ g_free (str);
+
+ g_variant_get_child (value, 1, "^a&ay", &strv);
+ str = g_strjoinv (",", strv);
+ g_free (strv);
+ g_assert_cmpstr (str, ==, test_string);
+ g_free (str);
+
+ g_variant_get_child (value, 1, "^aay", &strv);
+ str = g_strjoinv (",", strv);
+ g_strfreev (strv);
+ g_assert_cmpstr (str, ==, test_string);
+ g_free (str);
+
+ g_variant_get_child (value, 2, "^ay", &str);
+ g_assert_cmpstr (str, ==, "foo");
+ g_free (str);
+
+ g_variant_get_child (value, 2, "^&ay", &str);
+ g_assert_cmpstr (str, ==, "foo");
+
+ g_variant_get_child (value, 3, "^ay", &str);
+ g_assert_cmpstr (str, ==, "foo");
+ g_free (str);
+
+ g_variant_get_child (value, 3, "^&ay", &str);
+ g_assert_cmpstr (str, ==, "foo");
+ g_variant_unref (value);
+
+ untrusted_empty = g_variant_new_from_data (G_VARIANT_TYPE ("ay"), NULL, 0, FALSE, NULL, NULL);
+ value = g_variant_get_normal_form (untrusted_empty);
+ const_str = g_variant_get_bytestring (value);
+ (void) const_str;
+ g_variant_unref (value);
+ g_variant_unref (untrusted_empty);
+}
+
+static void
+test_lookup_value (void)
+{
+ struct {
+ const gchar *dict, *key, *value;
+ } cases[] = {
+ { "@a{ss} {'x': 'y'}", "x", "'y'" },
+ { "@a{ss} {'x': 'y'}", "y" },
+ { "@a{os} {'/x': 'y'}", "/x", "'y'" },
+ { "@a{os} {'/x': 'y'}", "/y" },
+ { "@a{sv} {'x': <'y'>}", "x", "'y'" },
+ { "@a{sv} {'x': <5>}", "x", "5" },
+ { "@a{sv} {'x': <'y'>}", "y" }
+ };
+ gint i;
+
+ for (i = 0; i < G_N_ELEMENTS (cases); i++)
+ {
+ GVariant *dictionary;
+ GVariant *value;
+ gchar *p;
+
+ dictionary = g_variant_parse (NULL, cases[i].dict, NULL, NULL, NULL);
+ value = g_variant_lookup_value (dictionary, cases[i].key, NULL);
+ g_variant_unref (dictionary);
+
+ if (value == NULL && cases[i].value == NULL)
+ continue;
+
+ g_assert (value && cases[i].value);
+ p = g_variant_print (value, FALSE);
+ g_assert_cmpstr (cases[i].value, ==, p);
+ g_variant_unref (value);
+ g_free (p);
+ }
+}
+
+static void
+test_lookup (void)
+{
+ const gchar *str;
+ GVariant *dict;
+ gboolean ok;
+ gint num;
+
+ dict = g_variant_parse (NULL,
+ "{'a': <5>, 'b': <'c'>}",
+ NULL, NULL, NULL);
+
+ ok = g_variant_lookup (dict, "a", "i", &num);
+ g_assert (ok);
+ g_assert_cmpint (num, ==, 5);
+
+ ok = g_variant_lookup (dict, "a", "&s", &str);
+ g_assert (!ok);
+
+ ok = g_variant_lookup (dict, "q", "&s", &str);
+ g_assert (!ok);
+
+ ok = g_variant_lookup (dict, "b", "i", &num);
+ g_assert (!ok);
+
+ ok = g_variant_lookup (dict, "b", "&s", &str);
+ g_assert (ok);
+ g_assert_cmpstr (str, ==, "c");
+
+ ok = g_variant_lookup (dict, "q", "&s", &str);
+ g_assert (!ok);
+
+ g_variant_unref (dict);
+}
+
+static GVariant *
+untrusted (GVariant *a)
+{
+ GVariant *b;
+ const GVariantType *type;
+ GBytes *bytes;
+
+ type = g_variant_get_type (a);
+ bytes = g_variant_get_data_as_bytes (a);
+ b = g_variant_new_from_bytes (type, bytes, FALSE);
+ g_bytes_unref (bytes);
+ g_variant_unref (a);
+
+ return b;
+}
+
+static void
+test_compare (void)
+{
+ GVariant *a;
+ GVariant *b;
+
+ a = untrusted (g_variant_new_byte (5));
+ b = g_variant_new_byte (6);
+ g_assert (g_variant_compare (a, b) < 0);
+ g_variant_unref (a);
+ g_variant_unref (b);
+ a = untrusted (g_variant_new_int16 (G_MININT16));
+ b = g_variant_new_int16 (G_MAXINT16);
+ g_assert (g_variant_compare (a, b) < 0);
+ g_variant_unref (a);
+ g_variant_unref (b);
+ a = untrusted (g_variant_new_uint16 (0));
+ b = g_variant_new_uint16 (G_MAXUINT16);
+ g_assert (g_variant_compare (a, b) < 0);
+ g_variant_unref (a);
+ g_variant_unref (b);
+ a = untrusted (g_variant_new_int32 (G_MININT32));
+ b = g_variant_new_int32 (G_MAXINT32);
+ g_assert (g_variant_compare (a, b) < 0);
+ g_variant_unref (a);
+ g_variant_unref (b);
+ a = untrusted (g_variant_new_uint32 (0));
+ b = g_variant_new_uint32 (G_MAXUINT32);
+ g_assert (g_variant_compare (a, b) < 0);
+ g_variant_unref (a);
+ g_variant_unref (b);
+ a = untrusted (g_variant_new_int64 (G_MININT64));
+ b = g_variant_new_int64 (G_MAXINT64);
+ g_assert (g_variant_compare (a, b) < 0);
+ g_variant_unref (a);
+ g_variant_unref (b);
+ a = untrusted (g_variant_new_uint64 (0));
+ b = g_variant_new_uint64 (G_MAXUINT64);
+ g_assert (g_variant_compare (a, b) < 0);
+ g_variant_unref (a);
+ g_variant_unref (b);
+ a = untrusted (g_variant_new_double (G_MINDOUBLE));
+ b = g_variant_new_double (G_MAXDOUBLE);
+ g_assert (g_variant_compare (a, b) < 0);
+ g_variant_unref (a);
+ g_variant_unref (b);
+ a = untrusted (g_variant_new_string ("abc"));
+ b = g_variant_new_string ("abd");
+ g_assert (g_variant_compare (a, b) < 0);
+ g_variant_unref (a);
+ g_variant_unref (b);
+ a = untrusted (g_variant_new_object_path ("/abc"));
+ b = g_variant_new_object_path ("/abd");
+ g_assert (g_variant_compare (a, b) < 0);
+ g_variant_unref (a);
+ g_variant_unref (b);
+ a = untrusted (g_variant_new_signature ("g"));
+ b = g_variant_new_signature ("o");
+ g_assert (g_variant_compare (a, b) < 0);
+ g_variant_unref (a);
+ g_variant_unref (b);
+ a = untrusted (g_variant_new_boolean (FALSE));
+ b = g_variant_new_boolean (TRUE);
+ g_assert (g_variant_compare (a, b) < 0);
+ g_variant_unref (a);
+ g_variant_unref (b);
+}
+
+static void
+test_equal (void)
+{
+ GVariant *a;
+ GVariant *b;
+
+ a = untrusted (g_variant_new_byte (5));
+ b = g_variant_get_normal_form (a);
+ g_assert (g_variant_equal (a, b));
+ g_variant_unref (a);
+ g_variant_unref (b);
+ a = untrusted (g_variant_new_int16 (G_MININT16));
+ b = g_variant_get_normal_form (a);
+ g_assert (g_variant_equal (a, b));
+ g_variant_unref (a);
+ g_variant_unref (b);
+ a = untrusted (g_variant_new_uint16 (0));
+ b = g_variant_get_normal_form (a);
+ g_assert (g_variant_equal (a, b));
+ g_variant_unref (a);
+ g_variant_unref (b);
+ a = untrusted (g_variant_new_int32 (G_MININT32));
+ b = g_variant_get_normal_form (a);
+ g_assert (g_variant_equal (a, b));
+ g_variant_unref (a);
+ g_variant_unref (b);
+ a = untrusted (g_variant_new_uint32 (0));
+ b = g_variant_get_normal_form (a);
+ g_assert (g_variant_equal (a, b));
+ g_variant_unref (a);
+ g_variant_unref (b);
+ a = untrusted (g_variant_new_int64 (G_MININT64));
+ b = g_variant_get_normal_form (a);
+ g_assert (g_variant_equal (a, b));
+ g_variant_unref (a);
+ g_variant_unref (b);
+ a = untrusted (g_variant_new_uint64 (0));
+ b = g_variant_get_normal_form (a);
+ g_assert (g_variant_equal (a, b));
+ g_variant_unref (a);
+ g_variant_unref (b);
+ a = untrusted (g_variant_new_double (G_MINDOUBLE));
+ b = g_variant_get_normal_form (a);
+ g_assert (g_variant_equal (a, b));
+ g_variant_unref (a);
+ g_variant_unref (b);
+ a = untrusted (g_variant_new_string ("abc"));
+ g_assert (g_variant_equal (a, a));
+ b = g_variant_get_normal_form (a);
+ g_assert (g_variant_equal (a, b));
+ g_variant_unref (a);
+ g_variant_unref (b);
+ a = untrusted (g_variant_new_object_path ("/abc"));
+ g_assert (g_variant_equal (a, a));
+ b = g_variant_get_normal_form (a);
+ a = untrusted (a);
+ g_assert (g_variant_equal (a, b));
+ g_variant_unref (a);
+ g_variant_unref (b);
+ a = untrusted (g_variant_new_signature ("g"));
+ g_assert (g_variant_equal (a, a));
+ b = g_variant_get_normal_form (a);
+ a = untrusted (a);
+ g_assert (g_variant_equal (a, b));
+ g_variant_unref (a);
+ g_variant_unref (b);
+ a = untrusted (g_variant_new_boolean (FALSE));
+ b = g_variant_get_normal_form (a);
+ g_assert (g_variant_equal (a, b));
+ g_variant_unref (a);
+ g_variant_unref (b);
+}
+
+static void
+test_fixed_array (void)
+{
+ GVariant *a;
+ gint32 values[5];
+ const gint32 *elts;
+ gsize n_elts;
+ gint i;