wxruby3 0.9.0.pre.rc.2-x64-mingw-ucrt → 0.9.0.pre.rc.3-x64-mingw-ucrt

Sign up to get free protection for your applications and to get access to all the features.
Files changed (341) hide show
  1. checksums.yaml +4 -4
  2. data/INSTALL.md +30 -8
  3. data/README.md +3 -3
  4. data/ext/wxbase32u_gcc_custom.dll +0 -0
  5. data/ext/wxbase32u_net_gcc_custom.dll +0 -0
  6. data/ext/wxbase32u_xml_gcc_custom.dll +0 -0
  7. data/ext/wxmsw32u_aui_gcc_custom.dll +0 -0
  8. data/ext/wxmsw32u_core_gcc_custom.dll +0 -0
  9. data/ext/wxmsw32u_gl_gcc_custom.dll +0 -0
  10. data/ext/wxmsw32u_html_gcc_custom.dll +0 -0
  11. data/ext/wxmsw32u_media_gcc_custom.dll +0 -0
  12. data/ext/wxmsw32u_propgrid_gcc_custom.dll +0 -0
  13. data/ext/wxmsw32u_qa_gcc_custom.dll +0 -0
  14. data/ext/wxmsw32u_ribbon_gcc_custom.dll +0 -0
  15. data/ext/wxmsw32u_richtext_gcc_custom.dll +0 -0
  16. data/ext/wxmsw32u_stc_gcc_custom.dll +0 -0
  17. data/ext/wxmsw32u_webview_gcc_custom.dll +0 -0
  18. data/ext/wxmsw32u_xrc_gcc_custom.dll +0 -0
  19. data/lib/wx/core/event_loop.rb +7 -0
  20. data/lib/wx/core/image.rb +33 -0
  21. data/lib/wx/core/listctrl.rb +17 -13
  22. data/lib/wx/core/log.rb +90 -0
  23. data/lib/wx/doc/bitmap.rb +11 -15
  24. data/lib/wx/doc/event_loop.rb +7 -0
  25. data/lib/wx/doc/extra/00_starting.md +6 -6
  26. data/lib/wx/doc/extra/02_lifecycles.md +9 -8
  27. data/lib/wx/doc/extra/09_exceptions.md +1 -1
  28. data/lib/wx/doc/extra/11_drawing_and_dc.md +4 -4
  29. data/lib/wx/doc/font.rb +1 -1
  30. data/lib/wx/doc/functions.rb +51 -23
  31. data/lib/wx/doc/gc_dc.rb +1 -1
  32. data/lib/wx/doc/gen/about_dialog_info.rb +1 -1
  33. data/lib/wx/doc/gen/accelerator.rb +6 -6
  34. data/lib/wx/doc/gen/accessible.rb +6 -2
  35. data/lib/wx/doc/gen/activity_indicator.rb +5 -5
  36. data/lib/wx/doc/gen/animation.rb +7 -7
  37. data/lib/wx/doc/gen/animation_ctrl.rb +7 -6
  38. data/lib/wx/doc/gen/any_button.rb +1 -1
  39. data/lib/wx/doc/gen/app.rb +17 -11
  40. data/lib/wx/doc/gen/art_provider.rb +61 -1
  41. data/lib/wx/doc/gen/aui/aui_dock_art.rb +12 -12
  42. data/lib/wx/doc/gen/aui/aui_floating_frame.rb +6 -6
  43. data/lib/wx/doc/gen/aui/aui_manager.rb +45 -27
  44. data/lib/wx/doc/gen/aui/aui_manager_event.rb +12 -6
  45. data/lib/wx/doc/gen/aui/aui_mdi_child_frame.rb +6 -6
  46. data/lib/wx/doc/gen/aui/aui_mdi_client_window.rb +6 -6
  47. data/lib/wx/doc/gen/aui/aui_mdi_parent_frame.rb +10 -10
  48. data/lib/wx/doc/gen/aui/aui_notebook.rb +34 -7
  49. data/lib/wx/doc/gen/aui/aui_notebook_event.rb +17 -2
  50. data/lib/wx/doc/gen/aui/aui_pane_info.rb +51 -51
  51. data/lib/wx/doc/gen/aui/aui_tab_art.rb +6 -6
  52. data/lib/wx/doc/gen/aui/aui_tool_bar.rb +33 -18
  53. data/lib/wx/doc/gen/aui/aui_tool_bar_art.rb +16 -16
  54. data/lib/wx/doc/gen/aui/aui_tool_bar_event.rb +4 -4
  55. data/lib/wx/doc/gen/aui/aui_tool_bar_item.rb +4 -4
  56. data/lib/wx/doc/gen/bitmap.rb +32 -26
  57. data/lib/wx/doc/gen/bitmap_button.rb +10 -6
  58. data/lib/wx/doc/gen/bitmap_combo_box.rb +12 -7
  59. data/lib/wx/doc/gen/book_ctrl_base.rb +7 -3
  60. data/lib/wx/doc/gen/book_ctrl_event.rb +2 -2
  61. data/lib/wx/doc/gen/box_sizer.rb +1 -1
  62. data/lib/wx/doc/gen/brush.rb +16 -4
  63. data/lib/wx/doc/gen/busy_info.rb +1 -1
  64. data/lib/wx/doc/gen/button.rb +19 -7
  65. data/lib/wx/doc/gen/calculate_layout_event.rb +2 -1
  66. data/lib/wx/doc/gen/calendar_ctrl.rb +28 -16
  67. data/lib/wx/doc/gen/calendar_date_attr.rb +2 -2
  68. data/lib/wx/doc/gen/calendar_event.rb +3 -3
  69. data/lib/wx/doc/gen/caret.rb +2 -2
  70. data/lib/wx/doc/gen/check_box.rb +10 -6
  71. data/lib/wx/doc/gen/check_list_box.rb +8 -7
  72. data/lib/wx/doc/gen/choice.rb +7 -6
  73. data/lib/wx/doc/gen/choicebook.rb +12 -6
  74. data/lib/wx/doc/gen/client_dc.rb +1 -1
  75. data/lib/wx/doc/gen/clipboard.rb +1 -1
  76. data/lib/wx/doc/gen/collapsible_pane.rb +9 -6
  77. data/lib/wx/doc/gen/collapsible_pane_event.rb +2 -1
  78. data/lib/wx/doc/gen/colour.rb +16 -6
  79. data/lib/wx/doc/gen/colour_dialog.rb +6 -6
  80. data/lib/wx/doc/gen/colour_picker_ctrl.rb +15 -9
  81. data/lib/wx/doc/gen/colour_picker_event.rb +7 -4
  82. data/lib/wx/doc/gen/combo_box.rb +22 -13
  83. data/lib/wx/doc/gen/context_help_button.rb +4 -3
  84. data/lib/wx/doc/gen/control.rb +9 -6
  85. data/lib/wx/doc/gen/core.rb +5 -2
  86. data/lib/wx/doc/gen/cursor.rb +16 -11
  87. data/lib/wx/doc/gen/data_format.rb +2 -2
  88. data/lib/wx/doc/gen/data_object.rb +23 -16
  89. data/lib/wx/doc/gen/date_event.rb +3 -3
  90. data/lib/wx/doc/gen/date_picker_ctrl.rb +11 -6
  91. data/lib/wx/doc/gen/dc.rb +37 -12
  92. data/lib/wx/doc/gen/defs.rb +16 -16
  93. data/lib/wx/doc/gen/dialog.rb +19 -5
  94. data/lib/wx/doc/gen/dir_dialog.rb +6 -2
  95. data/lib/wx/doc/gen/dir_filter_list_ctrl.rb +2 -2
  96. data/lib/wx/doc/gen/dir_picker_ctrl.rb +14 -9
  97. data/lib/wx/doc/gen/drag_drop.rb +15 -15
  98. data/lib/wx/doc/gen/drag_image.rb +6 -6
  99. data/lib/wx/doc/gen/editable_list_box.rb +7 -3
  100. data/lib/wx/doc/gen/event.rb +44 -13
  101. data/lib/wx/doc/gen/event_blocker.rb +1 -1
  102. data/lib/wx/doc/gen/event_filter.rb +5 -2
  103. data/lib/wx/doc/gen/event_list.rb +15 -15
  104. data/lib/wx/doc/gen/events.rb +215 -79
  105. data/lib/wx/doc/gen/evt_handler.rb +1 -1
  106. data/lib/wx/doc/gen/ext_help_controller.rb +1 -1
  107. data/lib/wx/doc/gen/file_dialog.rb +16 -7
  108. data/lib/wx/doc/gen/file_dir_picker_event.rb +5 -3
  109. data/lib/wx/doc/gen/file_picker_ctrl.rb +16 -8
  110. data/lib/wx/doc/gen/find_dialog_event.rb +7 -2
  111. data/lib/wx/doc/gen/find_replace_data.rb +1 -1
  112. data/lib/wx/doc/gen/find_replace_dialog.rb +1 -1
  113. data/lib/wx/doc/gen/flex_grid_sizer.rb +12 -6
  114. data/lib/wx/doc/gen/font.rb +30 -29
  115. data/lib/wx/doc/gen/font_data.rb +9 -5
  116. data/lib/wx/doc/gen/font_dialog.rb +3 -3
  117. data/lib/wx/doc/gen/font_picker_ctrl.rb +10 -6
  118. data/lib/wx/doc/gen/font_picker_event.rb +2 -1
  119. data/lib/wx/doc/gen/frame.rb +34 -11
  120. data/lib/wx/doc/gen/fs_file.rb +4 -17
  121. data/lib/wx/doc/gen/gauge.rb +11 -7
  122. data/lib/wx/doc/gen/gcdc.rb +5 -1
  123. data/lib/wx/doc/gen/gdi_common.rb +35 -33
  124. data/lib/wx/doc/gen/gdi_object.rb +1 -1
  125. data/lib/wx/doc/gen/generic_dir_ctrl.rb +13 -7
  126. data/lib/wx/doc/gen/graphics_context.rb +29 -28
  127. data/lib/wx/doc/gen/graphics_object.rb +1 -1
  128. data/lib/wx/doc/gen/grid/grid_cell_activatable_editor.rb +2 -2
  129. data/lib/wx/doc/gen/grid/grid_cell_attr.rb +10 -10
  130. data/lib/wx/doc/gen/grid/grid_cell_auto_wrap_string_editor.rb +1 -1
  131. data/lib/wx/doc/gen/grid/grid_cell_auto_wrap_string_renderer.rb +1 -1
  132. data/lib/wx/doc/gen/grid/grid_cell_bool_editor.rb +1 -1
  133. data/lib/wx/doc/gen/grid/grid_cell_bool_renderer.rb +1 -1
  134. data/lib/wx/doc/gen/grid/grid_cell_choice_editor.rb +2 -2
  135. data/lib/wx/doc/gen/grid/grid_cell_date_editor.rb +1 -1
  136. data/lib/wx/doc/gen/grid/grid_cell_date_renderer.rb +1 -1
  137. data/lib/wx/doc/gen/grid/grid_cell_date_time_renderer.rb +1 -1
  138. data/lib/wx/doc/gen/grid/grid_cell_editor.rb +13 -10
  139. data/lib/wx/doc/gen/grid/grid_cell_enum_editor.rb +1 -1
  140. data/lib/wx/doc/gen/grid/grid_cell_enum_renderer.rb +1 -1
  141. data/lib/wx/doc/gen/grid/grid_cell_float_editor.rb +1 -1
  142. data/lib/wx/doc/gen/grid/grid_cell_float_renderer.rb +1 -1
  143. data/lib/wx/doc/gen/grid/grid_cell_number_editor.rb +1 -1
  144. data/lib/wx/doc/gen/grid/grid_cell_number_renderer.rb +1 -1
  145. data/lib/wx/doc/gen/grid/grid_cell_renderer.rb +12 -12
  146. data/lib/wx/doc/gen/grid/grid_cell_string_renderer.rb +1 -1
  147. data/lib/wx/doc/gen/grid/grid_cell_text_editor.rb +1 -1
  148. data/lib/wx/doc/gen/grid/grid_ctrl.rb +32 -18
  149. data/lib/wx/doc/gen/grid/grid_editor_created_event.rb +5 -3
  150. data/lib/wx/doc/gen/grid/grid_event.rb +20 -3
  151. data/lib/wx/doc/gen/grid/grid_range_select_event.rb +7 -3
  152. data/lib/wx/doc/gen/grid/grid_size_event.rb +9 -3
  153. data/lib/wx/doc/gen/grid/grid_string_table.rb +2 -2
  154. data/lib/wx/doc/gen/grid/grid_table_base.rb +7 -7
  155. data/lib/wx/doc/gen/grid/grid_table_message.rb +5 -5
  156. data/lib/wx/doc/gen/grid_bag_sizer.rb +5 -5
  157. data/lib/wx/doc/gen/grid_sizer.rb +4 -4
  158. data/lib/wx/doc/gen/gui_event_loop.rb +132 -0
  159. data/lib/wx/doc/gen/help_controller.rb +18 -12
  160. data/lib/wx/doc/gen/html/html_cell.rb +36 -18
  161. data/lib/wx/doc/gen/html/html_cell_event.rb +5 -3
  162. data/lib/wx/doc/gen/html/html_easy_printing.rb +9 -4
  163. data/lib/wx/doc/gen/html/html_help_controller.rb +34 -8
  164. data/lib/wx/doc/gen/html/html_help_data.rb +3 -3
  165. data/lib/wx/doc/gen/html/html_help_frame.rb +6 -6
  166. data/lib/wx/doc/gen/html/html_help_window.rb +12 -8
  167. data/lib/wx/doc/gen/html/html_link_event.rb +4 -3
  168. data/lib/wx/doc/gen/html/html_list_box.rb +15 -7
  169. data/lib/wx/doc/gen/html/html_printout.rb +15 -5
  170. data/lib/wx/doc/gen/html/html_window.rb +19 -8
  171. data/lib/wx/doc/gen/hyperlink_ctrl.rb +12 -7
  172. data/lib/wx/doc/gen/hyperlink_event.rb +2 -1
  173. data/lib/wx/doc/gen/icon.rb +14 -14
  174. data/lib/wx/doc/gen/image.rb +119 -64
  175. data/lib/wx/doc/gen/image_list.rb +10 -6
  176. data/lib/wx/doc/gen/keyboard_state.rb +7 -7
  177. data/lib/wx/doc/gen/list_box.rb +30 -21
  178. data/lib/wx/doc/gen/list_ctrl.rb +169 -78
  179. data/lib/wx/doc/gen/list_event.rb +24 -2
  180. data/lib/wx/doc/gen/listbook.rb +12 -6
  181. data/lib/wx/doc/gen/locale.rb +11 -36
  182. data/lib/wx/doc/gen/log.rb +122 -45
  183. data/lib/wx/doc/gen/mdi_client_window.rb +2 -2
  184. data/lib/wx/doc/gen/mdi_frame.rb +15 -9
  185. data/lib/wx/doc/gen/media_ctrl.rb +7 -4
  186. data/lib/wx/doc/gen/media_event.rb +8 -2
  187. data/lib/wx/doc/gen/memory_dc.rb +23 -27
  188. data/lib/wx/doc/gen/menu.rb +9 -9
  189. data/lib/wx/doc/gen/menu_bar.rb +4 -4
  190. data/lib/wx/doc/gen/menu_item.rb +115 -34
  191. data/lib/wx/doc/gen/message_dialog.rb +48 -30
  192. data/lib/wx/doc/gen/mini_frame.rb +12 -3
  193. data/lib/wx/doc/gen/mouse_state.rb +1 -1
  194. data/lib/wx/doc/gen/multi_choice_dialog.rb +4 -2
  195. data/lib/wx/doc/gen/non_owned_window.rb +6 -7
  196. data/lib/wx/doc/gen/notebook.rb +20 -15
  197. data/lib/wx/doc/gen/number_entry_dialog.rb +2 -2
  198. data/lib/wx/doc/gen/object.rb +2 -2
  199. data/lib/wx/doc/gen/palette.rb +3 -3
  200. data/lib/wx/doc/gen/panel.rb +4 -3
  201. data/lib/wx/doc/gen/pen.rb +25 -12
  202. data/lib/wx/doc/gen/pg/numeric_property_validator.rb +1 -1
  203. data/lib/wx/doc/gen/pg/pg_array_editor_dialog.rb +3 -3
  204. data/lib/wx/doc/gen/pg/pg_cell.rb +12 -12
  205. data/lib/wx/doc/gen/pg/pg_editor.rb +76 -74
  206. data/lib/wx/doc/gen/pg/pg_multi_button.rb +3 -3
  207. data/lib/wx/doc/gen/pg/pg_properties.rb +221 -138
  208. data/lib/wx/doc/gen/pg/pg_property.rb +103 -54
  209. data/lib/wx/doc/gen/pg/pg_validation_info.rb +1 -1
  210. data/lib/wx/doc/gen/pg/property_grid.rb +19 -19
  211. data/lib/wx/doc/gen/pg/property_grid_event.rb +18 -5
  212. data/lib/wx/doc/gen/pg/property_grid_interface.rb +36 -24
  213. data/lib/wx/doc/gen/pg/property_grid_manager.rb +12 -12
  214. data/lib/wx/doc/gen/pg/property_grid_page.rb +12 -11
  215. data/lib/wx/doc/gen/pg/property_grid_page_state.rb +8 -8
  216. data/lib/wx/doc/gen/picker_base.rb +12 -11
  217. data/lib/wx/doc/gen/platform_info.rb +7 -7
  218. data/lib/wx/doc/gen/popup_window.rb +6 -6
  219. data/lib/wx/doc/gen/progress_dialog.rb +1 -1
  220. data/lib/wx/doc/gen/property_sheet_dialog.rb +19 -17
  221. data/lib/wx/doc/gen/prt/page_setup_dialog.rb +2 -2
  222. data/lib/wx/doc/gen/prt/preview_frame.rb +4 -1
  223. data/lib/wx/doc/gen/prt/print_abort_dialog.rb +1 -1
  224. data/lib/wx/doc/gen/prt/print_data.rb +24 -18
  225. data/lib/wx/doc/gen/prt/print_dialog.rb +4 -4
  226. data/lib/wx/doc/gen/prt/printer.rb +22 -22
  227. data/lib/wx/doc/gen/query_layout_info_event.rb +2 -1
  228. data/lib/wx/doc/gen/radio_box.rb +12 -10
  229. data/lib/wx/doc/gen/radio_button.rb +8 -6
  230. data/lib/wx/doc/gen/rbn/ribbon_art_provider.rb +39 -39
  231. data/lib/wx/doc/gen/rbn/ribbon_bar.rb +25 -7
  232. data/lib/wx/doc/gen/rbn/ribbon_bar_event.rb +5 -5
  233. data/lib/wx/doc/gen/rbn/ribbon_button_bar.rb +9 -2
  234. data/lib/wx/doc/gen/rbn/ribbon_button_bar_event.rb +5 -5
  235. data/lib/wx/doc/gen/rbn/ribbon_control.rb +4 -4
  236. data/lib/wx/doc/gen/rbn/ribbon_gallery.rb +6 -2
  237. data/lib/wx/doc/gen/rbn/ribbon_gallery_event.rb +5 -5
  238. data/lib/wx/doc/gen/rbn/ribbon_page.rb +5 -5
  239. data/lib/wx/doc/gen/rbn/ribbon_panel.rb +12 -6
  240. data/lib/wx/doc/gen/rbn/ribbon_panel_event.rb +5 -5
  241. data/lib/wx/doc/gen/rbn/ribbon_tool_bar.rb +4 -2
  242. data/lib/wx/doc/gen/rbn/ribbon_tool_bar_event.rb +5 -5
  243. data/lib/wx/doc/gen/region.rb +9 -8
  244. data/lib/wx/doc/gen/region_iterator.rb +2 -2
  245. data/lib/wx/doc/gen/rtc/rich_text_buffer.rb +92 -92
  246. data/lib/wx/doc/gen/rtc/rich_text_ctrl.rb +56 -34
  247. data/lib/wx/doc/gen/rtc/rich_text_event.rb +23 -4
  248. data/lib/wx/doc/gen/rtc/rich_text_file_handler.rb +6 -6
  249. data/lib/wx/doc/gen/rtc/rich_text_header_footer_data.rb +9 -5
  250. data/lib/wx/doc/gen/rtc/rich_text_html_handler.rb +6 -2
  251. data/lib/wx/doc/gen/rtc/rich_text_printing.rb +12 -12
  252. data/lib/wx/doc/gen/rtc/rich_text_xml_handler.rb +1 -1
  253. data/lib/wx/doc/gen/rtc/symbol_picker_dialog.rb +2 -2
  254. data/lib/wx/doc/gen/sash_event.rb +3 -1
  255. data/lib/wx/doc/gen/sash_layout_window.rb +5 -3
  256. data/lib/wx/doc/gen/sash_window.rb +8 -3
  257. data/lib/wx/doc/gen/scroll_bar.rb +29 -8
  258. data/lib/wx/doc/gen/scrolled_canvas.rb +41 -23
  259. data/lib/wx/doc/gen/scrolled_control.rb +41 -23
  260. data/lib/wx/doc/gen/scrolled_window.rb +41 -23
  261. data/lib/wx/doc/gen/search_ctrl.rb +15 -8
  262. data/lib/wx/doc/gen/simplebook.rb +2 -2
  263. data/lib/wx/doc/gen/single_choice_dialog.rb +4 -2
  264. data/lib/wx/doc/gen/sizer.rb +29 -28
  265. data/lib/wx/doc/gen/slider.rb +49 -16
  266. data/lib/wx/doc/gen/spin_button.rb +15 -9
  267. data/lib/wx/doc/gen/spin_ctrl.rb +12 -6
  268. data/lib/wx/doc/gen/spin_event.rb +5 -2
  269. data/lib/wx/doc/gen/splash_screen.rb +16 -12
  270. data/lib/wx/doc/gen/splitter_event.rb +6 -2
  271. data/lib/wx/doc/gen/splitter_window.rb +20 -4
  272. data/lib/wx/doc/gen/static_bitmap.rb +5 -5
  273. data/lib/wx/doc/gen/static_box.rb +36 -32
  274. data/lib/wx/doc/gen/static_box_sizer.rb +13 -10
  275. data/lib/wx/doc/gen/static_line.rb +5 -4
  276. data/lib/wx/doc/gen/static_text.rb +12 -6
  277. data/lib/wx/doc/gen/status_bar.rb +14 -5
  278. data/lib/wx/doc/gen/stc/styled_text_ctrl.rb +55 -7
  279. data/lib/wx/doc/gen/stc/styled_text_event.rb +224 -49
  280. data/lib/wx/doc/gen/std_dialog_button_sizer.rb +11 -2
  281. data/lib/wx/doc/gen/svg_file_dc.rb +3 -3
  282. data/lib/wx/doc/gen/system_options.rb +11 -1
  283. data/lib/wx/doc/gen/system_settings.rb +3 -3
  284. data/lib/wx/doc/gen/task_bar_icon.rb +10 -2
  285. data/lib/wx/doc/gen/task_bar_icon_event.rb +3 -3
  286. data/lib/wx/doc/gen/text_attr.rb +11 -7
  287. data/lib/wx/doc/gen/text_ctrl.rb +61 -92
  288. data/lib/wx/doc/gen/text_entry.rb +28 -40
  289. data/lib/wx/doc/gen/text_entry_dialog.rb +19 -19
  290. data/lib/wx/doc/gen/text_validator.rb +0 -11
  291. data/lib/wx/doc/gen/time_picker_ctrl.rb +6 -5
  292. data/lib/wx/doc/gen/timer.rb +8 -4
  293. data/lib/wx/doc/gen/timer_event.rb +19 -26
  294. data/lib/wx/doc/gen/tip_provider.rb +1 -1
  295. data/lib/wx/doc/gen/toggle_button.rb +6 -5
  296. data/lib/wx/doc/gen/tool_bar.rb +41 -24
  297. data/lib/wx/doc/gen/tool_tip.rb +2 -2
  298. data/lib/wx/doc/gen/toolbook.rb +6 -3
  299. data/lib/wx/doc/gen/top_level_window.rb +35 -25
  300. data/lib/wx/doc/gen/tree_ctrl.rb +63 -13
  301. data/lib/wx/doc/gen/tree_event.rb +23 -2
  302. data/lib/wx/doc/gen/treebook.rb +6 -2
  303. data/lib/wx/doc/gen/ui_action_simulator.rb +1 -1
  304. data/lib/wx/doc/gen/utils.rb +9 -3
  305. data/lib/wx/doc/gen/v_list_box.rb +2 -2
  306. data/lib/wx/doc/gen/v_scrolled_window.rb +2 -2
  307. data/lib/wx/doc/gen/validator.rb +7 -5
  308. data/lib/wx/doc/gen/variant.rb +34 -97
  309. data/lib/wx/doc/gen/window.rb +157 -102
  310. data/lib/wx/doc/gen/window_dc.rb +1 -1
  311. data/lib/wx/doc/gen/with_images.rb +1 -1
  312. data/lib/wx/doc/gen/wizard.rb +17 -4
  313. data/lib/wx/doc/gen/wizard_event.rb +9 -2
  314. data/lib/wx/doc/gen/wizard_page.rb +1 -1
  315. data/lib/wx/doc/gen/wizard_page_simple.rb +7 -7
  316. data/lib/wx/doc/gen/xml_node.rb +3 -3
  317. data/lib/wx/doc/gen/xml_resource.rb +12 -9
  318. data/lib/wx/doc/image.rb +42 -12
  319. data/lib/wx/doc/list_ctrl.rb +32 -0
  320. data/lib/wx/doc/log.rb +28 -0
  321. data/lib/wx/doc/prt/printer_dc.rb +2 -2
  322. data/lib/wx/doc/scaled_dc.rb +1 -1
  323. data/lib/wx/doc/text_validator.rb +12 -0
  324. data/lib/wx/version.rb +1 -1
  325. data/lib/wxruby_aui.so +0 -0
  326. data/lib/wxruby_core.so +0 -0
  327. data/lib/wxruby_grid.so +0 -0
  328. data/lib/wxruby_html.so +0 -0
  329. data/lib/wxruby_pg.so +0 -0
  330. data/lib/wxruby_prt.so +0 -0
  331. data/lib/wxruby_rbn.so +0 -0
  332. data/lib/wxruby_rtc.so +0 -0
  333. data/lib/wxruby_stc.so +0 -0
  334. data/tests/test_art.rb +9 -0
  335. data/tests/test_box_sizer.rb +161 -0
  336. data/tests/test_grid_sizer.rb +148 -0
  337. data/tests/test_list_ctrl.rb +53 -0
  338. data/tests/test_log.rb +163 -0
  339. data/tests/test_std_controls.rb +58 -0
  340. data/tests/test_timer.rb +95 -0
  341. metadata +13 -2
