MODULE test_builder ;
(*
m2-GTK4 test - GtkBuilder.
Loads a widget tree from an inline UI string, fetches an object by id,
looks up a type name, and checks that malformed XML reports a
GTK_BUILDER_ERROR via the GError out-parameter. Requires a display.
*)
FROM Gio IMPORT g_application_run, g_application_quit;
FROM GtkApplication IMPORT gtk_application_new;
FROM GtkBuilder IMPORT GtkBuilder, gtk_builder_new,
gtk_builder_add_from_string, gtk_builder_get_object,
gtk_builder_get_objects, gtk_builder_get_type_from_name,
gtk_builder_error_quark;
FROM GError IMPORT GError;
FROM GtkUtils IMPORT Connect, ErrorMessage, ClearError, Unref;
FROM SYSTEM IMPORT ADDRESS, ADR;
FROM libc IMPORT printf;
CONST
AppId = "org.example.m2gtk4.TestBuilder";
GoodUi = "";
VAR
app: ADDRESS;
passed: BOOLEAN;
PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
VAR
builder: GtkBuilder;
err: GError;
buf: ARRAY [0..255] OF CHAR;
ok: BOOLEAN;
BEGIN
ok := TRUE;
(* --- success path --- *)
builder := gtk_builder_new();
err := NIL;
IF gtk_builder_add_from_string(builder, GoodUi, -1, err) = 0 THEN
ErrorMessage(err, buf);
printf("good UI failed: %s\n", buf);
ClearError(err);
ok := FALSE
END;
IF err # NIL THEN
ErrorMessage(err, buf);
printf("unexpected error: %s\n", buf);
ClearError(err);
ok := FALSE
END;
IF gtk_builder_get_object(builder, "label1") = NIL THEN
printf("label1 not found\n");
ok := FALSE
END;
IF gtk_builder_get_type_from_name(builder, "GtkLabel") = 0 THEN
printf("type lookup failed\n");
ok := FALSE
END;
IF gtk_builder_get_objects(builder) = NIL THEN
printf("objects list is NIL\n");
ok := FALSE
END;
Unref(builder);
(* --- failure path: malformed XML must set a GError --- *)
builder := gtk_builder_new();
err := NIL;
IF gtk_builder_add_from_string(builder, "",
-1, err) # 0 THEN
printf("bad UI unexpectedly parsed\n");
ok := FALSE
END;
IF err = NIL THEN
printf("bad UI did not set an error\n");
ok := FALSE
ELSE
IF err^.domain # gtk_builder_error_quark() THEN
printf("wrong error domain\n");
ok := FALSE
END;
ClearError(err)
END;
Unref(builder);
passed := ok;
g_application_quit(application)
END OnActivate;
VAR
rc: INTEGER;
BEGIN
passed := FALSE;
app := gtk_application_new(AppId, 0);
IF app = NIL THEN
printf("test_builder: FAIL (no app)\n");
HALT(1)
END;
Connect(app, "activate", ADR(OnActivate), NIL);
rc := g_application_run(app, 0, NIL);
IF passed THEN
printf("test_builder: PASS\n");
HALT(0)
ELSE
printf("test_builder: FAIL\n");
HALT(1)
END
END test_builder.