robust_excel_ole 0.4 → 0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. data/.gitignore +1 -0
  2. data/Changelog +15 -0
  3. data/README.rdoc +128 -63
  4. data/README_detail.rdoc +130 -60
  5. data/examples/edit_sheets/example_access_sheets_and_cells.rb +1 -1
  6. data/examples/edit_sheets/example_adding_sheets.rb +2 -2
  7. data/examples/edit_sheets/example_copying.rb +1 -1
  8. data/examples/edit_sheets/example_expanding.rb +1 -1
  9. data/examples/edit_sheets/example_ranges.rb +1 -1
  10. data/examples/edit_sheets/example_saving.rb +2 -2
  11. data/examples/open_save_close/example_control_to_excel.rb +1 -1
  12. data/examples/open_save_close/example_if_obstructed_closeifsaved.rb +2 -2
  13. data/examples/open_save_close/example_if_obstructed_save.rb +2 -2
  14. data/examples/open_save_close/example_if_unsaved_accept.rb +1 -1
  15. data/examples/open_save_close/example_if_unsaved_forget.rb +2 -2
  16. data/examples/open_save_close/example_if_unsaved_forget_more.rb +3 -3
  17. data/examples/open_save_close/example_read_only.rb +1 -1
  18. data/examples/open_save_close/example_rename_cells.rb +1 -1
  19. data/examples/open_save_close/example_simple.rb +1 -1
  20. data/examples/open_save_close/example_unobtrusively.rb +3 -3
  21. data/lib/robust_excel_ole.rb +1 -0
  22. data/lib/robust_excel_ole/book.rb +249 -193
  23. data/lib/robust_excel_ole/bookstore.rb +1 -1
  24. data/lib/robust_excel_ole/cell.rb +1 -1
  25. data/lib/robust_excel_ole/excel.rb +125 -4
  26. data/lib/robust_excel_ole/general.rb +1 -92
  27. data/lib/robust_excel_ole/range.rb +1 -1
  28. data/lib/robust_excel_ole/reo_common.rb +37 -0
  29. data/lib/robust_excel_ole/sheet.rb +77 -24
  30. data/lib/robust_excel_ole/version.rb +1 -1
  31. data/spec/book_spec.rb +112 -82
  32. data/spec/book_specs/book_close_spec.rb +44 -1
  33. data/spec/book_specs/book_misc_spec.rb +97 -92
  34. data/spec/book_specs/book_open_spec.rb +40 -8
  35. data/spec/book_specs/book_save_spec.rb +77 -7
  36. data/spec/book_specs/book_sheet_spec.rb +290 -66
  37. data/spec/book_specs/book_unobtr_spec.rb +99 -73
  38. data/spec/bookstore_spec.rb +1 -1
  39. data/spec/cell_spec.rb +2 -2
  40. data/spec/data/another_workbook.xls +0 -0
  41. data/spec/data/workbook.xls +0 -0
  42. data/spec/excel_spec.rb +174 -23
  43. data/spec/general_spec.rb +3 -18
  44. data/spec/range_spec.rb +3 -3
  45. data/spec/reo_common_spec.rb +104 -0
  46. data/spec/sheet_spec.rb +101 -60
  47. metadata +6 -4
@@ -71,7 +71,7 @@ describe Book do
71
71
  @book = Book.open(@simple_file)
72
72
  @sheet_count = @book.ole_workbook.Worksheets.Count
73
73
  @book.add_sheet(@sheet, :as => 'a_name')
74
- @sheet = @book[0]
74
+ @sheet = @book.sheet(1)
75
75
  end
76
76
 
77
77
  after do
@@ -184,6 +184,49 @@ describe Book do
184
184
  end
185
185
  end
186
186
  end
