From 3e952c0a968348d1a65c8e316c333877b9d6b8dc Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Mon, 26 Jun 2023 16:40:24 -0700 Subject: [PATCH] libsysprof-gtk: use .ui file for test This will allow us to iterate a bit more easier. --- .../sysprof-normalized-series.c | 2 +- src/libsysprof-gtk/sysprof-xy-layer.c | 5 +- src/libsysprof-gtk/tests/meson.build | 9 +- src/libsysprof-gtk/tests/test-charts.c | 265 +++++++++--------- src/libsysprof-gtk/tests/test-charts.ui | 58 ++++ src/libsysprof-gtk/tests/tests.gresource.xml | 6 + 6 files changed, 209 insertions(+), 136 deletions(-) create mode 100644 src/libsysprof-gtk/tests/test-charts.ui create mode 100644 src/libsysprof-gtk/tests/tests.gresource.xml diff --git a/src/libsysprof-gtk/sysprof-normalized-series.c b/src/libsysprof-gtk/sysprof-normalized-series.c index 72193669..dc33239a 100644 --- a/src/libsysprof-gtk/sysprof-normalized-series.c +++ b/src/libsysprof-gtk/sysprof-normalized-series.c @@ -71,7 +71,7 @@ sysprof_normalized_series_update_missing (gpointer user_data) g_assert (SYSPROF_IS_NORMALIZED_SERIES (self)); - model = g_object_ref (G_LIST_MODEL (self->series)); + model = g_object_ref (sysprof_series_get_model (self->series)); bitset = egg_bitset_ref (self->missing); if (egg_bitset_iter_init_first (&iter, bitset, &position)) diff --git a/src/libsysprof-gtk/sysprof-xy-layer.c b/src/libsysprof-gtk/sysprof-xy-layer.c index 50a96457..edfdc9c0 100644 --- a/src/libsysprof-gtk/sysprof-xy-layer.c +++ b/src/libsysprof-gtk/sysprof-xy-layer.c @@ -30,7 +30,7 @@ enum { N_PROPS }; -G_DEFINE_FINAL_TYPE (SysprofXYLayer, sysprof_xy_layer, SYSPROF_TYPE_CHART_LAYER) +G_DEFINE_TYPE (SysprofXYLayer, sysprof_xy_layer, SYSPROF_TYPE_CHART_LAYER) static GParamSpec *properties [N_PROPS]; @@ -201,6 +201,9 @@ sysprof_xy_layer_set_series (SysprofXYLayer *self, g_binding_group_set_source (self->series_bindings, series); + sysprof_normalized_series_set_series (self->normal_x, SYSPROF_SERIES (series)); + sysprof_normalized_series_set_series (self->normal_y, SYSPROF_SERIES (series)); + g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SERIES]); } diff --git a/src/libsysprof-gtk/tests/meson.build b/src/libsysprof-gtk/tests/meson.build index caf13097..091a7ea1 100644 --- a/src/libsysprof-gtk/tests/meson.build +++ b/src/libsysprof-gtk/tests/meson.build @@ -23,8 +23,15 @@ libsysprof_gtk_testsuite_deps = [ libsysprof_gtk_static_dep, ] +tests_resources = gnome.compile_resources( + 'tests-resources', + 'tests.gresource.xml', + c_name: 'tests', +) + foreach test, params: libsysprof_gtk_testsuite - test_exe = executable(test, '@0@.c'.format(test), + test_exe = executable(test, + ['@0@.c'.format(test), tests_resources[0]], c_args: libsysprof_gtk_testsuite_c_args, dependencies: libsysprof_gtk_testsuite_deps, ) diff --git a/src/libsysprof-gtk/tests/test-charts.c b/src/libsysprof-gtk/tests/test-charts.c index 594e242d..73dd5b68 100644 --- a/src/libsysprof-gtk/tests/test-charts.c +++ b/src/libsysprof-gtk/tests/test-charts.c @@ -32,16 +32,38 @@ static const GOptionEntry entries[] = { { 0 } }; +#define TEST_TYPE_CHARTS (test_charts_get_type()) +G_DECLARE_FINAL_TYPE (TestCharts, test_charts, TEST, CHARTS, GtkWindow) + +struct _TestCharts +{ + GtkWindow parent_instance; + + SysprofDocument *document; + SysprofSession *session; +}; + +G_DEFINE_FINAL_TYPE (TestCharts, test_charts, GTK_TYPE_WINDOW) + +enum { + PROP_0, + PROP_DOCUMENT, + PROP_SESSION, + N_PROPS +}; + +static GParamSpec *properties [N_PROPS]; + static gboolean activate_layer_item_cb (SysprofChart *chart, SysprofChartLayer *layer, gpointer item, - SysprofDocument *document) + TestCharts *test) { g_assert (SYSPROF_IS_CHART (chart)); g_assert (SYSPROF_IS_CHART_LAYER (layer)); g_assert (G_IS_OBJECT (item)); - g_assert (SYSPROF_IS_DOCUMENT (document)); + g_assert (TEST_IS_CHARTS (test)); g_print ("Activated %s in layer '%s' [%s]\n", G_OBJECT_TYPE_NAME (item), @@ -69,7 +91,7 @@ activate_layer_item_cb (SysprofChart *chart, SysprofAddressContext final_context; guint n_symbols = G_N_ELEMENTS (symbols); - n_symbols = sysprof_document_symbolize_traceable (document, + n_symbols = sysprof_document_symbolize_traceable (test->document, item, symbols, n_symbols, @@ -83,6 +105,111 @@ activate_layer_item_cb (SysprofChart *chart, return GDK_EVENT_STOP; } +static void +test_charts_set_document (TestCharts *self, + SysprofDocument *document) +{ + if (g_set_object (&self->document, document)) + { + g_clear_object (&self->session); + + self->session = sysprof_session_new (self->document); + + g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_DOCUMENT]); + g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SESSION]); + } +} + +static void +test_charts_dispose (GObject *object) +{ + TestCharts *self = (TestCharts *)object; + + g_clear_object (&self->document); + g_clear_object (&self->session); + + G_OBJECT_CLASS (test_charts_parent_class)->dispose (object); +} + +static void +test_charts_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + TestCharts *self = TEST_CHARTS (object); + + switch (prop_id) + { + case PROP_DOCUMENT: + g_value_set_object (value, self->document); + break; + + case PROP_SESSION: + g_value_set_object (value, self->session); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +test_charts_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + TestCharts *self = TEST_CHARTS (object); + + switch (prop_id) + { + case PROP_DOCUMENT: + test_charts_set_document (self, g_value_get_object (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +test_charts_class_init (TestChartsClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->dispose = test_charts_dispose; + object_class->get_property = test_charts_get_property; + object_class->set_property = test_charts_set_property; + + properties [PROP_DOCUMENT] = + g_param_spec_object ("document", NULL, NULL, + SYSPROF_TYPE_DOCUMENT, + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + properties [PROP_SESSION] = + g_param_spec_object ("session", NULL, NULL, + SYSPROF_TYPE_SESSION, + (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_properties (object_class, N_PROPS, properties); + + gtk_widget_class_set_template_from_resource (widget_class, "/test-charts.ui"); + gtk_widget_class_bind_template_callback (widget_class, activate_layer_item_cb); + + g_type_ensure (SYSPROF_TYPE_CHART); + g_type_ensure (SYSPROF_TYPE_CHART_LAYER); + g_type_ensure (SYSPROF_TYPE_COLUMN_LAYER); + g_type_ensure (SYSPROF_TYPE_VALUE_AXIS); +} + +static void +test_charts_init (TestCharts *self) +{ + gtk_widget_init_template (GTK_WIDGET (self)); +} + int main (int argc, char *argv[]) @@ -90,23 +217,8 @@ main (int argc, g_autoptr(GOptionContext) context = g_option_context_new ("- test various charts"); g_autoptr(SysprofDocumentLoader) loader = NULL; g_autoptr(SysprofDocument) document = NULL; - g_autoptr(SysprofSession) session = NULL; - g_autoptr(SysprofXYSeries) samples_series = NULL; - g_autoptr(SysprofXYSeries) num_series = NULL; - g_autoptr(SysprofTimeSeries) marks_series = NULL; - g_autoptr(GListModel) samples = NULL; - g_autoptr(GListModel) marks = NULL; g_autoptr(GError) error = NULL; - const SysprofTimeSpan *time_span; - GtkWidget *chart; - GtkWidget *layer; - GtkWidget *split; GtkWindow *window; - GtkWidget *box; - GdkRGBA blue = {0,0,1,1}; - GdkRGBA red = {1,0,0,1}; - guint n_samples; - guint n_marks; sysprof_clock_init (); @@ -131,127 +243,14 @@ main (int argc, main_loop = g_main_loop_new (NULL, FALSE); loader = sysprof_document_loader_new (filename); - if (!(document = sysprof_document_loader_load (loader, NULL, &error))) g_error ("Failed to load document: %s", error->message); - g_print ("loaded\n"); - - session = sysprof_session_new (document); - time_span = sysprof_document_get_time_span (document); - marks = sysprof_document_list_marks (document); - - /* Generate an XY Series using the stacktraces depth for Y */ - samples = sysprof_document_list_samples (document); - n_samples = g_list_model_get_n_items (samples); - samples_series = sysprof_xy_series_new (samples, time_span->begin_nsec, 0, time_span->end_nsec, 128); - for (guint i = 0; i < n_samples; i++) - { - g_autoptr(SysprofDocumentTraceable) sample = g_list_model_get_item (samples, i); - gint64 time = sysprof_document_frame_get_time (SYSPROF_DOCUMENT_FRAME (sample)); - guint depth = sysprof_document_traceable_get_stack_depth (sample); - - sysprof_xy_series_add (samples_series, time, depth, i); - } - sysprof_xy_series_sort (samples_series); - - num_series = sysprof_xy_series_new (NULL, 0, 0, 100, 100); - for (guint i = 0; i < 100; i++) - sysprof_xy_series_add (num_series, i, g_random_int_range (0, 100), 0); - - g_print ("series built\n"); - - marks_series = sysprof_time_series_new (marks, *sysprof_document_get_time_span (document)); - n_marks = g_list_model_get_n_items (marks); - for (guint i = 0; i < n_marks; i++) - { - g_autoptr(SysprofDocumentMark) mark = g_list_model_get_item (marks, i); - gint64 time = sysprof_document_frame_get_time (SYSPROF_DOCUMENT_FRAME (mark)); - gint64 duration = sysprof_document_mark_get_duration (mark); - - sysprof_time_series_add (marks_series, - (SysprofTimeSpan) {time, time+duration}, - i); - } - sysprof_time_series_sort (marks_series); - - window = g_object_new (GTK_TYPE_WINDOW, + window = g_object_new (TEST_TYPE_CHARTS, "default-width", 800, "default-height", 600, + "document", document, NULL); - g_signal_connect_swapped (window, - "close-request", - G_CALLBACK (g_main_loop_quit), - main_loop); - - box = g_object_new (GTK_TYPE_BOX, - "orientation", GTK_ORIENTATION_VERTICAL, - NULL); - gtk_window_set_child (window, GTK_WIDGET (box)); - - chart = g_object_new (SYSPROF_TYPE_CHART, - "session", session, - "title", "Samples", - "height-request", 128, - NULL); - g_signal_connect (chart, - "activate-layer-item", - G_CALLBACK (activate_layer_item_cb), - document); - layer = g_object_new (SYSPROF_TYPE_COLUMN_LAYER, - "series", samples_series, - "title", "Stack Depth", - NULL); - sysprof_chart_add_layer (SYSPROF_CHART (chart), - SYSPROF_CHART_LAYER (layer)); - gtk_box_append (GTK_BOX (box), chart); - - chart = g_object_new (SYSPROF_TYPE_CHART, - "session", session, - "height-request", 128, - NULL); - split = g_object_new (SYSPROF_TYPE_SPLIT_LAYER, - "top", g_object_new (SYSPROF_TYPE_LINE_LAYER, - "series", num_series, - "title", "Stack Depth as Line", - "fill", TRUE, - NULL), - "bottom", g_object_new (SYSPROF_TYPE_LINE_LAYER, - "series", num_series, - "title", "Stack Depth as Line", - "flip-y", TRUE, - NULL), - NULL); - sysprof_chart_add_layer (SYSPROF_CHART (chart), - SYSPROF_CHART_LAYER (split)); - gtk_box_append (GTK_BOX (box), chart); - - chart = g_object_new (SYSPROF_TYPE_CHART, - "session", session, - "height-request", 128, - NULL); - layer = g_object_new (SYSPROF_TYPE_LINE_LAYER, - "series", num_series, - "use-curves", TRUE, - "fill", TRUE, - "dashed", TRUE, - NULL), - sysprof_chart_add_layer (SYSPROF_CHART (chart), - SYSPROF_CHART_LAYER (layer)); - gtk_box_append (GTK_BOX (box), chart); - - chart = g_object_new (SYSPROF_TYPE_CHART, - "session", session, - "height-request", 24, - NULL); - layer = g_object_new (SYSPROF_TYPE_TIME_SPAN_LAYER, - "color", &blue, - "event-color", &red, - "series", marks_series, - NULL), - sysprof_chart_add_layer (SYSPROF_CHART (chart), - SYSPROF_CHART_LAYER (layer)); - gtk_box_append (GTK_BOX (box), chart); gtk_window_present (window); g_main_loop_run (main_loop); diff --git a/src/libsysprof-gtk/tests/test-charts.ui b/src/libsysprof-gtk/tests/test-charts.ui new file mode 100644 index 00000000..e7be3695 --- /dev/null +++ b/src/libsysprof-gtk/tests/test-charts.ui @@ -0,0 +1,58 @@ + + + + diff --git a/src/libsysprof-gtk/tests/tests.gresource.xml b/src/libsysprof-gtk/tests/tests.gresource.xml new file mode 100644 index 00000000..a41b9c5c --- /dev/null +++ b/src/libsysprof-gtk/tests/tests.gresource.xml @@ -0,0 +1,6 @@ + + + + test-charts.ui + +