diff --git a/spec/ruby/library/win32ole/fixtures/event.xml b/spec/ruby/library/win32ole/fixtures/event.xml
new file mode 100644
index 0000000000..23f3d2b126
--- /dev/null
+++ b/spec/ruby/library/win32ole/fixtures/event.xml
@@ -0,0 +1,4 @@
+
+ Ruby
+ trunk
+
diff --git a/spec/ruby/library/win32ole/win32ole_event/on_event_spec.rb b/spec/ruby/library/win32ole/win32ole_event/on_event_spec.rb
index 00b8fcc035..feb26b0637 100644
--- a/spec/ruby/library/win32ole/win32ole_event/on_event_spec.rb
+++ b/spec/ruby/library/win32ole/win32ole_event/on_event_spec.rb
@@ -1,62 +1,70 @@
-require_relative '../fixtures/classes'
-
platform_is :windows do
- require 'win32ole'
+ require_relative '../fixtures/classes'
+ guard -> { WIN32OLESpecs::MSXML_AVAILABLE } do
- def default_handler(event, *args)
- @event += event
- end
-
- def alternate_handler(event, *args)
- @event2 = "alternate"
- end
-
- def handler3(event, *args)
- @event3 += event
- end
-
-
- describe "WIN32OLE_EVENT#on_event with no argument" do
- before :each do
- @ie = WIN32OLESpecs.new_ole('InternetExplorer.Application')
- @ev = WIN32OLE_EVENT.new(@ie, 'DWebBrowserEvents')
- @event = ''
- @event2 = ''
- @event3 = ''
- @ie.StatusBar = true
+ def handler_global(event, *args)
+ @event_global += event
end
- after :each do
- @ie.Quit
+ def handler_specific(*args)
+ @event_specific = "specific"
end
- it "sets event handler properly, and the handler is invoked by event loop" do
- @ev.on_event { |*args| default_handler(*args) }
- @ie.StatusText='hello'
- WIN32OLE_EVENT.message_loop
- @event.should =~ /StatusTextChange/
+ def handler_spec_alt(*args)
+ @event_spec_alt = "spec_alt"
end
- it "accepts a String argument, sets event handler properly, and the handler is invoked by event loop" do
- @ev.on_event("StatusTextChange") { |*args| @event = 'foo' }
- @ie.StatusText='hello'
- WIN32OLE_EVENT.message_loop
- @event.should =~ /foo/
- end
+ describe "WIN32OLE_EVENT#on_event" do
+ before :all do
+ @fn_xml = File.absolute_path "../fixtures/event.xml", __dir__
+ end
- it "registers multiple event handlers for the same event" do
- @ev.on_event("StatusTextChange") { |*args| default_handler(*args) }
- @ev.on_event("StatusTextChange") { |*args| alternate_handler(*args) }
- @ie.StatusText= 'hello'
- WIN32OLE_EVENT.message_loop
- @event2.should == 'alternate'
- end
+ before :each do
+ @xml_dom = WIN32OLESpecs.new_ole 'MSXML.DOMDocument'
+ @xml_dom.async = true
+ @ev = WIN32OLE_EVENT.new @xml_dom
+ @event_global = ''
+ @event_specific = ''
+ @event_spec_alt = ''
+ end
- it "accepts a Symbol argument, sets event handler properly, and the handler is invoked by event loop" do
- @ev.on_event(:StatusTextChange) { |*args| @event = 'foo' }
- @ie.StatusText='hello'
- WIN32OLE_EVENT.message_loop
- @event.should =~ /foo/
+ after :each do
+ @xml_dom = nil
+ @ev = nil
+ end
+
+ it "sets global event handler properly, and the handler is invoked by event loop" do
+ @ev.on_event { |*args| handler_global(*args) }
+ @xml_dom.loadXML "Rubytrunk"
+ WIN32OLE_EVENT.message_loop
+ @event_global.should =~ /onreadystatechange/
+ end
+
+ it "accepts a String argument and the handler is invoked by event loop" do
+ @ev.on_event("onreadystatechange") { |*args| @event = 'foo' }
+ @xml_dom.loadXML "Rubytrunk"
+ WIN32OLE_EVENT.message_loop
+ @event.should =~ /foo/
+ end
+
+ it "accepts a Symbol argument and the handler is invoked by event loop" do
+ @ev.on_event(:onreadystatechange) { |*args| @event = 'bar' }
+ @xml_dom.loadXML "Rubytrunk"
+ WIN32OLE_EVENT.message_loop
+ @event.should =~ /bar/
+ end
+
+ it "accepts a specific event handler and overrides a global event handler" do
+ @ev.on_event { |*args| handler_global(*args) }
+ @ev.on_event("onreadystatechange") { |*args| handler_specific(*args) }
+ @ev.on_event("onreadystatechange") { |*args| handler_spec_alt(*args) }
+ @xml_dom.load @fn_xml
+ WIN32OLE_EVENT.message_loop
+ @event_global.should == 'ondataavailable'
+ @event_global.should_not =~ /onreadystatechange/
+ @event_specific.should == ''
+ @event_spec_alt.should == "spec_alt"
+ end
end
end
end