robust_excel_ole 1.1.4 → 1.1.5

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.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog +13 -0
  3. data/README.rdoc +107 -73
  4. data/{README_excel.rdoc → docs/README_excel.rdoc} +2 -0
  5. data/{README_open.rdoc → docs/README_open.rdoc} +12 -16
  6. data/{README_ranges.rdoc → docs/README_ranges.rdoc} +1 -1
  7. data/{README_save_close.rdoc → docs/README_save_close.rdoc} +0 -0
  8. data/{README_sheet.rdoc → docs/README_sheet.rdoc} +0 -0
  9. data/examples/open_save_close/example_control_to_excel.rb +3 -3
  10. data/examples/open_save_close/example_default_excel.rb +2 -2
  11. data/examples/open_save_close/example_force_excel.rb +2 -2
  12. data/examples/open_save_close/example_if_obstructed_closeifsaved.rb +2 -2
  13. data/examples/open_save_close/example_if_obstructed_forget.rb +2 -2
  14. data/examples/open_save_close/example_if_obstructed_save.rb +2 -2
  15. data/examples/open_save_close/example_if_unsaved_accept.rb +3 -3
  16. data/examples/open_save_close/example_if_unsaved_forget.rb +7 -3
  17. data/examples/open_save_close/example_if_unsaved_forget_more.rb +1 -1
  18. data/examples/open_save_close/example_read_only.rb +2 -2
  19. data/examples/open_save_close/example_rename_cells.rb +2 -2
  20. data/examples/open_save_close/example_reuse.rb +2 -2
  21. data/examples/open_save_close/example_simple.rb +1 -1
  22. data/examples/open_save_close/example_unobtrusively.rb +2 -2
  23. data/lib/robust_excel_ole/book.rb +75 -76
  24. data/lib/robust_excel_ole/bookstore.rb +9 -9
  25. data/lib/robust_excel_ole/excel.rb +5 -5
  26. data/lib/robust_excel_ole/general.rb +11 -4
  27. data/lib/robust_excel_ole/reo_common.rb +3 -0
  28. data/lib/robust_excel_ole/version.rb +1 -1
  29. data/robust_excel_ole.gemspec +2 -2
  30. data/spec/book_spec.rb +67 -63
  31. data/spec/book_specs/book_close_spec.rb +12 -10
  32. data/spec/book_specs/book_misc_spec.rb +279 -279
  33. data/spec/book_specs/book_open_spec.rb +258 -105
  34. data/spec/book_specs/book_save_spec.rb +28 -28
  35. data/spec/book_specs/book_unobtr_spec.rb +862 -164
  36. data/spec/bookstore_spec.rb +22 -22
  37. data/spec/data/another_workbook.xls +0 -0
  38. data/spec/data/different_workbook.xls +0 -0
  39. data/spec/data/workbook.xls +0 -0
  40. data/spec/excel_spec.rb +256 -254
  41. data/spec/general_spec.rb +7 -7
  42. data/spec/ruby1.8.6_rspec2.14/book_spec.rb +1421 -0
  43. data/spec/ruby1.8.6_rspec2.14/book_specs/book_all_spec.rb +22 -0
  44. data/spec/ruby1.8.6_rspec2.14/book_specs/book_close_spec.rb +252 -0
  45. data/spec/ruby1.8.6_rspec2.14/book_specs/book_misc_spec.rb +1070 -0
  46. data/spec/ruby1.8.6_rspec2.14/book_specs/book_open_spec.rb +1855 -0
  47. data/spec/ruby1.8.6_rspec2.14/book_specs/book_save_spec.rb +514 -0
  48. data/spec/ruby1.8.6_rspec2.14/book_specs/book_sheet_spec.rb +395 -0
  49. data/spec/ruby1.8.6_rspec2.14/book_specs/book_subclass_spec.rb +51 -0
  50. data/spec/ruby1.8.6_rspec2.14/book_specs/book_unobtr_spec.rb +1737 -0
  51. data/spec/ruby1.8.6_rspec2.14/bookstore_spec.rb +495 -0
  52. data/spec/ruby1.8.6_rspec2.14/cell_spec.rb +76 -0
  53. data/spec/ruby1.8.6_rspec2.14/cygwin_spec.rb +42 -0
  54. data/spec/ruby1.8.6_rspec2.14/excel_spec.rb +1820 -0
  55. data/spec/ruby1.8.6_rspec2.14/general_spec.rb +212 -0
  56. data/spec/ruby1.8.6_rspec2.14/range_spec.rb +131 -0
  57. data/spec/ruby1.8.6_rspec2.14/reo_common_spec.rb +130 -0
  58. data/spec/ruby1.8.6_rspec2.14/sheet_spec.rb +663 -0
  59. data/spec/ruby1.8.6_rspec2.14/spec_helper.rb +35 -0
  60. data/spec/sheet_spec.rb +2 -2
  61. metadata +28 -12
  62. data/README_detail.rdoc +0 -852
  63. data/README_development.rdoc +0 -5
data/spec/general_spec.rb CHANGED
@@ -64,7 +64,7 @@ module RobustExcelOle
64
64
 
65
65
  it "should do methods for book" do
66
66
  ((@ole_workbook_methods + @book_methods) - @book1.methods).should be_empty
67
- (Object.instance_methods.select{|m| m =~ /^(?!\_)/} - @book1.methods).should be_empty
67
+ # (Object.instance_methods.select{|m| m =~ /^(?!\_)/} - @book1.methods).should be_empty
68
68
  end
69
69
 
70
70
  it "should do own_methods with popular ole_workbook and workbook methods" do
@@ -73,12 +73,12 @@ module RobustExcelOle
73
73
  end
74
74
 
75
75
  it "should respond to popular workbook methods" do
76
- @book_methods.each{|m| @book1.respond_to?(m).should be_true}
76
+ @book_methods.each{|m| @book1.respond_to?(m).should be true}
77
77
  end
78
78
 
79
79
  it "should do methods for excel" do
80
80
  ((@ole_excel_methods + @excel_methods) - @book1.excel.methods).should be_empty
81
- (Object.instance_methods.select{|m| m =~ /^(?!\_)/} - @book1.excel.methods).sort.should be_empty
81
+ #(Object.instance_methods.select{|m| m =~ /^(?!\_)/} - @book1.excel.methods).sort.should be_empty
82
82
  end
83
83
 
84
84
  it "should do own_methods with popular ole_excel and excel methods" do
@@ -87,21 +87,21 @@ module RobustExcelOle
87
87
  end
88
88
 
89
89
  it "should respond to popular excel methods" do
90
- @excel_methods.each{|m| @book1.excel.respond_to?(m).should be_true}
90
+ @excel_methods.each{|m| @book1.excel.respond_to?(m).should be true}
91
91
  end
92
92
 
93
93
  it "should do methods for sheet" do
94
- ((@ole_sheet_methods + @sheet_methods) - @book1.sheet(1).methods).should be_empty
94
+ # ((@ole_sheet_methods + @sheet_methods) - @book1.sheet(1).methods).should be_empty
95
95
  (Object.instance_methods.select{|m| m =~ /^(?!\_)/} - @book1.sheet(1).methods).sort.should be_empty
96
96
  end
97
97
 
98
98
  it "should do own_methods with popular ole_excel and excel methods" do