@@ -0,0 +1,148 @@
1
+
2
+ require_relative './lib/wxframe_runner'
3
+
4
+ class GridSizerTests < WxRuby::Test::GUITests
5
+
6
+ def setup
7
+ super
8
+ @win = Wx::Window.new(test_frame, Wx::ID_ANY)
9
+ @win.set_client_size(127, 35)
10
+ @sizer = Wx::GridSizer.new(2)
11
+ @win.set_sizer(@sizer)
12
+ end
13
+
14
+ def cleanup
15
+ test_frame.destroy_children
16
+ @win = nil
17
+ @sizer = nil
18
+ super
19
+ end
20
+
21
+ attr_reader :win, :sizer
22
+
23
+ def set_children(children, flags)
24
+ @sizer.clear
25
+ children.each { |c| @sizer.add(c, flags) }
26
+ @win.layout
27
+ end
28
+
29
+ def test_layout
30
+ sizeTotal = win.get_client_size
31
+ sizeChild = Wx::Size.new(sizeTotal.x / 2, sizeTotal.y / 2)
32
+
33
+ children = [Wx::Window.new(win, Wx::ID_ANY),
34
+ Wx::Window.new(win, Wx::ID_ANY),
35
+ Wx::Window.new(win, Wx::ID_ANY)]
36
+
37
+ set_children(children, Wx::SizerFlags.new.expand)
38
+ assert(children[0].rect == Wx::Rect.new(Wx::Point.new(0, 0), sizeChild))
39
+ assert(children[1].rect == Wx::Rect.new(Wx::Point.new(sizeChild.x, 0), sizeChild))
40
+ assert(children[2].rect == Wx::Rect.new(Wx::Point.new(0, sizeChild.y), sizeChild))
41
+ end
42
+
43
+ end
44
+
45
+ class FlexGridSizerTests < WxRuby::Test::GUITests
46
+
47
+ def setup
48
+ super
49
+ @win = Wx::Window.new(test_frame, Wx::ID_ANY)
50
+ @win.set_client_size(127, 35)
51
+ @sizer = Wx::FlexGridSizer.new(2)
52
+ @win.set_sizer(@sizer)
53
+ end
54
+
55
+ def cleanup
56
+ test_frame.destroy_children
57
+ @win = nil
58
+ @sizer = nil
59
+ super
60
+ end
61
+
62
+ attr_reader :win, :sizer
63
+
64
+ def set_children(children, flags)
65
+ @sizer.clear
66
+ children.each { |c| @sizer.add(c, flags) }
67
+ @win.layout
68
+ end
69
+
70
+ def do_test_layout
71
+ sizeTotal = win.get_client_size
72
+ sizeChild = Wx::Size.new(sizeTotal.x / 4, sizeTotal.y / 4)
73
+ sizeRest = Wx::Size.new(sizeTotal.x - sizeTotal.x / 4,
74
+ sizeTotal.y - sizeTotal.y / 4)
75
+
76
+ children = [Wx::Window.new(win, Wx::ID_ANY, Wx::DEFAULT_POSITION, sizeChild),
77
+ Wx::Window.new(win, Wx::ID_ANY, Wx::DEFAULT_POSITION, sizeChild),
78
+ Wx::Window.new(win, Wx::ID_ANY, Wx::DEFAULT_POSITION, sizeChild),
79
+ Wx::Window.new(win, Wx::ID_ANY, Wx::DEFAULT_POSITION, sizeChild)]
80
+
81
+ sizer.add_growable_row(1)
82
+ sizer.add_growable_col(1)
83
+
84
+ yield(children, sizeTotal, sizeChild, sizeRest)
85
+ end
86
+
87
+ def test_layout
88
+ do_test_layout do |children, sizeTotal, sizeChild, sizeRest|
89
+ set_children(children, Wx::SizerFlags.new)
90
+ assert_equal( sizeChild, children[0].get_size)
91
+ assert_equal( sizeChild, children[1].get_size )
92
+ assert_equal( sizeChild, children[2].get_size )
93
+ assert_equal( sizeChild, children[3].get_size )
94
+ end
95
+ end
96
+
97
+ def test_layout_expand
98
+ do_test_layout do |children, sizeTotal, sizeChild, sizeRest|
99
+ set_children(children, Wx::SizerFlags.new.expand)
100
+ assert_equal(sizeChild, children[0].get_size)
101
+ assert_equal(Wx::Size.new(sizeRest.x, sizeChild.y), children[1].get_size)
102
+ assert_equal(Wx::Size.new(sizeChild.x, sizeRest.y), children[2].get_size)
103
+ assert_equal(sizeRest, children[3].get_size )
104
+ end
105
+ end
106
+
107
+ def test_layout_expand_centre_vertical
108
+ do_test_layout do |children, sizeTotal, sizeChild, sizeRest|
109
+ set_children(children, Wx::SizerFlags.new.expand.centre_vertical)
110
+ assert_equal(sizeChild, children[0].get_size)
111
+ assert_equal(Wx::Size.new(sizeRest.x, sizeChild.y), children[1].get_size)
112
+ assert_equal(sizeChild, children[2].get_size )
113
+ assert_equal(Wx::Size.new(sizeRest.x, sizeChild.y), children[3].get_size)
114
+ end
115
+ end
116
+
117
+ def test_layout_expand_centre_horizontal
118
+ do_test_layout do |children, sizeTotal, sizeChild, sizeRest|
119
+ set_children(children, Wx::SizerFlags.new.expand.centre_horizontal)
120
+ assert_equal(sizeChild, children[0].get_size)
121
+ assert_equal(sizeChild, children[1].get_size )
122
+ assert_equal(Wx::Size.new(sizeChild.x, sizeRest.y), children[2].get_size)
123
+ assert_equal(Wx::Size.new(sizeChild.x, sizeRest.y), children[3].get_size)
124
+ end
125
+ end
126
+
127
+ def test_layout_right
128
+ do_test_layout do |children, sizeTotal, sizeChild, sizeRest|
129
+ set_children(children, Wx::SizerFlags.new.right)
130
+ assert_equal( Wx::Point.new(0, 0), children[0].get_position)
131
+ assert_equal( Wx::Point.new(sizeRest.x, 0), children[1].get_position)
132
+ assert_equal( Wx::Point.new(0, sizeChild.y), children[2].get_position)
133
+ assert_equal( Wx::Point.new(sizeRest.x, sizeChild.y), children[3].get_position)
134
+ end
135
+ end
136
+
137
+ def test_layout_right_centre_vertical
138
+ do_test_layout do |children, sizeTotal, sizeChild, sizeRest|
139
+ set_children(children, Wx::SizerFlags.new.right.centre_vertical)
140
+ yMid = sizeChild.y + (sizeRest.y - sizeChild.y) / 2
141
+ assert_equal( Wx::Point.new(0, 0), children[0].get_position)
142
+ assert_equal( Wx::Point.new(sizeRest.x, 0), children[1].get_position)
143
+ assert_equal( Wx::Point.new(0, yMid), children[2].get_position)
144
+ assert_equal( Wx::Point.new(sizeRest.x, yMid), children[3].get_position)
145
+ end
146
+ end
147
+
148
+ end
@@ -0,0 +1,53 @@
1
+
2
+ require_relative './lib/wxframe_runner'
3
+
4
+ class ButtonTests < WxRuby::Test::GUITests
5
+
6
+ def setup
7
+ super
8
+ @list = Wx::ListCtrl.new(test_frame)
9
+ @list.set_window_style(Wx::LC_REPORT | Wx::LC_EDIT_LABELS)
10
+ @list.set_size([400, 200])
11
+ end
12
+
13
+ def cleanup
14
+ @list.destroy
15
+ super
16
+ end
17
+
18
+ attr_reader :list
19
+
20
+ def test_sort
21
+ list.insert_column(0, "Column 0")
22
+
23
+ list.insert_item(0, "Item 0")
24
+ list.set_item_data(0, 0)
25
+ list.insert_item(1, "Item 1")
26
+ list.set_item_data(1, 1)
27
+
28
+ list.sort_items { |i1, i2, _| i2 <=> i1 } # inverted compare
29
+
30
+ assert_equal("Item 1", list.get_item_text(0))
31
+ assert_equal("Item 0", list.get_item_text(1))
32
+ end
33
+
34
+ if Wx.has_feature?(:HAS_LISTCTRL_COLUMN_ORDER)
35
+
36
+ def test_columns_order
37
+ 3.times { |i| list.insert_column(i, "Column #{i}") }
38
+
39
+ order = [2, 0, 1]
40
+ list.set_columns_order(order)
41
+
42
+ # now list.get_columns_order() will return order
43
+ assert_equal(order, list.get_columns_order)
44
+ # and list.get_column_index_from_order(n) will return order[n]
45
+ assert_equal(order[1], list.get_column_index_from_order(1))
46
+ # and list.get_column_order() will return 1, 2 and 0 for the column 0,
47
+ # 1 and 2 respectively
48
+ assert_equal(1, list.get_column_order(0))
49
+ end
50
+
51
+ end
52
+
53
+ end
data/tests/test_log.rb ADDED
@@ -0,0 +1,163 @@
1
+
2
+ require_relative './lib/wxapp_runner'
3
+
4
+ class LogTests < Test::Unit::TestCase
5
+
6
+ class TestLogBase < Wx::Log
7
+
8
+ def initialize
9
+ super
10
+ @logs = ::Array.new(Wx::LOG_Trace + 1)
11
+ @logsInfo = ::Array.new(Wx::LOG_Trace + 1)
12
+ end
13
+
14
+ def get_log(level)
15
+ @logs[level].to_s
16
+ end
17
+
18
+ def get_info(level)
19
+ @logsInfo[level]
20
+ end
21
+
22
+ def clear
23
+ @logs = ::Array.new(Wx::LOG_Trace + 1)
24
+ @logsInfo = ::Array.new(Wx::LOG_Trace + 1)
25
+ end
26
+
27
+ end
28
+
29
+ class TestLog < TestLogBase
30
+
31
+ protected
32
+
33
+ def do_log_record(level, msg, info)
34
+ @logs[level] = msg
35
+ # do not keep log info objects because these (and their state) are purely transient data
36
+ # that can only be reliably accessed (or passed on) within this call scope
37
+ @logsInfo[level] = { filename: info.filename, line: info.line, func: info.func, component: info.component }
38
+ end
39
+
40
+ end
41
+
42
+ def setup
43
+ super
44
+ @logOld = Wx::Log.set_active_target(@log = TestLog.new)
45
+ @logWasEnabled = Wx::Log.enable_logging
46
+ end
47
+
48
+ def cleanup
49
+ Wx::Log.set_active_target(@logOld)
50
+ Wx::Log.enable_logging(@logWasEnabled)
51
+ super
52
+ end
53
+
54
+ def test_functions
55
+ Wx.log_message("Message")
56
+ assert_equal("Message", @log.get_log(Wx::LOG_Message))
57
+
58
+ Wx.log_error("Error %d", 17)
59
+ assert_equal("Error 17", @log.get_log(Wx::LOG_Error))
60
+
61
+ Wx.log_debug("Debug")
62
+ if Wx::WXWIDGETS_DEBUG_LEVEL > 0
63
+ assert_equal( "Debug", @log.get_log(Wx::LOG_Debug))
64
+ else
65
+ assert_equal( "", @log.get_log(Wx::LOG_Debug))
66
+ end
67
+ end
68
+
69
+ def test_null
70
+ Wx::LogNull.no_log do
71
+ Wx.log_warning("%s warning", "Not important")
72
+
73
+ assert_equal("", @log.get_log(Wx::LOG_Warning))
74
+ end
75
+
76
+ Wx.log_warning("%s warning", "Important")
77
+ assert_equal("Important warning", @log.get_log(Wx::LOG_Warning))
78
+ end
79
+
80
+ def test_component
81
+ Wx.log_message('Message')
82
+ assert_equal('wxapp',
83
+ @log.get_info(Wx::LOG_Message)[:component])
84
+
85
+ # completely disable logging for this component
86
+ Wx::Log.set_component_level('test/ignore', Wx::LOG_FatalError)
87
+
88
+ # but enable it for one of its subcomponents
89
+ Wx::Log.set_component_level('test/ignore/not', Wx::LOG_Max)
90
+
91
+ Wx::Log.for_component('test/ignore') do
92
+ # this shouldn't be output as this component is ignored
93
+ Wx::log_error('Error')
94
+ assert_equal('', @log.get_log(Wx::LOG_Error))
95
+
96
+ # and so are its subcomponents
97
+ Wx.log_error('Error', component: 'test/ignore/sub/subsub') # explicit component: overrules scoped setting
98
+ assert_equal('', @log.get_log(Wx::LOG_Error))
99
+
100
+ Wx.log_error('Error', component: 'test/ignore/not')
101
+ assert_equal('Error', @log.get_log(Wx::LOG_Error))
102
+
103
+ # restore the original component value
104
+ end
105
+ end
106
+
107
+ def test_repetition_counting
108
+ Wx::Log.set_repetition_counting(true)
109
+
110
+ Wx.log_message('Message')
111
+ assert_equal('Message', @log.get_log(Wx::LOG_Message))
112
+
113
+ @log.clear
114
+ Wx.log_message('Message')
115
+ assert_equal('', @log.get_log(Wx::LOG_Message))
116
+ Wx.log_message('Message')
117
+ assert_equal('', @log.get_log(Wx::LOG_Message))
118
+
119
+ Wx.log_info('Another message')
120
+ if Wx.has_feature?(:USE_INTL)
121
+ # don't what language may come out so just test if not empty anymore
122
+ assert_not_empty(@log.get_log(Wx::LOG_Message))
123
+ else
124
+ assert_match(/The previous message.*repeated/, @log.get_log(Wx::LOG_Message))
125
+ end
126
+ assert_equal('Another message', @log.get_log(Wx::LOG_Info))
127
+
128
+ Wx::Log.set_repetition_counting(false)
129
+ end
130
+
131
+ class MyBufferInterposer < Wx::LogInterposer
132
+
133
+ def initialize
134
+ super
135
+ @buffer = []
136
+ end
137
+
138
+ attr_reader :buffer
139
+
140
+ def do_log_text(msg)
141
+ @buffer << msg
142
+ end
143
+ protected :do_log_text
144
+
145
+ end
146
+
147
+ def test_log_interposer
148
+ buffer_log = MyBufferInterposer.new
149
+ assert_empty(buffer_log.buffer)
150
+
151
+ Wx.log_message('Message')
152
+ assert_equal("Message", @log.get_log(Wx::LOG_Message))
153
+ assert_equal(1, buffer_log.buffer.size)
154
+ assert_match(/Message/, buffer_log.buffer.first)
155
+
156
+ Wx.log_warning('Message')
157
+ assert_equal("Message", @log.get_log(Wx::LOG_Warning))
158
+ assert_equal(2, buffer_log.buffer.size)
159
+ assert_match(/Message/, buffer_log.buffer.last)
160
+
161
+ end
162
+
163
+ end
@@ -371,3 +371,61 @@ class ChoiceTests < WxRuby::Test::GUITests
371
371
  end
