[gtk/clipboard-test: 4/4] Add more clipboard tests
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/clipboard-test: 4/4] Add more clipboard tests
- Date: Tue, 27 Apr 2021 00:36:55 +0000 (UTC)
commit f71d2712323482c8e45bd31de1ebc27e5a5886fd
Author: Matthias Clasen <mclasen redhat com>
Date: Mon Apr 26 17:02:50 2021 -0400
Add more clipboard tests
This tests the simplest cases of copying text,
files, or colors between processes.
testsuite/gdk/clipboard-client.c | 190 +++++++++++++++++++++++++++++++++++++++
testsuite/gdk/clipboard.c | 88 ++++++++++++++++++
testsuite/gdk/meson.build | 7 ++
3 files changed, 285 insertions(+)
---
diff --git a/testsuite/gdk/clipboard-client.c b/testsuite/gdk/clipboard-client.c
new file mode 100644
index 0000000000..88ae607358
--- /dev/null
+++ b/testsuite/gdk/clipboard-client.c
@@ -0,0 +1,190 @@
+#include <gtk/gtk.h>
+
+static void
+got_text_cb (GObject *source,
+ GAsyncResult *result,
+ gpointer data)
+{
+ GdkClipboard *clipboard = GDK_CLIPBOARD (source);
+ GError *error = NULL;
+ char *text;
+
+ text = gdk_clipboard_read_text_finish (clipboard, result, &error);
+ if (text)
+ {
+ g_print ("%s", text);
+ g_free (text);
+ }
+ else
+ {
+ g_print ("ERROR: %s", error->message);
+ g_clear_error (&error);
+ }
+
+ exit (0);
+}
+
+static void
+got_file (GObject *source,
+ GAsyncResult *result,
+ gpointer data)
+{
+ GdkClipboard *clipboard = GDK_CLIPBOARD (source);
+ GError *error = NULL;
+ const GValue *value;
+
+ value = gdk_clipboard_read_value_finish (clipboard, result, &error);
+ if (value)
+ {
+ GFile *file = g_value_get_object (value);
+ char *path = g_file_get_path (file);
+ g_print ("%s", path);
+ g_free (path);
+ }
+ else
+ {
+ g_print ("ERROR: %s", error->message);
+ g_clear_error (&error);
+ }
+
+ exit (0);
+}
+
+static void
+got_color (GObject *source,
+ GAsyncResult *result,
+ gpointer data)
+{
+ GdkClipboard *clipboard = GDK_CLIPBOARD (source);
+ GError *error = NULL;
+ const GValue *value;
+
+ value = gdk_clipboard_read_value_finish (clipboard, result, &error);
+ if (value)
+ {
+ GdkRGBA *color = g_value_get_boxed (value);
+ char *s = gdk_rgba_to_string (color);
+ g_print ("%s", s);
+ g_free (s);
+ }
+ else
+ {
+ g_print ("ERROR: %s", error->message);
+ g_clear_error (&error);
+ }
+
+ exit (0);
+}
+
+static const char *action;
+static const char *type;
+static const char *value;
+
+static void
+do_it (GObject *object,
+ GParamSpec *pspec)
+{
+ GdkClipboard *clipboard;
+
+ clipboard = gdk_display_get_clipboard (gdk_display_get_default ());
+
+ if (strcmp (action, "info") == 0)
+ {
+ GdkContentFormats *formats;
+ char *s;
+
+ formats = gdk_clipboard_get_formats (clipboard);
+ s = gdk_content_formats_to_string (formats);
+ g_print ("%s\n", s);
+ g_free (s);
+ }
+ else if (strcmp (action, "set") == 0)
+ {
+ GdkContentFormats *formats;
+ char *s;
+
+ if (strcmp (type, "string") == 0)
+ gdk_clipboard_set_text (clipboard, value);
+ else if (strcmp (type, "file") == 0)
+ {
+ GFile *file;
+
+ file = g_file_new_for_commandline_arg (value);
+ gdk_clipboard_set (clipboard, G_TYPE_FILE, file);
+ g_object_unref (file);
+ }
+ else if (strcmp (type, "color") == 0)
+ {
+ GdkRGBA color;
+
+ gdk_rgba_parse (&color, value);
+ gdk_clipboard_set (clipboard, GDK_TYPE_RGBA, &color);
+ }
+ else
+ g_error ("can't set %s", type);
+
+ formats = gdk_clipboard_get_formats (clipboard);
+ s = gdk_content_formats_to_string (formats);
+ g_print ("%s\n", s);
+ g_free (s);
+ }
+ else if (strcmp (action, "get") == 0)
+ {
+ if (strcmp (type, "string") == 0)
+ gdk_clipboard_read_text_async (clipboard, NULL, got_text_cb, NULL);
+ else if (strcmp (type, "file") == 0)
+ gdk_clipboard_read_value_async (clipboard, G_TYPE_FILE, 0, NULL, got_file, NULL);
+ else if (strcmp (type, "color") == 0)
+ gdk_clipboard_read_value_async (clipboard, GDK_TYPE_RGBA, 0, NULL, got_color, NULL);
+ else
+ g_error ("can't get %s", type);
+ }
+ else
+ g_error ("can only set, get or info");
+}
+
+int
+main (int argc, char *argv[])
+{
+ GtkWidget *window;
+ gboolean done = FALSE;
+
+ if (argc < 2)
+ g_error ("too few arguments");
+
+ action = argv[1];
+
+ if (strcmp (action, "info") == 0)
+ {
+ }
+ else if (strcmp (action, "set") == 0)
+ {
+ if (argc < 4)
+ g_error ("too few arguments for set");
+
+ type = argv[2];
+ value = argv[3];
+ }
+ else if (strcmp (action, "get") == 0)
+ {
+ if (argc < 3)
+ g_error ("too few arguments for get");
+
+ type = argv[2];
+ }
+ else
+ g_error ("can only set or get");
+
+ gtk_init ();
+
+ window = gtk_window_new ();
+
+ gtk_window_present (GTK_WINDOW (window));
+
+ g_signal_connect (window, "notify::is-active", G_CALLBACK (do_it), NULL);
+
+ while (!done)
+ g_main_context_iteration (NULL, TRUE);
+
+ return 0;
+}
diff --git a/testsuite/gdk/clipboard.c b/testsuite/gdk/clipboard.c
index aa3b1055f2..32c671f14b 100644
--- a/testsuite/gdk/clipboard.c
+++ b/testsuite/gdk/clipboard.c
@@ -70,6 +70,91 @@ test_clipboard_basic (void)
g_value_unset (&value);
}
+static void
+read_upto_done (GObject *source,
+ GAsyncResult *result,
+ gpointer data)
+{
+ GDataInputStream *out = G_DATA_INPUT_STREAM (source);
+ gboolean *done = data;
+ char *str;
+ GError *error = NULL;
+
+ str = g_data_input_stream_read_upto_finish (out, result, NULL, &error);
+ g_assert_no_error (error);
+ g_free (str);
+
+ *done = TRUE;
+ g_main_context_wakeup (NULL);
+}
+
+static void
+test_clipboard_roundtrip (const char *type,
+ const char *value,
+ const char *result)
+{
+ GSubprocess *source, *target;
+ char *clipboard_client;
+ GError *error = NULL;
+ GDataInputStream *out;
+ gboolean done = FALSE;
+ char *stdout_buf = NULL;
+ char *stderr_buf = NULL;
+
+ clipboard_client = g_test_build_filename (G_TEST_BUILT, "/clipboard-client", NULL);
+
+ source = g_subprocess_new (G_SUBPROCESS_FLAGS_STDOUT_PIPE,
+ &error,
+ clipboard_client,
+ "set", type, value, NULL);
+ g_assert_no_error (error);
+
+ /* Wait until the first child has claimed the clipboard */
+ out = g_data_input_stream_new (g_subprocess_get_stdout_pipe (source));
+ g_data_input_stream_read_upto_async (out, "\n", 1, 0, NULL, read_upto_done, &done);
+
+ while (!done)
+ g_main_context_iteration (NULL, TRUE);
+
+ g_object_unref (out);
+
+ target = g_subprocess_new (G_SUBPROCESS_FLAGS_STDOUT_PIPE,
+ &error,
+ clipboard_client,
+ "get", type, NULL);
+ g_assert_no_error (error);
+
+ g_subprocess_communicate_utf8 (target, NULL, NULL, &stdout_buf, &stderr_buf, &error);
+ g_assert_no_error (error);
+ g_assert_cmpstr (stdout_buf, ==, result);
+ g_assert_null (stderr_buf);
+ g_free (stdout_buf);
+ g_object_unref (target);
+
+ g_subprocess_force_exit (source);
+ g_object_unref (source);
+
+ g_free (clipboard_client);
+}
+
+static void
+test_clipboard_text (void)
+{
+ test_clipboard_roundtrip ("string", "abcdef1230", "abcdef1230");
+}
+
+static void
+test_clipboard_file (void)
+{
+ test_clipboard_roundtrip ("file", "/etc/passwd", "/etc/passwd");
+}
+
+static void
+test_clipboard_color (void)
+{
+ test_clipboard_roundtrip ("color", "red", "rgb(255,0,0)");
+}
+
int
main (int argc, char *argv[])
{
@@ -78,6 +163,9 @@ main (int argc, char *argv[])
gtk_init ();
g_test_add_func ("/clipboard/basic", test_clipboard_basic);
+ g_test_add_func ("/clipboard/text", test_clipboard_text);
+ g_test_add_func ("/clipboard/file", test_clipboard_file);
+ g_test_add_func ("/clipboard/color", test_clipboard_color);
return g_test_run ();
}
diff --git a/testsuite/gdk/meson.build b/testsuite/gdk/meson.build
index 5216d7a518..edc290ff7a 100644
--- a/testsuite/gdk/meson.build
+++ b/testsuite/gdk/meson.build
@@ -1,3 +1,10 @@
+clipboard_client = executable('clipboard-client',
+ sources: ['clipboard-client.c'],
+ include_directories: [confinc],
+ c_args: common_cflags,
+ dependencies: [ libgtk_dep ],
+ install: false)
+
testexecdir = join_paths(installed_test_bindir, 'gdk')
testdatadir = join_paths(installed_test_datadir, 'gdk')
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]