187
+
188
+ context "with :if_unsaved => :excel" do
189
+ before do
190
+ @key_sender = IO.popen 'ruby "' + File.join(File.dirname(__FILE__), '../helpers/key_sender.rb') + '" "Microsoft Excel" ' , "w"
191
+ end
192
+
193
+ after do
194
+ @key_sender.close
195
+ end
196
+
197
+ possible_answers = [:yes, :no, :cancel]
198
+ possible_answers.each_with_index do |answer, position|
199
+ it "should" + (answer == :yes ? "" : " not") + " the unsaved book and" + (answer == :cancel ? " not" : "") + " close it" + "if user answers '#{answer}'" do
200
+ # "Yes" is the default. "No" is right of "Yes", "Cancel" is right of "No" --> language independent
201
+ @key_sender.puts "{right}" * position + "{enter}"
202
+ ole_workbook = @book.ole_workbook
203
+ excel = @book.excel
204
+ displayalert_value = @book.excel.DisplayAlerts
205
+ if answer == :cancel then
206
+ expect {
207
+ @book.close(:if_unsaved => :excel)
208
+ }.to raise_error(ExcelUserCanceled, "close: canceled by user")
209
+ @book.ole_workbook.Saved.should be_false
210
+ @book.ole_workbook.should_not == nil
211
+ @book.should be_alive
212
+ else
213
+ @book.excel.Workbooks.Count.should == 1
214
+ @book.close(:if_unsaved => :excel)
215
+ @book.excel.Workbooks.Count.should == 0
216
+ @book.ole_workbook.should == nil
217
+ @book.should_not be_alive
218
+ expect{ole_workbook.Name}.to raise_error(WIN32OLERuntimeError)
219
+ end
220
+ new_book = Book.open(@simple_file, :if_unsaved => :forget)
221
+ begin
222
+ new_book.ole_workbook.Worksheets.Count.should == @sheet_count + (answer==:yes ? 1 : 0)
223
+ new_book.excel.DisplayAlerts.should == displayalert_value
224
+ ensure
225
+ new_book.close
226
+ end
227
+ end
228
+ end
229
+ end
187
230
  end
188
231
  end
189
232
  end
@@ -31,7 +31,7 @@ describe Book do
31
31
 
32
32
  after do
33
33
  Excel.kill_all
34
- rm_tmp(@dir)
34
+ #rm_tmp(@dir)
35
35
  end
36
36
 
37
37
  describe "create file" do
@@ -101,113 +101,99 @@ describe Book do
101
101
  end
102
102
  end
103
103
 
104
- describe "nvalue, set_nvalue, rename_range" do
105
-
106
- context "nvalue, book[<name>]" do
107
-
108
- before do
109
- @book1 = Book.open(@another_simple_file)
110
- end
104
+ describe "nameval, set_nameval, [], []=" do
105
+
106
+ before do
107
+ @book1 = Book.open(@another_simple_file)
108
+ end
111
109
 
112
- after do
113
- @book1.close(:if_unsaved => :forget)
114
- end
115
-
116
- it "should return value of a range" do
117
- @book1.nvalue("new").should == "foo"
118
- @book1.nvalue("one").should == 1
119
- @book1.nvalue("firstrow").should == [[1,2]]
120
- @book1.nvalue("four").should == [[1,2],[3,4]]
121
- @book1.nvalue("firstrow").should_not == "12"
122
- @book1.nvalue("firstcell").should == "foo"
123
- @book1["new"].should == "foo"
124
- @book1["one"].should == 1
125
- @book1["firstrow"].should == [[1,2]]
126
- @book1["four"].should == [[1,2],[3,4]]
127
- @book1["firstcell"].should == "foo"
128
- end
129
-
130
- it "should raise an error if name not defined" do
131
- expect {
132
- @book1.nvalue("foo")
133
- }.to raise_error(ExcelError, /name "foo" not in "another_workbook.xls"/)
134
- expect {
135
- @book1["foo"]
136
- }.to raise_error(ExcelError, /name "foo" not in "another_workbook.xls"/)
137
- end
110
+ after do
111
+ @book1.close(:if_unsaved => :forget)
112
+ end
113
+
114
+ it "should return value of a range" do
115
+ @book1.nameval("new").should == "foo"
116
+ @book1.nameval("one").should == 1
117
+ @book1.nameval("firstrow").should == [[1,2]]
118
+ @book1.nameval("four").should == [[1,2],[3,4]]
119
+ @book1.nameval("firstrow").should_not == "12"
120
+ @book1.nameval("firstcell").should == "foo"
121
+ end
138
122
 
