4
%% Copyright Ericsson AB 2008-2009. All Rights Reserved.
6
%% The contents of this file are subject to the Erlang Public License,
7
%% Version 1.1, (the "License"); you may not use this file except in
8
%% compliance with the License. You should have received a copy of the
9
%% Erlang Public License along with this software. If not, it can be
10
%% retrieved online at http://www.erlang.org/.
12
%% Software distributed under the License is distributed on an "AS IS"
13
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
14
%% the License for the specific language governing rights and limitations
18
%%%-------------------------------------------------------------------
19
%%% File : wx_event_SUITE.erl
20
%%% Author : Dan Gudmundsson <dan.gudmundsson@ericsson.com>
21
%%% Description : Test event handling as much as possible
22
%%% Created : 3 Nov 2008 by Dan Gudmundsson <dan.gudmundsson@ericsson.com>
23
%%%-------------------------------------------------------------------
24
-module(wx_event_SUITE).
25
-export([all/0, init_per_suite/1, end_per_suite/1,
26
init_per_testcase/2, fin_per_testcase/2, end_per_testcase/2]).
30
-include("wx_test_lib.hrl").
32
%% Initialization functions.
33
init_per_suite(Config) ->
34
wx_test_lib:init_per_suite(Config).
36
end_per_suite(Config) ->
37
wx_test_lib:end_per_suite(Config).
39
init_per_testcase(Func,Config) ->
40
wx_test_lib:init_per_testcase(Func,Config).
41
end_per_testcase(Func,Config) ->
42
wx_test_lib:end_per_testcase(Func,Config).
43
fin_per_testcase(Func,Config) -> %% For test_server
44
wx_test_lib:end_per_testcase(Func,Config).
46
%% SUITE specification
62
%% Test that the various options to connect work as expected.
63
connect(TestInfo) when is_atom(TestInfo) -> wx_test_lib:tc_info(TestInfo);
65
?mr(wx_ref, wx:new()),
66
Frame = ?mt(wxFrame, wxFrame:new(wx:null(), 1, "Event Testing")),
67
Panel = ?mt(wxPanel, wxPanel:new(Frame)),
68
Window = wxWindow:new(Panel, -1),
71
CB = fun(#wx{event=#wxSize{},userData=UserD}, SizeEvent) ->
72
?mt(wxSizeEvent, SizeEvent),
73
Tester ! {got_size, UserD}
76
?m(ok, wxFrame:connect(Frame, size)),
77
?m(ok, wxEvtHandler:connect(Panel, size,[{skip, true},{userData, panel}])),
78
?m(ok, wxEvtHandler:connect(Panel, size,[{callback,CB},{userData, panel}])),
80
?m({'EXIT', {{badarg,_},_}},
81
wxEvtHandler:connect(Panel, there_is_no_such_event)),
83
?m({'EXIT', {{badarg,_},_}},
84
wxEvtHandler:connect(Panel, there_is_no_such_event, [{callback,CB}])),
86
?m(ok, wxWindow:connect(Window, size,[{callback,CB},{userData, window}])),
87
?m(ok, wxWindow:connect(Window, size,[{skip,true},{userData, window}])),
89
?m(true, wxFrame:show(Frame)),
91
wxWindow:setSize(Panel, {200,100}),
92
wxWindow:setSize(Window, {200,100}),
94
get_size_messages(Frame, [frame, panel_cb, window_cb, window]),
96
wx_test_lib:wx_destroy(Frame, Config).
98
get_size_messages(_, []) -> ok;
99
get_size_messages(Frame, Msgs) ->
101
#wx{obj=Frame,event=#wxSize{}} -> %% ok
102
get_size_messages(Frame, lists:delete(frame, Msgs));
103
#wx{userData=window, event=#wxSize{}} ->
104
?m(true, lists:member(window_cb, Msgs)),
105
get_size_messages(Frame, lists:delete(window, Msgs));
106
#wx{userData=panel, event=#wxSize{}} ->
107
?m(true, lists:member(panel, Msgs)),
108
get_size_messages(Frame, lists:delete(panel, Msgs));
110
?m(false, lists:member(window, Msgs)),
111
get_size_messages(Frame, lists:delete(window_cb, Msgs));
113
get_size_messages(Frame, lists:delete(panel_cb, Msgs));
115
?error("Got unexpected msg ~p ~p~n", [Other,Msgs])
117
?error("Timeout ~p~n", [Msgs])
120
disconnect(TestInfo) when is_atom(TestInfo) -> wx_test_lib:tc_info(TestInfo);
121
disconnect(Config) ->
122
?mr(wx_ref, wx:new()),
123
Frame = ?mt(wxFrame, wxFrame:new(wx:null(), 1, "Event Testing")),
124
Panel = ?mt(wxPanel, wxPanel:new(Frame)),
127
CB = fun(#wx{event=#wxSize{},userData=UserD}, SizeEvent) ->
128
?mt(wxSizeEvent, SizeEvent),
129
Tester ! {got_size, UserD}
131
?m(ok, wxFrame:connect(Frame, close_window)),
132
?m(ok, wxFrame:connect(Frame, size)),
133
?m(ok, wxEvtHandler:connect(Panel, size,[{skip, true},{userData, panel}])),
134
?m(ok, wxEvtHandler:connect(Panel, size,[{callback,CB},{userData, panel}])),
136
?m(true, wxFrame:show(Frame)),
138
wxWindow:setSize(Panel, {200,100}),
139
get_size_messages(Frame, [frame, panel_cb]),
142
?m(true, wxEvtHandler:disconnect(Panel, size, [{callback,CB}])),
143
?m(ok, wxWindow:setSize(Panel, {200,101})),
144
get_size_messages(Frame, [panel]),
148
?m({'EXIT', {{badarg,_},_}}, wxEvtHandler:disconnect(Panel, non_existing_event_type)),
149
?m(true, wxEvtHandler:disconnect(Panel, size)),
150
?m(ok, wxWindow:setSize(Panel, {200,102})),
152
?m([], wx_test_lib:flush()),
154
wx_test_lib:wx_destroy(Frame, Config).
158
%% Test that the msg events are forwarded as supposed to
159
connect_msg_20(TestInfo)
160
when is_atom(TestInfo) -> wx_test_lib:tc_info(TestInfo);
161
connect_msg_20(Config) ->
162
?mr(wx_ref, wx:new()),
163
Frame = ?mt(wxFrame, wxFrame:new(wx:null(), 1, "Event 20 Testing")),
167
EvtHandler = fun() ->
169
wxFrame:connect(Frame,size,[{skip,true}]),
171
receive #wx{obj=Frame,event=#wxSize{}} ->
175
Msgs = [begin spawn_link(EvtHandler), got_it end|| _ <- lists:seq(1,20)],
177
?m_multi_receive(lists:duplicate(20, initiated)),
178
?m(true, wxFrame:show(Frame)),
180
?m_multi_receive(Msgs),
181
wx_test_lib:wx_destroy(Frame, Config).
183
%% Test that the callbacks works as msgs
184
connect_cb_20(TestInfo)
185
when is_atom(TestInfo) -> wx_test_lib:tc_info(TestInfo);
186
connect_cb_20(Config) ->
187
?mr(wx_ref, wx:new()),
188
Frame = ?mt(wxFrame, wxFrame:new(wx:null(), 1, "Event 20 Testing")),
192
wxFrame:connect(Frame,size,[{callback,
193
fun(#wx{event=#wxSize{}},_SizeEv) ->
197
EvtHandler = fun() ->
200
CB = fun(#wx{event=#wxSize{}},
202
wxEvent:skip(WxSizeEventObj),
206
wxFrame:connect(Frame,size,[{callback, CB}]),
211
Msgs = [begin spawn_link(EvtHandler), got_it end|| _ <- lists:seq(1,20)],
213
?m_multi_receive(lists:duplicate(20, initiated)),
214
?m(true, wxFrame:show(Frame)),
216
?m_multi_receive(Msgs),
217
?m_receive(main_got_it),
219
wx_test_lib:wx_destroy(Frame, Config).
222
mouse_on_grid(TestInfo)
223
when is_atom(TestInfo) -> wx_test_lib:tc_info(TestInfo);
224
mouse_on_grid(Config) ->
225
Wx = ?mr(wx_ref, wx:new()),
227
Frame = wxFrame:new(Wx, ?wxID_ANY, "Frame"),
228
Panel = wxPanel:new(Frame, []),
229
Sizer = wxBoxSizer:new(?wxVERTICAL),
231
Grid = wxGrid:new(Panel, ?wxID_ANY),
232
wxGrid:createGrid(Grid, 10, 10, []),
233
wxSizer:add(Sizer, Grid, [{proportion, 1}]),
235
wxWindow:connect(Panel, motion),
236
wxWindow:connect(Panel, middle_down),
238
%% Undocumented function
239
GridWindow = ?mt(wxWindow, wxGrid:getGridWindow(Grid)),
240
wxWindow:connect(GridWindow, motion),
241
wxWindow:connect(GridWindow, middle_down),
243
wxWindow:setSizerAndFit(Panel, Sizer),
246
wx_test_lib:wx_destroy(Frame, Config).
250
when is_atom(TestInfo) -> wx_test_lib:tc_info(TestInfo);
251
spin_event(Config) ->
252
Wx = ?mr(wx_ref, wx:new()),
254
%% Spin events and scrollEvent share some events id's
255
%% test that they work
257
Frame = wxFrame:new(Wx, ?wxID_ANY, "Spin Events"),
258
Panel = wxPanel:new(Frame, []),
259
Sizer = wxBoxSizer:new(?wxVERTICAL),
260
HSz = wxBoxSizer:new(?wxHORIZONTAL),
262
SB = wxSpinButton:new(Panel, [{id, 100}]),
263
wxSizer:add(HSz, SB, []),
264
wxSpinButton:connect(SB, spin),
265
wxSpinButton:connect(SB, spin_up),
266
wxSpinButton:connect(SB, spin_down),
268
SC = wxSpinCtrl:new(Panel, [{id, 101}, {min, -12}, {max, 12},
269
{value, "-3"}, {initial, 3},
270
{style, ?wxSP_ARROW_KEYS bor ?wxSP_WRAP}]),
271
wxSpinCtrl:connect(SC, command_spinctrl_updated),
272
wxSizer:add(HSz, SC, [{proportion, 1}, {flag, ?wxEXPAND}]),
273
wxSizer:add(Sizer, HSz, [{proportion, 0},{flag, ?wxEXPAND}]),
275
SL = wxSlider:new(Panel, 102, 57, 22, 99),
276
wxSlider:connect(SL, scroll_thumbtrack),
277
wxSlider:connect(SL, scroll_lineup),
278
wxSlider:connect(SL, scroll_linedown),
279
wxSizer:add(Sizer, SL, [{proportion, 0},{flag, ?wxEXPAND}]),
281
wxWindow:setSizerAndFit(Panel, Sizer),
285
%% Set value does not generate a spin event...
286
%% wxSpinButton:setValue(SB, 7),
287
%% ?m_receive(#wx{id=100, event=#wxSpin{type=spin}}),
288
%% wxSpinCtrl:setValue(SC, 8),
289
%% ?m_receive(#wx{id=101, event=#wxSpin{type=command_spinctrl_updated}}),
290
%% wxSlider:setValue(SL, 29),
291
%% ?m_receive(#wx{id=102, event=#wxScroll{}}),
293
wx_test_lib:wx_destroy(Frame, Config).
296
%% Test that we can connect to events from inside a callback fun
297
%% This is needed for example inside a callback that does a wxWindow:popupMenu/2
298
connect_in_callback(TestInfo)
299
when is_atom(TestInfo) -> wx_test_lib:tc_info(TestInfo);
300
connect_in_callback(Config) ->
301
Wx = ?mr(wx_ref, wx:new()),
302
Frame = wxFrame:new(Wx, ?wxID_ANY, "Connect in callback"),
303
Panel = wxPanel:new(Frame, []),
305
wxFrame:connect(Frame,size,
307
fun(#wx{event=#wxSize{}},_SizeEv) ->
308
io:format("Frame got size~n",[]),
309
F1 = wxFrame:new(Frame, ?wxID_ANY, "Frame size event"),
311
wxFrame:connect(F1,size,[{callback,
313
io:format("CB2 got size~n",[]),
317
receive continue -> wxFrame:destroy(F1) end
319
wxPanel:connect(Panel,size,
321
fun(#wx{event=#wxSize{}},_SizeEv) ->
322
io:format("Panel got size~n",[]),
323
F1 = wxFrame:new(Frame, ?wxID_ANY, "Panel size event"),
324
wxFrame:connect(F1,size),
326
receive #wx{event=#wxSize{}} -> wxFrame:destroy(F1) end
331
wx_test_lib:wx_destroy(Frame, Config).