spec/dde/client_spec.rb in dde-0.2.2 vs spec/dde/client_spec.rb in dde-0.2.8
- old
+ new
@@ -1,15 +1,41 @@
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
+require File.expand_path(File.dirname(__FILE__) + '/app_shared')
module DDETest
+ def start_callback_recorder
+ @client_calls = []
+ @server_calls = []
+ @client = DDE::Client.new {|*args| @client_calls << extract_values(*args); 1}
+ @server = DDE::Server.new do |*args|
+ @server_calls << extract_values(*args)
+ #puts "#{Time.now.strftime('%T.%6N')} #{extract_values(*args)}"
+ DDE_FACK
+ end
+ @server.start_service('service')
+ end
+
+ def stop_callback_recorder
+ @client.stop_conversation if @client.conversation_active?
+ #@client.stop_dde if @client.dde_active?
+ @server.stop_service if @server.service_active?
+ @server.stop_dde if @server.dde_active?
+ end
+
+ def extract_values(type, format, conv, hsz1, hsz2, data, data1, data2)
+ [Win::DDE::TYPES[type], format, conv,
+ dde_query_string(@client.id, hsz1),
+ dde_query_string(@client.id, hsz2),
+ data, data1, data2]
+ end
+
describe DDE::Client do
-# before(:all){@monitor = DDE::Monitor.new}
-# after(:all){@monitor.stop_dde}
+ before(:each){ @client = DDE::Client.new }
+ after(:each){ @client.stop_dde if @client.dde_active?}
- before(:each ){ @client = DDE::Client.new }
-# after(:each ){ @client.stop_dde}
+ it_should_behave_like "DDE App"
it 'new without parameters creates Client but does not activate DDEML' do
@client.id.should == nil
@client.conversation.should == nil
@client.service.should == nil
@@ -17,18 +43,18 @@
@client.dde_active?.should == false
@client.conversation_active?.should == false
end
it 'new with attached callback block creates Client and activates DDEML' do
- client = DDE::Client.new {|*args|}
- client.id.should be_an Integer
- client.id.should_not == 0
- client.dde_active?.should == true
- client.conversation.should == nil
- client.conversation_active?.should == false
- client.service.should == nil
- client.topic.should == nil
+ @client = DDE::Client.new {|*args|}
+ @client.id.should be_an Integer
+ @client.id.should_not == 0
+ @client.dde_active?.should == true
+ @client.conversation.should == nil
+ @client.conversation_active?.should == false
+ @client.service.should == nil
+ @client.topic.should == nil
end
describe '#start_conversation' do
context 'with inactive (uninitialized) DDE:' do
@@ -41,18 +67,17 @@
@client.conversation_active?.should == false
lambda{@client.start_conversation}.
should raise_error /DDE is not initialized/
@client.conversation_active?.should == false
end
- end
+ end # context 'with inactive (uninitialized) DDE:'
context 'with active (initialized) DDE AND existing DDE server supporting "service" topic' do
- before(:each )do
- @client_calls = []
- @server_calls = []
- @client = DDE::Client.new {|*args| @client_calls << args; 1}
- @server = DDE::Server.new {|*args| @server_calls << args; 1}.start_service('service')
+ before(:each ){start_callback_recorder}
+ after(:each )do
+ stop_callback_recorder
+ #p @server_calls, @client_calls # ?????????? No XTYP_DISCONNECT ? Why ?
end
it 'starts new conversation if DDE is already activated' do
res = @client.start_conversation 'service', 'topic'
res.should be_true
@@ -76,27 +101,28 @@
end
it 'initiates XTYP_CONNECT transaction to service`s callback' do
@client.start_conversation 'service', 'topic'
- @server_calls.first[0].should == XTYP_CONNECT
- @server_calls.first[3].should == @client.topic.handle
- @server_calls.first[4].should == @client.service.handle
+ @server_calls.first[0].should == 'XTYP_CONNECT'
+ @server_calls.first[3].should == @client.topic
+ @server_calls.first[4].should == @client.service
end
it 'if server confirms connect, XTYP_CONNECT_CONFIRM transaction to service`s callback follows' do
@client.start_conversation 'service', 'topic'
- @server_calls[1][0].should == XTYP_CONNECT_CONFIRM
- @server_calls[1][3].should == @client.topic.handle
- @server_calls[1][4].should == @client.service.handle
+ # p @server_calls, @client_calls # ?????????? No XTYP_DISCONNECT ? Why ?
+ @server_calls[1][0].should == 'XTYP_CONNECT_CONFIRM'
+ @server_calls[1][3].should == @client.topic
+ @server_calls[1][4].should == @client.service
end
it 'client`s callback receives no transactions' do
@client.start_conversation 'service', 'topic'
- p @server_calls, @client.service.handle, @client.topic.handle, @client.conversation
+ #p @server_calls, @client.service.handle, @client.topic.handle, @client.conversation
@client_calls.should == []
end
it 'fails if another conversation is already in progress' do
@client.start_conversation 'service', 'topic'
@@ -107,43 +133,45 @@
it 'fails to start conversation on unsupported service' do
lambda{@client.start_conversation('not_a_service', 'topic')}.
should raise_error /A client`s attempt to establish a conversation has failed/
@client.conversation_active?.should == false
+
+ #ensure
+ dde_free_string_handle(@client.id, @client.topic.handle)
+ dde_free_string_handle(@client.id, @client.service.handle)
end
- end
- end
+ end # context 'with active (initialized) DDE AND existing DDE server supporting "service" topic' do
+ end # describe '#start_conversation'
describe '#stop_conversation' do
context 'with inactive (uninitialized) DDE:' do
it 'fails to stop conversation' do
lambda{@client.stop_conversation}.
should raise_error /DDE not started/
@client.conversation_active?.should == false
end
- end
+ end # context 'with inactive (uninitialized) DDE:'
context 'with active (initialized) DDE AND existing DDE server supporting "service" topic' do
- before(:each )do
- @client_calls = []
- @server_calls = []
- @client = DDE::Client.new {|*args| @client_calls << args; 1}
- @server = DDE::Server.new {|*args| @server_calls << args; 1}
- @server.start_service('service')
+ before(:each ){start_callback_recorder}
+ after(:each )do
+ stop_callback_recorder
end
it 'fails to stop conversation' do
lambda{@client.stop_conversation}.
should raise_error /Conversation not started/
@client.conversation_active?.should == false
end
context 'conversation already started' do
- before(:each ){@client.start_conversation 'service', 'topic'}
+ before(:each){ @client.start_conversation 'service', 'topic' }
+ after(:each){ @client.stop_conversation if @client.conversation_active?}
it 'stops conversation' do
res = @client.stop_conversation
res.should be_true
@client.conversation_active?.should == false
@@ -163,14 +191,14 @@
it 'initiates XTYP_DISCONNECT transaction to service`s callback' do
pending
@client.stop_conversation
p @server_calls, @client_calls # ?????????? No XTYP_DISCONNECT ? Why ?
- @server_calls.last[0].should == XTYP_DISCONNECT
+ @server_calls.last[0].should == 'XTYP_DISCONNECT'
end
- end
+ end # context 'conversation already started'
- end
- end
- end
+ end # context 'with active (initialized) DDE AND existing DDE server supporting "service" topic'
+ end # describe '#stop_conversation'
+ end # describe DDE::Client
end
\ No newline at end of file