139
- it "should evaluate a formula" do
140
- @book1.nvalue("named_formula").should == 4
141
- @book1["named_formula"].should == 4
142
- end
123
+ it "should return value of a range via []" do
124
+ @book1["new"].should == "foo"
125
+ @book1["one"].should == 1
126
+ @book1["firstrow"] == [[1,2]]
127
+ @book1["four"].should == [[1,2],[3,4]]
128
+ @book1["firstrow"].should_not == "12"
129
+ @book1["firstcell"].should == "foo"
130
+ end
143
131
 
144
- it "should return default value if name not defined" do
145
- @book1.nvalue("foo", :default => 2).should == 2
146
- end
132
+ it "should set value of a range" do
133
+ @book1.set_nameval("new", "bar")
134
+ @book1.nameval("new").should == "bar"
147
135
  end
148
136
 
149
- context "set_nvalue, book[<name>]=" do
150
-
151
- before do
152
- @book1 = Book.open(@another_simple_file)
153
- end
137
+ it "should set value of a range via []=" do
138
+ @book1["new"] = "bar"
139
+ @book1.nameval("new").should == "bar"
140
+ end
154
141
 
155
- after do
156
- @book1.close(:if_unsaved => :forget)
157
- end
142
+ it "should evaluate a formula" do
143
+ @book1.nameval("named_formula").should == 4
144
+ end
158
145
 
159
- it "should set value of a range" do
160
- @book1.nvalue("new").should == "foo"
161
- @book1.set_nvalue("new","bar")
162
- @book1.nvalue("new").should == "bar"
163
- end
146
+ it "should evaluate a formula via []" do
147
+ @book1["named_formula"].should == 4
148
+ end
164
149
 
165
- it "should raise an error if name not defined" do
166
- expect {
167
- @book1.set_nvalue("foo","bar")
168
- }.to raise_error(ExcelError, /name "foo" not in "another_workbook.xls"/)
169
- expect {
170
- @book1["foo"] = "bar"
171
- }.to raise_error(ExcelError, /name "foo" not in "another_workbook.xls"/)
172
- end
173
150
 
174
- it "should raise an error if name was defined but contents is calcuated" do
175
- expect {
176
- @book1.set_nvalue("named_formula","bar")
177
- }.to raise_error(ExcelError, /RefersToRange error of name "named_formula" in "another_workbook.xls"/)
178
- expect {
179
- @book1["named_formula"] = "bar"
180
- }.to raise_error(ExcelError, /RefersToRange error of name "named_formula" in "another_workbook.xls"/)
181
- end
151
+ it "should return default value if name not defined" do
152
+ @book1.nameval("foo", :default => 2).should == 2
153
+ end
182
154
 
183
- it "should set value of a range" do
184
- @book1.nvalue("new").should == "foo"
185
- @book1["new"] = "bar"
186
- @book1.nvalue("new").should == "bar"
187
- end
155
+ it "should raise an error if name not defined" do
156
+ expect {
157
+ @book1.nameval("foo")
158
+ }.to raise_error(ExcelError, /name "foo" not in "another_workbook.xls"/)
159
+ expect {
160
+ @book1.set_nameval("foo","bar")
161
+ }.to raise_error(ExcelError, /name "foo" not in "another_workbook.xls"/)
162
+ expect {
163
+ @book1["foo"] = "bar"
164
+ }.to raise_error(ExcelError, /name "foo" not in "another_workbook.xls"/)
165
+ end
166
+
167
+ it "should raise an error if name was defined but contents is calcuated" do
168
+ expect {
169
+ @book1.set_nameval("named_formula","bar")
170
+ }.to raise_error(ExcelError, /cannot assign value to range named "named_formula" in "another_workbook.xls"/)
171
+ expect {
172
+ @book1["named_formula"] = "bar"
173
+ }.to raise_error(ExcelError, /cannot assign value to range named "named_formula" in "another_workbook.xls"/)
188
174
  end
