win32-autogui 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. data/.gitattributes +1 -0
  2. data/.gitignore +10 -0
  3. data/.yardopts +6 -0
  4. data/Gemfile +4 -0
  5. data/Gemfile.lock +60 -0
  6. data/HISTORY.markdown +11 -0
  7. data/LICENSE +20 -0
  8. data/README.markdown +265 -0
  9. data/Rakefile +55 -0
  10. data/TODO.markdown +9 -0
  11. data/VERSION +1 -0
  12. data/config/cucumber.yml +7 -0
  13. data/examples/quicknote/.gitignore +8 -0
  14. data/examples/quicknote/FormAboutU.dfm +44 -0
  15. data/examples/quicknote/FormAboutU.pas +36 -0
  16. data/examples/quicknote/FormMainU.dfm +110 -0
  17. data/examples/quicknote/FormMainU.pas +268 -0
  18. data/examples/quicknote/FormSplashU.dfm +32 -0
  19. data/examples/quicknote/FormSplashU.pas +52 -0
  20. data/examples/quicknote/LICENSE +20 -0
  21. data/examples/quicknote/README.markdown +28 -0
  22. data/examples/quicknote/Rakefile +12 -0
  23. data/examples/quicknote/TODO.markdown +15 -0
  24. data/examples/quicknote/dcu/.gitignore +1 -0
  25. data/examples/quicknote/exe/.gitignore +0 -0
  26. data/examples/quicknote/exe/quicknote.exe +0 -0
  27. data/examples/quicknote/lib/quicknote.rb +140 -0
  28. data/examples/quicknote/quicknote.cfg +37 -0
  29. data/examples/quicknote/quicknote.dof +158 -0
  30. data/examples/quicknote/quicknote.dpr +16 -0
  31. data/examples/quicknote/quicknote.res +0 -0
  32. data/examples/quicknote/spec/quicknote/form_about_spec.rb +50 -0
  33. data/examples/quicknote/spec/quicknote/form_main_spec.rb +274 -0
  34. data/examples/quicknote/spec/quicknote/form_splash_spec.rb +44 -0
  35. data/examples/quicknote/spec/spec.opts +2 -0
  36. data/examples/quicknote/spec/spec_helper.rb +34 -0
  37. data/examples/quicknote/spec/watchr.rb +143 -0
  38. data/examples/skeleton/.gitignore +8 -0
  39. data/examples/skeleton/LICENSE +20 -0
  40. data/examples/skeleton/README.markdown +62 -0
  41. data/examples/skeleton/Rakefile +21 -0
  42. data/examples/skeleton/TODO.markdown +9 -0
  43. data/examples/skeleton/config/cucumber.yml +7 -0
  44. data/examples/skeleton/dcu/.gitignore +1 -0
  45. data/examples/skeleton/exe/.gitignore +1 -0
  46. data/examples/skeleton/features/basic.feature +6 -0
  47. data/examples/skeleton/features/step_definitions/.gitignore +0 -0
  48. data/examples/skeleton/features/step_definitions/application_steps.rb +43 -0
  49. data/examples/skeleton/features/support/env.rb +5 -0
  50. data/examples/skeleton/lib/myapp.rb +73 -0
  51. data/examples/skeleton/spec/myapp/form_about_spec.rb +50 -0
  52. data/examples/skeleton/spec/myapp/form_main_spec.rb +60 -0
  53. data/examples/skeleton/spec/spec.opts +2 -0
  54. data/examples/skeleton/spec/spec_helper.rb +29 -0
  55. data/examples/skeleton/spec/watchr.rb +143 -0
  56. data/features/automating_an_application.feature +11 -0
  57. data/features/step_definitions/.gitignore +0 -0
  58. data/features/step_definitions/calculator_steps.rb +37 -0
  59. data/features/support/env.rb +4 -0
  60. data/lib/win32/autogui.rb +27 -0
  61. data/lib/win32/autogui/application.rb +249 -0
  62. data/lib/win32/autogui/input.rb +238 -0
  63. data/lib/win32/autogui/window.rb +191 -0
  64. data/lib/win32/autogui/windows/window.rb +22 -0
  65. data/spec/applications/calculator.rb +34 -0
  66. data/spec/auto_gui/application_spec.rb +132 -0
  67. data/spec/basic_gem/basic_gem_spec.rb +13 -0
  68. data/spec/spec.opts +2 -0
  69. data/spec/spec_helper.rb +31 -0
  70. data/spec/watchr.rb +144 -0
  71. data/win32-autogui.gemspec +43 -0
  72. metadata +329 -0