372
372
 
373
373
  end
374
+
375
+ class GaugeTests < WxRuby::Test::GUITests
376
+
377
+ def setup
378
+ super
379
+ @gauge = Wx::Gauge.new(test_frame, range: 100)
380
+ end
381
+
382
+ def cleanup
383
+ test_frame.destroy_children
384
+ super
385
+ end
386
+
387
+ attr_reader :gauge
388
+
389
+ def test_direction
390
+ #We should default to a horizontal gauge
391
+ assert(!gauge.is_vertical)
392
+
393
+ gauge.destroy
394
+ @gauge = Wx::Gauge.new(test_frame, range: 100, style: Wx::GA_VERTICAL)
395
+
396
+ assert(gauge.vertical?)
397
+
398
+ gauge.destroy
399
+ @gauge = Wx::Gauge.new(test_frame, range: 100, style: Wx::GA_HORIZONTAL)
400
+
401
+ assert(!gauge.vertical?)
402
+ end
403
+
404
+ def test_range
405
+ assert_equal(100, gauge.get_range)
406
+
407
+ gauge.set_range(50)
408
+
409
+ assert_equal(50, gauge.get_range)
410
+
411
+ gauge.set_range(0)
412
+
413
+ assert_equal(0, gauge.range)
414
+ end
415
+
416
+ def test_value
417
+ assert_equal(0, gauge.get_value)
418
+
419
+ gauge.set_value(50)
420
+
421
+ assert_equal(50, gauge.value)
422
+
423
+ gauge.value = 0
424
+
425
+ assert_equal(0, gauge.get_value)
426
+
427
+ gauge.set_value(100)
428
+
429
+ assert_equal(100, gauge.value)
430
+ end
431
+ end
@@ -0,0 +1,95 @@
1
+
2
+ require_relative './lib/wxapp_runner'
3
+
4
+ class TimerTests < Test::Unit::TestCase
5
+
6
+ class TimerCounterHandler < Wx::EvtHandler
7
+
8
+ def initialize
9
+ super
10
+ @count = 0
11
+ evt_timer Wx::ID_ANY, :on_timer
12
+ end
13
+
14
+ attr_reader :count
15
+
16
+ private
17
+
18
+ def on_timer(_evt)
19
+ @count += 1
20
+ tick
21
+ end
22
+
23
+ def tick
24
+ # noop
25
+ end
26
+
27
+ end
28
+
29
+ def test_one_shot
30
+
31
+ handler = Class.new(TimerCounterHandler) do
32
+ def initialize(loop)
33
+ super()
34
+ @loop = loop
35
+ end
36
+
37
+ def run
38
+ @timer = Wx::Timer.new(self)
39
+ @timer.start(200, true)
40
+ @loop.run
41
+ end
42
+
43
+ def tick
44
+ @timer.stop
45
+ @loop.exit
46
+ end
47
+ end.new(Wx::EventLoop.new)
48
+
49
+ handler.run
50
+
51
+ assert_equal(1, handler.count)
52
+ end
53
+
54
+ def test_multiple
55
+
56
+
57
+ handler = Class.new(TimerCounterHandler) do
58
+ def initialize(loop)
59
+ super()
60
+ @loop = loop
61
+ end
62
+
63
+ def run
64
+ @timer = Wx::Timer.new(self)
65
+ @timer.start(100)
66
+ # run for 2 seconds
67
+ @tm_end = Time.now + 2
68
+ @loop.run
69
+ end
70
+
71
+ def tick
72
+ # exit after 2 seconds
73
+ unless Time.now < @tm_end
74
+ @timer.stop
75
+ @loop.exit
76
+ end
77
+ end
78
+ end.new(Wx::EventLoop.new)
79
+
80
+
81
+ handler.run
82
+
83
+ # we can't count on getting exactly 20 ticks but we shouldn't get more
84
+ # than this
85
+ num_ticks = handler.count
86
+ assert( num_ticks <= 20 )
87
+
88
+ # and we should get a decent number of them but if the system is very
89
+ # loaded (as happens with build bot slaves running a couple of builds in
90
+ # parallel actually) it may be much less than 20 so just check that we get
91
+ # more than one
92
+ assert( num_ticks > 1 )
93
+ end
94
+
95
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wxruby3
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0.pre.rc.2
4
+ version: 0.9.0.pre.rc.3
5
5
  platform: x64-mingw-ucrt