175
+ end
189
176
 
190
- context "rename_range" do
177
+ describe "rename_range" do
191
178
 
192
- before do
193
- @book1 = Book.open(@another_simple_file)
194
- end
179
+ before do
180
+ @book1 = Book.open(@another_simple_file)
181
+ end
195
182
 
196
- after do
197
- @book1.close(:if_unsaved => :forget)
198
- end
183
+ after do
184
+ @book1.close(:if_unsaved => :forget)
185
+ end
199
186
 
200
- it "should rename a range" do
187
+ it "should rename a range" do
188
+ @book1.rename_range("four","five")
189
+ @book1.nameval("five").should == [[1,2],[3,4]]
190
+ expect {
201
191
  @book1.rename_range("four","five")
202
- @book1.nvalue("five").should == [[1,2],[3,4]]
203
- expect {
204
- @book1.rename_range("four","five")
205
- }.to raise_error(ExcelError, /name "four" not in "another_workbook.xls"/)
206
- end
192
+ }.to raise_error(ExcelError, /name "four" not in "another_workbook.xls"/)
207
193
  end
208
194
  end
209
195
 
210
- describe "alive?, filename, ==, visible, displayalerts, activate, saved" do
196
+ describe "alive?, filename, ==, visible, displayalerts, activate, saved, check_compatibility" do
211
197
 
212
198
  context "with alive?" do
213
199
 
@@ -304,7 +290,7 @@ describe Book do
304
290
  end
305
291
 
306
292
  it "should yield false for an unsaved book" do
307
- sheet = @book[0]
293
+ sheet = @book.sheet(1)
308
294
  sheet[1,1] = sheet[1,1].value == "foo" ? "bar" : "foo"
309
295
  @book.saved.should be_false
310
296
  end
@@ -352,10 +338,10 @@ describe Book do
352
338
  end
353
339
 
354
340
  it "should activate a book" do
355
- sheet = @book[1]
341
+ sheet = @book.sheet(2)
356
342
  sheet.Activate
357
343
  sheet[2,3].Activate
358
- sheet2 = @book2[2]
344
+ sheet2 = @book2.sheet(2)
359
345
  sheet2.Activate
360
346
  sheet2[3,2].Activate
361
347
  Excel.current.should == @book.excel
@@ -371,5 +357,24 @@ describe Book do
371
357
  Excel.current.should == @book.excel
372
358
  end
373
359
  end
360
+
361
+ context "with compatibility" do
362
+
363
+ it "should open and check compatibility" do
364
+ book = Book.open(@simple_file, :visible => true, :check_compatibility => false)
365
+ book.CheckCompatibility.should be_false
366
+ book.CheckCompatibility = true
367
+ book.CheckCompatibility.should be_true
368
+ Book.unobtrusively(@simple_file, :visible => true, :check_compatibility => false) do |book|
369
+ book.CheckCompatibility.should be_false
370
+ end
371
+ Book.unobtrusively(@simple_file, :visible => true, :check_compatibility => true) do |book|
372
+ book.CheckCompatibility.should be_true
373
+ end
374
+
375
+ end
376
+
377
+ end
378
+
374
379
  end
375
380
  end
@@ -474,7 +474,7 @@ describe Book do
474
474
 
475
475
  before do
476
476
  @book = Book.open(@simple_file)
477
- @sheet = @book[0]
477
+ @sheet = @book.sheet(1)
478
478
  @book.add_sheet(@sheet, :as => 'a_name')
479
479
  end
480
480
 
