osaka 0.4.8 → 0.4.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +7 -0
- data/README.rdoc +1 -1
- data/Rakefile +12 -2
- data/lib/osaka.rb +6 -0
- data/lib/osaka/calculator.rb +1 -1
- data/lib/osaka/commandrunner.rb +17 -0
- data/lib/osaka/defaultssystem.rb +28 -0
- data/lib/osaka/keynote.rb +8 -6
- data/lib/osaka/keynoteflow.rb +10 -2
- data/lib/osaka/launchservices.rb +29 -0
- data/lib/osaka/location.rb +1 -1
- data/lib/osaka/mailmergeflow.rb +1 -1
- data/lib/osaka/numbers.rb +1 -1
- data/lib/osaka/osakaexpectations.rb +65 -61
- data/lib/osaka/pages.rb +35 -26
- data/lib/osaka/preview.rb +1 -1
- data/lib/osaka/remotecontrol.rb +57 -47
- data/lib/osaka/scriptrunner.rb +2 -11
- data/lib/osaka/textedit.rb +1 -1
- data/lib/osaka/typicalapplication.rb +10 -4
- data/lib/osaka/typicalfinderdialog.rb +1 -1
- data/lib/osaka/typicalopendialog.rb +22 -18
- data/lib/osaka/typicalprintdialog.rb +1 -1
- data/lib/osaka/typicalsavedialog.rb +1 -1
- data/lib/osaka/version.rb +1 -1
- data/{osaka.gemfile → osaka.gemspec} +0 -0
- data/spec/assets/document.pdf +0 -0
- data/spec/calculator_spec.rb +5 -5
- data/spec/defaultssystem_spec.rb +30 -0
- data/spec/integration_calculator_spec.rb +7 -7
- data/spec/integration_keynote_spec.rb +24 -11
- data/spec/integration_numbers_spec.rb +2 -2
- data/spec/integration_pages_numbers_mail_merge_spec.rb +9 -9
- data/spec/integration_preview_spec.rb +16 -0
- data/spec/integration_textedit_spec.rb +5 -5
- data/spec/keynote_flows_spec.rb +52 -31
- data/spec/keynote_spec.rb +24 -14
- data/spec/launchservices_spec.rb +63 -0
- data/spec/location_spec.rb +13 -13
- data/spec/mailmergeflow_spec.rb +13 -13
- data/spec/numbers_spec.rb +10 -10
- data/spec/osakaexpectations_spec.rb +3 -3
- data/spec/pages_spec.rb +80 -61
- data/spec/preview_spec.rb +5 -5
- data/spec/remotecontrol_spec.rb +65 -43
- data/spec/scriptrunner_spec.rb +22 -22
- data/spec/textedit_spec.rb +3 -3
- data/spec/typicalapplication_spec.rb +119 -108
- data/spec/typicalfinderdialog_spec.rb +2 -2
- data/spec/typicalopendialog_spec.rb +41 -35
- data/spec/typicalprintdialog_spec.rb +5 -5
- data/spec/typicalsavedialog_spec.rb +10 -10
- metadata +51 -47
data/lib/osaka/version.rb
CHANGED
File without changes
|
Binary file
|
data/spec/calculator_spec.rb
CHANGED
@@ -6,13 +6,13 @@ describe "Mac GUI Calculator" do
|
|
6
6
|
include(*Osaka::OsakaExpectations)
|
7
7
|
|
8
8
|
subject { Osaka::Calculator.new }
|
9
|
-
let(:control) { subject.control =
|
10
|
-
|
9
|
+
let(:control) { subject.control = double("RemoteControl", :mac_version => :mountain_lion)}
|
10
|
+
|
11
11
|
it "Should be setting the window when starting the Calculator" do
|
12
12
|
|
13
13
|
expect_activate
|
14
14
|
expect_current_window_name.and_return("")
|
15
|
-
subject.
|
15
|
+
expect(subject).to receive(:wait_for_new_window).with([])
|
16
16
|
expect_window_list.and_return(["Calculator"])
|
17
17
|
expect_set_current_window("Calculator")
|
18
18
|
subject.activate
|
@@ -37,7 +37,7 @@ describe "Mac GUI Calculator" do
|
|
37
37
|
it "Should be able to get the value from the screen" do
|
38
38
|
expect_wait_until_exists!(at.static_text(1).group(1))
|
39
39
|
expect_get!("value", at.static_text(1).group(1)).and_return("0")
|
40
|
-
subject.result.
|
40
|
+
expect(subject.result).to eq "0"
|
41
41
|
end
|
42
42
|
|
43
|
-
end
|
43
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
|
2
|
+
require 'osaka'
|
3
|
+
|
4
|
+
describe "Wrapper around the defaults app which can be used for storing and retrieving preferences" do
|
5
|
+
|
6
|
+
before (:each) do
|
7
|
+
@worldclock_widget = <<-END_OF_DUMP
|
8
|
+
{
|
9
|
+
"0000000000000002-city" = 44;
|
10
|
+
"0000000000000002-continent" = 1;
|
11
|
+
city = 44;
|
12
|
+
continent = 1;
|
13
|
+
}
|
14
|
+
END_OF_DUMP
|
15
|
+
end
|
16
|
+
|
17
|
+
it "Can retrieve the settings from a domain (A domain is usually an application)" do
|
18
|
+
expect(Osaka::CommandRunner).to receive(:run).with("defaults read widget-com.apple.widget.worldclock").and_return(@worldclock_widget)
|
19
|
+
settings = DefaultsSystem.new("widget-com.apple.widget.worldclock")
|
20
|
+
expect(settings["city"]).to eq "44"
|
21
|
+
end
|
22
|
+
|
23
|
+
it "Can set settings on a domain" do
|
24
|
+
expect(Osaka::CommandRunner).to receive(:run).with("defaults read com.osaka").and_return(@worldclock_widget)
|
25
|
+
expect(Osaka::CommandRunner).to receive(:run).with("defaults write com.osaka key value").and_return(@worldclock_widget)
|
26
|
+
settings = DefaultsSystem.new("com.osaka")
|
27
|
+
settings["key"] = "value"
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
|
2
2
|
require 'osaka'
|
3
3
|
|
4
|
-
describe "Integration test using the Calculator" do
|
4
|
+
describe "Integration test using the Calculator", :integration => true do
|
5
5
|
|
6
6
|
subject { Osaka::Calculator.new }
|
7
7
|
|
@@ -22,20 +22,20 @@ describe "Integration test using the Calculator" do
|
|
22
22
|
subject.click("+")
|
23
23
|
subject.click("1")
|
24
24
|
subject.click("=")
|
25
|
-
subject.result.
|
25
|
+
expect(subject.result).to eq "2"
|
26
26
|
end
|
27
27
|
|
28
28
|
it "Should be able to do calculations using keyboard" do
|
29
29
|
subject.key("10")
|
30
30
|
subject.key("*")
|
31
31
|
subject.key("10")
|
32
|
-
subject.key("
|
33
|
-
subject.result.
|
32
|
+
subject.key("+")
|
33
|
+
expect(subject.result).to eq "100"
|
34
34
|
end
|
35
35
|
|
36
36
|
it "Should do whole formulas using key" do
|
37
|
-
subject.key("100+10*3+99
|
38
|
-
subject.result.
|
37
|
+
subject.key("100+10*3+99+")
|
38
|
+
expect(subject.result).to eq "229"
|
39
39
|
end
|
40
40
|
|
41
|
-
end
|
41
|
+
end
|
@@ -1,29 +1,42 @@
|
|
1
1
|
require 'tmpdir'
|
2
2
|
require 'osaka'
|
3
3
|
|
4
|
-
describe "Integration tests for Keynote and Common Flows" do
|
5
|
-
|
6
|
-
|
4
|
+
describe "Integration tests for Keynote and Common Flows", :integration => true do
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
@assets_directory = File.join(File.dirname(__FILE__), "assets")
|
8
|
+
end
|
7
9
|
|
8
|
-
|
10
|
+
it "Should be able to do a combine with just one file" do
|
9
11
|
|
10
|
-
keynote_file = File.join(assets_directory, "01_first_slides.key")
|
12
|
+
keynote_file = File.join(@assets_directory, "01_first_slides.key")
|
11
13
|
Dir.mktmpdir { |dir|
|
12
14
|
results_file = File.join(dir, "results.key")
|
13
15
|
CommonFlows.keynote_combine_files(results_file, keynote_file)
|
14
|
-
File.exists?(results_file).
|
16
|
+
expect(File.exists?(results_file)).to eq true
|
15
17
|
}
|
16
18
|
end
|
17
19
|
|
18
20
|
it "Should be able to combine multiple files" do
|
19
|
-
assets_directory = File.join(File.dirname(__FILE__), "assets")
|
20
21
|
|
21
22
|
Dir.mktmpdir { |dir|
|
22
23
|
results_file = File.join(dir, "results.key")
|
23
|
-
CommonFlows.keynote_combine_files_from_directory_sorted(results_file, assets_directory)
|
24
|
-
File.exists?(results_file).
|
25
|
-
}
|
24
|
+
CommonFlows.keynote_combine_files_from_directory_sorted(results_file, @assets_directory)
|
25
|
+
expect(File.exists?(results_file)).to eq true
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
it "Should exit with message if files are open" do
|
26
30
|
|
31
|
+
keynote_file = File.join(@assets_directory, "01_first_slides.key")
|
32
|
+
keynote = Osaka::Keynote.new
|
33
|
+
keynote.open(keynote_file)
|
34
|
+
|
35
|
+
expect {
|
36
|
+
CommonFlows.keynote_combine_files(nil, keynote_file)
|
37
|
+
}.to raise_error(Osaka::ApplicationWindowsMustBeClosed, "All Keynote windows must be closed before running this flow")
|
38
|
+
|
39
|
+
keynote.close
|
27
40
|
end
|
28
41
|
|
29
|
-
end
|
42
|
+
end
|
@@ -3,7 +3,7 @@ require 'osaka'
|
|
3
3
|
|
4
4
|
describe "Integration tests for Numbers" do
|
5
5
|
|
6
|
-
it "Should be able to fill in large index cells" do
|
6
|
+
it "Should be able to fill in large index cells", :integration => true do
|
7
7
|
|
8
8
|
Dir.mktmpdir { |dir|
|
9
9
|
|
@@ -14,4 +14,4 @@ describe "Integration tests for Numbers" do
|
|
14
14
|
|
15
15
|
end
|
16
16
|
|
17
|
-
end
|
17
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'tmpdir'
|
2
2
|
require 'osaka'
|
3
3
|
|
4
|
-
describe "Integration of mail merge flow with Pages and Numbers" do
|
4
|
+
describe "Integration of mail merge flow with Pages and Numbers", :integration => true do
|
5
5
|
|
6
6
|
|
7
7
|
before (:each) do
|
@@ -10,11 +10,11 @@ describe "Integration of mail merge flow with Pages and Numbers" do
|
|
10
10
|
@pages_template_filename = File.join(@tempdir, "mail_merge_template.pages")
|
11
11
|
@pdf_output_file = File.join(@tempdir, "output.pdf")
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
after (:each) do
|
15
15
|
FileUtils.remove_entry_secure @tempdir
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
it "Should mail merge the assets and generate a PDF" do
|
19
19
|
|
20
20
|
Osaka::Numbers.create_document(@numbers_filename) { |doc|
|
@@ -23,19 +23,19 @@ describe "Integration of mail merge flow with Pages and Numbers" do
|
|
23
23
|
doc.fill_cell(2, 3, "of Data")
|
24
24
|
doc.fill_cell(2, 4, "in Numbers")
|
25
25
|
}
|
26
|
-
|
26
|
+
|
27
27
|
Osaka::Pages.create_document(@pages_template_filename) { |doc|
|
28
28
|
doc.set_mail_merge_document(@numbers_filename)
|
29
|
-
doc.type("Hello World! This is pages. We're going to mail merge!\r\r")
|
29
|
+
doc.type("Hello World! This is pages. We're going to mail merge!\r\r")
|
30
30
|
doc.mail_merge_field("Data");
|
31
31
|
}
|
32
|
-
|
32
|
+
|
33
33
|
CommonFlows::number_and_pages_mail_merge(@numbers_filename, @pages_template_filename, @pdf_output_file)
|
34
|
-
File.exists?(@pdf_output_file).
|
35
|
-
|
34
|
+
expect(File.exists?(@pdf_output_file)).to eq true
|
35
|
+
|
36
36
|
preview = Osaka::Preview.new
|
37
37
|
preview.open(@pdf_output_file)
|
38
|
-
preview.pdf_content.
|
38
|
+
expect(preview.pdf_content).to include("Hello World")
|
39
39
|
preview.close
|
40
40
|
preview.quit
|
41
41
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'osaka'
|
2
|
+
|
3
|
+
describe "Integration tests for Preview", :integration => true do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@assets_directory = File.join(File.dirname(__FILE__), "assets")
|
7
|
+
end
|
8
|
+
|
9
|
+
it "Should be able to open a file and check if there is a certain text" do
|
10
|
+
preview = Osaka::Preview.new
|
11
|
+
preview.open(File.join(@assets_directory, "document.pdf"))
|
12
|
+
expect(preview.pdf_content).to include("Jamaica")
|
13
|
+
preview.close
|
14
|
+
preview.quit
|
15
|
+
end
|
16
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
|
2
2
|
require 'osaka'
|
3
3
|
|
4
|
-
describe "Integration test using TextEdit" do
|
4
|
+
describe "Integration test using TextEdit", :integration => true do
|
5
5
|
|
6
6
|
subject { Osaka::TextEdit.new }
|
7
7
|
|
@@ -18,7 +18,7 @@ describe "Integration test using TextEdit" do
|
|
18
18
|
it "can type in the window" do
|
19
19
|
subject.new_document
|
20
20
|
subject.type("Hello World")
|
21
|
-
subject.text.
|
21
|
+
expect(subject.text).to eq "Hello World"
|
22
22
|
subject.close(:dont_save)
|
23
23
|
end
|
24
24
|
|
@@ -32,11 +32,11 @@ describe "Integration test using TextEdit" do
|
|
32
32
|
editor1.type("Typing in window 1")
|
33
33
|
editor2.type("Typing in window 2")
|
34
34
|
|
35
|
-
editor1.text.
|
36
|
-
editor2.text.
|
35
|
+
expect(editor1.text).to eq "Typing in window 1"
|
36
|
+
expect(editor2.text).to eq "Typing in window 2"
|
37
37
|
|
38
38
|
editor1.close(:dont_save)
|
39
39
|
editor2.close(:dont_save)
|
40
40
|
end
|
41
41
|
|
42
|
-
end
|
42
|
+
end
|
data/spec/keynote_flows_spec.rb
CHANGED
@@ -2,59 +2,80 @@
|
|
2
2
|
require "osaka"
|
3
3
|
|
4
4
|
describe "Common flows in keynote" do
|
5
|
+
|
6
|
+
def should_shutdown
|
7
|
+
expect(mock_keynote).to receive(:save)
|
8
|
+
expect(mock_keynote).to receive(:close)
|
9
|
+
expect(mock_keynote).to receive(:quit)
|
10
|
+
end
|
5
11
|
|
6
|
-
let(:mock_keynote) {
|
12
|
+
let(:mock_keynote) { double("First keynote")}
|
7
13
|
|
14
|
+
it "Should exit if keynote windows are already open" do
|
15
|
+
expect(Osaka::Keynote).to receive(:new).and_return(mock_keynote)
|
16
|
+
expect(mock_keynote).to receive(:activate)
|
17
|
+
expect(mock_keynote).to receive(:raise_error_on_open_standard_windows)
|
18
|
+
.with("All Keynote windows must be closed before running this flow")
|
19
|
+
.and_raise(Osaka::ApplicationWindowsMustBeClosed, "All Keynote windows must be closed before running this flow")
|
20
|
+
|
21
|
+
expect {
|
22
|
+
CommonFlows.keynote_combine_files("result.key", "one_file.key")
|
23
|
+
}.to raise_error(Osaka::ApplicationWindowsMustBeClosed, "All Keynote windows must be closed before running this flow")
|
24
|
+
end
|
25
|
+
|
8
26
|
it "Should be able to combine just one single file" do
|
9
|
-
Osaka::Keynote.
|
10
|
-
mock_keynote.
|
11
|
-
mock_keynote.
|
12
|
-
mock_keynote.
|
13
|
-
mock_keynote.
|
27
|
+
expect(Osaka::Keynote).to receive(:new).and_return(mock_keynote)
|
28
|
+
expect(mock_keynote).to receive(:activate)
|
29
|
+
expect(mock_keynote).to receive(:raise_error_on_open_standard_windows)
|
30
|
+
expect(mock_keynote).to receive(:light_table_view)
|
31
|
+
expect(mock_keynote).to receive(:open).with("one_file.key")
|
32
|
+
expect(mock_keynote).to receive(:save_as).with("result.key")
|
33
|
+
should_shutdown
|
14
34
|
CommonFlows.keynote_combine_files("result.key", "one_file.key")
|
15
35
|
end
|
16
36
|
|
17
37
|
it "Should be able to combine multiple files in one result" do
|
18
|
-
mock2_keynote =
|
19
|
-
mock3_keynote =
|
20
|
-
Osaka::Keynote.
|
21
|
-
mock_keynote.
|
22
|
-
mock_keynote.
|
23
|
-
mock_keynote.
|
24
|
-
mock_keynote.
|
25
|
-
mock_keynote.
|
38
|
+
mock2_keynote = double("Second keynote")
|
39
|
+
mock3_keynote = double("Third keynote")
|
40
|
+
expect(Osaka::Keynote).to receive(:new).and_return(mock_keynote, mock2_keynote, mock3_keynote)
|
41
|
+
expect(mock_keynote).to receive(:activate)
|
42
|
+
expect(mock_keynote).to receive(:raise_error_on_open_standard_windows)
|
43
|
+
expect(mock_keynote).to receive(:open).with("one_file.key")
|
44
|
+
expect(mock_keynote).to receive(:light_table_view)
|
45
|
+
expect(mock_keynote).to receive(:save_as).with("result.key")
|
46
|
+
expect(mock_keynote).to receive(:select_all_slides).exactly(2).times
|
47
|
+
expect(mock_keynote).to receive(:paste).exactly(2).times
|
26
48
|
|
27
|
-
|
28
|
-
mock2_keynote.
|
29
|
-
mock2_keynote.
|
30
|
-
mock2_keynote.
|
31
|
-
mock2_keynote.should_receive(:close)
|
49
|
+
expect(mock2_keynote).to receive(:open).with("two_file.key")
|
50
|
+
expect(mock2_keynote).to receive(:select_all_slides)
|
51
|
+
expect(mock2_keynote).to receive(:copy)
|
52
|
+
expect(mock2_keynote).to receive(:close)
|
32
53
|
|
33
|
-
mock3_keynote.
|
34
|
-
mock3_keynote.
|
35
|
-
mock3_keynote.
|
36
|
-
mock3_keynote.
|
54
|
+
expect(mock3_keynote).to receive(:open).with("three_file.key")
|
55
|
+
expect(mock3_keynote).to receive(:select_all_slides)
|
56
|
+
expect(mock3_keynote).to receive(:copy)
|
57
|
+
expect(mock3_keynote).to receive(:close)
|
37
58
|
|
38
|
-
|
59
|
+
should_shutdown
|
39
60
|
CommonFlows.keynote_combine_files("result.key", ["one_file.key", "two_file.key", "three_file.key"])
|
40
61
|
end
|
41
62
|
|
42
63
|
it "Should be able to combine multiple files from one directory sorted" do
|
43
64
|
files_in_dir = [".", "..", "one.key", "05_file.key", "02key.wrong", "another", "01hey.key", "last"]
|
44
65
|
files_matching = ["./05_file.key", "./01hey.key", "./one.key"]
|
45
|
-
Dir.
|
46
|
-
CommonFlows.
|
66
|
+
expect(Dir).to receive(:new).with(".").and_return(files_in_dir)
|
67
|
+
expect(CommonFlows).to receive(:keynote_combine_files).with("results.key", files_matching.sort)
|
47
68
|
CommonFlows.keynote_combine_files_from_directory_sorted("results.key")
|
48
69
|
end
|
49
70
|
|
50
71
|
it "Should be able to combine multiple files from one directory sorted with pattern" do
|
51
72
|
files_in_dir = [".", "..", "05_file.key", "02key.wrong", "another", "01hey.key", "last"]
|
52
73
|
files_in_dir_to_be_used = ["dirname/01hey.key", "dirname/05_file.key"]
|
53
|
-
mocked_dir =
|
54
|
-
Dir.
|
55
|
-
mocked_dir.
|
56
|
-
CommonFlows.
|
74
|
+
mocked_dir = double("Directory with keynote files")
|
75
|
+
expect(Dir).to receive(:new).with("dirname").and_return(mocked_dir)
|
76
|
+
expect(mocked_dir).to receive(:entries).and_return(files_in_dir)
|
77
|
+
expect(CommonFlows).to receive(:keynote_combine_files).with("results.key", files_in_dir_to_be_used)
|
57
78
|
CommonFlows.keynote_combine_files_from_directory_sorted("results.key", "dirname", /^\d+.*\.key$/)
|
58
79
|
end
|
59
80
|
|
60
|
-
end
|
81
|
+
end
|
data/spec/keynote_spec.rb
CHANGED
@@ -6,28 +6,38 @@ describe "Osaka::Keynote" do
|
|
6
6
|
include(*Osaka::OsakaExpectations)
|
7
7
|
|
8
8
|
subject { Osaka::Keynote.new }
|
9
|
-
let(:control) {subject.control =
|
9
|
+
let(:control) {subject.control = double("RemoteControl")}
|
10
10
|
|
11
11
|
it "Should create the correct keynote print dialog" do
|
12
|
-
subject.create_print_dialog("window").
|
12
|
+
expect(subject.create_print_dialog("window")).to be_instance_of Osaka::KeynotePrintDialog
|
13
13
|
end
|
14
14
|
|
15
|
-
it "Should be possible to select all the slides
|
16
|
-
|
17
|
-
|
18
|
-
expect_click(slides_button_location)
|
19
|
-
subject.should_receive(:select_all)
|
15
|
+
it "Should be possible to select all the slides by switching to light table view" do
|
16
|
+
expect(subject).to receive(:light_table_view)
|
17
|
+
expect(subject).to receive(:select_all)
|
20
18
|
subject.select_all_slides
|
21
19
|
end
|
22
|
-
|
23
|
-
it "Should
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
expect_click(alternative_slides_button_location)
|
28
|
-
subject.should_receive(:select_all)
|
20
|
+
|
21
|
+
it "Should click light table view when the dialog is there" do
|
22
|
+
expect(subject.control).to receive(:exists?).and_return(true)
|
23
|
+
expect(subject.control).to receive(:click)
|
24
|
+
expect(subject).to receive(:select_all)
|
29
25
|
subject.select_all_slides
|
30
26
|
end
|
31
27
|
|
28
|
+
it "Should not click the dialog when it is not there" do
|
29
|
+
expect(subject.control).to receive(:exists?).and_return(false)
|
30
|
+
expect(subject.control).to receive(:click).exactly(0).times
|
31
|
+
expect(subject).to receive(:select_all)
|
32
|
+
subject.select_all_slides
|
33
|
+
end
|
34
|
+
|
35
|
+
it "Should ask for and click the light table view menu" do
|
36
|
+
light_table_view_selection = at.menu_item("Light Table").menu(1).menu_bar_item("View").menu_bar(1)
|
37
|
+
expect_exists?(light_table_view_selection).and_return(true)
|
38
|
+
expect_click(light_table_view_selection)
|
39
|
+
expect(subject).to receive(:select_all)
|
40
|
+
subject.select_all_slides
|
41
|
+
end
|
32
42
|
|
33
43
|
end
|