6
6
  authors:
7
7
  - Martin Corino
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-07-15 00:00:00.000000000 Z
11
+ date: 2023-07-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -134,6 +134,7 @@ files:
134
134
  - lib/wx/core/enum.rb
135
135
  - lib/wx/core/event.rb
136
136
  - lib/wx/core/event_blocker.rb
137
+ - lib/wx/core/event_loop.rb
137
138
  - lib/wx/core/events/evt_list.rb
138
139
  - lib/wx/core/evthandler.rb
139
140
  - lib/wx/core/ext.rb
@@ -205,6 +206,7 @@ files:
205
206
  - lib/wx/doc/enum.rb
206
207
  - lib/wx/doc/event.rb
207
208
  - lib/wx/doc/event_blocker.rb
209
+ - lib/wx/doc/event_loop.rb
208
210
  - lib/wx/doc/events.rb
209
211
  - lib/wx/doc/evthandler.rb
210
212
  - lib/wx/doc/extra/00_starting.md
@@ -356,6 +358,7 @@ files:
356
358
  - lib/wx/doc/gen/grid/grid_table_message.rb
357
359
  - lib/wx/doc/gen/grid_bag_sizer.rb
358
360
  - lib/wx/doc/gen/grid_sizer.rb
361
+ - lib/wx/doc/gen/gui_event_loop.rb
359
362
  - lib/wx/doc/gen/help_controller.rb
