#include "views/dialog_geometry.h" static void test_calculations(void) { LabfyDialogGeometry geometry = labfy_dialog_geometry_calculate(1920, 1080); g_assert_cmpint(geometry.initial_width, ==, 1200); g_assert_cmpint(geometry.initial_height, ==, 800); g_assert_cmpint(geometry.minimum_width, ==, 800); g_assert_cmpint(geometry.minimum_height, ==, 600); geometry = labfy_dialog_geometry_calculate(800, 600); g_assert_cmpint(geometry.initial_width, ==, 800); g_assert_cmpint(geometry.initial_height, ==, 600); g_assert_cmpint(geometry.minimum_width, ==, 800); g_assert_cmpint(geometry.minimum_height, ==, 600); geometry = labfy_dialog_geometry_calculate(760, 560); g_assert_cmpint(geometry.initial_width, ==, 684); g_assert_cmpint(geometry.initial_height, ==, 504); g_assert_cmpint(geometry.minimum_width, ==, 684); g_assert_cmpint(geometry.minimum_height, ==, 504); geometry = labfy_dialog_geometry_calculate(0, 0); g_assert_cmpint(geometry.initial_width, ==, 1200); g_assert_cmpint(geometry.initial_height, ==, 800); } static gboolean frame_seen(GtkWidget *widget, GdkFrameClock *clock, gpointer data) { gboolean *seen = data; (void) widget; (void) clock; *seen = TRUE; return G_SOURCE_REMOVE; } static void wait_for_frame(GtkWidget *widget) { gboolean seen = FALSE; gtk_widget_add_tick_callback(widget, frame_seen, &seen, NULL); while (!seen) g_main_context_iteration(NULL, TRUE); } static void test_paned_applied_once(void) { GtkWindow *window = GTK_WINDOW(gtk_window_new()); GtkPaned *paned = GTK_PANED( gtk_paned_new(GTK_ORIENTATION_HORIZONTAL)); gtk_paned_set_start_child(paned, gtk_label_new("Formulaire")); gtk_paned_set_end_child(paned, gtk_label_new("Aperçu")); gtk_window_set_default_size(window, 900, 600); gtk_window_set_child(window, GTK_WIDGET(paned)); labfy_paned_apply_initial_ratio(paned, 2.0 / 3.0, 320, 180); gtk_window_present(window); for (guint frame = 0; frame < 6; frame++) wait_for_frame(GTK_WIDGET(window)); int allocated = gtk_widget_get_width(GTK_WIDGET(paned)); int expected = (allocated * 2) / 3; int tolerance = MAX(4, allocated / 50); int position = gtk_paned_get_position(paned); g_assert_cmpint(ABS(position - expected), <=, tolerance); g_assert_cmpint(position, >=, 320); g_assert_cmpint(allocated - position, >=, 180); int user_position = (allocated * 11) / 20; gtk_paned_set_position(paned, user_position); gtk_window_set_default_size(window, 1000, 700); wait_for_frame(GTK_WIDGET(window)); g_assert_cmpint(gtk_paned_get_position(paned), ==, user_position); labfy_paned_apply_initial_ratio(paned, 0.5, 100, 100); g_assert_cmpint(gtk_paned_get_position(paned), ==, user_position); gtk_window_destroy(window); } static void test_parent_and_presentation(void) { for (guint cycle = 0; cycle < 20; cycle++) { GtkWindow *parent = GTK_WINDOW(gtk_window_new()); GtkWindow *dialog = GTK_WINDOW(gtk_window_new()); GtkWindow *nested = GTK_WINDOW(gtk_window_new()); GtkWindow *dialog_observer = dialog; GtkWindow *nested_observer = nested; int width = 0; int height = 0; gtk_window_present(parent); labfy_dialog_prepare(dialog, parent, TRUE, TRUE); g_assert_true(gtk_window_get_transient_for(dialog) == parent); g_assert_true(gtk_window_get_modal(dialog)); g_assert_true(gtk_window_get_destroy_with_parent(dialog)); labfy_dialog_present(dialog); gtk_window_get_default_size(dialog, &width, &height); g_assert_cmpint(width, >, 0); g_assert_cmpint(height, >, 0); g_assert_true(gtk_widget_get_visible(GTK_WIDGET(dialog))); labfy_dialog_prepare(nested, dialog, TRUE, TRUE); g_assert_true(gtk_window_get_transient_for(nested) == dialog); labfy_dialog_present(nested); g_assert_true(gtk_widget_get_visible(GTK_WIDGET(nested))); g_object_add_weak_pointer( G_OBJECT(dialog), (gpointer *) &dialog_observer); g_object_add_weak_pointer( G_OBJECT(nested), (gpointer *) &nested_observer); gtk_window_destroy(parent); while (g_main_context_iteration(NULL, FALSE)); g_assert_null(dialog_observer); g_assert_null(nested_observer); } } int main(int argc, char **argv) { if (!gtk_init_check()) { g_print("SKIP: aucun affichage GTK disponible.\n"); return 0; } g_test_init(&argc, &argv, NULL); g_test_add_func("/dialog-geometry/calculations", test_calculations); g_test_add_func("/dialog-geometry/paned-applied-once", test_paned_applied_once); g_test_add_func("/dialog-geometry/parent-and-presentation", test_parent_and_presentation); return g_test_run(); }