99
- ((@ole_sheet_methods + @sheet_methods) - @book1.sheet(1).own_methods).should == [] #be_empty
99
+ # ((@ole_sheet_methods + @sheet_methods) - @book1.sheet(1).own_methods).should == [] #be_empty
100
100
  (Object.instance_methods - @book1.sheet(1).own_methods).should == Object.instance_methods
101
101
  end
102
102
 
103
103
  it "should respond to popular sheet methods" do
104
- @sheet_methods.each{|m| @book1.sheet(1).respond_to?(m).should be_true}
104
+ @sheet_methods.each{|m| @book1.sheet(1).respond_to?(m).should be true}
105
105
  end
106
106
 
107
107
  end
@@ -0,0 +1,1421 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require File.join(File.dirname(__FILE__), './spec_helper')
4
+
5
+ $VERBOSE = nil
6
+
7
+ include General
8
+
9
+ module RobustExcelOle
10
+
11
+ describe Book do
12
+
13
+ before(:all) do
14
+ excel = Excel.new(:reuse => true)
15
+ open_books = excel == nil ? 0 : excel.Workbooks.Count
16
+ puts "*** open books *** : #{open_books}" if open_books > 0
17
+ Excel.kill_all
18
+ end
19
+
20
+ before do
21
+ @dir = create_tmpdir
22
+ @simple_file = @dir + '/workbook.xls'
23
+ @simple_save_file = @dir + '/workbook_save.xls'
24
+ @different_file = @dir + '/different_workbook.xls'
25
+ @simple_file_other_path = @dir + '/more_data/workbook.xls'
26
+ @another_simple_file = @dir + '/another_workbook.xls'
27
+ @linked_file = @dir + '/workbook_linked.xlsm'
28
+ @simple_file_xlsm = @dir + '/workbook.xls'
29
+ @simple_file_xlsx = @dir + '/workbook.xlsx'
30
+ @simple_file1 = @simple_file
31
+ @simple_file_other_path1 = @simple_file_other_path
32
+ @simple_save_file1 = @simple_save_file
33
+ end
34
+
35
+ after do
36
+ Excel.kill_all
37
+ #rm_tmp(@dir)
38
+ end
39
+
40
+ describe "create file" do
41
+ context "with standard" do
42
+ it "open an existing file" do
43
+ expect {
44
+ @book = Book.open(@simple_file)
45
+ }.to_not raise_error
46
+ @book.should be_a Book
47
+ @book.close
48
+ end
49
+ end
50
+ end
51
+
52
+ describe "Book::save" do
53
+
54
+ it "should save a file, if it is open" do
55
+ @book = Book.open(@simple_file)
56
+ @book.add_sheet(@sheet, :as => 'a_name')
57
+ @new_sheet_count = @book.ole_workbook.Worksheets.Count
58
+ expect {
59
+ Book.save(@simple_file)
60
+ }.to_not raise_error
61
+ @book.ole_workbook.Worksheets.Count.should == @new_sheet_count
62
+ @book.close
63
+ end
64
+
65
+ it "should not save a file, if it is not open" do
66
+ @book = Book.open(@simple_file)
67
+ @book.add_sheet(@sheet, :as => 'a_name')
68
+ @new_sheet_count = @book.ole_workbook.Worksheets.Count
69
+ @book.close(:if_unsaved => :forget)
70
+ expect {
71
+ Book.save(@simple_file)
72
+ }.to_not raise_error
73
+ end
74
+
75
+ end
76
+
77
+ describe "Book::save_as" do
78
+
79
+ it "should save to 'simple_save_file.xls'" do
80
+ book = Book.open(@simple_file1)
81
+ Book.save_as(@simple_file1, @simple_save_file1, :if_exists => :overwrite)
82
+ File.exist?(@simple_save_file1).should be_true
83
+ end
84
+ end
85
+
86
+ describe "Book::close" do
87
+
88
+ it "should close the book if it is open" do
89
+ book = Book.open(@simple_file1)
90
+ Book.close(@simple_file1)
91
+ book.should_not be_alive
92
+ end
93
+
94
+ it "should not close the book if it is not open" do
95
+ book = Book.open(@simple_file1, :visible => true)
96
+ book.close
97
+ Book.close(@simple_file1)
98
+ book.should_not be_alive
99
+ end
100
+
101
+ it "should raise error if the book is unsaved and open" do
102
+ book = Book.open(@simple_file1)
103
+ sheet = book.sheet(1)
104
+ book.add_sheet(sheet, :as => 'a_name')
105
+ expect{
106
+ Book.close(@simple_file1)
107
+ }.to raise_error(WorkbookNotSaved, /workbook is unsaved: "workbook.xls"/)
108
+ expect{
109
+ Book.close(@simple_file, :if_unsaved => :raise)
110
+ }.to raise_error(WorkbookNotSaved, /workbook is unsaved: "workbook.xls"/)
111
+ end
112
+
113
+ it "should save and close the book" do
114
+ book = Book.open(@simple_file1)
115
+ sheet_count = book.ole_workbook.Worksheets.Count
116
+ sheet = book.sheet(1)
117
+ book.add_sheet(sheet, :as => 'a_name')
118
+ ole_workbook = book.ole_workbook
119
+ excel = book.excel
120
+ excel.Workbooks.Count.should == 1
121
+ Book.close(@simple_file1, {:if_unsaved => :save})
122
+ excel.Workbooks.Count.should == 0
123
+ book.ole_workbook.should == nil
124
+ book.should_not be_alive
125
+ expect{ole_workbook.Name}.to raise_error(WIN32OLERuntimeError)
126
+ new_book = Book.open(@simple_file1)
127
+ begin
128
+ new_book.ole_workbook.Worksheets.Count.should == sheet_count + 1
129
+ ensure
130
+ new_book.close
131
+ end
132
+ end
133
+ end
134
+
135
+ describe "open" do
136
+
137
+ context "with various file formats" do
138
+
139
+ it "should open linked workbook" do
140
+ book = Book.open(@linked_file, :visible => true)
141
+ book.close
142
+ end
143
+ end
144
+
145
+
146
+ context "with class identifier 'Workbook'" do
147
+
148
+ before do
149
+ @book = Workbook.open(@simple_file)
150
+ end
151
+
152
+ after do
153
+ @book.close rescue nil
154
+ end
155
+
156
+ it "should open in a new Excel" do
157
+ book2 = Workbook.open(@simple_file, :force => {:excel => :new})
158
+ book2.should be_alive
159
+ book2.should be_a Book
160
+ book2.excel.should_not == @book.excel
161
+ book2.should_not == @book
162
+ @book.Readonly.should be_false
163
+ book2.Readonly.should be_true
164
+ book2.close
165
+ end
166
+ end
167
+
168
+ context "lift a workbook to a Book object" do
169
+
170
+ before do
171
+ @book = Book.open(@simple_file)
172
+ end
173
+
174
+ after do
175
+ @book.close
176
+ end
177
+
178
+ it "should yield an identical Book and set visible and displayalerts values" do
179
+ workbook = @book.ole_workbook
180
+ new_book = Book.new(workbook, :visible => true)
181
+ new_book.excel.displayalerts = true
182
+ new_book.should be_a Book
183
+ new_book.should be_alive
184
+ new_book.should == @book
185
+ new_book.filename.should == @book.filename
186
+ new_book.excel.should == @book.excel
187
+ new_book.should === @book
188
+ new_book.excel.Visible.should be_true
189
+ new_book.excel.DisplayAlerts.should be_true
190
+ new_book.close
191
+ end
192
+
193
+ end
194
+
195
+
196
+ context "with standard options" do
197
+ before do
198
+ @book = Book.open(@simple_file)
199
+ end
200
+
201
+ after do
202
+ @book.close
203
+ end
204
+
205
+ it "should say that it lives" do
206
+ @book.should be_alive
207
+ end
208
+ end
209
+
210
+ context "with identity transperence" do
211
+
212
+ before do
213
+ @book = Book.open(@simple_file)
214
+ end
215
+
216
+ after do
217
+ @book.close
218
+ end
219
+
220
+ it "should yield identical Book objects for identical Excel books when reopening" do
221
+ @book.should be_alive
222
+ @book.close
223
+ @book.should_not be_alive
224
+ book2 = Book.open(@simple_file)
225
+ book2.should === @book
226
+ book2.should be_alive
227
+ book2.close
228
+ end
229
+
230
+ it "should yield different Book objects when reopening in a new Excel" do
231
+ @book.should be_alive
232
+ old_excel = @book.excel
233
+ @book.close
234
+ @book.should_not be_alive
235
+ book2 = Book.open(@simple_file, :force => {:excel => :new})
236
+ book2.should_not === @book
237
+ book2.should be_alive
238
+ book2.excel.should_not == old_excel
239
+ book2.close
240
+ end
241
+ end
242
+
243
+ context "with :force_excel" do
244
+
245
+ before do
246
+ @book = Book.open(@simple_file)
247
+ end
248
+
249
+ after do
250
+ @book.close rescue nil
251
+ end
252
+
253
+ it "should open in a new Excel" do
254
+ book2 = Book.open(@simple_file, :force => {:excel => :new})
255
+ book2.should be_alive
256
+ book2.should be_a Book
257
+ book2.excel.should_not == @book.excel
258
+ book2.should_not == @book
259
+ @book.Readonly.should be_false
260
+ book2.Readonly.should be_true
261
+ book2.close
262
+ end
263
+
264
+ it "should open in a given Excel, provide identity transparency, because book can be readonly, such that the old and the new book are readonly" do
265
+ book2 = Book.open(@simple_file1, :force => {:excel => :new})
266
+ book2.excel.should_not == @book.excel
267
+ book3 = Book.open(@simple_file1, :force => {:excel => :new})
268
+ book3.excel.should_not == book2.excel
269
+ book3.excel.should_not == @book.excel
270
+ book2.close
271
+ book3.close
272
+ @book.close
273
+ book4 = Book.open(@simple_file1, :force => {:excel => book2.excel}, :read_only => true)
274
+ book4.should be_alive
275
+ book4.should be_a Book
276
+ book4.excel.should == book2.excel
277
+ book4.ReadOnly.should be_true
278
+ book4.should == book2
279
+ book4.close
280
+ book5 = Book.open(@simple_file1, :force => {:excel => book2}, :read_only => true)
281
+ book5.should be_alive
282
+ book5.should be_a Book
283
+ book5.excel.should == book2.excel
284
+ book5.ReadOnly.should be_true
285
+ book5.should == book2
286
+ book5.close
287
+ book3.close
288
+ end
289
+ end
290
+
291
+ context "with :default_excel" do
292
+
293
+ before do
294
+ excel = Excel.new(:reuse => false)
295
+ @book = Book.open(@simple_file)
296
+ end
297
+
298
+ after do
299
+ @book.close rescue nil
300
+ end
301
+
302
+ it "should reopen the book in the excel instance where it was opened before" do
303
+ excel = Excel.new(:reuse => false)
304
+ @book.close
305
+ book2 = Book.open(@simple_file)
306
+ book2.should be_alive
307
+ book2.should be_a Book
308
+ book2.excel.should == @book.excel
309
+ book2.excel.should_not == excel
310
+ book2.filename.should == @book.filename
311
+ @book.should be_alive
312
+ book2.should == @book
313
+ book2.close
314
+ end
315
+
316
+ it "should open a new excel, if the book cannot be reopened" do
317
+ @book.close
318
+ new_excel = Excel.new(:reuse => false)
319
+ book2 = Book.open(@different_file, :default => {:excel => :new})
320
+ book2.should be_alive
321
+ book2.should be_a Book
322
+ book2.excel.should_not == new_excel
323
+ book2.excel.should_not == @book.excel
324
+ book2.close
325
+ end
326
+
327
+ it "should open in a given Excel provided as Excel, Book, or WIN32OLE representing an Excel or Workbook" do
328
+ book2 = Book.open(@another_simple_file)
329
+ different_file1 = @different_file
330
+ book3 = Book.open(different_file1, :default => {:excel => book2.excel})
331
+ book3.excel.should === book2.excel
332
+ book3.close
333
+ book4 = Book.open(different_file1, :default => {:excel => book2})
334
+ book4.excel.should === book2.excel
335
+ book4.close
336
+ book5 = Book.open(different_file1, :default_excel => book2.ole_workbook)
337
+ book5.excel.should === book2.excel
338
+ book5.close
339
+ win32ole_excel1 = WIN32OLE.connect(book2.ole_workbook.Fullname).Application
340
+ book6 = Book.open(different_file1, :default => {:excel => win32ole_excel1})
341
+ book6.excel.should === book2.excel
342
+ book6.close
343
+ end
344
+
345
+
346
+ end
347
+
348
+ context "with :if_unsaved" do
349
+
350
+ before do
351
+ @book = Book.open(@simple_file)
352
+ @sheet = @book.sheet(1)
353
+ @book.add_sheet(@sheet, :as => 'a_name')
354
+ end
355
+
356
+ after do
357
+ @book.close(:if_unsaved => :forget)
358
+ @new_book.close rescue nil
359
+ end
360
+
361
+ it "should raise an error, if :if_unsaved is :raise" do
362
+ expect {
363
+ @new_book = Book.open(@simple_file, :if_unsaved => :raise)
364
+ }.to raise_error(WorkbookNotSaved, /workbook is already open but not saved: "workbook.xls"/)
365
+ end
366
+
367
+ it "should let the book open, if :if_unsaved is :accept" do
368
+ expect {
369
+ @new_book = Book.open(@simple_file, :if_unsaved => :accept)
370
+ }.to_not raise_error
371
+ @book.should be_alive
372
+ @new_book.should be_alive
373
+ @new_book.should == @book
374
+ end
375
+
376
+ context "with :if_unsaved => :alert or :if_unsaved => :excel" do
377
+ before do
378
+ @key_sender = IO.popen 'ruby "' + File.join(File.dirname(__FILE__), '/helpers/key_sender.rb') + '" "Microsoft Office Excel" ' , "w"
379
+ end
380
+
381
+ after do
382
+ @key_sender.close
383
+ end
384
+
385
+ it "should open the new book and close the unsaved book, if user answers 'yes'" do
386
+ # "Yes" is the default. --> language independent
387
+ @key_sender.puts "{enter}"
388
+ @new_book = Book.open(@simple_file1, :if_unsaved => :alert)
389
+ @new_book.should be_alive
390
+ @new_book.filename.downcase.should == @simple_file1.downcase
391
+ @book.should_not be_alive
392
+ end
393
+
394
+ it "should not open the new book and not close the unsaved book, if user answers 'no'" do
395
+ # "No" is right to "Yes" (the default). --> language independent
396
+ # strangely, in the "no" case, the question will sometimes be repeated three times
397
+ #@book.excel.Visible = true
398
+ @key_sender.puts "{right}{enter}"
399
+ @key_sender.puts "{right}{enter}"
400
+ @key_sender.puts "{right}{enter}"
401
+ #expect{
402
+ # Book.open(@simple_file, :if_unsaved => :alert)
403
+ # }.to raise_error(ExcelREOError, /user canceled or runtime error/)
404
+ @book.should be_alive
405
+ end
406
+
407
+ it "should open the new book and close the unsaved book, if user answers 'yes'" do
408
+ # "Yes" is the default. --> language independent
409
+ @key_sender.puts "{enter}"
410
+ @new_book = Book.open(@simple_file1, :if_unsaved => :excel)
411
+ @new_book.should be_alive
412
+ @new_book.filename.downcase.should == @simple_file1.downcase
413
+ #@book.should_not be_alive
414
+ end
415
+
416
+ it "should not open the new book and not close the unsaved book, if user answers 'no'" do
417
+ # "No" is right to "Yes" (the default). --> language independent
418
+ # strangely, in the "no" case, the question will sometimes be repeated three times
419
+ #@book.excel.Visible = true
420
+ @key_sender.puts "{right}{enter}"
421
+ @key_sender.puts "{right}{enter}"
422
+ @key_sender.puts "{right}{enter}"
423
+ #expect{
424
+ # Book.open(@simple_file, :if_unsaved => :excel)
425
+ # }.to raise_error(ExcelREOError, /user canceled or runtime error/)
426
+ @book.should be_alive
427
+ end
428
+
429
+ end
430
+ end
431
+
432
+ context "with :if_obstructed" do
433
+
434
+ for i in 1..2 do
435
+
436
+ context "with and without reopen" do
437
+
438
+ before do
439
+ if i == 1 then
440
+ book_before = Book.open(@simple_file)
441
+ book_before.close
442
+ end
443
+ @book = Book.open(@simple_file_other_path1)
444
+ @sheet_count = @book.ole_workbook.Worksheets.Count
445
+ @sheet = @book.sheet(1)
446
+ @book.add_sheet(@sheet, :as => 'a_name')
447
+ end
448
+
449
+ after do
450
+ @book.close(:if_unsaved => :forget)
451
+ @new_book.close rescue nil
452
+ end
453
+
454
+ it "should save the old book, close it, and open the new book, if :if_obstructed is :save" do
455
+ @new_book = Book.open(@simple_file1, :if_obstructed => :save)
456
+ @book.should_not be_alive
457
+ @new_book.should be_alive
458
+ @new_book.filename.downcase.should == @simple_file1.downcase
459
+ old_book = Book.open(@simple_file_other_path1, :if_obstructed => :forget)
460
+ old_book.ole_workbook.Worksheets.Count.should == @sheet_count + 1
461
+ old_book.close
462
+ end
463
+
464
+ it "should raise an error, if the old book is unsaved, and close the old book and open the new book,
465
+ if :if_obstructed is :close_if_saved" do
466
+ expect{
467
+ @new_book = Book.open(@simple_file1, :if_obstructed => :close_if_saved)
468
+ }.to raise_error(WorkbookBlocked, /workbook with the same name in a different path is unsaved/)
469
+ @book.save
470
+ @new_book = Book.open(@simple_file1, :if_obstructed => :close_if_saved)
471
+ @book.should_not be_alive
472
+ @new_book.should be_alive
473
+ @new_book.filename.downcase.should == @simple_file1.downcase
474
+ old_book = Book.open(@simple_file_other_path1, :if_obstructed => :forget)
475
+ old_book.ole_workbook.Worksheets.Count.should == @sheet_count + 1
476
+ old_book.close
477
+ end
478
+ end
479
+ end
480
+ end
481
+
482
+ context "with non-existing file" do
483
+
484
+ it "should create a workbook" do
485
+ File.delete @simple_save_file rescue nil
486
+ book = Book.open(@simple_save_file, :if_absent => :create)
487
+ book.should be_a Book
488
+ book.close
489
+ File.exist?(@simple_save_file).should be_true
490
+ end
491
+
492
+ it "should raise an exception by default" do
493
+ File.delete @simple_save_file rescue nil
494
+ expect {
495
+ Book.open(@simple_save_file)
496
+ }.to raise_error(FileNotFound, "file #{General::absolute_path(@simple_save_file).gsub("/","\\").inspect} not found")
497
+ end
498
+ end
499
+
500
+ context "with :read_only" do
501
+
502
+ it "should reopen the book with writable (unsaved changes from readonly will not be saved)" do
503
+ book = Book.open(@simple_file1, :read_only => true)
504
+ book.ReadOnly.should be_true
505
+ book.should be_alive
506
+ sheet = book.sheet(1)
507
+ old_cell_value = sheet[1,1].value
508
+ sheet[1,1] = sheet[1,1].value == "foo" ? "bar" : "foo"
509
+ book.Saved.should be_false
510
+ new_book = Book.open(@simple_file1, :read_only => false, :if_unsaved => :accept)
511
+ new_book.ReadOnly.should be_false
512
+ new_book.should be_alive
513
+ book.should be_alive
514
+ new_book.should == book
515
+ new_sheet = new_book.sheet(1)
516
+ new_cell_value = new_sheet[1,1].value
517
+ new_cell_value.should == old_cell_value
518
+ end
519
+
520
+ context "with block" do
521
+ it 'block parameter should be instance of Book' do
522
+ Book.open(@simple_file) do |book|
523
+ book.should be_a Book
524
+ end
525
+ end
526
+ end
527
+ end
528
+
529
+ describe "reopen" do
530
+
531
+ context "with standard" do
532
+
533
+ before do
534
+ @book = Book.open(@simple_file)
535
+ end
536
+
537
+ after do
538
+ @book.close
539
+ end
540
+
541
+ it "should reopen the closed book" do
542
+ @book.should be_alive
543
+ book1 = @book
544
+ @book.close
545
+ @book.should_not be_alive
546
+ @book.reopen
547
+ @book.should be_a Book
548
+ @book.should be_alive
549
+ @book.should === book1
550
+ end
551
+ end
552
+ end
553
+
554
+ describe "uplifting" do
555
+
556
+ context "with standard" do
557
+
558
+ before do
559
+ @book = Book.open(@simple_file)
560
+ end
561
+
562
+ after do
563
+ @book.close
564
+ end
565
+
566
+ it "should uplift a workbook to a book with an open book" do
567
+ workbook = @book.ole_workbook
568
+ book1 = Book.new(workbook)
569
+ book1.should be_a Book
570
+ book1.should be_alive
571
+ book1.should == @book
572
+ end
573
+ end
574
+ end
575
+
576
+ describe "visible" do
577
+
578
+ it "should preserve :visible if they are not set" do
579
+ excel1 = Excel.create(:visible => true)
580
+ book1 = Book.open(@simple_file)
581
+ book1.excel.Visible.should be_true
582
+ book1.close
583
+ end
584
+
585
+ it "should preserve :visible if they are not set" do
586
+ excel1 = Excel.create
587
+ book1 = Book.open(@simple_file, :visible => true)
588
+ book1.excel.Visible.should be_true
589
+ end
590
+
591
+ it "should preserve :visible if they are not set" do
592
+ excel1 = Excel.create(:visible => true)
593
+ book1 = Book.open(@different_file, :default => {:excel => :new})
594
+ book1.excel.Visible.should be_false
595
+ end
596
+
597
+ it "should preserve :visible if they are not set" do
598
+ excel1 = Excel.create(:visible => true)
599
+ excel2 = Excel.create(:visible => true)
600
+ book1 = Book.open(@different_file, :force => {:excel => excel2})
601
+ book1.excel.Visible.should be_true
602
+ book1.close
603
+ end
604
+
605
+ it "should let an open Book open" do
606
+ @book = Book.open(@simple_file, :visible => true)
607
+ Book.unobtrusively(@simple_file) do |book|
608
+ book.should be_a Book
609
+ book.should be_alive
610
+ book.excel.should == @book.excel
611
+ book.excel.Visible.should be_true
612
+ end
613
+ @book.should be_alive
614
+ @book.should be_a Book
615
+ @book.excel.Visible.should be_true
616
+ @book.close(:if_unsaved => :forget)
617
+ @book2.close(:if_unsaved => :forget) rescue nil
618
+ end
619
+ end
620
+
621
+
622
+ describe "unobtrusively" do
623
+
624
+ def unobtrusively_ok? # :nodoc: #
625
+ Book.unobtrusively(@simple_file) do |book|
626
+ book.should be_a Book
627
+ sheet = book.sheet(1)
628
+ sheet[1,1] = sheet[1,1].value == "foo" ? "bar" : "foo"
629
+ book.should be_alive
630
+ book.Saved.should be_false
631
+ end
632
+ end
633
+
634
+ context "with no open book" do
635
+
636
+ it "should open unobtrusively in a new Excel" do
637
+ expect{ unobtrusively_ok? }.to_not raise_error
638
+ end
639
+ end
640
+
641
+ context "with two running excel instances" do
642
+ before :all do
643
+ Excel.close_all
644
+ end
645
+
646
+ before do
647
+ @excel1 = Excel.new(:reuse => false)
648
+ @excel2 = Excel.new(:reuse => false)
649
+ end
650
+
651
+ after do
652
+ #Excel.close_all
653
+ begin
654
+ @excel1.close
655
+ @excel2.close
656
+ rescue ExcelREOError => msg
657
+ # puts "ExcelREOError: #{msg.message}" if msg.message =~ /Excel instance not alive or damaged/
658
+ end
659
+ end
660
+
661
+ it "should open unobtrusively in a new Excel" do
662
+ Book.unobtrusively(@simple_file, :if_closed => :current) do |book|
663
+ book.should be_a Book
664
+ book.should be_alive
665
+ book.excel.should == @excel1
666
+ book.excel.should_not == @excel2
667
+ end
668
+ end
669
+
670
+ it "should open unobtrusively in a given Excel" do
671
+ Book.unobtrusively(@simple_file, :if_closed => @excel2) do |book|
672
+ book.should be_a Book
673
+ book.should be_alive
674
+ book.excel.should_not == @excel1
675
+ book.excel.should == @excel2
676
+ end
677
+ end
678
+ end
679
+
680
+ context "with an open book" do
681
+
682
+ before do
683
+ @book = Book.open(@simple_file1)
684
+ end
685
+
686
+ after do
687
+ @book.close(:if_unsaved => :forget)
688
+ @book2.close(:if_unsaved => :forget) rescue nil
689
+ end
690
+
691
+ it "should let an open Book open if two books have been opened and one has been closed and opened again" do
692
+ book2 = Book.open(@different_file, :force => {:excel => :new})
693
+ @book.close
694
+ book2.close
695
+ @book.reopen
696
+ Book.unobtrusively(@simple_file1) do |book|
697
+ book.should be_a Book
698
+ book.should be_alive
699
+ book.excel.should == @book.excel
700
+ end
701
+ @book.should be_alive
702
+ @book.should be_a Book
703
+ end
704
+
705
+ it "should let a saved book saved" do
706
+ @book.Saved.should be_true
707
+ @book.should be_alive
708
+ sheet = @book.sheet(1)
709
+ old_cell_value = sheet[1,1].value
710
+ unobtrusively_ok?
711
+ @book.Saved.should be_true
712
+ @book.should be_alive
713
+ sheet = @book.sheet(1)
714
+ sheet[1,1].value.should_not == old_cell_value
715
+ end
716
+
717
+ it "should let the unsaved book unsaved" do
718
+ sheet = @book.sheet(1)
719
+ sheet[1,1] = sheet[1,1].value == "foo" ? "bar" : "foo"
720
+ old_cell_value = sheet[1,1].value
721
+ @book.Saved.should be_false
722
+ unobtrusively_ok?
723
+ @book.should be_alive
724
+ @book.Saved.should be_false
725
+ @book.close(:if_unsaved => :forget)
726
+ @book2 = Book.open(@simple_file1)
727
+ sheet2 = @book2.sheet(1)
728
+ sheet2[1,1].value.should_not == old_cell_value
729
+ end
730
+ end
731
+
732
+ context "with a closed book" do
733
+
734
+ before do
735
+ @book = Book.open(@simple_file1)
736
+ end
737
+
738
+ after do
739
+ @book.close(:if_unsaved => :forget)
740
+ end
741
+
742
+ it "should let the closed book closed by default" do
743
+ sheet = @book.sheet(1)
744
+ old_cell_value = sheet[1,1].value
745
+ @book.close
746
+ @book.should_not be_alive
747
+ unobtrusively_ok?
748
+ @book.should_not be_alive
749
+ book2 = Book.open(@simple_file1)
750
+ sheet = book2.sheet(1)
751
+ sheet[1,1].Value.should_not == old_cell_value
752
+ end
753
+
754
+ # The bold reanimation of the @book
755
+ it "should use the excel of the book and keep open the book" do
756
+ excel = Excel.new(:reuse => false)
757
+ sheet = @book.sheet(1)
758
+ old_cell_value = sheet[1,1].value
759
+ @book.close
760
+ @book.should_not be_alive
761
+ Book.unobtrusively(@simple_file1, :keep_open => true) do |book|
762
+ book.should be_a Book
763
+ book.excel.should == @book.excel
764
+ book.excel.should_not == excel
765
+ sheet = book.sheet(1)
766
+ cell = sheet[1,1]
767
+ sheet[1,1] = cell.value == "foo" ? "bar" : "foo"
768
+ book.Saved.should be_false
769
+ end
770
+ @book.should be_alive
771
+ @book.close
772
+ new_book = Book.open(@simple_file1)
773
+ sheet = new_book.sheet(1)
774
+ sheet[1,1].value.should_not == old_cell_value
775
+ end
776
+
777
+ it "should use the excel of the book and keep open the book" do
778
+ excel = Excel.new(:reuse => false)
779
+ sheet = @book.sheet(1)
780
+ old_cell_value = sheet[1,1].value
781
+ @book.close
782
+ @book.should_not be_alive
783
+ Book.unobtrusively(@simple_file1, :if_closed => :current) do |book|
784
+ book.should be_a Book
785
+ book.should be_alive
786
+ book.excel.should == @book.excel
787
+ book.excel.should_not == excel
788
+ sheet = book.sheet(1)
789
+ cell = sheet[1,1]
790
+ sheet[1,1] = cell.value == "foo" ? "bar" : "foo"
791
+ book.Saved.should be_false
792
+ end
793
+ @book.should_not be_alive
794
+ new_book = Book.open(@simple_file1)
795
+ sheet = new_book.sheet(1)
796
+ sheet[1,1].value.should_not == old_cell_value
797
+ end
798
+ end
799
+
800
+
801
+ context "with a read_only book" do
802
+
803
+ before do
804
+ @book = Book.open(@simple_file1, :read_only => true)
805
+ end
806
+
807
+ after do
808
+ @book.close
809
+ end
810
+
811
+ it "should open unobtrusively the book in a new Excel such that the book is writable" do
812
+ book2 = Book.open(@simple_file1, :force => {:excel => :new}, :read_only => true)
813
+ @book.ReadOnly.should be_true
814
+ book2.Readonly.should be_true
815
+ sheet = @book.sheet(1)
816
+ cell_value = sheet[1,1].value
817
+ Book.unobtrusively(@simple_file1, :rw_change_excel => :new, :if_closed => :current, :writable => true) do |book|
818
+ book.should be_a Book
819
+ book.excel.should_not == book2.excel
820
+ book.excel.should_not == @book.excel
821
+ sheet = book.sheet(1)
822
+ sheet[1,1] = sheet[1,1].value == "foo" ? "bar" : "foo"
823
+ book.should be_alive
824
+ book.Saved.should be_false
825
+ end
826
+ @book.Saved.should be_true
827
+ @book.ReadOnly.should be_true
828
+ @book.close
829
+ book2.close
830
+ book3 = Book.open(@simple_file1)
831
+ new_sheet = book3.sheet(1)
832
+ new_sheet[1,1].value.should_not == cell_value
833
+ book3.close
834
+ end
835
+ end
836
+
837
+ context "with a virgin Book class" do
838
+ before do
839
+ class Book # :nodoc: #
840
+ @@bookstore = nil
841
+ end
842
+ end
843
+ it "should work" do
844
+ expect{ unobtrusively_ok? }.to_not raise_error
845
+ end
846
+ end
847
+
848
+ context "with a book never opened before" do
849
+ before do
850
+ class Book # :nodoc: #
851
+ @@bookstore = nil
852
+ end
853
+ other_book = Book.open(@different_file)
854
+ end
855
+ it "should open the book" do
856
+ expect{ unobtrusively_ok? }.to_not raise_error
857
+ end
858
+ end
859
+
860
+ context "with block result" do
861
+ before do
862
+ @book1 = Book.open(@simple_file)
863
+ end
864
+
865
+ after do
866
+ @book1.close(:if_unsaved => :forget)
867
+ end
868
+
869
+ it "should yield the block result true" do
870
+ result =
871
+ Book.unobtrusively(@simple_file) do |book|
872
+ @book1.Saved.should be_true
873
+ end
874
+ result.should == true
875
+ end
876
+ end
877
+
878
+ context "with several Excel instances" do
879
+
880
+ before do
881
+ @book1 = Book.open(@simple_file1)
882
+ @book2 = Book.open(@simple_file1, :force => {:excel => :new})
883
+ @book1.Readonly.should == false
884
+ @book2.Readonly.should == true
885
+ old_sheet = @book1.sheet(1)
886
+ @old_cell_value = old_sheet[1,1].value
887
+ @book1.close
888
+ @book2.close
889
+ @book1.should_not be_alive
890
+ @book2.should_not be_alive
891
+ end
892
+
893
+ it "should open unobtrusively the closed book in the most recent Excel where it was open before" do
894
+ Book.unobtrusively(@simple_file) do |book|
895
+ book.excel.should_not == @book2.excel
896
+ book.excel.should == @book1.excel
897
+ book.ReadOnly.should == false
898
+ sheet = book.sheet(1)
899
+ cell = sheet[1,1]
900
+ sheet[1,1] = cell.value == "foo" ? "bar" : "foo"
901
+ book.Saved.should be_false
902
+ end
903
+ new_book = Book.open(@simple_file1)
904
+ sheet = new_book.sheet(1)
905
+ sheet[1,1].value.should_not == @old_cell_value
906
+ end
907
+
908
+ it "should open unobtrusively the closed book in the new hidden Excel" do
909
+ Book.unobtrusively(@simple_file, :if_closed => :current) do |book|
910
+ book.excel.should_not == @book2.excel
911
+ book.excel.should == @book1.excel
912
+ book.ReadOnly.should == false
913
+ sheet = book.sheet(1)
914
+ cell = sheet[1,1]
915
+ sheet[1,1] = cell.value == "foo" ? "bar" : "foo"
916
+ book.Saved.should be_false
917
+ end
918
+ new_book = Book.open(@simple_file1)
919
+ sheet = new_book.sheet(1)
920
+ sheet[1,1].Value.should_not == @old_cell_value
921
+ end
922
+ end
923
+ end
924
+
925
+ =begin
926
+ context "with :hidden" do
927
+
928
+ before do
929
+ @book1 = Book.open(@simple_file1)
930
+ @book1.close
931
+ end
932
+
933
+ it "should create a new hidden Excel instance and use this afterwards" do
934
+ hidden_excel = nil
935
+ Book.unobtrusively(@simple_file1, :hidden) do |book|
936
+ book.should be_a Book
937
+ book.should be_alive
938
+ book.excel.Visible.should be_false
939
+ book.excel.DisplayAlerts.should be_false
940
+ hidden_excel = book.excel
941
+ end
942
+ Book.unobtrusively(@different_file, :hidden) do |book|
943
+ book.should be_a Book
944
+ book.should be_alive
945
+ book.excel.Visible.should be_false
946
+ book.excel.DisplayAlerts.should be_false
947
+ book.excel.should == hidden_excel
948
+ end
949
+ end
950
+ end
951
+ end
952
+ =end
953
+
954
+ describe "for_reading, for_modifying" do
955
+
956
+ context "open unobtrusively for reading and modifying" do
957
+
958
+ before do
959
+ @book = Book.open(@simple_file1)
960
+ sheet = @book.sheet(1)
961
+ @old_cell_value = sheet[1,1].value
962
+ @book.close
963
+ end
964
+
965
+ it "should not change the value" do
966
+ Book.for_reading(@simple_file) do |book|
967
+ book.should be_a Book
968
+ book.should be_alive
969
+ book.Saved.should be_true
970
+ sheet = book.sheet(1)
971
+ cell = sheet[1,1]
972
+ sheet[1,1] = cell.value == "foo" ? "bar" : "foo"
973
+ book.Saved.should be_false
974
+ book.excel.should == @book.excel
975
+ end
976
+ new_book = Book.open(@simple_file1, :visible => true)
977
+ sheet = new_book.sheet(1)
978
+ sheet[1,1].Value.should == @old_cell_value
979
+ end
980
+
981
+
982
+ it "should not change the value and use the hidden Excel instance" do
983
+ new_excel = Excel.new(:reuse => false)
984
+ Book.for_reading(@simple_file1, :if_closed => :new) do |book|
985
+ sheet = book.sheet(1)
986
+ cell = sheet[1,1]
987
+ sheet[1,1] = cell.value == "foo" ? "bar" : "foo"
988
+ book.excel.should_not == @book.excel
989
+ book.excel.should_not == new_excel
990
+ book.excel.visible.should be_false
991
+ book.excel.displayalerts.should == :if_visible
992
+ end
993
+ new_book = Book.open(@simple_file1, :visible => true)
994
+ sheet = new_book.sheet(1)
995
+ sheet[1,1].Value.should == @old_cell_value
996
+ end
997
+
998
+ it "should change the value" do
999
+ Book.for_modifying(@simple_file1) do |book|
1000
+ sheet = book.sheet(1)
1001
+ cell = sheet[1,1]
1002
+ sheet[1,1] = cell.value == "foo" ? "bar" : "foo"
1003
+ book.excel.should == @book.excel
1004
+ end
1005
+ new_book = Book.open(@simple_file1, :visible => true)
1006
+ sheet = new_book.sheet(1)
1007
+ sheet[1,1].Value.should_not == @old_cell_value
1008
+ end
1009
+ end
1010
+ end
1011
+
1012
+ describe "send methods to workbook" do
1013
+
1014
+ context "with standard" do
1015
+ before do
1016
+ @book = Book.open(@simple_file)
1017
+ end
1018
+
1019
+ after do
1020
+ @book.close
1021
+ end
1022
+
1023
+ it "should send Saved to workbook" do
1024
+ @book.Saved.should be_true
1025
+ end
1026
+ end
1027
+ end
1028
+
1029
+ describe "nameval, set_nameval, [], []=" do
1030
+
1031
+ before do
1032
+ @book1 = Book.open(@another_simple_file)
1033
+ end
1034
+
1035
+ after do
1036
+ @book1.close(:if_unsaved => :forget)
1037
+ end
1038
+
1039
+ it "should return value of a range" do
1040
+ @book1.nameval("new").should == "foo"
1041
+ @book1.nameval("one").should == 1
1042
+ @book1.nameval("firstrow").should == [[1,2]]
1043
+ @book1.nameval("four").should == [[1,2],[3,4]]
1044
+ @book1.nameval("firstrow").should_not == "12"
1045
+ @book1.nameval("firstcell").should == "foo"
1046
+ end
1047
+
1048
+ it "should return value of a range via []" do
1049
+ @book1["new"].should == "foo"
1050
+ @book1["one"].should == 1
1051
+ @book1["firstrow"] == [[1,2]]
1052
+ @book1["four"].should == [[1,2],[3,4]]
1053
+ @book1["firstrow"].should_not == "12"
1054
+ @book1["firstcell"].should == "foo"
1055
+ end
1056
+
1057
+ it "should set value of a range" do
1058
+ @book1.set_nameval("new", "bar")
1059
+ @book1.nameval("new").should == "bar"
1060
+ end
1061
+
1062
+ it "should set value of a range via []=" do
1063
+ @book1["new"] = "bar"
1064
+ @book1.nameval("new").should == "bar"
1065
+ end
1066
+
1067
+ #it "should evaluate a formula" do
1068
+ # @book1.nameval("named_formula").should == 4
1069
+ #end
1070
+
1071
+ #it "should evaluate a formula via []" do
1072
+ # @book1["named_formula"].should == 4
1073
+ #end
1074
+
1075
+ #it "should return default value if name not defined" do
1076
+ # @book1.nameval("foo", :default => 2).should == 2
1077
+ #end
1078
+
1079
+ end
1080
+
1081
+ describe "close" do
1082
+
1083
+ context "with unsaved read_only book" do
1084
+ before do
1085
+ @book = Book.open(@simple_file, :read_only => true)
1086
+ @sheet_count = @book.ole_workbook.Worksheets.Count
1087
+ @book.add_sheet(@sheet, :as => 'a_name')
1088
+ end
1089
+
1090
+ it "should close the unsaved book without error and without saving" do
1091
+ expect{
1092
+ @book.close
1093
+ }.to_not raise_error
1094
+ new_book = Book.open(@simple_file)
1095
+ new_book.ole_workbook.Worksheets.Count.should == @sheet_count
1096
+ new_book.close
1097
+ end
1098
+ end
1099
+
1100
+ context "with unsaved book" do
1101
+ before do
1102
+ @book = Book.open(@simple_file)
1103
+ @sheet_count = @book.ole_workbook.Worksheets.Count
1104
+ @book.add_sheet(@sheet, :as => 'a_name')
1105
+ @sheet = @book.sheet(1)
1106
+ end
1107
+
1108
+ after do
1109
+ @book.close(:if_unsaved => :forget) rescue nil
1110
+ end
1111
+
1112
+ it "should raise error by default" do
1113
+ expect{
1114
+ @book.close(:if_unsaved => :raise)
1115
+ }.to raise_error(WorkbookNotSaved, /workbook is unsaved: "workbook.xls"/)
1116
+ end
1117
+
1118
+ it "should save the book before close with option :save" do
1119
+ ole_workbook = @book.ole_workbook
1120
+ excel = @book.excel
1121
+ excel.Workbooks.Count.should == 1
1122
+ @book.close(:if_unsaved => :save)
1123
+ excel.Workbooks.Count.should == 0
1124
+ @book.ole_workbook.should == nil
1125
+ @book.should_not be_alive
1126
+ expect{
1127
+ ole_workbook.Name}.to raise_error(WIN32OLERuntimeError)
1128
+ new_book = Book.open(@simple_file)
1129
+ begin
1130
+ new_book.ole_workbook.Worksheets.Count.should == @sheet_count + 1
1131
+ ensure
1132
+ new_book.close
1133
+ end
1134
+ end
1135
+ end
1136
+ end
1137
+
1138
+ describe "save" do
1139
+
1140
+ context "with simple save" do
1141
+
1142
+ it "should save for a file opened without :read_only" do
1143
+ @book = Book.open(@simple_file)
1144
+ @book.add_sheet(@sheet, :as => 'a_name')
1145
+ @new_sheet_count = @book.ole_workbook.Worksheets.Count
1146
+ expect {
1147
+ @book.save
1148
+ }.to_not raise_error
1149
+ @book.ole_workbook.Worksheets.Count.should == @new_sheet_count
1150
+ @book.close
1151
+ end
1152
+ end
1153
+
1154
+ context "with argument" do
1155
+ before do
1156
+ Book.open(@simple_file) do |book|
1157
+ book.save_as(@simple_save_file, :if_exists => :overwrite)
1158
+ end
1159
+ end
1160
+
1161
+ it "should save to 'simple_save_file.xlsx'" do
1162
+ File.exist?(@simple_save_file).should be_true
1163
+ end
1164
+ end
1165
+ end
1166
+
1167
+ describe "alive?, filename, ==, focus, saved" do
1168
+
1169
+ context "with alive?" do
1170
+
1171
+ before do
1172
+ @book = Book.open(@simple_file)
1173
+ end
1174
+
1175
+ after do
1176
+ @book.close
1177
+ end
1178
+
1179
+ it "should return true, if book is alive" do
1180
+ @book.should be_alive
1181
+ end
1182
+
1183
+ it "should return false, if book is dead" do
1184
+ @book.close
1185
+ @book.should_not be_alive
1186
+ end
1187
+
1188
+ end
1189
+
1190
+ context "with filename" do
1191
+
1192
+ before do
1193
+ @book = Book.open(@simple_file)
1194
+ end
1195
+
1196
+ after do
1197
+ @book.close
1198
+ end
1199
+
1200
+ it "should return full file name" do
1201
+ @book.filename.should == @simple_file
1202
+ end
1203
+
1204
+ end
1205
+
1206
+ context "with ==" do
1207
+
1208
+ before do
1209
+ @book = Book.open(@simple_file)
1210
+ end
1211
+
1212
+ after do
1213
+ @book.close
1214
+ @new_book.close rescue nil
1215
+ end
1216
+
1217
+ it "should be true with two identical books" do
1218
+ @new_book = Book.open(@simple_file)
1219
+ @new_book.should == @book
1220
+ end
1221
+ end
1222
+
1223
+ context "with focus" do
1224
+
1225
+ before do
1226
+ @key_sender = IO.popen 'ruby "' + File.join(File.dirname(__FILE__), '/helpers/key_sender.rb') + '" "Microsoft Office Excel" ' , "w"
1227
+ @book = Book.open(@simple_file, :visible => true)
1228
+ @book2 = Book.open(@another_simple_file, :visible => true)
1229
+ end
1230
+
1231
+ after do
1232
+ @book.close(:if_unsaved => :forget)
1233
+ @book2.close(:if_unsaved => :forget)
1234
+ @key_sender.close
1235
+ end
1236
+
1237
+ it "should bring a book to focus" do
1238
+ sheet = @book.sheet(2)
1239
+ sheet.Activate
1240
+ sheet[2,3].Activate
1241
+ sheet2 = @book2.sheet(2)
1242
+ sheet2.Activate
1243
+ sheet2[3,2].Activate
1244
+ @book2.focus
1245
+ @key_sender.puts "{a}{enter}"
1246
+ sleep 0.2
1247
+ sheet2[3,2].Value.should == "a"
1248
+ @book.focus
1249
+ @book.Windows(1).Visible.should be_true
1250
+ @book.Windows(@book.Name).Visible.should be_true
1251
+ @key_sender.puts "{a}{enter}"
1252
+ sleep 0.2
1253
+ sheet[2,3].Value.should == "a"
1254
+ Excel.current.should == @book.excel
1255
+ end
1256
+ end
1257
+ end
1258
+
1259
+ describe "#add_sheet" do
1260
+ before do
1261
+ @book = Book.open(@simple_file)
1262
+ @sheet = @book.sheet(1)
1263
+ end
1264
+
1265
+ after do
1266
+ @book.close(:if_unsaved => :forget)
1267
+ end
1268
+
1269
+ context "only first argument" do
1270
+ it "should add worksheet" do
1271
+ @book.ole_workbook.Worksheets.Count.should == 3
1272
+ @book.add_sheet @sheet
1273
+ @book.ole_workbook.Worksheets.Count.should == 4
1274
+ #expect { @book.add_sheet @sheet }.to change{ @book.workbook.Worksheets.Count }.from(3).to(4)
1275
+ end
1276
+
1277
+ it "should return copyed sheet" do
1278
+ sheet = @book.add_sheet @sheet
1279
+ copyed_sheet = @book.ole_workbook.Worksheets.Item(@book.ole_workbook.Worksheets.Count)
1280
+ sheet.name.should eq copyed_sheet.name
1281
+ end
1282
+ end
1283
+
1284
+ context "with first argument" do
1285
+
1286
+ context "with second argument is {:before => @book.sheet(3), :after => @sheet}" do
1287
+ it "should arguments in the first is given priority" do
1288
+ @book.add_sheet(@sheet, :before => @book.sheet(3), :after => @sheet)
1289
+ @book.Worksheets.Count.should == 4
1290
+ end
1291
+ end
1292
+ end
1293
+
1294
+ context "without first argument" do
1295
+ context "second argument is {:as => 'new sheet'}" do
1296
+ it "should return new sheet" do
1297
+ @book.add_sheet(:as => 'new sheet').name.should eq 'new sheet'
1298
+ end
1299
+ end
1300
+
1301
+ context "second argument is {:before => @sheet}" do
1302
+ it "should add the first sheet" do
1303
+ @book.add_sheet(:before => @sheet).name.should eq @book.sheet(1).name
1304
+ end
1305
+ end
1306
+
1307
+ context "second argument is {:after => @sheet}" do
1308
+ it "should add the second sheet" do
1309
+ @book.add_sheet(:after => @sheet).name.should eq @book.sheet(2).name
1310
+ end
1311
+ end
1312
+ end
1313
+
1314
+ context "without argument" do
1315
+
1316
+ it "should return copyed sheet" do
1317
+ sheet = @book.add_sheet
1318
+ copyed_sheet = @book.ole_workbook.Worksheets.Item(@book.ole_workbook.Worksheets.Count)
1319
+ sheet.name.should eq copyed_sheet.name
1320
+ end
1321
+ end
1322
+ end
1323
+
1324
+ describe 'access sheet' do
1325
+ before do
1326
+ @book = Book.open(@simple_file)
1327
+ end
1328
+
1329
+ after do
1330
+ @book.close
1331
+ end
1332
+
1333
+ context "standard" do
1334
+
1335
+ it 'with sheet name' do
1336
+ @book.sheet('Sheet1').should be_kind_of Sheet
1337
+ end
1338
+
1339
+ it 'with integer' do
1340
+ @book.sheet(1).should be_kind_of Sheet
1341
+ end
1342
+
1343
+ it 'with block' do
1344
+ @book.each do |sheet|
1345
+ sheet.should be_kind_of Sheet
1346
+ end
1347
+ end
1348
+
1349
+ it 'with each_with_index' do
1350
+ @book.each_with_index do |sheet,i|
1351
+ sheet.should be_kind_of Sheet
1352
+ end
1353
+ end
1354
+ end
1355
+
1356
+ describe "with retain_saved" do
1357
+
1358
+ before do
1359
+ @book = Book.open(@simple_file)
1360
+ end
1361
+
1362
+ after do
1363
+ @book.close(:if_unsaved => :forget)
1364
+ end
1365
+
1366
+ it "should keep the save state 'unsaved'" do
1367
+ sheet = @book.sheet(1)
1368
+ sheet[1,1] = sheet[1,1].value == "foo" ? "bar" : "foo"
1369
+ @book.Saved.should be_false
1370
+ @book.retain_saved do
1371
+ sheet = @book.sheet(1)
1372
+ a = sheet[1,1]
1373
+ b = @book.visible
1374
+ end
1375
+ @book.Saved.should be_false
1376
+ end
1377
+
1378
+ it "should keep the save state 'unsaved' even when the workbook was saved before" do
1379
+ sheet = @book.sheet(1)
1380
+ sheet[1,1] = sheet[1,1].value == "foo" ? "bar" : "foo"
1381
+ @book.Saved.should be_false
1382
+ @book.retain_saved do
1383
+ @book.save
1384
+ @book.Saved.should be_true
1385
+ end
1386
+ @book.Saved.should be_false
1387
+ end
1388
+ end
1389
+
1390
+ =begin
1391
+ context "with test what happens with save-status when setting calculation status" do
1392
+
1393
+ it "should keep the save status" do
1394
+ book1 = Book.open(@simple_file, :visible => true)
1395
+ book1.Saved.should be_true
1396
+ book2 = Book.open(@another_simple_file, :visible => true)
1397
+ book1.Saved.should be_true
1398
+ book2.Saved.should be_true
1399
+ sheet2 = book2.sheet(1)
1400
+ sheet2[1,1] = sheet2[1,1].value == "foo" ? "bar" : "foo"
1401
+ book1.Saved.should be_true
1402
+ book2.Saved.should be_false
1403
+ book3 = Book.open(@different_file, :visible => true)
1404
+ book1.Saved.should be_true
1405
+ book2.Saved.should be_false
1406
+ book3.Saved.should be_true
1407
+ end
1408
+ end
1409
+ =end
1410
+
1411
+ context 'open with block' do
1412
+ it {
1413
+ Book.open(@simple_file) do |book|
1414
+ book.sheet('Sheet1').should be_a Sheet
1415
+ end
1416
+ }
1417
+ end
1418
+ end
1419
+ end
1420
+ end
1421
+ end