test_text.mod 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. MODULE test_text ;
  2. (*
  3. m2-GTK4 test - text extras: tags, tag table, marks, iterators,
  4. GtkEntryBuffer and GtkEntryCompletion. Requires a display.
  5. *)
  6. FROM Gio IMPORT g_application_run, g_application_quit;
  7. FROM GtkApplication IMPORT gtk_application_new;
  8. FROM GtkWindow IMPORT gtk_application_window_new, gtk_window_set_child;
  9. FROM GtkBox IMPORT gtk_box_new, gtk_box_append;
  10. FROM GtkEnums IMPORT GtkVertical;
  11. FROM GtkTextView IMPORT gtk_text_view_new_with_buffer;
  12. FROM GtkTextBuffer IMPORT gtk_text_buffer_new, gtk_text_buffer_set_text,
  13. gtk_text_buffer_get_char_count, gtk_text_buffer_get_tag_table,
  14. gtk_text_buffer_create_tag, gtk_text_buffer_create_mark,
  15. gtk_text_buffer_get_mark, gtk_text_buffer_get_iter_at_offset,
  16. gtk_text_buffer_get_iter_at_mark, gtk_text_buffer_apply_tag,
  17. gtk_text_buffer_remove_tag, gtk_text_buffer_remove_all_tags,
  18. gtk_text_buffer_insert_at_cursor, gtk_text_buffer_insert_markup;
  19. FROM GtkTextIter IMPORT gtk_text_iter_get_offset, GtkTextIter;
  20. FROM GtkTextTag IMPORT gtk_text_tag_new, gtk_text_tag_set_priority,
  21. gtk_text_tag_get_priority;
  22. FROM GtkTextTagTable IMPORT gtk_text_tag_table_add, gtk_text_tag_table_lookup,
  23. gtk_text_tag_table_get_size;
  24. FROM GtkTextMark IMPORT gtk_text_mark_get_name, gtk_text_mark_set_visible,
  25. gtk_text_mark_get_visible, gtk_text_mark_get_deleted;
  26. FROM GtkEntry IMPORT gtk_entry_new, gtk_entry_get_buffer,
  27. gtk_entry_set_completion, gtk_entry_get_completion;
  28. FROM GtkEntryBuffer IMPORT gtk_entry_buffer_set_text, gtk_entry_buffer_get_text,
  29. gtk_entry_buffer_get_length, gtk_entry_buffer_set_max_length,
  30. gtk_entry_buffer_get_max_length;
  31. FROM GtkEntryCompletion IMPORT gtk_entry_completion_new,
  32. gtk_entry_completion_set_text_column, gtk_entry_completion_get_text_column,
  33. gtk_entry_completion_set_minimum_key_length,
  34. gtk_entry_completion_get_minimum_key_length,
  35. gtk_entry_completion_set_popup_completion;
  36. FROM GtkUtils IMPORT Connect, CStrToM2;
  37. FROM SYSTEM IMPORT ADDRESS, ADR;
  38. FROM libc IMPORT printf;
  39. CONST
  40. AppId = "org.example.m2gtk4.TestText";
  41. VAR
  42. app: ADDRESS;
  43. passed: BOOLEAN;
  44. PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS);
  45. VAR
  46. window, box, view, buffer, table, tag, tag2, tag3, mark, entry, eb, completion,
  47. it0, it1, it2: ADDRESS;
  48. iter0, iter1, iter2: GtkTextIter;
  49. buf: ARRAY [0..63] OF CHAR;
  50. size0: INTEGER;
  51. ok: BOOLEAN;
  52. BEGIN
  53. ok := TRUE;
  54. buffer := gtk_text_buffer_new(NIL);
  55. table := gtk_text_buffer_get_tag_table(buffer);
  56. IF table = NIL THEN printf("tag table NIL\n"); ok := FALSE END;
  57. size0 := gtk_text_tag_table_get_size(table);
  58. (* tag + tag table *)
  59. tag := gtk_text_tag_new("bold");
  60. gtk_text_tag_table_add(table, tag);
  61. IF gtk_text_tag_table_lookup(table, "bold") # tag THEN
  62. printf("tag lookup wrong\n"); ok := FALSE
  63. END;
  64. IF gtk_text_tag_table_get_size(table) # size0 + 1 THEN
  65. printf("tag table size wrong\n"); ok := FALSE
  66. END;
  67. tag3 := gtk_text_tag_new("italic");
  68. gtk_text_tag_table_add(table, tag3);
  69. IF gtk_text_tag_table_get_size(table) # size0 + 2 THEN ok := FALSE END;
  70. (* priority must be < the tag table size *)
  71. gtk_text_tag_set_priority(tag, 1);
  72. IF gtk_text_tag_get_priority(tag) # 1 THEN
  73. printf("tag priority wrong\n"); ok := FALSE
  74. END;
  75. (* text + iterators + tags *)
  76. gtk_text_buffer_set_text(buffer, "hello world", -1);
  77. IF gtk_text_buffer_get_char_count(buffer) # 11 THEN
  78. printf("char count wrong\n"); ok := FALSE
  79. END;
  80. gtk_text_buffer_get_iter_at_offset(buffer, iter0, 0);
  81. gtk_text_buffer_get_iter_at_offset(buffer, iter1, 5);
  82. IF gtk_text_iter_get_offset(iter0) # 0 THEN ok := FALSE END;
  83. IF gtk_text_iter_get_offset(iter1) # 5 THEN ok := FALSE END;
  84. gtk_text_buffer_apply_tag(buffer, tag, iter0, iter1);
  85. gtk_text_buffer_remove_tag(buffer, tag, iter0, iter1);
  86. gtk_text_buffer_remove_all_tags(buffer, iter0, iter1);
  87. (* mark *)
  88. mark := gtk_text_buffer_create_mark(buffer, "m1", iter0, 1);
  89. IF gtk_text_buffer_get_mark(buffer, "m1") # mark THEN
  90. printf("mark lookup wrong\n"); ok := FALSE
  91. END;
  92. CStrToM2(gtk_text_mark_get_name(mark), buf);
  93. IF (buf[0] # 'm') OR (buf[2] # 0C) THEN
  94. printf("mark name wrong: [%s]\n", buf); ok := FALSE
  95. END;
  96. gtk_text_mark_set_visible(mark, 1);
  97. IF gtk_text_mark_get_visible(mark) # 1 THEN ok := FALSE END;
  98. IF gtk_text_mark_get_deleted(mark) # 0 THEN ok := FALSE END;
  99. gtk_text_buffer_get_iter_at_mark(buffer, iter2, mark);
  100. IF gtk_text_iter_get_offset(iter2) # 0 THEN ok := FALSE END;
  101. (* inserts *)
  102. gtk_text_buffer_insert_at_cursor(buffer, "X", -1);
  103. IF gtk_text_buffer_get_char_count(buffer) # 12 THEN
  104. printf("insert_at_cursor wrong\n"); ok := FALSE
  105. END;
  106. gtk_text_buffer_get_iter_at_offset(buffer, iter0, 0);
  107. gtk_text_buffer_insert_markup(buffer, iter0, "<b>hi</b>", -1);
  108. IF gtk_text_buffer_get_char_count(buffer) # 14 THEN
  109. printf("insert_markup wrong\n"); ok := FALSE
  110. END;
  111. tag2 := gtk_text_buffer_create_tag(buffer, "red", NIL);
  112. IF tag2 = NIL THEN printf("create_tag NIL\n"); ok := FALSE END;
  113. (* entry buffer *)
  114. entry := gtk_entry_new();
  115. eb := gtk_entry_get_buffer(entry);
  116. IF eb = NIL THEN printf("entry buffer NIL\n"); ok := FALSE END;
  117. gtk_entry_buffer_set_text(eb, "abcdef", -1);
  118. IF gtk_entry_buffer_get_length(eb) # 6 THEN
  119. printf("entry buffer length wrong\n"); ok := FALSE
  120. END;
  121. CStrToM2(gtk_entry_buffer_get_text(eb), buf);
  122. IF (buf[0] # 'a') OR (buf[5] # 'f') OR (buf[6] # 0C) THEN
  123. printf("entry buffer text wrong: [%s]\n", buf); ok := FALSE
  124. END;
  125. gtk_entry_buffer_set_max_length(eb, 10);
  126. IF gtk_entry_buffer_get_max_length(eb) # 10 THEN ok := FALSE END;
  127. (* entry completion *)
  128. completion := gtk_entry_completion_new();
  129. gtk_entry_completion_set_text_column(completion, 0);
  130. IF gtk_entry_completion_get_text_column(completion) # 0 THEN ok := FALSE END;
  131. gtk_entry_completion_set_minimum_key_length(completion, 2);
  132. IF gtk_entry_completion_get_minimum_key_length(completion) # 2 THEN ok := FALSE END;
  133. gtk_entry_completion_set_popup_completion(completion, 1);
  134. gtk_entry_set_completion(entry, completion);
  135. IF gtk_entry_get_completion(entry) # completion THEN
  136. printf("entry completion wrong\n"); ok := FALSE
  137. END;
  138. view := gtk_text_view_new_with_buffer(buffer);
  139. box := gtk_box_new(GtkVertical, 4);
  140. gtk_box_append(box, view);
  141. gtk_box_append(box, entry);
  142. window := gtk_application_window_new(application);
  143. gtk_window_set_child(window, box);
  144. passed := ok;
  145. g_application_quit(application)
  146. END OnActivate;
  147. VAR
  148. rc: INTEGER;
  149. BEGIN
  150. passed := FALSE;
  151. app := gtk_application_new(AppId, 0);
  152. IF app = NIL THEN
  153. printf("test_text: FAIL (no app)\n");
  154. HALT(1)
  155. END;
  156. Connect(app, "activate", ADR(OnActivate), NIL);
  157. rc := g_application_run(app, 0, NIL);
  158. IF passed THEN
  159. printf("test_text: PASS\n");
  160. HALT(0)
  161. ELSE
  162. printf("test_text: FAIL\n");
  163. HALT(1)
  164. END
  165. END test_text.