diff options
author | suke <suke@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-11-02 13:22:42 +0000 |
---|---|---|
committer | suke <suke@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-11-02 13:22:42 +0000 |
commit | 2d45869c7623b166d02fa07cbb6cf8a39cc81a8b (patch) | |
tree | ae1c58e5dfaf31748df098ba0a6601a1d60f5595 /test/win32ole | |
parent | 510d2a7d2e6030a489409c76fd49273214e2e2c2 (diff) | |
download | ruby-2d45869c7623b166d02fa07cbb6cf8a39cc81a8b.tar.gz |
* ext/win32ole/win32ole.c (ole_event_free): invoke IConnectionPoint::Unadvise
before invoking IConnectionPoint::Release.
* test/win32ole/test_win32ole_event.rb, test/win32ole/err_in_callback.rb,
test/win32ole/test_err_in_callback.rb: Use ActiveX Data Object
Library instead of InternetExplorer.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@20089 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test/win32ole')
-rw-r--r-- | test/win32ole/err_in_callback.rb | 18 | ||||
-rw-r--r-- | test/win32ole/test_err_in_callback.rb | 46 | ||||
-rw-r--r-- | test/win32ole/test_win32ole_event.rb | 569 |
3 files changed, 292 insertions, 341 deletions
diff --git a/test/win32ole/err_in_callback.rb b/test/win32ole/err_in_callback.rb index 6a0b711403..fabb7bef0e 100644 --- a/test/win32ole/err_in_callback.rb +++ b/test/win32ole/err_in_callback.rb @@ -1,15 +1,9 @@ require 'win32ole' -ie = WIN32OLE.new('InternetExplorer.Application') -ie.visible = true -WIN32OLE_EVENT.message_loop -sleep 0.2 -ev = WIN32OLE_EVENT.new(ie) - -ev.on_event('NavigateComplete2') {|*args| +db = WIN32OLE.new('ADODB.Connection') +db.connectionString = "Driver={Microsoft Text Driver (*.txt; *.csv)};DefaultDir=.;" +ev = WIN32OLE_EVENT.new(db) +ev.on_event('WillConnect') {|*args| foo } -ie.navigate(ARGV.shift) -while ie.readystate != 4 - WIN32OLE_EVENT.message_loop - sleep 0.2 -end +db.open +WIN32OLE_EVENT.message_loop diff --git a/test/win32ole/test_err_in_callback.rb b/test/win32ole/test_err_in_callback.rb index c223804ce6..d686aa23df 100644 --- a/test/win32ole/test_err_in_callback.rb +++ b/test/win32ole/test_err_in_callback.rb @@ -21,27 +21,12 @@ if defined?(WIN32OLE) " -I " + e }.join("") @script = File.dirname(__FILE__) + "/err_in_callback.rb" - @param = create_temp_html - @param = "file:///" + @param.gsub(/\\/, '/') end end - def create_temp_html - fso = WIN32OLE.new('Scripting.FileSystemObject') - @dummy_file = fso.GetTempName + ".html" - cfolder = fso.getFolder(".") - @str = "This is test HTML file for Win32OLE (#{Time.now})" - f = cfolder.CreateTextFile(@dummy_file) - f.writeLine("<html><body><div id='str'>#{@str}</div></body></html>") - f.close - @f = @dummy_file - dummy_path = cfolder.path + "\\" + @dummy_file - dummy_path - end - def test_err_in_callback if @ruby - cmd = "#{@ruby} -v #{@iopt} #{@script} #{@param} > test_err_in_callback.log 2>&1" + cmd = "#{@ruby} -v #{@iopt} #{@script} > test_err_in_callback.log 2>&1" system(cmd) str = "" open("test_err_in_callback.log") {|ifs| @@ -51,34 +36,5 @@ if defined?(WIN32OLE) end end - def ie_quit - WIN32OLE_EVENT.message_loop - sh = WIN32OLE.new('Shell.Application') - sh.windows.each do |w| - i = 0 - begin - i = i + 1 - next if i > 100 - WIN32OLE_EVENT.message_loop - sleep 0.1 - next if /#{@dummy_file}/ !~ w.locationURL - e = w.document.all.item("str") - if e && e.innerHTML == @str - w.quit - WIN32OLE_EVENT.message_loop - sleep 0.2 - break - end - rescue - retry - end - end - end - - def teardown - ie_quit - File.unlink(@f) - File.unlink("test_err_in_callback.log") - end end end diff --git a/test/win32ole/test_win32ole_event.rb b/test/win32ole/test_win32ole_event.rb index 5b2a1af420..84d1e00f21 100644 --- a/test/win32ole/test_win32ole_event.rb +++ b/test/win32ole/test_win32ole_event.rb @@ -4,330 +4,331 @@ rescue LoadError end require 'test/unit' -if defined?(WIN32OLE_EVENT) - class TestWIN32OLE_EVENT < Test::Unit::TestCase - module IE - end - def create_temp_html - fso = WIN32OLE.new('Scripting.FileSystemObject') - dummy_file = fso.GetTempName + ".html" - cfolder = fso.getFolder(".") - f = cfolder.CreateTextFile(dummy_file) - f.writeLine("<html><body>This is test HTML file for Win32OLE.</body></html>") - f.close - dummy_path = cfolder.path + "\\" + dummy_file - dummy_path +def ado_installed? + installed = false + if defined?(WIN32OLE) + db = nil + begin + db = WIN32OLE.new('ADODB.Connection') + db.connectionString = "Driver={Microsoft Text Driver (*.txt; *.csv)};DefaultDir=.;" + db.open + db.close + db = nil + installed = true + rescue end + end + installed +end - def message_loop - WIN32OLE_EVENT.message_loop - sleep 0.1 - end +if defined?(WIN32OLE_EVENT) + dotest = ado_installed? + if !dotest + STDERR.puts("\n#{__FILE__} skipped(ActiveX Data Object Library not found.)") + end + if dotest + class TestWIN32OLE_EVENT_ADO < Test::Unit::TestCase + CONNSTR="Driver={Microsoft Text Driver (*.txt; *.csv)};DefaultDir=.;" + module ADO + end + def message_loop + WIN32OLE_EVENT.message_loop + end - def wait_ie - while @ie.readyState != IE::READYSTATE_COMPLETE - message_loop + def default_handler(event, *args) + @event += event end - end - def setup - WIN32OLE_EVENT.message_loop - @ie = WIN32OLE.new("InternetExplorer.Application") - if !defined?(IE::READYSTATE_COMPLETE) - WIN32OLE.const_load(@ie, IE) - end - @ie.visible = true - message_loop - @event = "" - @event2 = "" - @event3 = "" - @f = create_temp_html - end + def setup + @db = WIN32OLE.new('ADODB.Connection') + if !defined?(ADO::AdStateOpen) + WIN32OLE.const_load(@db, ADO) + end + @db.connectionString = CONNSTR + @event = "" + @event2 = "" + @event3 = "" + end - def default_handler(event, *args) - @event += event - end + def test_s_new + assert_raise(TypeError) { + ev = WIN32OLE_EVENT.new("A") + } + end - def test_s_new - assert_raise(TypeError) { - ev = WIN32OLE_EVENT.new("A") - } - end + def test_s_new_without_itf + ev = WIN32OLE_EVENT.new(@db) + ev.on_event {|*args| default_handler(*args)} + @db.open + @db.close + 10.times do |i| + WIN32OLE_EVENT.new(@db) + GC.start + message_loop + @db.open + message_loop + @db.close + end + assert_match(/WillConnect/, @event) + end - def test_s_new_without_itf - ev = WIN32OLE_EVENT.new(@ie) - ev.on_event {|*args| default_handler(*args)} - @ie.navigate("file:///#{@f}") - while @ie.busy - WIN32OLE_EVENT.new(@ie) - GC.start + def test_on_event + ev = WIN32OLE_EVENT.new(@db, 'ConnectionEvents') + ev.on_event {|*args| default_handler(*args)} + @db.open message_loop + assert_match(/WillConnect/, @event) end - assert_match(/BeforeNavigate/, @event) - assert_match(/NavigateComplete/, @event) - end - - def test_on_event - ev = WIN32OLE_EVENT.new(@ie, 'DWebBrowserEvents') - ev.on_event {|*args| default_handler(*args)} - @ie.navigate("file:///#{@f}") - wait_ie - assert_match(/BeforeNavigate/, @event) - assert_match(/NavigateComplete/, @event) - end - def test_on_event_symbol - ev = WIN32OLE_EVENT.new(@ie) - ev.on_event(:BeforeNavigate2) {|*args| - handler1 - } - @ie.navigate("file:///#{@f}") - wait_ie - assert_equal("handler1", @event2) - end - - def test_on_event2 - ev = WIN32OLE_EVENT.new(@ie, 'DWebBrowserEvents') - ev.on_event('BeforeNavigate') {|*args| handler1} - ev.on_event('BeforeNavigate') {|*args| handler2} - @ie.navigate("file:///#{@f}") - wait_ie - assert_equal("handler2", @event2) - end + def test_on_event_symbol + ev = WIN32OLE_EVENT.new(@db) + ev.on_event(:WillConnect) {|*args| + handler1 + } + @db.open + message_loop + assert_equal("handler1", @event2) + end - def test_on_event3 - ev = WIN32OLE_EVENT.new(@ie, 'DWebBrowserEvents') - ev.on_event {|*args| handler1} - ev.on_event {|*args| handler2} - @ie.navigate("file:///#{@f}") - wait_ie - assert_equal("handler2", @event2) - end + def test_on_event2 + ev = WIN32OLE_EVENT.new(@db, 'ConnectionEvents') + ev.on_event('WillConnect') {|*args| handler1} + ev.on_event('WillConnect') {|*args| handler2} + @db.open + message_loop + assert_equal("handler2", @event2) + end - def test_on_event4 - ev = WIN32OLE_EVENT.new(@ie, 'DWebBrowserEvents') - ev.on_event{|*args| handler1} - ev.on_event{|*args| handler2} - ev.on_event('NavigateComplete'){|*args| handler3(*args)} - @ie.navigate("file:///#{@f}") - wait_ie - assert(@event3!="") - assert("handler2", @event2) - end + def test_on_event3 + ev = WIN32OLE_EVENT.new(@db, 'ConnectionEvents') + ev.on_event('WillConnect') {|*args| handler1} + ev.on_event('WillConnect') {|*args| handler2} + @db.open + message_loop + assert_equal("handler2", @event2) + end - def test_on_event5 - ev = WIN32OLE_EVENT.new(@ie, 'DWebBrowserEvents') - ev.on_event {|*args| default_handler(*args)} - ev.on_event('NavigateComplete'){|*args| handler3(*args)} - @ie.navigate("file:///#{@f}") - wait_ie - assert_match(/BeforeNavigate/, @event) - assert(/NavigateComplete/ !~ @event) - assert(@event!="") - end + def test_on_event4 + ev = WIN32OLE_EVENT.new(@db, 'ConnectionEvents') + ev.on_event{|*args| handler1} + ev.on_event{|*args| handler2} + ev.on_event('WillConnect'){|*args| handler3(*args)} + @db.open + message_loop + assert_equal(CONNSTR, @event3) + assert("handler2", @event2) + end - def test_unadvise - ev = WIN32OLE_EVENT.new(@ie, 'DWebBrowserEvents') - ev.on_event {|*args| default_handler(*args)} - @ie.navigate("file:///#{@f}") - wait_ie - assert_match(/BeforeNavigate/, @event) - ev.unadvise - @event = "" - @ie.navigate("file:///#{@f}") - wait_ie - assert_equal("", @event); - assert_raise(WIN32OLERuntimeError) { + def test_on_event5 + ev = WIN32OLE_EVENT.new(@db, 'ConnectionEvents') ev.on_event {|*args| default_handler(*args)} - } - end - - def test_non_exist_event - assert_raise(RuntimeError) { - ev = WIN32OLE_EVENT.new(@ie, 'XXXX') - } - dict = WIN32OLE.new('Scripting.Dictionary') - assert_raise(RuntimeError) { - ev = WIN32OLE_EVENT.new(dict) - } - end + ev.on_event('WillConnect'){|*args| handler3(*args)} + @db.open + message_loop + assert_match(/ConnectComplete/, @event) + assert(/WillConnect/ !~ @event) + assert_equal(CONNSTR, @event3) + end - def test_on_event_with_outargs - ev = WIN32OLE_EVENT.new(@ie) - # ev.on_event_with_outargs('BeforeNavigate'){|*args| - # args.last[5] = true # Cancel = true - # } - ev.on_event_with_outargs('BeforeNavigate2'){|*args| - args.last[6] = true # Cancel = true - } - bl = @ie.locationURL - @ie.navigate("file:///#{@f}") - wait_ie - assert_equal(bl, @ie.locationURL) - end + def test_unadvise + ev = WIN32OLE_EVENT.new(@db, 'ConnectionEvents') + ev.on_event {|*args| default_handler(*args)} + @db.open + message_loop + assert_match(/WillConnect/, @event) + ev.unadvise + @event = "" + @db.close + @db.open + message_loop + assert_equal("", @event); + assert_raise(WIN32OLERuntimeError) { + ev.on_event {|*args| default_handler(*args)} + } + end - def test_on_event_hash_return - ev = WIN32OLE_EVENT.new(@ie) - ev.on_event('BeforeNavigate2'){|*args| - {:return => 1, :Cancel => true} - } - bl = @ie.locationURL - @ie.navigate("file:///#{@f}") - wait_ie - assert_equal(bl, @ie.locationURL) - end + def test_non_exist_event + assert_raise(RuntimeError) { + ev = WIN32OLE_EVENT.new(@db, 'XXXX') + } + dict = WIN32OLE.new('Scripting.Dictionary') + assert_raise(RuntimeError) { + ev = WIN32OLE_EVENT.new(dict) + } + end - def test_on_event_hash_return2 - ev = WIN32OLE_EVENT.new(@ie) - ev.on_event('BeforeNavigate2'){|*args| - {:Cancel => true} - } - bl = @ie.locationURL - @ie.navigate("file:///#{@f}") - wait_ie - assert_equal(bl, @ie.locationURL) - end + def test_on_event_with_outargs + ev = WIN32OLE_EVENT.new(@db) + @db.connectionString = 'XXX' # set illegal connection string + assert_raise(WIN32OLERuntimeError) { + @db.open + } + ev.on_event_with_outargs('WillConnect'){|*args| + args.last[0] = CONNSTR # ConnectionString = CONNSTR + } + @db.open + message_loop + assert(true) + end - def test_on_event_hash_return3 - ev = WIN32OLE_EVENT.new(@ie) - ev.on_event('BeforeNavigate2'){|*args| - {'Cancel' => true} - } - bl = @ie.locationURL - @ie.navigate("file:///#{@f}") - wait_ie - assert_equal(bl, @ie.locationURL) - end - - def test_on_event_hash_return4 - ev = WIN32OLE_EVENT.new(@ie) - ev.on_event('BeforeNavigate2'){|*args| - {'return' => 2, 'Cancel' => true} - } - bl = @ie.locationURL - @ie.navigate("file:///#{@f}") - wait_ie - assert_equal(bl, @ie.locationURL) - end + def test_on_event_hash_return + ev = WIN32OLE_EVENT.new(@db) + ev.on_event('WillConnect'){|*args| + {:return => 1, :ConnectionString => CONNSTR} + } + @db.connectionString = 'XXX' + @db.open + assert(true) + end - def test_on_event_hash_return5 - ev = WIN32OLE_EVENT.new(@ie) - ev.on_event('BeforeNavigate2'){|*args| - {6 => true} - } - bl = @ie.locationURL - @ie.navigate("file:///#{@f}") - wait_ie - assert_equal(bl, @ie.locationURL) - end + def test_on_event_hash_return2 + ev = WIN32OLE_EVENT.new(@db) + ev.on_event('WillConnect'){|*args| + {:ConnectionString => CONNSTR} + } + @db.connectionString = 'XXX' + @db.open + assert(true) + end - def test_off_event - ev = WIN32OLE_EVENT.new(@ie) - ev.on_event{handler1} - ev.off_event - @ie.navigate("file:///#{@f}") - wait_ie - assert_equal("", @event2) - end + def test_on_event_hash_return3 + ev = WIN32OLE_EVENT.new(@db) + ev.on_event('WillConnect'){|*args| + {'ConnectionString' => CONNSTR} + } + @db.connectionString = 'XXX' + @db.open + assert(true) + end - def test_off_event_arg - ev = WIN32OLE_EVENT.new(@ie) - ev.on_event('BeforeNavigate2'){handler1} - ev.off_event('BeforeNavigate2') - @ie.navigate("file:///#{@f}") - wait_ie - assert_equal("", @event2) - end + def test_on_event_hash_return4 + ev = WIN32OLE_EVENT.new(@db) + ev.on_event('WillConnect'){|*args| + {'return' => 1, 'ConnectionString' => CONNSTR} + } + @db.connectionString = 'XXX' + @db.open + assert(true) + end - def test_off_event_sym_arg - ev = WIN32OLE_EVENT.new(@ie) - ev.on_event('BeforeNavigate2'){handler1} - ev.off_event(:BeforeNavigate2) - @ie.navigate("file:///#{@f}") - wait_ie - assert_equal("", @event2) - end + def test_on_event_hash_return5 + ev = WIN32OLE_EVENT.new(@db) + ev.on_event('WillConnect'){|*args| + {0 => CONNSTR} + } + @db.connectionString = 'XXX' + @db.open + assert(true) + end - def handler1 - @event2 = "handler1" - end + def test_off_event + ev = WIN32OLE_EVENT.new(@db) + ev.on_event{handler1} + ev.off_event + @db.open + message_loop + assert_equal("", @event2) + end - def handler2 - @event2 = "handler2" - end + def test_off_event_arg + ev = WIN32OLE_EVENT.new(@db) + ev.on_event('WillConnect'){handler1} + ev.off_event('WillConnect') + @db.open + message_loop + assert_equal("", @event2) + end - def handler3(url) - @event3 += url - end + def test_off_event_arg2 + ev = WIN32OLE_EVENT.new(@db) + ev.on_event('WillConnect'){handler1} + ev.on_event('ConnectComplete'){handler1} + ev.off_event('WillConnect') + @db.open + message_loop + assert_equal("handler1", @event2) + end - def teardown - @ie.quit - message_loop - @ie = nil - i = 0 - begin - i += 1 - File.unlink(@f) if i < 10 - rescue Errno::EACCES + def test_off_event_sym_arg + ev = WIN32OLE_EVENT.new(@db) + ev.on_event('WillConnect'){handler1} + ev.off_event(:WillConnect) + @db.open message_loop - retry + assert_equal("", @event2) end - message_loop - GC.start - message_loop - end - class Handler1 - attr_reader :val1, :val2, :val3, :val4 - def initialize - @val1 = nil - @val2 = nil - @val3 = nil - @val4 = nil + def handler1 + @event2 = "handler1" end - def onStatusTextChange(t) - @val1 = t + + def handler2 + @event2 = "handler2" end - def onProgressChange(p, pmax) - @val2 = p - @val3 = pmax + + def handler3(*arg) + @event3 += arg[0] end - def onPropertyChange(p) - @val4 = p + + def teardown + if @db && @db.state == ADO::AdStateOpen + @db.close + end + message_loop + @db = nil end - end - class Handler2 - attr_reader :ev - def initialize - @ev = "" + class Handler1 + attr_reader :val1, :val2, :val3, :val4 + def initialize + @val1 = nil + @val2 = nil + @val3 = nil + @val4 = nil + end + def onWillConnect(conn, uid, pwd, opts, stat, pconn) + @val1 = conn + end + def onConnectComplete(err, stat, pconn) + @val2 = err + @val3 = stat + end + def onInfoMessage(err, stat, pconn) + @val4 = stat + end end - def method_missing(ev, *arg) - @ev += ev + + class Handler2 + attr_reader :ev + def initialize + @ev = "" + end + def method_missing(ev, *arg) + @ev += ev + end end - end - def test_handler1 - ev = WIN32OLE_EVENT.new(@ie) - h1 = Handler1.new - ev.handler = h1 - @ie.navigate("file:///#{@f}") - wait_ie - assert(h1.val1) - assert_equal(h1.val1, ev.handler.val1) - assert(h1.val2) - assert(h1.val3) - assert(h1.val4) - end + def test_handler1 + ev = WIN32OLE_EVENT.new(@db) + h1 = Handler1.new + ev.handler = h1 + @db.open + message_loop + assert_equal(CONNSTR, h1.val1) + assert_equal(h1.val1, ev.handler.val1) + assert_equal(nil, h1.val2) + assert_equal(ADO::AdStateOpen, h1.val3) + assert_equal(ADO::AdStateOpen, h1.val4) + end - def test_handler2 - ev = WIN32OLE_EVENT.new(@ie) - h2 = Handler2.new - ev.handler = h2 - @ie.navigate("file:///#{@f}") - wait_ie - assert(h2.ev != "") + def test_handler2 + ev = WIN32OLE_EVENT.new(@db) + h2 = Handler2.new + ev.handler = h2 + @db.open + message_loop + assert(h2.ev != "") + end end - end end |