360
363
  - lib/wx/doc/gen/help_provider.rb
361
364
  - lib/wx/doc/gen/html/event_list.rb
@@ -538,6 +541,8 @@ files:
538
541
  - lib/wx/doc/icon.rb
539
542
  - lib/wx/doc/id_helper.rb
540
543
  - lib/wx/doc/image.rb
544
+ - lib/wx/doc/list_ctrl.rb
545
+ - lib/wx/doc/log.rb
541
546
  - lib/wx/doc/memory_dc.rb
542
547
  - lib/wx/doc/mirror_dc.rb
543
548
  - lib/wx/doc/pen.rb
@@ -565,6 +570,7 @@ files:
565
570
  - lib/wx/doc/stream.rb
566
571
  - lib/wx/doc/svg_file_dc.rb
567
572
  - lib/wx/doc/system_settings.rb
573
+ - lib/wx/doc/text_validator.rb
568
574
  - lib/wx/doc/treebook.rb
569
575
  - lib/wx/doc/v_list_box.rb
570
576
  - lib/wx/doc/variant.rb
@@ -984,6 +990,7 @@ files:
984
990
  - tests/test_art.rb
985
991
  - tests/test_art_provider.rb
986
992
  - tests/test_basic.rb
993
+ - tests/test_box_sizer.rb
987
994
  - tests/test_clipboard.rb
988
995
  - tests/test_dc.rb
989
996
  - tests/test_dialog.rb
@@ -993,9 +1000,13 @@ files:
993
1000
  - tests/test_font.rb
994
1001
  - tests/test_gdi_object.rb
995
1002
  - tests/test_geometry.rb
1003
+ - tests/test_grid_sizer.rb
996
1004
  - tests/test_intl.rb
997
1005
  - tests/test_item_data.rb
1006
+ - tests/test_list_ctrl.rb
1007
+ - tests/test_log.rb
998
1008
  - tests/test_std_controls.rb
1009
+ - tests/test_timer.rb
999
1010
  - tests/test_variant.rb
1000
1011
  - tests/test_window.rb
1001
1012
  - tests/testapp.rb