@@ -537,6 +537,38 @@ describe Book do
537
537
  end
538
538
  end
539
539
 
540
+ context "with :if_unsaved => :excel" do
541
+ before do
542
+ @key_sender = IO.popen 'ruby "' + File.join(File.dirname(__FILE__), '../helpers/key_sender.rb') + '" "Microsoft Office Excel" ' , "w"
543
+ end
544
+
545
+ after do
546
+ @key_sender.close
547
+ end
548
+
549
+ it "should open the new book and close the unsaved book, if user answers 'yes'" do
550
+ # "Yes" is the default. --> language independent
551
+ @key_sender.puts "{enter}"
552
+ @new_book = Book.open(@simple_file, :if_unsaved => :excel)
553
+ @new_book.should be_alive
554
+ @new_book.filename.downcase.should == @simple_file.downcase
555
+ @book.should_not be_alive
556
+ end
557
+
558
+ it "should not open the new book and not close the unsaved book, if user answers 'no'" do
559
+ # "No" is right to "Yes" (the default). --> language independent
560
+ # strangely, in the "no" case, the question will sometimes be repeated three times
561
+ #@book.excel.Visible = true
562
+ @key_sender.puts "{right}{enter}"
563
+ @key_sender.puts "{right}{enter}"
564
+ @key_sender.puts "{right}{enter}"
565
+ expect{
566
+ Book.open(@simple_file, :if_unsaved => :excel)
567
+ }.to raise_error(ExcelErrorOpen, "open: user canceled or open error")
568
+ @book.should be_alive
569
+ end
570
+ end
571
+
540
572
  it "should open the book in a new excel instance, if :if_unsaved is :new_excel" do
541
573
  @new_book = Book.open(@simple_file, :if_unsaved => :new_excel)
542
574
  @book.should be_alive
@@ -572,7 +604,7 @@ describe Book do
572
604
  end
573
605
  @book = Book.open(@simple_file_other_path)
574
606
  @sheet_count = @book.ole_workbook.Worksheets.Count
575
- @sheet = @book[0]
607
+ @sheet = @book.sheet(1)
576
608
  @book.add_sheet(@sheet, :as => 'a_name')
577
609
  end
578
610
 
@@ -721,7 +753,7 @@ describe Book do
721
753
  book = Book.open(@simple_file, :read_only => true)
722
754
  book.ReadOnly.should be_true
723
755
  book.should be_alive
724
- sheet = book[0]
756
+ sheet = book.sheet(1)
725
757
  old_cell_value = sheet[1,1].value
726
758
  sheet[1,1] = sheet[1,1].value == "foo" ? "bar" : "foo"
727
759
  book.Saved.should be_false
@@ -730,7 +762,7 @@ describe Book do
730
762
  new_book.should be_alive
731
763
  book.should be_alive
732
764
  new_book.should == book
733
- new_sheet = new_book[0]
765
+ new_sheet = new_book.sheet(1)
734
766
  new_cell_value = new_sheet[1,1].value
735
767
  new_cell_value.should == old_cell_value
736
768
  end
@@ -739,7 +771,7 @@ describe Book do
739
771
  book = Book.open(@simple_file, :read_only => false)
740
772
  book.ReadOnly.should be_false
741
773
  book.should be_alive
742
- sheet = book[0]
774
+ sheet = book.sheet(1)
743
775
  old_cell_value = sheet[1,1].value
744
776
  sheet[1,1] = sheet[1,1].value == "foo" ? "bar" : "foo"
745
777
  book.Saved.should be_false
@@ -753,7 +785,7 @@ describe Book do
753
785
  book = Book.open(@simple_file, :read_only => true)
754
786
  book.ReadOnly.should be_true
755
787
  book.should be_alive
756
- sheet = book[0]
788
+ sheet = book.sheet(1)
757
789
  old_cell_value = sheet[1,1].value
758
790
  sheet[1,1] = sheet[1,1].value == "foo" ? "bar" : "foo"
