win_gui 0.1.6 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +21 -21
- data/HISTORY +7 -0
- data/LICENSE +20 -20
- data/README.rdoc +77 -114
- data/Rakefile +24 -58
- data/VERSION +1 -1
- data/features/support/env.rb +7 -4
- data/features/win_gui.feature +9 -9
- data/lib/version.rb +8 -0
- data/lib/win_gui/window.rb +78 -69
- data/lib/win_gui.rb +25 -3
- data/spec/spec.opts +1 -1
- data/spec/spec_helper.rb +90 -118
- data/spec/win_gui/window_spec.rb +120 -123
- data/tasks/common.rake +14 -0
- data/tasks/doc.rake +14 -0
- data/tasks/gem.rake +39 -0
- data/tasks/git.rake +34 -0
- data/tasks/spec.rake +19 -0
- data/tasks/version.rake +71 -0
- metadata +68 -188
- data/.document +0 -5
- data/book_code/early_success/bundle.rb +0 -34
- data/book_code/early_success/english.txt +0 -1
- data/book_code/early_success/jruby_basics.rb +0 -47
- data/book_code/early_success/windows_basics.rb +0 -97
- data/book_code/guessing/locknote.rb +0 -379
- data/book_code/guessing/monkeyshines.rb +0 -14
- data/book_code/guessing/note.rb +0 -120
- data/book_code/guessing/note_spec.rb +0 -175
- data/book_code/guessing/replay.rb +0 -21
- data/book_code/guessing/seed.rb +0 -9
- data/book_code/guessing/spec_helper.rb +0 -69
- data/book_code/guessing/windows_gui.rb +0 -247
- data/book_code/home_stretch/junquenote.rb +0 -151
- data/book_code/home_stretch/locknote.rb +0 -180
- data/book_code/home_stretch/note.rb +0 -144
- data/book_code/home_stretch/note_spec.rb +0 -191
- data/book_code/home_stretch/spec_helper.rb +0 -55
- data/book_code/home_stretch/swing_gui.rb +0 -50
- data/book_code/home_stretch/windows_gui.rb +0 -232
- data/book_code/junquenote/exports.sh +0 -10
- data/book_code/junquenote/jruby_mac.sh +0 -10
- data/book_code/junquenote/junquenote_app.rb +0 -262
- data/book_code/novite/Rakefile +0 -10
- data/book_code/novite/app/controllers/application.rb +0 -18
- data/book_code/novite/app/controllers/guests_controller.rb +0 -28
- data/book_code/novite/app/controllers/parties_controller.rb +0 -77
- data/book_code/novite/app/helpers/application_helper.rb +0 -11
- data/book_code/novite/app/helpers/guests_helper.rb +0 -10
- data/book_code/novite/app/helpers/parties_helper.rb +0 -10
- data/book_code/novite/app/models/guest.rb +0 -11
- data/book_code/novite/app/models/party.rb +0 -32
- data/book_code/novite/app/models/party_mailer.rb +0 -19
- data/book_code/novite/app/views/layouts/application.rhtml +0 -44
- data/book_code/novite/app/views/parties/new.html.erb +0 -42
- data/book_code/novite/app/views/parties/show.html.erb +0 -43
- data/book_code/novite/app/views/party_mailer/invite.erb +0 -17
- data/book_code/novite/config/boot.rb +0 -117
- data/book_code/novite/config/database.yml +0 -19
- data/book_code/novite/config/environment.rb +0 -67
- data/book_code/novite/config/environments/development.rb +0 -29
- data/book_code/novite/config/environments/production.rb +0 -27
- data/book_code/novite/config/environments/test.rb +0 -30
- data/book_code/novite/config/initializers/inflections.rb +0 -18
- data/book_code/novite/config/initializers/mime_types.rb +0 -13
- data/book_code/novite/config/routes.rb +0 -47
- data/book_code/novite/db/migrate/001_create_parties.rb +0 -26
- data/book_code/novite/db/migrate/002_create_guests.rb +0 -23
- data/book_code/novite/db/schema.rb +0 -41
- data/book_code/novite/log/empty.txt +0 -0
- data/book_code/novite/public/.htaccess +0 -40
- data/book_code/novite/public/404.html +0 -38
- data/book_code/novite/public/422.html +0 -38
- data/book_code/novite/public/500.html +0 -38
- data/book_code/novite/public/dispatch.cgi +0 -10
- data/book_code/novite/public/dispatch.fcgi +0 -24
- data/book_code/novite/public/dispatch.rb +0 -18
- data/book_code/novite/public/favicon.ico +0 -0
- data/book_code/novite/public/images/rails.png +0 -0
- data/book_code/novite/public/index.html +0 -285
- data/book_code/novite/public/javascripts/application.js +0 -10
- data/book_code/novite/public/javascripts/controls.js +0 -971
- data/book_code/novite/public/javascripts/dragdrop.js +0 -980
- data/book_code/novite/public/javascripts/effects.js +0 -1128
- data/book_code/novite/public/javascripts/prototype.js +0 -4233
- data/book_code/novite/public/robots.txt +0 -5
- data/book_code/novite/script/about +0 -3
- data/book_code/novite/script/console +0 -3
- data/book_code/novite/script/destroy +0 -3
- data/book_code/novite/script/generate +0 -3
- data/book_code/novite/script/performance/benchmarker +0 -3
- data/book_code/novite/script/performance/profiler +0 -3
- data/book_code/novite/script/performance/request +0 -3
- data/book_code/novite/script/plugin +0 -3
- data/book_code/novite/script/process/inspector +0 -3
- data/book_code/novite/script/process/reaper +0 -3
- data/book_code/novite/script/process/spawner +0 -3
- data/book_code/novite/script/runner +0 -3
- data/book_code/novite/script/server +0 -3
- data/book_code/novite/test/test_helper.rb +0 -46
- data/book_code/one_more_thing/applescript.rb +0 -68
- data/book_code/one_more_thing/note_spec.rb +0 -50
- data/book_code/one_more_thing/spec_helper.rb +0 -17
- data/book_code/one_more_thing/textedit-pure.rb +0 -28
- data/book_code/one_more_thing/textedit.applescript +0 -26
- data/book_code/one_more_thing/textedit.rb +0 -32
- data/book_code/one_more_thing/textnote.rb +0 -87
- data/book_code/simplify/junquenote.rb +0 -48
- data/book_code/simplify/locknote.rb +0 -46
- data/book_code/simplify/note.rb +0 -35
- data/book_code/simplify/note_spec.rb +0 -28
- data/book_code/simplify/swing_gui.rb +0 -45
- data/book_code/simplify/windows_gui.rb +0 -232
- data/book_code/simplify/windows_gui_spec.rb +0 -35
- data/book_code/story/invite.story +0 -19
- data/book_code/story/journal.txt +0 -29
- data/book_code/story/novite_stories.rb +0 -156
- data/book_code/story/party.rb +0 -149
- data/book_code/story/password.rb +0 -61
- data/book_code/story/password.story +0 -26
- data/book_code/story/rsvp.story +0 -29
- data/book_code/tables/TestTime.html +0 -93
- data/book_code/tables/TestTimeSample.html +0 -63
- data/book_code/tables/calculate_time.rb +0 -39
- data/book_code/tables/calculator.rb +0 -108
- data/book_code/tables/calculator_actions.rb +0 -27
- data/book_code/tables/calculator_spec.rb +0 -47
- data/book_code/tables/fit.rb +0 -32
- data/book_code/tables/matrix.rb +0 -109
- data/book_code/tables/pseudocode.rb +0 -17
- data/book_code/tubes/book_selenium.rb +0 -67
- data/book_code/tubes/book_watir.rb +0 -60
- data/book_code/tubes/dragdrop.html +0 -81
- data/book_code/tubes/html_capture.rb +0 -33
- data/book_code/tubes/joke_list.rb +0 -67
- data/book_code/tubes/list_spec.rb +0 -41
- data/book_code/tubes/search_spec.rb +0 -32
- data/book_code/tubes/selenium_example.rb +0 -66
- data/book_code/tubes/selenium_link.rb +0 -23
- data/book_code/tubes/web_server.rb +0 -14
- data/book_code/windows/wgui.rb +0 -29
- data/book_code/windows/wobj.rb +0 -25
- data/book_code/windows/wsh.rb +0 -25
- data/book_code/with_rspec/empty_spec.rb +0 -13
- data/book_code/with_rspec/junquenote.rb +0 -60
- data/book_code/with_rspec/locknote.rb +0 -129
- data/book_code/with_rspec/note_spec.rb +0 -32
- data/book_code/with_rspec/should_examples.rb +0 -18
- data/lib/note/java/jemmy.jar +0 -0
- data/lib/note/java/jnote.rb +0 -48
- data/lib/note/java/jruby_basics.rb +0 -37
- data/lib/note/java/junquenote_app.rb +0 -262
- data/lib/note/java/note_spec.rb +0 -20
- data/lib/note/win/locknote.rb +0 -19
- data/lib/note.rb +0 -15
- data/lib/win_gui/constants.rb +0 -82
- data/lib/win_gui/def_api.rb +0 -160
- data/lib/win_gui/string_extensions.rb +0 -36
- data/lib/win_gui/win_gui.rb +0 -437
- data/old/windows_basics.rb +0 -80
- data/old/wnote.rb +0 -80
- data/old/wnote_spec.rb +0 -20
- data/spec/note/win/locknote_spec.rb +0 -7
- data/spec/test_apps/locknote/LockNote.exe +0 -0
- data/spec/win_gui/def_api_spec.rb +0 -339
- data/spec/win_gui/string_extensions_spec.rb +0 -61
- data/spec/win_gui/win_gui_spec.rb +0 -537
- data/win_gui.gemspec +0 -215
@@ -1,537 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), "..", "spec_helper" )
|
2
|
-
|
3
|
-
module GuiTest
|
4
|
-
def test_show_window *cmds, tests
|
5
|
-
cmds.each do |cmd|
|
6
|
-
test_app do |app|
|
7
|
-
show_window(app.handle, cmd)
|
8
|
-
tests.each{|test, result| send(test.to_sym, app.handle).should == result}
|
9
|
-
|
10
|
-
hide_window(app.handle) # hiding window first
|
11
|
-
show_window(app.handle, cmd)
|
12
|
-
tests.each{|test, result| send(test.to_sym, app.handle).should == result}
|
13
|
-
|
14
|
-
show_window(app.handle, SW_MAXIMIZE) # now maximizing window
|
15
|
-
show_window(app.handle, cmd)
|
16
|
-
tests.each{|test, result| send(test.to_sym, app.handle).should == result}
|
17
|
-
|
18
|
-
show_window(app.handle, SW_MINIMIZE) # now minimizing window
|
19
|
-
show_window(app.handle, cmd)
|
20
|
-
tests.each{|test, result| send(test.to_sym, app.handle).should == result}
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
describe WinGui, ' contains a set of pre-defined GUI functions' do
|
26
|
-
describe '#window?' do
|
27
|
-
spec{ use{ IsWindow(any_handle) }}
|
28
|
-
spec{ use{ is_window(any_handle) }}
|
29
|
-
spec{ use{ window?(any_handle) }}
|
30
|
-
|
31
|
-
it 'returns true if window exists' do
|
32
|
-
window?(any_handle).should == true
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'returns false for invalid window handle' do
|
36
|
-
window?(not_a_handle).should == false
|
37
|
-
end
|
38
|
-
|
39
|
-
it 'changes from true to false when existing window is closed' do
|
40
|
-
test_app do |app|
|
41
|
-
@app_handle = app.handle
|
42
|
-
@ta_handle = app.textarea.handle
|
43
|
-
window?(@app_handle).should == true
|
44
|
-
window?(@ta_handle).should == true
|
45
|
-
end
|
46
|
-
window?(@app_handle).should == false
|
47
|
-
window?(@ta_handle).should == false
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
describe '#window_visible?' do
|
52
|
-
spec{ use{ IsWindowVisible(any_handle) }}
|
53
|
-
spec{ use{ is_window_visible(any_handle) }}
|
54
|
-
spec{ use{ window_visible?(any_handle) }}
|
55
|
-
spec{ use{ visible?(any_handle) }}
|
56
|
-
|
57
|
-
it 'returns true when window is visible, false when window is hidden' do
|
58
|
-
test_app do |app|
|
59
|
-
visible?(app.handle).should == true
|
60
|
-
window_visible?(app.handle).should == true
|
61
|
-
window_visible?(app.textarea.handle).should == true
|
62
|
-
hide_window(app.handle)
|
63
|
-
visible?(app.handle).should == false
|
64
|
-
window_visible?(app.handle).should == false
|
65
|
-
window_visible?(app.textarea.handle).should == false
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
describe '#maximized?' do
|
71
|
-
spec{ use{ IsZoomed(any_handle) }}
|
72
|
-
spec{ use{ is_zoomed(any_handle) }}
|
73
|
-
spec{ use{ zoomed?(any_handle) }}
|
74
|
-
spec{ use{ maximized?(any_handle) }}
|
75
|
-
|
76
|
-
it 'returns true if the window is maximized, false otherwise' do
|
77
|
-
test_app do |app|
|
78
|
-
zoomed?(app.handle).should == false
|
79
|
-
maximized?(app.handle).should == false
|
80
|
-
show_window(app.handle, SW_MAXIMIZE)
|
81
|
-
maximized?(app.handle).should == true
|
82
|
-
zoomed?(app.handle).should == true
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
describe '#minimized?' do
|
88
|
-
spec{ use{ IsIconic(any_handle) }}
|
89
|
-
spec{ use{ is_iconic(any_handle) }}
|
90
|
-
spec{ use{ iconic?(any_handle) }}
|
91
|
-
spec{ use{ minimized?(any_handle) }}
|
92
|
-
|
93
|
-
it 'returns true if the window is minimized, false otherwise' do
|
94
|
-
test_app do |app|
|
95
|
-
iconic?(app.handle).should == false
|
96
|
-
minimized?(app.handle).should == false
|
97
|
-
show_window(app.handle, SW_MINIMIZE)
|
98
|
-
iconic?(app.handle).should == true
|
99
|
-
minimized?(app.handle).should == true
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
describe '#child?' do
|
105
|
-
spec{ use{ IsChild(parent_handle = any_handle, handle = any_handle) }}
|
106
|
-
spec{ use{ is_child(parent_handle = any_handle, handle = any_handle) }}
|
107
|
-
spec{ use{ child?(parent_handle = any_handle, handle = any_handle) }}
|
108
|
-
|
109
|
-
it 'returns true if the window is a child of given parent, false otherwise' do
|
110
|
-
test_app do |app|
|
111
|
-
child?(app.handle, app.textarea.handle).should == true
|
112
|
-
child?(app.handle, any_handle).should == false
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
describe '#find_window(w)' do
|
118
|
-
spec{ use{ FindWindow(class_name = nil, win_name = nil) }}
|
119
|
-
spec{ use{ find_window(class_name = nil, win_name = nil) }}
|
120
|
-
# Widebyte (unicode) version
|
121
|
-
spec{ use{ FindWindowW(class_name = nil, win_name = nil) }}
|
122
|
-
spec{ use{ find_window_w(class_name = nil, win_name = nil) }}
|
123
|
-
|
124
|
-
it 'returns either Integer Window handle or nil' do
|
125
|
-
find_window(nil, nil).should be_a_kind_of Integer
|
126
|
-
find_window(TEST_IMPOSSIBLE, nil).should == nil
|
127
|
-
end
|
128
|
-
|
129
|
-
it 'returns nil if Window is not found' do
|
130
|
-
find_window(TEST_IMPOSSIBLE, nil).should == nil
|
131
|
-
find_window(nil, TEST_IMPOSSIBLE).should == nil
|
132
|
-
find_window(TEST_IMPOSSIBLE, TEST_IMPOSSIBLE).should == nil
|
133
|
-
find_window_w(TEST_IMPOSSIBLE, nil).should == nil
|
134
|
-
find_window_w(nil, TEST_IMPOSSIBLE).should == nil
|
135
|
-
find_window_w(TEST_IMPOSSIBLE, TEST_IMPOSSIBLE).should == nil
|
136
|
-
end
|
137
|
-
|
138
|
-
it 'finds at least one window if both args are nils' do
|
139
|
-
find_window(nil, nil).should_not == nil
|
140
|
-
find_window_w(nil, nil).should_not == nil
|
141
|
-
end
|
142
|
-
|
143
|
-
it 'finds top-level window by window class or title' do
|
144
|
-
test_app do |app|
|
145
|
-
find_window(TEST_WIN_CLASS, nil).should == app.handle
|
146
|
-
find_window(nil, TEST_WIN_TITLE).should == app.handle
|
147
|
-
find_window_w(TEST_WIN_CLASS.to_w, nil).should == app.handle
|
148
|
-
find_window_w(nil, TEST_WIN_TITLE.to_w).should == app.handle
|
149
|
-
end
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
describe '#find_window_ex' do
|
154
|
-
spec{ use{ FindWindowEx(parent = any_handle, after_child = 0, win_class = nil, win_title = nil) }}
|
155
|
-
spec{ use{ find_window_ex(parent = any_handle, after_child = 0, win_class = nil, win_title = nil) }}
|
156
|
-
|
157
|
-
it 'returns nil if wrong control is given' do
|
158
|
-
parent_handle = any_handle
|
159
|
-
find_window_ex(parent_handle, 0, TEST_IMPOSSIBLE, nil).should == nil
|
160
|
-
find_window_ex(parent_handle, 0, nil, TEST_IMPOSSIBLE).should == nil
|
161
|
-
end
|
162
|
-
|
163
|
-
it 'finds child window/control by class' do
|
164
|
-
test_app do |app|
|
165
|
-
ta_handle = find_window_ex(app.handle, 0, TEST_TEXTAREA_CLASS, nil)
|
166
|
-
ta_handle.should_not == nil
|
167
|
-
ta_handle.should == app.textarea.handle
|
168
|
-
end
|
169
|
-
end
|
170
|
-
|
171
|
-
it 'finds child window/control by text/title' do
|
172
|
-
pending 'Identify appropriate (short name) control'
|
173
|
-
test_app do |app|
|
174
|
-
keystroke(VK_CONTROL, 'A'.ord)
|
175
|
-
keystroke('1'.ord, '2'.ord)
|
176
|
-
ta_handle = find_window_ex(app.handle, 0, nil, '12')
|
177
|
-
ta_handle.should_not == 0
|
178
|
-
ta_handle.should == app.textarea.handle
|
179
|
-
end
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
describe '#get_foreground_window' do
|
184
|
-
# ! Different from GetActiveWindow !
|
185
|
-
spec{ use{ handle = GetForegroundWindow() }}
|
186
|
-
spec{ use{ handle = get_foreground_window }}
|
187
|
-
spec{ use{ handle = foreground_window }}
|
188
|
-
|
189
|
-
it 'returns handle to window that is currently in foreground' do
|
190
|
-
test_app do |app|
|
191
|
-
@app_handle = app.handle
|
192
|
-
fg1 = foreground_window
|
193
|
-
@app_handle.should == fg1
|
194
|
-
end
|
195
|
-
fg2 = foreground_window
|
196
|
-
@app_handle.should_not == fg2
|
197
|
-
end
|
198
|
-
|
199
|
-
it 'defines #foreground? test function ' do
|
200
|
-
test_app do |app|
|
201
|
-
@app_handle = app.handle
|
202
|
-
foreground?(@app_handle).should == true
|
203
|
-
end
|
204
|
-
foreground?(@app_handle).should == false
|
205
|
-
end
|
206
|
-
end
|
207
|
-
|
208
|
-
describe '#get_active_window' do
|
209
|
-
# ! Different from GetForegroundWindow !
|
210
|
-
spec{ use{ handle = GetActiveWindow() }}
|
211
|
-
spec{ use{ handle = get_active_window }}
|
212
|
-
spec{ use{ handle = active_window }}
|
213
|
-
|
214
|
-
it 'returns handle to the active window attached to the calling thread`s message queue' do
|
215
|
-
pending 'No idea how to test it'
|
216
|
-
test_app do |app|
|
217
|
-
@app_handle = app.handle
|
218
|
-
fg1 = active_window
|
219
|
-
@app_handle.should == fg1
|
220
|
-
end
|
221
|
-
fg2 = active_window
|
222
|
-
@app_handle.should_not == fg2
|
223
|
-
end
|
224
|
-
end
|
225
|
-
|
226
|
-
describe '#get_window_text(w)' do
|
227
|
-
spec{ use{ GetWindowText(any_handle, buffer = "\00"* 1024, buffer.size)}}
|
228
|
-
# Improved with block to accept window handle as a single arg and return (rstripped) text string
|
229
|
-
spec{ use{ text = get_window_text(handle = 0)}}
|
230
|
-
# Unicode version of get_window_text (strings returned encoded as utf-8)
|
231
|
-
spec{ use{ GetWindowTextW(any_handle, buffer = "\00"* 1024, buffer.size)}}
|
232
|
-
spec{ use{ text = get_window_text_w(any_handle)}} # result encoded as utf-8
|
233
|
-
|
234
|
-
it 'returns nil if incorrect window handle given' do
|
235
|
-
get_window_text(not_a_handle).should == nil
|
236
|
-
get_window_text_w(not_a_handle).should == nil
|
237
|
-
end
|
238
|
-
|
239
|
-
it 'returns correct window text' do
|
240
|
-
test_app do |app|
|
241
|
-
get_window_text(app.handle).should == TEST_WIN_TITLE
|
242
|
-
get_window_text_w(app.handle).should == TEST_WIN_TITLE
|
243
|
-
end
|
244
|
-
end
|
245
|
-
end
|
246
|
-
|
247
|
-
describe '#get_class_name(w)' do
|
248
|
-
spec{ use{ GetClassName(any_handle, buffer = "\00"* 1024, buffer.size)}}
|
249
|
-
# Improved with block to accept window handle as a single arg and return class name string
|
250
|
-
spec{ use{ class_name = get_class_name(any_handle)}}
|
251
|
-
# Unicode version of get_class_name (strings returned encoded as utf-8)
|
252
|
-
spec{ use{ GetClassNameW(any_handle, buffer = "\00"* 1024, buffer.size)}}
|
253
|
-
spec{ use{ class_name = get_class_name_w(handle = 0)}} # result encoded as utf-8
|
254
|
-
|
255
|
-
it 'returns correct window class name' do
|
256
|
-
test_app do |app|
|
257
|
-
get_class_name(app.handle).should == TEST_WIN_CLASS
|
258
|
-
get_class_name_w(app.handle).should == TEST_WIN_CLASS
|
259
|
-
end
|
260
|
-
end
|
261
|
-
end
|
262
|
-
|
263
|
-
describe '#get_window_thread_process_id' do
|
264
|
-
spec{ use{ thread = GetWindowThreadProcessId(any_handle, process_buffer = [1].pack('L')) }}
|
265
|
-
spec{ use{ thread, process = get_window_thread_process_id(any_handle) }}
|
266
|
-
# Improved with block to accept window handle as a single arg and return a pair of [thread, process]
|
267
|
-
|
268
|
-
it 'returns a pair of nonzero Integer ids (thread and process) for valid window' do
|
269
|
-
thread, process = get_window_thread_process_id(any_handle)
|
270
|
-
thread.should be_a_kind_of Integer
|
271
|
-
thread.should be > 0
|
272
|
-
process.should be_a_kind_of Integer
|
273
|
-
process.should be > 0
|
274
|
-
end
|
275
|
-
|
276
|
-
it 'returns a pair of nils (thread and process) for invalid window' do
|
277
|
-
thread, process = get_window_thread_process_id(not_a_handle)
|
278
|
-
thread.should == nil
|
279
|
-
process.should == nil
|
280
|
-
end
|
281
|
-
end
|
282
|
-
|
283
|
-
describe '#get_window_rect' do
|
284
|
-
spec{ use{ success = GetWindowRect(any_handle, rectangle = [0, 0, 0, 0].pack('L*'))}}
|
285
|
-
spec{ use{ left, top, right, bottom = get_window_rect(any_handle)}}
|
286
|
-
|
287
|
-
it 'returns array of nils for invalid window' do
|
288
|
-
get_window_rect(not_a_handle).should == [nil, nil, nil, nil]
|
289
|
-
end
|
290
|
-
|
291
|
-
it 'returns window`s border rectangle' do
|
292
|
-
test_app do |app|
|
293
|
-
get_window_rect(app.handle).should == TEST_WIN_RECT
|
294
|
-
end
|
295
|
-
end
|
296
|
-
end
|
297
|
-
|
298
|
-
describe '#show_window ', 'LI', 'I' do
|
299
|
-
spec{ use{ was_visible = show_window(handle = any_handle, cmd = SW_SHOWNA) }}
|
300
|
-
|
301
|
-
it 'was_visible = hide_window(handle = any_handle) # derived method (not a separate API function)' do
|
302
|
-
test_app do |app|
|
303
|
-
use{ @was_visible = hide_window(app.handle) }
|
304
|
-
@was_visible.should == true
|
305
|
-
visible?(app.handle).should == false
|
306
|
-
hide_window(app.handle).should == false
|
307
|
-
visible?(app.handle).should == false
|
308
|
-
end
|
309
|
-
end
|
310
|
-
|
311
|
-
it 'returns true if the window was PREVIOUSLY visible, false otherwise' do
|
312
|
-
test_app do |app|
|
313
|
-
show_window(app.handle, SW_HIDE).should == true
|
314
|
-
show_window(app.handle, SW_HIDE).should == false
|
315
|
-
end
|
316
|
-
end
|
317
|
-
|
318
|
-
it 'hides window with SW_HIDE command ' do
|
319
|
-
test_app do |app|
|
320
|
-
show_window(app.handle, SW_HIDE)
|
321
|
-
visible?(app.handle).should == false
|
322
|
-
end
|
323
|
-
end
|
324
|
-
|
325
|
-
it 'shows hidden window with SW_SHOW command' do
|
326
|
-
test_app do |app|
|
327
|
-
hide_window(app.handle)
|
328
|
-
show_window(app.handle, SW_SHOW)
|
329
|
-
visible?(app.handle).should == true
|
330
|
-
end
|
331
|
-
end
|
332
|
-
|
333
|
-
it 'SW_MAXIMIZE, SW_SHOWMAXIMIZED maximize window and activate it' do
|
334
|
-
test_show_window SW_MAXIMIZE, SW_SHOWMAXIMIZED,
|
335
|
-
:minimized? => false, :maximized? => true, :visible? => true, :foreground? => true
|
336
|
-
end
|
337
|
-
|
338
|
-
it 'SW_MINIMIZE minimizes window and activates the next top-level window in the Z order' do
|
339
|
-
test_show_window SW_MINIMIZE,
|
340
|
-
:minimized? => true, :maximized? => false, :visible? => true, :foreground? => false
|
341
|
-
end
|
342
|
-
|
343
|
-
it 'SW_SHOWMINNOACTIVE, SW_SHOWMINIMIZED displays the window as a minimized foreground window' do
|
344
|
-
test_show_window SW_SHOWMINNOACTIVE, SW_SHOWMINIMIZED,
|
345
|
-
:minimized? => true, :maximized? => false, :visible? => true, :foreground? => true
|
346
|
-
end
|
347
|
-
|
348
|
-
it 'SW_SHOWNORMAL, SW_RESTORE, SW_SHOWNOACTIVATE activate/display a window(if min/maximized it is restored' do
|
349
|
-
test_show_window SW_SHOWNORMAL, SW_RESTORE, SW_SHOWNOACTIVATE,
|
350
|
-
:minimized? => false, :maximized? => false, :visible? => true, :foreground? => true
|
351
|
-
end
|
352
|
-
|
353
|
-
it 'SW_SHOWNA displays the window in its current size and position (similar to SW_SHOW, but window is not activated)'
|
354
|
-
it 'SW_SHOWDEFAULT sets the show state based on the SW_ value specified in the STARTUPINFO structure passed to the CreateProcess function by the program that started the application'
|
355
|
-
it 'SW_FORCEMINIMIZE minimizes a window, even if the thread that owns the window is not responding - only Win2000/XP'
|
356
|
-
end
|
357
|
-
|
358
|
-
describe '#keydb_event' do
|
359
|
-
spec{ use{ keybd_event(vkey = 0, bscan = 0, flags = 0, extra_info = 0) }}
|
360
|
-
# vkey (I) - Specifies a virtual-key code. The code must be a value in the range 1 to 254. For a complete list, see msdn:Virtual Key Codes.
|
361
|
-
# bscan (I) - Specifies a hardware scan code for the key.
|
362
|
-
# flags (L) - Specifies various aspects of function operation. This parameter can be one or more of the following values.
|
363
|
-
# KEYEVENTF_EXTENDEDKEY - If specified, the scan code was preceded by a prefix byte having the value 0xE0 (224).
|
364
|
-
# KEYEVENTF_KEYUP - If specified, the key is being released. If not specified, the key is being depressed.
|
365
|
-
# extra_info (L) - Specifies an additional value associated with the key stroke.
|
366
|
-
# no return value
|
367
|
-
|
368
|
-
it 'synthesizes a numeric keystrokes, emulating keyboard driver' do
|
369
|
-
test_app do |app|
|
370
|
-
text = '123 456'
|
371
|
-
text.upcase.each_byte do |b| # upcase needed since user32 keybd_event expects upper case chars
|
372
|
-
keybd_event(b.ord, 0, KEYEVENTF_KEYDOWN, 0)
|
373
|
-
sleep TEST_KEY_DELAY
|
374
|
-
keybd_event(b.ord, 0, KEYEVENTF_KEYUP, 0)
|
375
|
-
sleep TEST_KEY_DELAY
|
376
|
-
end
|
377
|
-
app.textarea.text.should =~ Regexp.new(text)
|
378
|
-
7.times {keystroke(VK_CONTROL, 'Z'.ord)} # dirty hack!
|
379
|
-
end
|
380
|
-
end
|
381
|
-
|
382
|
-
it 'synthesizes a letter keystroke, emulating keyboard driver'
|
383
|
-
end
|
384
|
-
|
385
|
-
describe '#post_message' do
|
386
|
-
spec{ use{ success = post_message(handle = 0, msg = 0, w_param = 0, l_param = 0) }}
|
387
|
-
# handle (L) - Handle to the window whose window procedure will receive the message.
|
388
|
-
# If this parameter is HWND_BROADCAST, the message is sent to all top-level windows in the system, including disabled or
|
389
|
-
# invisible unowned windows, overlapped windows, and pop-up windows; but the message is not sent to child windows.
|
390
|
-
# msg (L) - Specifies the message to be posted.
|
391
|
-
# w_param (L) - Specifies additional message-specific information.
|
392
|
-
# l_param (L) - Specifies additional message-specific information.
|
393
|
-
# returns (L) - Nonzero if success, zero if function failed. To get extended error information, call GetLastError.
|
394
|
-
|
395
|
-
it 'places (posts) a message in the message queue associated with the thread that created the specified window'
|
396
|
-
it 'returns without waiting for the thread to process the message'
|
397
|
-
end
|
398
|
-
|
399
|
-
describe '#send_message' do
|
400
|
-
spec{ use{ success = send_message(handle = 0, msg = 0, w_param = 1024, l_param = "\x0"*1024) }}
|
401
|
-
# handle (L) - Handle to the window whose window procedure is to receive the message. The following values have special meanings.
|
402
|
-
# HWND_BROADCAST - The message is posted to all top-level windows in the system, including disabled or invisible unowned windows,
|
403
|
-
# overlapped windows, and pop-up windows. The message is not posted to child windows.
|
404
|
-
# NULL - The function behaves like a call to PostThreadMessage with the dwThreadId parameter set to the identifier of the current thread.
|
405
|
-
# msg (L) - Specifies the message to be posted.
|
406
|
-
# w_param (L) - Specifies additional message-specific information.
|
407
|
-
# l_param (L) - Specifies additional message-specific information.
|
408
|
-
# return (L) - Nonzero if success, zero if function failed. To get extended error information, call GetLastError.
|
409
|
-
|
410
|
-
it 'sends the specified message to a window or windows'
|
411
|
-
it 'calls the window procedure and does not return until the window procedure has processed the message'
|
412
|
-
end
|
413
|
-
|
414
|
-
describe '#get_dlg_item' do
|
415
|
-
spec{ use{ control_handle = get_dlg_item(handle = 0, item_id = 1) }}
|
416
|
-
# handle (L) - Handle of the dialog box that contains the control.
|
417
|
-
# item_id (I) - Specifies the identifier of the control to be retrieved.
|
418
|
-
# Returns (L) - handle of the specified control if success or nil for invalid dialog box handle or a nonexistent control.
|
419
|
-
# To get extended error information, call GetLastError.
|
420
|
-
# You can use the GetDlgItem function with any parent-child window pair, not just with dialog boxes. As long as the handle
|
421
|
-
# parameter specifies a parent window and the child window has a unique id (as specified by the hMenu parameter in the
|
422
|
-
# CreateWindow or CreateWindowEx function that created the child window), GetDlgItem returns a valid handle to the child window.
|
423
|
-
|
424
|
-
it 'returns handle to correctly specified control'
|
425
|
-
end
|
426
|
-
|
427
|
-
describe '#enum_windows' do
|
428
|
-
spec{ use{ enum_windows(message = 'Message') }}
|
429
|
-
|
430
|
-
it 'return an array of top-level window handles if block is not given' do
|
431
|
-
test_app do |app|
|
432
|
-
enum = enum_windows(message = 'Message')
|
433
|
-
enum.should be_a_kind_of Array
|
434
|
-
enum.should_not be_empty
|
435
|
-
enum.should have_at_least(60).elements # typical number of top windows in WinXP system?
|
436
|
-
enum.each{|handle| handle.should be_an Integer }
|
437
|
-
enum.any?{|handle| handle == app.handle}.should == true
|
438
|
-
end
|
439
|
-
end
|
440
|
-
it 'iterates through all the top-level windows, passing each found window handle and message to a given block'
|
441
|
-
|
442
|
-
end
|
443
|
-
|
444
|
-
describe '#enum_child_windows' do
|
445
|
-
spec{ use{ enum_child_windows(parent = any_handle, message = 'Message') }}
|
446
|
-
|
447
|
-
it 'return an array of child window handles if block is not given' do
|
448
|
-
test_app do |app|
|
449
|
-
enum = enum_child_windows(app.handle, message = 'Message')
|
450
|
-
enum.should be_a_kind_of Array
|
451
|
-
enum.should have(2).elements
|
452
|
-
class_name(enum.first).should == TEST_STATUSBAR_CLASS
|
453
|
-
class_name(enum.last).should == TEST_TEXTAREA_CLASS
|
454
|
-
end
|
455
|
-
end
|
456
|
-
|
457
|
-
it 'loops through all children of given window, passing each found window handle and a message to a given block' do
|
458
|
-
test_app do |app|
|
459
|
-
enum = []
|
460
|
-
enum_child_windows(app.handle, 'Message') do |handle, message|
|
461
|
-
enum << handle
|
462
|
-
message.should == 'Message'
|
463
|
-
end
|
464
|
-
enum.should have(2).elements
|
465
|
-
class_name(enum.first).should == TEST_STATUSBAR_CLASS
|
466
|
-
class_name(enum.last).should == TEST_TEXTAREA_CLASS
|
467
|
-
end
|
468
|
-
end
|
469
|
-
|
470
|
-
it 'breaks loop if given block returns false' do
|
471
|
-
pending
|
472
|
-
test_app do |app|
|
473
|
-
enum = []
|
474
|
-
enum_child_windows(app.handle, 'Message') do |handle, message|
|
475
|
-
enum << handle
|
476
|
-
1
|
477
|
-
end
|
478
|
-
enum.should have(1).element
|
479
|
-
class_name(enum.first).should == TEST_STATUSBAR_CLASS
|
480
|
-
# class_name(enum.last).should == TEST_TEXTAREA_CLASS
|
481
|
-
end
|
482
|
-
end
|
483
|
-
end
|
484
|
-
end
|
485
|
-
|
486
|
-
describe WinGui, ' convenience wrapper methods' do
|
487
|
-
describe '#keystroke' do
|
488
|
-
spec{ use{ keystroke( vkey = 30, vkey = 30) }}
|
489
|
-
# this service method emulates combinations of (any amount of) keys pressed one after another (Ctrl+Alt+P) and then released
|
490
|
-
# vkey (int) - Specifies a virtual-key code. The code must be a value in the range 1 to 254. For a complete list, see msdn:Virtual Key Codes.
|
491
|
-
|
492
|
-
it 'emulates combinations of keys pressed (Ctrl+Alt+P+M, etc)' do
|
493
|
-
test_app do |app|
|
494
|
-
keystroke(VK_CONTROL, 'A'.ord)
|
495
|
-
keystroke(VK_SPACE)
|
496
|
-
app.textarea.text.should == ' '
|
497
|
-
2.times {keystroke(VK_CONTROL, 'Z'.ord)} # dirty hack!
|
498
|
-
end
|
499
|
-
end
|
500
|
-
end
|
501
|
-
|
502
|
-
describe '#type_in' do
|
503
|
-
spec{ use{ type_in(message = '') }}
|
504
|
-
# this service method types text message into window holding the focus
|
505
|
-
|
506
|
-
it 'types text message into window holding the focus' do
|
507
|
-
test_app do |app|
|
508
|
-
text = '123 456'
|
509
|
-
type_in(text)
|
510
|
-
app.textarea.text.should =~ Regexp.new(text)
|
511
|
-
7.times {keystroke(VK_CONTROL, 'Z'.ord)} # dirty hack!
|
512
|
-
end
|
513
|
-
end
|
514
|
-
end
|
515
|
-
|
516
|
-
describe 'dialog' do
|
517
|
-
spec{ use{ dialog( title ='Dialog Title', timeout_sec = 0.001, &any_block) }}
|
518
|
-
# me od finds top-level dialog window by title and yields found dialog window to block if given
|
519
|
-
|
520
|
-
it 'finds top-level dialog window by title' do
|
521
|
-
pending 'Some problems (?with timeouts?) leave window open ~half of the runs'
|
522
|
-
test_app do |app|
|
523
|
-
keystroke(VK_ALT, 'F'.ord, 'A'.ord)
|
524
|
-
@found = false
|
525
|
-
dialog('Save As', 0.5) do |dialog_window|
|
526
|
-
@found = true
|
527
|
-
keystroke(VK_ESCAPE)
|
528
|
-
dialog_window
|
529
|
-
end
|
530
|
-
@found.should == true
|
531
|
-
end
|
532
|
-
end
|
533
|
-
it 'yields found dialog window to a given block'
|
534
|
-
end
|
535
|
-
|
536
|
-
end
|
537
|
-
end
|