win_gui 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +5 -0
- data/.gitignore +21 -0
- data/LICENSE +20 -0
- data/README.rdoc +43 -0
- data/Rakefile +58 -0
- data/VERSION +1 -0
- data/book_code/early_success/bundle.rb +34 -0
- data/book_code/early_success/english.txt +1 -0
- data/book_code/early_success/jruby_basics.rb +47 -0
- data/book_code/early_success/windows_basics.rb +97 -0
- data/book_code/guessing/locknote.rb +379 -0
- data/book_code/guessing/monkeyshines.rb +14 -0
- data/book_code/guessing/note.rb +120 -0
- data/book_code/guessing/note_spec.rb +175 -0
- data/book_code/guessing/replay.rb +21 -0
- data/book_code/guessing/seed.rb +9 -0
- data/book_code/guessing/spec_helper.rb +69 -0
- data/book_code/guessing/windows_gui.rb +247 -0
- data/book_code/home_stretch/junquenote.rb +151 -0
- data/book_code/home_stretch/locknote.rb +180 -0
- data/book_code/home_stretch/note.rb +144 -0
- data/book_code/home_stretch/note_spec.rb +191 -0
- data/book_code/home_stretch/spec_helper.rb +55 -0
- data/book_code/home_stretch/swing_gui.rb +50 -0
- data/book_code/home_stretch/windows_gui.rb +232 -0
- data/book_code/junquenote/exports.sh +10 -0
- data/book_code/junquenote/jruby_mac.sh +10 -0
- data/book_code/junquenote/junquenote_app.rb +262 -0
- data/book_code/novite/Rakefile +10 -0
- data/book_code/novite/app/controllers/application.rb +18 -0
- data/book_code/novite/app/controllers/guests_controller.rb +28 -0
- data/book_code/novite/app/controllers/parties_controller.rb +77 -0
- data/book_code/novite/app/helpers/application_helper.rb +11 -0
- data/book_code/novite/app/helpers/guests_helper.rb +10 -0
- data/book_code/novite/app/helpers/parties_helper.rb +10 -0
- data/book_code/novite/app/models/guest.rb +11 -0
- data/book_code/novite/app/models/party.rb +32 -0
- data/book_code/novite/app/models/party_mailer.rb +19 -0
- data/book_code/novite/app/views/layouts/application.rhtml +44 -0
- data/book_code/novite/app/views/parties/new.html.erb +42 -0
- data/book_code/novite/app/views/parties/show.html.erb +43 -0
- data/book_code/novite/app/views/party_mailer/invite.erb +17 -0
- data/book_code/novite/config/boot.rb +117 -0
- data/book_code/novite/config/database.yml +19 -0
- data/book_code/novite/config/environment.rb +67 -0
- data/book_code/novite/config/environments/development.rb +29 -0
- data/book_code/novite/config/environments/production.rb +27 -0
- data/book_code/novite/config/environments/test.rb +30 -0
- data/book_code/novite/config/initializers/inflections.rb +18 -0
- data/book_code/novite/config/initializers/mime_types.rb +13 -0
- data/book_code/novite/config/routes.rb +47 -0
- data/book_code/novite/db/migrate/001_create_parties.rb +26 -0
- data/book_code/novite/db/migrate/002_create_guests.rb +23 -0
- data/book_code/novite/db/schema.rb +41 -0
- data/book_code/novite/log/empty.txt +0 -0
- data/book_code/novite/public/.htaccess +40 -0
- data/book_code/novite/public/404.html +38 -0
- data/book_code/novite/public/422.html +38 -0
- data/book_code/novite/public/500.html +38 -0
- data/book_code/novite/public/dispatch.cgi +10 -0
- data/book_code/novite/public/dispatch.fcgi +24 -0
- data/book_code/novite/public/dispatch.rb +18 -0
- 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 +285 -0
- data/book_code/novite/public/javascripts/application.js +10 -0
- data/book_code/novite/public/javascripts/controls.js +971 -0
- data/book_code/novite/public/javascripts/dragdrop.js +980 -0
- data/book_code/novite/public/javascripts/effects.js +1128 -0
- data/book_code/novite/public/javascripts/prototype.js +4233 -0
- data/book_code/novite/public/robots.txt +5 -0
- data/book_code/novite/script/about +3 -0
- data/book_code/novite/script/console +3 -0
- data/book_code/novite/script/destroy +3 -0
- data/book_code/novite/script/generate +3 -0
- data/book_code/novite/script/performance/benchmarker +3 -0
- data/book_code/novite/script/performance/profiler +3 -0
- data/book_code/novite/script/performance/request +3 -0
- data/book_code/novite/script/plugin +3 -0
- data/book_code/novite/script/process/inspector +3 -0
- data/book_code/novite/script/process/reaper +3 -0
- data/book_code/novite/script/process/spawner +3 -0
- data/book_code/novite/script/runner +3 -0
- data/book_code/novite/script/server +3 -0
- data/book_code/novite/test/test_helper.rb +46 -0
- data/book_code/one_more_thing/applescript.rb +68 -0
- data/book_code/one_more_thing/note_spec.rb +50 -0
- data/book_code/one_more_thing/spec_helper.rb +17 -0
- data/book_code/one_more_thing/textedit-pure.rb +28 -0
- data/book_code/one_more_thing/textedit.applescript +26 -0
- data/book_code/one_more_thing/textedit.rb +32 -0
- data/book_code/one_more_thing/textnote.rb +87 -0
- data/book_code/simplify/junquenote.rb +48 -0
- data/book_code/simplify/locknote.rb +46 -0
- data/book_code/simplify/note.rb +35 -0
- data/book_code/simplify/note_spec.rb +28 -0
- data/book_code/simplify/swing_gui.rb +45 -0
- data/book_code/simplify/windows_gui.rb +232 -0
- data/book_code/simplify/windows_gui_spec.rb +35 -0
- data/book_code/story/invite.story +19 -0
- data/book_code/story/journal.txt +29 -0
- data/book_code/story/novite_stories.rb +156 -0
- data/book_code/story/party.rb +149 -0
- data/book_code/story/password.rb +61 -0
- data/book_code/story/password.story +26 -0
- data/book_code/story/rsvp.story +29 -0
- data/book_code/tables/TestTime.html +93 -0
- data/book_code/tables/TestTimeSample.html +63 -0
- data/book_code/tables/calculate_time.rb +39 -0
- data/book_code/tables/calculator.rb +108 -0
- data/book_code/tables/calculator_actions.rb +27 -0
- data/book_code/tables/calculator_spec.rb +47 -0
- data/book_code/tables/fit.rb +32 -0
- data/book_code/tables/matrix.rb +109 -0
- data/book_code/tables/pseudocode.rb +17 -0
- data/book_code/tubes/book_selenium.rb +67 -0
- data/book_code/tubes/book_watir.rb +60 -0
- data/book_code/tubes/dragdrop.html +81 -0
- data/book_code/tubes/html_capture.rb +33 -0
- data/book_code/tubes/joke_list.rb +67 -0
- data/book_code/tubes/list_spec.rb +41 -0
- data/book_code/tubes/search_spec.rb +32 -0
- data/book_code/tubes/selenium_example.rb +66 -0
- data/book_code/tubes/selenium_link.rb +23 -0
- data/book_code/tubes/web_server.rb +14 -0
- data/book_code/windows/wgui.rb +29 -0
- data/book_code/windows/wobj.rb +25 -0
- data/book_code/windows/wsh.rb +25 -0
- data/book_code/with_rspec/empty_spec.rb +13 -0
- data/book_code/with_rspec/junquenote.rb +60 -0
- data/book_code/with_rspec/locknote.rb +129 -0
- data/book_code/with_rspec/note_spec.rb +32 -0
- data/book_code/with_rspec/should_examples.rb +18 -0
- data/exp/exp.rb +6 -0
- data/exp/exp_encodings.rb +40 -0
- data/exp/exp_enum_windows.rb +60 -0
- data/exp/exp_quik.rb +38 -0
- data/exp/exp_wsh.rb +115 -0
- data/exp/old/windows_basics.rb +80 -0
- data/exp/old/wnote.rb +80 -0
- data/exp/old/wnote_spec.rb +20 -0
- data/features/step_definitions/win_gui_steps.rb +0 -0
- data/features/support/env.rb +4 -0
- data/features/win_gui.feature +9 -0
- data/lib/note/java/jemmy.jar +0 -0
- data/lib/note/java/jnote.rb +48 -0
- data/lib/note/java/jruby_basics.rb +37 -0
- data/lib/note/java/junquenote_app.rb +262 -0
- data/lib/note/java/note_spec.rb +20 -0
- data/lib/note/win/locknote.rb +19 -0
- data/lib/note.rb +15 -0
- data/lib/win_gui/constants.rb +66 -0
- data/lib/win_gui/string_extensions.rb +24 -0
- data/lib/win_gui/win_gui.rb +274 -0
- data/lib/win_gui/window.rb +70 -0
- data/lib/win_gui.rb +3 -0
- data/spec/note/win/locknote_spec.rb +7 -0
- data/spec/spec.opts +2 -0
- data/spec/spec_helper.rb +100 -0
- data/spec/test_apps/locknote/LockNote.exe +0 -0
- data/spec/win_gui/string_extensions_spec.rb +61 -0
- data/spec/win_gui/win_gui_spec.rb +733 -0
- data/spec/win_gui/window_spec.rb +124 -0
- metadata +251 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#---
|
|
2
|
+
# Excerpted from "Scripted GUI Testing With Ruby",
|
|
3
|
+
# published by The Pragmatic Bookshelf.
|
|
4
|
+
# Copyrights apply to this code. It may not be used to create training material,
|
|
5
|
+
# courses, books, articles, and the like. Contact us if you are in doubt.
|
|
6
|
+
# We make no guarantees that this code is fit for any purpose.
|
|
7
|
+
# Visit http://www.pragmaticprogrammer.com/titles/idgtr for more book information.
|
|
8
|
+
#---
|
|
9
|
+
ENV["RAILS_ENV"] = "test"
|
|
10
|
+
require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
|
|
11
|
+
require 'test_help'
|
|
12
|
+
|
|
13
|
+
class Test::Unit::TestCase
|
|
14
|
+
# Transactional fixtures accelerate your tests by wrapping each test method
|
|
15
|
+
# in a transaction that's rolled back on completion. This ensures that the
|
|
16
|
+
# test database remains unchanged so your fixtures don't have to be reloaded
|
|
17
|
+
# between every test method. Fewer database queries means faster tests.
|
|
18
|
+
#
|
|
19
|
+
# Read Mike Clark's excellent walkthrough at
|
|
20
|
+
# http://clarkware.com/cgi/blosxom/2005/10/24#Rails10FastTesting
|
|
21
|
+
#
|
|
22
|
+
# Every Active Record database supports transactions except MyISAM tables
|
|
23
|
+
# in MySQL. Turn off transactional fixtures in this case; however, if you
|
|
24
|
+
# don't care one way or the other, switching from MyISAM to InnoDB tables
|
|
25
|
+
# is recommended.
|
|
26
|
+
#
|
|
27
|
+
# The only drawback to using transactional fixtures is when you actually
|
|
28
|
+
# need to test transactions. Since your test is bracketed by a transaction,
|
|
29
|
+
# any transactions started in your code will be automatically rolled back.
|
|
30
|
+
self.use_transactional_fixtures = true
|
|
31
|
+
|
|
32
|
+
# Instantiated fixtures are slow, but give you @david where otherwise you
|
|
33
|
+
# would need people(:david). If you don't want to migrate your existing
|
|
34
|
+
# test cases which use the @david style and don't mind the speed hit (each
|
|
35
|
+
# instantiated fixtures translates to a database query per test method),
|
|
36
|
+
# then set this back to true.
|
|
37
|
+
self.use_instantiated_fixtures = false
|
|
38
|
+
|
|
39
|
+
# Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order.
|
|
40
|
+
#
|
|
41
|
+
# Note: You'll currently still have to declare fixtures explicitly in integration tests
|
|
42
|
+
# -- they do not yet inherit this setting
|
|
43
|
+
fixtures :all
|
|
44
|
+
|
|
45
|
+
# Add more helper methods to be used by all tests here...
|
|
46
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
#---
|
|
2
|
+
# Excerpted from "Scripted GUI Testing With Ruby",
|
|
3
|
+
# published by The Pragmatic Bookshelf.
|
|
4
|
+
# Copyrights apply to this code. It may not be used to create training material,
|
|
5
|
+
# courses, books, articles, and the like. Contact us if you are in doubt.
|
|
6
|
+
# We make no guarantees that this code is fit for any purpose.
|
|
7
|
+
# Visit http://www.pragmaticprogrammer.com/titles/idgtr for more book information.
|
|
8
|
+
#---
|
|
9
|
+
|
|
10
|
+
module AppleScript
|
|
11
|
+
class Command
|
|
12
|
+
def initialize #(1)
|
|
13
|
+
@lines = []
|
|
14
|
+
@tells = 0
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def method_missing(name, *args, &block)
|
|
18
|
+
immediate = name.to_s.include? '!' #(2)
|
|
19
|
+
param = args.shift
|
|
20
|
+
script = name.to_s.chomp('!').gsub('_', ' ')
|
|
21
|
+
script += %Q( #{param.inspect}) if param
|
|
22
|
+
|
|
23
|
+
unless immediate #(3)
|
|
24
|
+
script = 'tell ' + script
|
|
25
|
+
@tells += 1
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
@lines << script
|
|
29
|
+
|
|
30
|
+
if block_given? #(4)
|
|
31
|
+
@has_block = true
|
|
32
|
+
instance_eval &block
|
|
33
|
+
go!
|
|
34
|
+
elsif immediate && !@has_block
|
|
35
|
+
go!
|
|
36
|
+
else
|
|
37
|
+
self
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
module AppleScript
|
|
47
|
+
class Command
|
|
48
|
+
def go!
|
|
49
|
+
clauses = @lines.map do |line|
|
|
50
|
+
'-e "' + line.gsub('"', '\"') + '"'
|
|
51
|
+
end.join(' ') + ' '
|
|
52
|
+
|
|
53
|
+
clauses += '-e "end tell" ' * @tells
|
|
54
|
+
|
|
55
|
+
`osascript #{clauses}`.chomp("\n")
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
module AppleScript
|
|
64
|
+
def tell
|
|
65
|
+
Command.new
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
#---
|
|
2
|
+
# Excerpted from "Scripted GUI Testing With Ruby",
|
|
3
|
+
# published by The Pragmatic Bookshelf.
|
|
4
|
+
# Copyrights apply to this code. It may not be used to create training material,
|
|
5
|
+
# courses, books, articles, and the like. Contact us if you are in doubt.
|
|
6
|
+
# We make no guarantees that this code is fit for any purpose.
|
|
7
|
+
# Visit http://www.pragmaticprogrammer.com/titles/idgtr for more book information.
|
|
8
|
+
#---
|
|
9
|
+
require 'spec_helper'
|
|
10
|
+
|
|
11
|
+
describe 'The editor' do
|
|
12
|
+
it_should_behave_like 'a new document'
|
|
13
|
+
|
|
14
|
+
it 'supports multiple levels of undo' do
|
|
15
|
+
|
|
16
|
+
@note.text = 'abc'
|
|
17
|
+
@note.text = 'def'
|
|
18
|
+
|
|
19
|
+
@note.undo
|
|
20
|
+
@note.text.should == 'abc'
|
|
21
|
+
|
|
22
|
+
@note.undo
|
|
23
|
+
@note.text.should be_empty
|
|
24
|
+
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it 'supports copying and pasting text' do
|
|
28
|
+
@note.text = 'itchy'
|
|
29
|
+
@note.select_all
|
|
30
|
+
@note.copy
|
|
31
|
+
@note.text.should == 'itchy'
|
|
32
|
+
|
|
33
|
+
@note.text = 'scratchy'
|
|
34
|
+
@note.select_all
|
|
35
|
+
@note.paste
|
|
36
|
+
@note.text.should == 'itchy'
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it 'supports cutting and pasting text' do
|
|
40
|
+
@note.text = 'pineapple'
|
|
41
|
+
@note.select_all
|
|
42
|
+
@note.cut
|
|
43
|
+
@note.text.should be_empty
|
|
44
|
+
|
|
45
|
+
@note.text = 'mango'
|
|
46
|
+
@note.select_all
|
|
47
|
+
@note.paste
|
|
48
|
+
@note.text.should == 'pineapple'
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#---
|
|
2
|
+
# Excerpted from "Scripted GUI Testing With Ruby",
|
|
3
|
+
# published by The Pragmatic Bookshelf.
|
|
4
|
+
# Copyrights apply to this code. It may not be used to create training material,
|
|
5
|
+
# courses, books, articles, and the like. Contact us if you are in doubt.
|
|
6
|
+
# We make no guarantees that this code is fit for any purpose.
|
|
7
|
+
# Visit http://www.pragmaticprogrammer.com/titles/idgtr for more book information.
|
|
8
|
+
#---
|
|
9
|
+
describe 'a new document', :shared => true do
|
|
10
|
+
before do
|
|
11
|
+
@note = Note.open
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
after do
|
|
15
|
+
@note.exit! if @note.running?
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#---
|
|
2
|
+
# Excerpted from "Scripted GUI Testing With Ruby",
|
|
3
|
+
# published by The Pragmatic Bookshelf.
|
|
4
|
+
# Copyrights apply to this code. It may not be used to create training material,
|
|
5
|
+
# courses, books, articles, and the like. Contact us if you are in doubt.
|
|
6
|
+
# We make no guarantees that this code is fit for any purpose.
|
|
7
|
+
# Visit http://www.pragmaticprogrammer.com/titles/idgtr for more book information.
|
|
8
|
+
#---
|
|
9
|
+
require 'applescript'
|
|
10
|
+
|
|
11
|
+
include AppleScript
|
|
12
|
+
|
|
13
|
+
RightArrow = 124
|
|
14
|
+
|
|
15
|
+
tell.application("TextEdit").activate! #(1)
|
|
16
|
+
|
|
17
|
+
tell.application("System Events").
|
|
18
|
+
process("TextEdit").
|
|
19
|
+
menu_bar(1).
|
|
20
|
+
menu_bar_item("Edit"). #(2)
|
|
21
|
+
menu("Edit") do #(3)
|
|
22
|
+
keystroke! "H"
|
|
23
|
+
keystroke! "i"
|
|
24
|
+
click_menu_item! "Select All"
|
|
25
|
+
click_menu_item! "Copy"
|
|
26
|
+
key_code! RightArrow
|
|
27
|
+
click_menu_item! "Paste"
|
|
28
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
tell application "TextEdit"
|
|
2
|
+
activate
|
|
3
|
+
end tell
|
|
4
|
+
|
|
5
|
+
tell application "System Events"
|
|
6
|
+
tell process "TextEdit"
|
|
7
|
+
keystroke "H"
|
|
8
|
+
keystroke "i"
|
|
9
|
+
end tell
|
|
10
|
+
end tell
|
|
11
|
+
|
|
12
|
+
tell application "System Events"
|
|
13
|
+
tell process "TextEdit"
|
|
14
|
+
tell menu bar 1
|
|
15
|
+
tell menu bar item "Edit"
|
|
16
|
+
tell menu "Edit"
|
|
17
|
+
click menu item "Select All"
|
|
18
|
+
click menu item "Copy"
|
|
19
|
+
set rightArrow to 124
|
|
20
|
+
key code rightArrow
|
|
21
|
+
click menu item "Paste"
|
|
22
|
+
end tell
|
|
23
|
+
end tell
|
|
24
|
+
end tell
|
|
25
|
+
end tell
|
|
26
|
+
end tell
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#---
|
|
2
|
+
# Excerpted from "Scripted GUI Testing With Ruby",
|
|
3
|
+
# published by The Pragmatic Bookshelf.
|
|
4
|
+
# Copyrights apply to this code. It may not be used to create training material,
|
|
5
|
+
# courses, books, articles, and the like. Contact us if you are in doubt.
|
|
6
|
+
# We make no guarantees that this code is fit for any purpose.
|
|
7
|
+
# Visit http://www.pragmaticprogrammer.com/titles/idgtr for more book information.
|
|
8
|
+
#---
|
|
9
|
+
require 'rubygems'
|
|
10
|
+
require 'appscript'
|
|
11
|
+
|
|
12
|
+
include Appscript
|
|
13
|
+
|
|
14
|
+
app("TextEdit").activate
|
|
15
|
+
|
|
16
|
+
events = app("System Events")
|
|
17
|
+
events.keystroke "H"
|
|
18
|
+
events.keystroke "i"
|
|
19
|
+
|
|
20
|
+
edit = app('System Events').
|
|
21
|
+
processes['TextEdit'].
|
|
22
|
+
menu_bars[1].
|
|
23
|
+
menu_bar_items['Edit'].
|
|
24
|
+
menus['Edit']
|
|
25
|
+
|
|
26
|
+
edit.menu_items['Select All'].click
|
|
27
|
+
edit.menu_items['Copy'].click
|
|
28
|
+
|
|
29
|
+
RightArrow = 124
|
|
30
|
+
events.key_code RightArrow
|
|
31
|
+
|
|
32
|
+
edit.menu_items['Paste'].click
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
#---
|
|
2
|
+
# Excerpted from "Scripted GUI Testing With Ruby",
|
|
3
|
+
# published by The Pragmatic Bookshelf.
|
|
4
|
+
# Copyrights apply to this code. It may not be used to create training material,
|
|
5
|
+
# courses, books, articles, and the like. Contact us if you are in doubt.
|
|
6
|
+
# We make no guarantees that this code is fit for any purpose.
|
|
7
|
+
# Visit http://www.pragmaticprogrammer.com/titles/idgtr for more book information.
|
|
8
|
+
#---
|
|
9
|
+
|
|
10
|
+
require 'applescript'
|
|
11
|
+
require 'note'
|
|
12
|
+
|
|
13
|
+
class TextNote < Note
|
|
14
|
+
include AppleScript
|
|
15
|
+
|
|
16
|
+
@@app = TextNote
|
|
17
|
+
|
|
18
|
+
def initialize(name = 'Untitled', with_options = {})
|
|
19
|
+
tell.application('TextEdit').activate!
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
DontSave = 2
|
|
23
|
+
|
|
24
|
+
def exit!
|
|
25
|
+
menu 'TextEdit', 'Quit TextEdit'
|
|
26
|
+
|
|
27
|
+
tell.
|
|
28
|
+
application('System Events').
|
|
29
|
+
process('TextEdit').
|
|
30
|
+
window('Untitled').
|
|
31
|
+
sheet(1).
|
|
32
|
+
click_button!(DontSave) #(1)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def running?
|
|
36
|
+
tell.
|
|
37
|
+
application('System Events').
|
|
38
|
+
process!('TextEdit') == 'TextEdit' #(2)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class TextNote
|
|
46
|
+
def text
|
|
47
|
+
tell.
|
|
48
|
+
application('System Events').
|
|
49
|
+
process('TextEdit').
|
|
50
|
+
window('Untitled').
|
|
51
|
+
scroll_area(1).
|
|
52
|
+
text_area(1).
|
|
53
|
+
get_value!
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def text=(new_text)
|
|
57
|
+
select_all
|
|
58
|
+
|
|
59
|
+
tell.application('System Events').
|
|
60
|
+
process('TextEdit').
|
|
61
|
+
window('Untitled') do
|
|
62
|
+
new_text.split(//).each {|k| keystroke! k}
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class TextNote
|
|
71
|
+
def menu(name, item, wait = false)
|
|
72
|
+
tell.application('System Events').
|
|
73
|
+
process('TextEdit').
|
|
74
|
+
menu_bar(1).
|
|
75
|
+
menu_bar_item(name).
|
|
76
|
+
menu(name).
|
|
77
|
+
click_menu_item! item
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def undo; menu('Edit', 1) end #(3)
|
|
81
|
+
|
|
82
|
+
def select_all; menu('Edit', 'Select All') end
|
|
83
|
+
def cut; menu('Edit', 'Cut') end
|
|
84
|
+
def copy; menu('Edit', 'Copy') end
|
|
85
|
+
def paste; menu('Edit', 'Paste') end
|
|
86
|
+
end
|
|
87
|
+
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#---
|
|
2
|
+
# Excerpted from "Scripted GUI Testing With Ruby",
|
|
3
|
+
# published by The Pragmatic Bookshelf.
|
|
4
|
+
# Copyrights apply to this code. It may not be used to create training material,
|
|
5
|
+
# courses, books, articles, and the like. Contact us if you are in doubt.
|
|
6
|
+
# We make no guarantees that this code is fit for any purpose.
|
|
7
|
+
# Visit http://www.pragmaticprogrammer.com/titles/idgtr for more book information.
|
|
8
|
+
#---
|
|
9
|
+
|
|
10
|
+
require 'swing_gui' #(1)
|
|
11
|
+
require 'junquenote_app'
|
|
12
|
+
require 'note'
|
|
13
|
+
|
|
14
|
+
class JunqueNote < Note
|
|
15
|
+
include SwingGui
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@@app = JunqueNote
|
|
19
|
+
@@titles[:save] = "Quittin' time"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def initialize
|
|
23
|
+
JunqueNoteApp.new
|
|
24
|
+
|
|
25
|
+
@main_window = JFrameOperator.new 'JunqueNote'
|
|
26
|
+
@edit_window = JTextAreaOperator.new @main_window #(2)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class JunqueNote
|
|
34
|
+
def text
|
|
35
|
+
@edit_window.text
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def text=(message)
|
|
39
|
+
@edit_window.clear_text
|
|
40
|
+
@edit_window.type_text message
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def close
|
|
44
|
+
menu_bar = JMenuBarOperator.new @main_window
|
|
45
|
+
menu_bar.push_menu_no_block 'File|Exit', '|'
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#---
|
|
2
|
+
# Excerpted from "Scripted GUI Testing With Ruby",
|
|
3
|
+
# published by The Pragmatic Bookshelf.
|
|
4
|
+
# Copyrights apply to this code. It may not be used to create training material,
|
|
5
|
+
# courses, books, articles, and the like. Contact us if you are in doubt.
|
|
6
|
+
# We make no guarantees that this code is fit for any purpose.
|
|
7
|
+
# Visit http://www.pragmaticprogrammer.com/titles/idgtr for more book information.
|
|
8
|
+
#---
|
|
9
|
+
|
|
10
|
+
require 'windows_gui'
|
|
11
|
+
require 'note'
|
|
12
|
+
|
|
13
|
+
class LockNote < Note
|
|
14
|
+
include WindowsGui
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@@app = LockNote
|
|
18
|
+
@@titles[:save] = 'Steganos LockNote'
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def initialize
|
|
22
|
+
system 'start "" "C:/LockNote/LockNote.exe"'
|
|
23
|
+
|
|
24
|
+
@main_window = Window.top_level 'LockNote - Steganos LockNote'
|
|
25
|
+
@edit_window = @main_window.child 'ATL:00434310'
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class LockNote
|
|
32
|
+
def text
|
|
33
|
+
@edit_window.text
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def text=(message)
|
|
37
|
+
keystroke VK_CONTROL, ?A
|
|
38
|
+
keystroke VK_BACK
|
|
39
|
+
type_in(message)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def close
|
|
43
|
+
@main_window.close
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
#---
|
|
2
|
+
# Excerpted from "Scripted GUI Testing With Ruby",
|
|
3
|
+
# published by The Pragmatic Bookshelf.
|
|
4
|
+
# Copyrights apply to this code. It may not be used to create training material,
|
|
5
|
+
# courses, books, articles, and the like. Contact us if you are in doubt.
|
|
6
|
+
# We make no guarantees that this code is fit for any purpose.
|
|
7
|
+
# Visit http://www.pragmaticprogrammer.com/titles/idgtr for more book information.
|
|
8
|
+
#---
|
|
9
|
+
|
|
10
|
+
class Note
|
|
11
|
+
@@app = nil #(1)
|
|
12
|
+
@@titles = {} #(2)
|
|
13
|
+
|
|
14
|
+
def self.open
|
|
15
|
+
@@app.new
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class Note
|
|
23
|
+
def exit!
|
|
24
|
+
close
|
|
25
|
+
|
|
26
|
+
@prompted = dialog(@@titles[:save]) do |d| #(3)
|
|
27
|
+
d.click '_No'
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def has_prompted?
|
|
32
|
+
@prompted
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#---
|
|
2
|
+
# Excerpted from "Scripted GUI Testing With Ruby",
|
|
3
|
+
# published by The Pragmatic Bookshelf.
|
|
4
|
+
# Copyrights apply to this code. It may not be used to create training material,
|
|
5
|
+
# courses, books, articles, and the like. Contact us if you are in doubt.
|
|
6
|
+
# We make no guarantees that this code is fit for any purpose.
|
|
7
|
+
# Visit http://www.pragmaticprogrammer.com/titles/idgtr for more book information.
|
|
8
|
+
#---
|
|
9
|
+
describe 'The main window' do
|
|
10
|
+
it 'launches with a welcome message' do
|
|
11
|
+
note = Note.open
|
|
12
|
+
note.text.should include('Welcome')
|
|
13
|
+
note.exit!
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it 'exits without a prompt if nothing has changed' do
|
|
17
|
+
note = Note.open
|
|
18
|
+
note.exit!
|
|
19
|
+
note.should_not have_prompted
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it 'prompts before exiting if the document has changed' do
|
|
23
|
+
note = Note.open
|
|
24
|
+
note.text = 'changed'
|
|
25
|
+
note.exit!
|
|
26
|
+
note.should have_prompted
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#---
|
|
2
|
+
# Excerpted from "Scripted GUI Testing With Ruby",
|
|
3
|
+
# published by The Pragmatic Bookshelf.
|
|
4
|
+
# Copyrights apply to this code. It may not be used to create training material,
|
|
5
|
+
# courses, books, articles, and the like. Contact us if you are in doubt.
|
|
6
|
+
# We make no guarantees that this code is fit for any purpose.
|
|
7
|
+
# Visit http://www.pragmaticprogrammer.com/titles/idgtr for more book information.
|
|
8
|
+
#---
|
|
9
|
+
require 'java'
|
|
10
|
+
require 'jemmy.jar'
|
|
11
|
+
|
|
12
|
+
include_class 'org.netbeans.jemmy.JemmyProperties'
|
|
13
|
+
include_class 'org.netbeans.jemmy.TestOut'
|
|
14
|
+
|
|
15
|
+
JemmyProperties.set_current_output TestOut.get_null_output
|
|
16
|
+
|
|
17
|
+
%w(Frame TextArea MenuBar Dialog Button).each do |o|
|
|
18
|
+
include_class "org.netbeans.jemmy.operators.J#{o}Operator"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class JDialogOperator
|
|
23
|
+
def click(title)
|
|
24
|
+
b = JButtonOperator.new self, title.gsub('_', '') #(1)
|
|
25
|
+
b.push
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
module SwingGui
|
|
32
|
+
def dialog(title, seconds=3)
|
|
33
|
+
JemmyProperties.set_current_timeout \
|
|
34
|
+
'DialogWaiter.WaitDialogTimeout', seconds * 1000
|
|
35
|
+
|
|
36
|
+
begin
|
|
37
|
+
d = JDialogOperator.new title
|
|
38
|
+
yield d #(2)
|
|
39
|
+
d.wait_closed
|
|
40
|
+
|
|
41
|
+
true
|
|
42
|
+
rescue NativeException
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|