759
791
  book.Saved.should be_false
@@ -762,7 +794,7 @@ describe Book do
762
794
  new_book.should be_alive
763
795
  book.should be_alive
764
796
  new_book.should == book
765
- new_sheet = new_book[0]
797
+ new_sheet = new_book.sheet(1)
766
798
  new_cell_value = new_sheet[1,1].value
767
799
  new_cell_value.should == old_cell_value
768
800
  end
@@ -771,7 +803,7 @@ describe Book do
771
803
  book = Book.open(@simple_file, :force_excel => :new, :read_only => false)
772
804
  book.ReadOnly.should be_false
773
805
  book.should be_alive
774
- sheet = book[0]
806
+ sheet = book.sheet(1)
775
807
  old_cell_value = sheet[1,1].value
776
808
  sheet[1,1] = sheet[1,1].value == "foo" ? "bar" : "foo"
777
809
  book.Saved.should be_false
@@ -152,7 +152,7 @@ describe Book do
152
152
  File.open(@simple_file_other_path,"w") do | file |
153
153
  file.puts "garbage"
154
154
  end
155
- sheet = @book[0]
155
+ sheet = @book.sheet(1)
156
156
  cell_value = sheet[1,1].value
157
157
  sheet[1,1] = sheet[1,1].value == "foo" ? "bar" : "foo"
158
158
  @book.Saved.should be_false
@@ -164,7 +164,7 @@ describe Book do
164
164
  new_book.should be_a Book
165
165
  new_book.close
166
166
  old_book = Book.open(@simple_file)
167
- old_sheet = old_book[0]
167
+ old_sheet = old_book.sheet(1)
168
168
  old_sheet[1,1].value.should == cell_value
169
169
  old_book.close
170
170
  end
@@ -174,7 +174,7 @@ describe Book do
174
174
  File.open(@simple_file_other_path,"w") do | file |
175
175
  file.puts "garbage"
176
176
  end
177
- sheet = @book[0]
177
+ sheet = @book.sheet(1)
178
178
  cell_value = sheet[1,1].value
179
179
  sheet[1,1] = sheet[1,1].value == "foo" ? "bar" : "foo"
180
180
  @book.Saved.should be_false
@@ -186,7 +186,7 @@ describe Book do
186
186
  new_book.should be_a Book
187
187
  new_book.close
188
188
  old_book = Book.open(@simple_file)
189
- old_sheet = old_book[0]
189
+ old_sheet = old_book.sheet(1)
190
190
  old_sheet[1,1].value.should_not == cell_value
191
191
  old_book.close
192
192
  end
@@ -207,7 +207,7 @@ describe Book do
207
207
  end
208
208
 
209
209
  it "should raise an error if the blocking workbook was unsaved with :if_obstructed => :close_if_saved" do
210
- sheet = @book[0]
210
+ sheet = @book.sheet(1)
211
211
  cell_value = sheet[1,1].value
212
212
  sheet[1,1] = sheet[1,1].value == "foo" ? "bar" : "foo"
213
213
  @book.Saved.should be_false
@@ -295,12 +295,12 @@ describe Book do
295
295
  end
296
296
 
297
297
  it "should simple save if file name is equal to the old one with :if_exists => :overwrite" do
298
- sheet = @book[0]
298
+ sheet = @book.sheet(1)
299
299
  sheet[1,1] = sheet[1,1].value == "foo" ? "bar" : "foo"
300
300
  new_value = sheet[1,1].value
301
301
  @book.save_as(@simple_file, :if_exists => :overwrite)
302
302
  new_book = Book.open(@simple_file)
303
- new_sheet = new_book[0]
303
+ new_sheet = new_book.sheet(1)
304
304
  new_sheet[1,1].value.should == new_value
305
305
  new_book.close
306
306
  end
@@ -390,6 +390,76 @@ describe Book do
390
390
 
391
391
  end
392
392
 
