test_builder.mod 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. MODULE test_builder ;
  2. (*
  3. m2-GTK4 test - GtkBuilder.
  4. Loads a widget tree from an inline UI string, fetches an object by id,
  5. looks up a type name, and checks that malformed XML reports a
  6. GTK_BUILDER_ERROR via the GError out-parameter. Requires a display.
  7. *)
  8. FROM Gio IMPORT g_application_run, g_application_quit;
  9. FROM GtkApplication IMPORT gtk_application_new;
  10. FROM GtkBuilder IMPORT GtkBuilder, gtk_builder_new,
  11. gtk_builder_add_from_string, gtk_builder_get_object,
  12. gtk_builder_get_objects, gtk_builder_get_type_from_name,
  13. gtk_builder_error_quark;
  14. FROM GError IMPORT GError;
  15. FROM GtkUtils IMPORT Connect, ErrorMessage, ClearError, Unref;
  16. FROM SYSTEM IMPORT ADDRESS, ADR;
  17. FROM libc IMPORT printf;
  18. CONST
  19. AppId = "org.example.m2gtk4.TestBuilder";
  20. GoodUi = "<interface><object class='GtkWindow' id='win'><property name='title'>T</property><child><object class='GtkLabel' id='label1'><property name='label'>Hi</property></object></child></object></interface>";
  21. VAR
  22. app: ADDRESS;
  23. passed: BOOLEAN;
  24. PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
  25. VAR
  26. builder: GtkBuilder;
  27. err: GError;
  28. buf: ARRAY [0..255] OF CHAR;
  29. ok: BOOLEAN;
  30. BEGIN
  31. ok := TRUE;
  32. (* --- success path --- *)
  33. builder := gtk_builder_new();
  34. err := NIL;
  35. IF gtk_builder_add_from_string(builder, GoodUi, -1, err) = 0 THEN
  36. ErrorMessage(err, buf);
  37. printf("good UI failed: %s\n", buf);
  38. ClearError(err);
  39. ok := FALSE
  40. END;
  41. IF err # NIL THEN
  42. ErrorMessage(err, buf);
  43. printf("unexpected error: %s\n", buf);
  44. ClearError(err);
  45. ok := FALSE
  46. END;
  47. IF gtk_builder_get_object(builder, "label1") = NIL THEN
  48. printf("label1 not found\n");
  49. ok := FALSE
  50. END;
  51. IF gtk_builder_get_type_from_name(builder, "GtkLabel") = 0 THEN
  52. printf("type lookup failed\n");
  53. ok := FALSE
  54. END;
  55. IF gtk_builder_get_objects(builder) = NIL THEN
  56. printf("objects list is NIL\n");
  57. ok := FALSE
  58. END;
  59. Unref(builder);
  60. (* --- failure path: malformed XML must set a GError --- *)
  61. builder := gtk_builder_new();
  62. err := NIL;
  63. IF gtk_builder_add_from_string(builder, "<interface><bad/></interface>",
  64. -1, err) # 0 THEN
  65. printf("bad UI unexpectedly parsed\n");
  66. ok := FALSE
  67. END;
  68. IF err = NIL THEN
  69. printf("bad UI did not set an error\n");
  70. ok := FALSE
  71. ELSE
  72. IF err^.domain # gtk_builder_error_quark() THEN
  73. printf("wrong error domain\n");
  74. ok := FALSE
  75. END;
  76. ClearError(err)
  77. END;
  78. Unref(builder);
  79. passed := ok;
  80. g_application_quit(application)
  81. END OnActivate;
  82. VAR
  83. rc: INTEGER;
  84. BEGIN
  85. passed := FALSE;
  86. app := gtk_application_new(AppId, 0);
  87. IF app = NIL THEN
  88. printf("test_builder: FAIL (no app)\n");
  89. HALT(1)
  90. END;
  91. Connect(app, "activate", ADR(OnActivate), NIL);
  92. rc := g_application_run(app, 0, NIL);
  93. IF passed THEN
  94. printf("test_builder: PASS\n");
  95. HALT(0)
  96. ELSE
  97. printf("test_builder: FAIL\n");
  98. HALT(1)
  99. END
  100. END test_builder.