@@ -0,0 +1 @@
1
+ *.rb diff=ruby
@@ -0,0 +1,10 @@
1
+ pkg/*
2
+ *.gem
3
+ .bundle
4
+ coverage
5
+ rdoc
6
+ .yardoc
7
+ rerun.txt
8
+ tags
9
+ tmp/fixtures
10
+ tmp/aruba
@@ -0,0 +1,6 @@
1
+ --verbose
2
+ --list-undoc
3
+ -
4
+ LICENSE
5
+ HISTORY.markdown
6
+ VERSION
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in the .gemspec file
4
+ gemspec
@@ -0,0 +1,60 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ win32-autogui (0.2.0)
5
+ win32-clipboard (>= 0.5.2)
6
+ win32-process (>= 0.6.2)
7
+ windows-api (>= 0.4.0)
8
+ windows-pr (>= 1.0.9)
9
+
10
+ GEM
11
+ remote: http://rubygems.org/
12
+ specs:
13
+ aruba (0.2.3)
14
+ background_process
15
+ cucumber (~> 0.9.0)
16
+ background_process (1.2)
17
+ builder (2.1.2)
18
+ cucumber (0.9.3)
19
+ builder (~> 2.1.2)
20
+ diff-lcs (~> 1.1.2)
21
+ gherkin (~> 2.2.9)
22
+ json (~> 1.4.6)
23
+ term-ansicolor (~> 1.0.5)
24
+ diff-lcs (1.1.2)
25
+ gherkin (2.2.9)
26
+ json (~> 1.4.6)
27
+ term-ansicolor (~> 1.0.5)
28
+ json (1.4.6)
29
+ rake (0.8.7)
30
+ rdiscount (1.6.5)
31
+ rspec (1.3.1)
32
+ term-ansicolor (1.0.5)
33
+ win32-api (1.4.6)
34
+ win32-clipboard (0.5.2)
35
+ windows-pr (>= 1.0.3)
36
+ win32-process (0.6.2)
37
+ windows-pr (>= 1.0.5)
38
+ windows-api (0.4.0)
39
+ win32-api (>= 1.4.5)
40
+ windows-pr (1.0.9)
41
+ win32-api (>= 1.4.5)
42
+ windows-api (>= 0.3.0)
43
+ yard (0.6.1)
44
+
45
+ PLATFORMS
46
+ ruby
47
+
48
+ DEPENDENCIES
49
+ aruba (>= 0.2.3)
50
+ bundler (>= 1.0.3)
51
+ cucumber (>= 0.9.2)
52
+ rake (>= 0.8.7)
53
+ rdiscount (>= 1.6.5)
54
+ rspec (= 1.3.1)
55
+ win32-autogui!
56
+ win32-clipboard (>= 0.5.2)
57
+ win32-process (>= 0.6.2)
58
+ windows-api (>= 0.4.0)
59
+ windows-pr (>= 1.0.9)
60
+ yard (>= 0.6.1)
@@ -0,0 +1,11 @@
1
+ History
2
+ =======
3
+ Most recent changes are at the top
4
+
5
+
6
+ Changes
7
+ -------
8
+
9
+ ### 0.2.0 - 11/04/2010 ###
10
+
11
+ * Initial release
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010 GearheadForHire, LLC
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,265 @@
1
+ Win32-Autogui
2
+ =============
3
+
4
+ A Win32 GUI testing framework packaged as a [RubyGem](http://rubygems.org/).
5
+
6
+
7
+ Overview
8
+ --------
9
+ Win32-autogui provides a framework to enable GUI application testing
10
+ with Ruby. This facilitates integration testing of Windows binaries using
11
+ Ruby based tools like [RSpec](http://github.com/dchelimsky/rspec)
12
+ and [Cucumber](http://github.com/aslakhellesoy/cucumber). Examples of
13
+ using both these tools are provided with this gem.
14
+
15
+
16
+ Quick Start
17
+ -----------
18
+ See [examples/skeleton/README.markdown](examples/skeleton/README.markdown) for
19
+ a template of the file structure needed for jump-starting GUI testing with
20
+ the Win32-autogui RubyGem.
21
+
22
+
23
+ Example Usage: Driving Calc.exe
24
+ -------------------------------
25
+
26
+ Using [RSpec](http://github.com/dchelimsky/rspec) to test drive the stock
27
+ Window's calculator application. This example is used as Win32-autogui's
28
+ internal spec. See [spec/auto_gui/application_spec.rb](spec/auto_gui/application_spec.rb).
29
+
30
+ A more complete example of testing a Window's Delphi program is presented with
31
+ source and binaries in [examples/quicknote/](examples/quicknote/).
32
+
33
+ ### Wrap the application to be tested ###
34
+ The first step is to subclass Win32-autogui's application class.
35
+
36
+ require 'win32/autogui'
37
+
38
+ class Calculator < Autogui::Application
39
+
40
+ # initialize with the binary name 'calc' and the window title
41
+ # 'Calculator' used along with the application pid to find the
42
+ # main application window
43
+ def initialize(options = {})
44
+ defaults = {
45
+ :name => "calc",
46
+ :title => "Calculator"
47
+ }
48
+ super defaults.merge(options)
49
+ end
50
+
51
+ # the calculator's results window
52
+ def edit_window
53
+ main_window.children.find {|w| w.window_class == 'Edit'}
54
+ end
55
+
56
+ # About dialog, hotkey (VK_MENU, VK_H, VK_A)
57
+ def dialog_about
58
+ Autogui::EnumerateDesktopWindows.new.find do |w|
59
+ w.title.match(/About Calculator/) && (w.pid == pid)
60
+ end
61
+ end
62
+
63
+ # the 'CE' button
64
+ def clear_entry
65
+ keystroke(VK_DELETE)
66
+ end
67
+
68
+ end
69
+
70
+ ### Write specs ###
71
+ The following RSpec code describes driving the Windows calculator for testing.
72
+ Multiple instances running simultaneously are supported. See "should control
73
+ focus with set_focus."
74
+
75
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
76
+
77
+ include Autogui::Input
78
+
79
+ describe Autogui::Application do
80
+
81
+ describe "driving calc.exe" do
82
+
83
+ before(:all) do
84
+ @calculator = Calculator.new
85
+ end
86
+
87
+ after(:all) do
88
+ @calculator.close(:wait_for_close => true) if @calculator.running?
89
+ @calculator.should_not be_running
90
+ end
91
+
92
+ it "should start when initialized" do
93
+ @calculator.should be_running
94
+ end
95
+
96
+ it "should have the title 'Calculator' that matches the main_window title" do
97
+ @calculator.main_window.title.should == 'Calculator'
98
+ @calculator.main_window.title.should == @calculator.title
99
+ end
100
+
101
+ it "should have an inspect method showing child window information" do
102
+ @calculator.inspect.should match(/children=</)
103
+ end
104
+
105
+ it "should calculate '2+2=4' using the keystroke method" do
106
+ @calculator.set_focus
107
+ keystroke(VK_2, VK_ADD, VK_2, VK_RETURN)
108
+ @calculator.edit_window.text.strip.should == "4."
109
+ end
110
+
111
+ it "should calculate '2+12=14' using the type_in method" do
112
+ @calculator.set_focus
113
+ type_in("2+12=")
114
+ @calculator.edit_window.text.strip.should == "14."
115
+ end
116
+
117
+ it "should control the focus with 'set_focus'" do
118
+ @calculator.set_focus
119
+ keystroke(VK_9)
120
+ @calculator.edit_window.text.strip.should == "9."
121
+
122
+ calculator2 = Calculator.new
123
+ calculator2.pid.should_not == @calculator.pid
124
+ calculator2.set_focus
125
+ keystroke(VK_1, VK_0)
126
+ calculator2.edit_window.text.strip.should == "10."
127
+
128
+ @calculator.set_focus
129
+ @calculator.edit_window.text.strip.should == "9."
130
+
131
+ calculator2.close(:wait_for_close => true)
132
+ end
133
+
134
+ it "should open and close the 'About Calculator' dialog via (VK_MENU, VK_H, VK_A)" do
135
+ @calculator.set_focus
136
+ dialog_about = @calculator.dialog_about
137
+ dialog_about.should be_nil
138
+ keystroke(VK_MENU, VK_H, VK_A)
139
+ dialog_about = @calculator.dialog_about
140
+ dialog_about.title.should == "About Calculator"
141
+ dialog_about.combined_text.should match(/Microsoft . Calculator/)
142
+ dialog_about.close
143
+ @calculator.dialog_about.should be_nil
144
+ end
145
+
146
+ describe "clipboard" do
147
+ before(:each) do
148
+ @calculator.clear_entry
149
+ @calculator.clipboard.text = ""
150
+ @calculator.clipboard.text.should == ""
151
+ end
152
+
153
+ describe "copy (VK_CONTROL, VK_C)" do
154
+ it "should copy the edit window" do
155
+ @calculator.set_focus
156
+ type_in("3002")
157
+ @calculator.edit_window.text.strip.should == "3,002."
158
+ @calculator.edit_window.set_focus
159
+ keystroke(VK_CONTROL, VK_C)
160
+ @calculator.clipboard.text.should == "3002"
161
+ end
162
+ end
163
+
164
+ describe "paste (VK_CONTROL, VK_V)" do
165
+ it "should paste into the edit window" do
166
+ @calculator.edit_window.set_focus
167
+ @calculator.clipboard.text = "12345"
168
+ @calculator.edit_window.text.strip.should == "0."
169
+ keystroke(VK_CONTROL, VK_V)
170
+ @calculator.edit_window.text.strip.should == "12,345."
171
+ end
172
+ end
173
+
174
+ end
175
+
176
+ end
177
+ end
178
+
179
+
180
+ System Requirements
181
+ -------------------
182
+
183
+ Windows OS, version 2000 or higher, testing was done via Cygwin <http://www.cygwin.com/>
184
+
185
+
186
+ Dependencies
187
+ ------------
188
+ Win32-autogui depends on the following RubyGems
189
+
190
+ * Windows-api <http://github.com/djberg96/win32-api>
191
+ * Windows-pr <http://github.com/djberg96/windows-pr>
192
+ * Win32-process <http://github.com/djberg96/win32-process>
193
+ * Win32-clipboard <http://github.com/djberg96/win32-clipboard>
194
+
195
+
196
+ Installation
197
+ ------------
198
+ Win32-autogui is available on [RubyGems.org](http://rubygems.org/gems/win32-autogui)
199
+
200
+ gem install win32-autogui
201
+
202
+
203
+ References and Alternative Libraries
204
+ ------------------------------------
205
+
206
+ * Scripted GUI Testing with Ruby by Ian Dees <http://pragprog.com/titles/idgtr/scripted-gui-testing-with-ruby>
207
+ * RAA - win32-guitest <http://raa.ruby-lang.org/project/win32-guitest>
208
+ * Updated win32-guitest <http://rubyforge.org/projects/guitest>
209
+
210
+
211
+ Development
212
+ -----------
213
+ Win32-autogui development was jump-started by cloning [BasicGem](http://github.com/robertwahler/basic_gem).
214
+
215
+ ### Dependencies ###
216
+
217
+ * Bundler for dependency management <http://github.com/carlhuda/bundler>
218
+ * RSpec for unit testing <http://github.com/dchelimsky/rspec>
219
+ * Cucumber for functional testing <http://github.com/aslakhellesoy/cucumber>
220
+ * Aruba for CLI testing <http://github.com/aslakhellesoy/aruba>
221
+ * YARD for documentation generation <http://github.com/lsegal/yard>
222
+
223
+ ### Rake tasks ###
224
+
225
+ rake -T
226
+
227
+ rake build # Build win32-autogui-0.0.1.gem into the pkg directory
228
+ rake doc:clean # Remove generated documenation
229
+ rake doc:generate # Generate YARD Documentation
230
+ rake features # Run Cucumber features
231
+ rake install # Build and install win32-autogui-0.0.1.gem into system gems
232
+ rake release # Create tag v0.0.1 and build and push win32-autogui-0.0.1.gem to Rubygems
233
+ rake spec # Run specs
234
+ rake test # Run specs and features
235
+
236
+
237
+ ### Autotesting with Watchr ###
238
+
239
+ [Watchr](http://github.com/mynyml/watchr) provides a flexible alternative to Autotest. A
240
+ jump start script is provided in spec/watchr.rb.
241
+
242
+ #### Install watchr ###
243
+
244
+ gem install watchr
245
+
246
+ #### Run watchr ###
247
+
248
+ watchr spec/watchr.rb
249
+
250
+ outputs a menu
251
+
252
+ Ctrl-\ for menu, Ctrl-C to quit
253
+
254
+ Watchr will now watch the files defined in 'spec/watchr.rb' and run RSpec or Cucumber, as appropriate.
255
+ The watchr script provides a simple menu.
256
+
257
+ Ctrl-\
258
+
259
+ MENU: a = all , f = features s = specs, l = last feature (none), q = quit
260
+
261
+
262
+ Copyright
263
+ ---------
264
+
265
+ Copyright (c) 2010 GearheadForHire, LLC. See [LICENSE](LICENSE) for details.
@@ -0,0 +1,55 @@
1
+ # encoding: utf-8
2
+
3
+ # bundler/setup is managing $LOAD_PATH, any gem needed by this Rakefile must
4
+ # be listed as a development dependency in the gemspec
5
+
6
+ require 'rubygems'
7
+ require 'bundler/setup'
8
+
9
+ Bundler::GemHelper.install_tasks
10
+
11
+ def gemspec
12
+ @gemspec ||= begin
13
+ file = File.expand_path('../win32-autogui.gemspec', __FILE__)
14
+ eval(File.read(file), binding, file)
15
+ end
16
+ end
17
+
18
+ require 'spec'
19
+ require 'spec/rake/spectask'
20
+ Spec::Rake::SpecTask.new(:spec) do |spec|
21
+ spec.libs << 'lib' << 'spec'
22
+ spec.spec_files = FileList['spec/**/*_spec.rb']
23
+ end
24
+
25
+ require 'cucumber'
26
+ require 'cucumber/rake/task'
27
+ Cucumber::Rake::Task.new(:features) do |task|
28
+ task.cucumber_opts = ["features"]
29
+ end
30
+
31
+ desc "Run specs and features"
32
+ task :test => [:spec, :features]
33
+
34
+ task :default => :test
35
+
36
+ namespace :doc do
37
+ project_root = File.expand_path(File.dirname(__FILE__))
38
+ doc_destination = File.join(project_root, 'rdoc')
39
+
40
+ require 'yard'
41
+ require 'yard/rake/yardoc_task'
42
+
43
+ YARD::Rake::YardocTask.new(:generate) do |yt|
44
+ yt.options = ['--markup-provider', 'rdiscount',
45
+ '--output-dir', doc_destination
46
+ ] +
47
+ gemspec.rdoc_options - ['--line-numbers', '--inline-source']
48
+ end
49
+
50
+ desc "Remove generated documenation"
51
+ task :clean do
52
+ rm_r doc_destination if File.exists?(doc_destination)
53
+ end
54
+
55
+ end
@@ -0,0 +1,9 @@
1
+ TODO
2
+ ====
3
+
4
+ general
5
+ -------
6
+
7
+ * (1.0) stop changing $LOAD_PATH in specs and features, modify ENV[] in before and afters
8
+ * (1.0) implement Application.find and add option to not start application automatically, allows driving already running applications
9
+ * (1.0) application class should be a mixin, not classical inheritance