393
+ context "with :if_exists => :excel" do
394
+ before do
395
+ File.delete @simple_save_file rescue nil
396
+ File.open(@simple_save_file,"w") do | file |
397
+ file.puts "garbage"
398
+ end
399
+ @garbage_length = File.size?(@simple_save_file)
400
+ @key_sender = IO.popen 'ruby "' + File.join(File.dirname(__FILE__), '../helpers/key_sender.rb') + '" "Microsoft Excel" ' , "w"
401
+ end
402
+
403
+ after do
404
+ @key_sender.close
405
+ end
406
+
407
+ it "should save if user answers 'yes'" do
408
+ # "Yes" is to the left of "No", which is the default. --> language independent
409
+ @key_sender.puts "{left}{enter}" #, :initial_wait => 0.2, :if_target_missing=>"Excel window not found")
410
+ @book.save_as(@simple_save_file, :if_exists => :excel)
411
+ File.exist?(@simple_save_file).should be_true
412
+ File.size?(@simple_save_file).should > @garbage_length
413
+ @book.excel.DisplayAlerts.should == displayalert_value
414
+ new_book = Book.open(@simple_save_file, :excel => :new)
415
+ new_book.should be_a Book
416
+ new_book.close
417
+ @book.excel.DisplayAlerts.should == displayalert_value
418
+ end
419
+
420
+ it "should not save if user answers 'no'" do
421
+ # Just give the "Enter" key, because "No" is the default. --> language independent
422
+ # strangely, in the "no" case, the question will sometimes be repeated three times
423
+ @key_sender.puts "{enter}"
424
+ @key_sender.puts "{enter}"
425
+ @key_sender.puts "{enter}"
426
+ #@key_sender.puts "%{n}" #, :initial_wait => 0.2, :if_target_missing=>"Excel window not found")
427
+ expect{
428
+ @book.save_as(@simple_save_file, :if_exists => :excel)
429
+ }.to raise_error(ExcelErrorSave, "not saved or canceled by user")
430
+ File.exist?(@simple_save_file).should be_true
431
+ File.size?(@simple_save_file).should == @garbage_length
432
+ @book.excel.DisplayAlerts.should == displayalert_value
433
+ end
434
+
435
+ it "should not save if user answers 'cancel'" do
436
+ # 'Cancel' is right from 'yes'
437
+ # strangely, in the "no" case, the question will sometimes be repeated three times
438
+ @key_sender.puts "{right}{enter}"
439
+ @key_sender.puts "{right}{enter}"
440
+ @key_sender.puts "{right}{enter}"
441
+ #@key_sender.puts "%{n}" #, :initial_wait => 0.2, :if_target_missing=>"Excel window not found")
442
+ expect{
443
+ @book.save_as(@simple_save_file, :if_exists => :excel)
444
+ }.to raise_error(ExcelErrorSave, "not saved or canceled by user")
445
+ File.exist?(@simple_save_file).should be_true
446
+ File.size?(@simple_save_file).should == @garbage_length
447
+ @book.excel.DisplayAlerts.should == displayalert_value
448
+ end
449
+
450
+ it "should report save errors and leave DisplayAlerts unchanged" do
451
+ #@key_sender.puts "{left}{enter}" #, :initial_wait => 0.2, :if_target_missing=>"Excel window not found")
452
+ @book.ole_workbook.Close
453
+ expect{
454
+ @book.save_as(@simple_save_file, :if_exists => :excel)
455
+ }.to raise_error(ExcelErrorSave, "Workbook is not alive")
456
+ File.exist?(@simple_save_file).should be_true
457
+ File.size?(@simple_save_file).should == @garbage_length
458
+ @book.excel.DisplayAlerts.should == displayalert_value
459
+ end
460
+
461
+ end
462
+
393
463
  it "should save to 'simple_save_file.xls' with :if_exists => nil" do
394
464
  dirname, basename = File.split(@simple_save_file)
395
465
  File.delete @simple_save_file rescue nil