1 //=============================================================================
3 * @file test_dynsequence.cpp
5 * Implementation of the simple DynSequence test
7 * @author Jeff Parsons <jp4@cs.wustl.edu>
9 //=============================================================================
12 #include "test_dynsequence.h"
13 #include "da_testsC.h"
16 #include "tao/DynamicAny/DynamicAny.h"
17 #include "ace/OS_NS_string.h"
23 compare_string_sequence_elements(
25 DynamicAny::DynAnySeq
const & lhs
,
26 DynamicAny::DynAnySeq
const & rhs
)
28 CORBA::String_var lhs_string
= lhs
[i
]->get_string ();
30 ACE_DEBUG ((LM_DEBUG
, "elem[%d] = %C\n", i
, lhs_string
.in()));
32 CORBA::Boolean match
=
33 lhs
[i
]->equal (rhs
[i
]);
37 CORBA::String_var rhs_string
=
41 " mismatch with elements[%d] = %C\n", i
,
49 Test_DynSequence::Test_DynSequence (CORBA::ORB_var orb
, int debug
)
51 test_name_ (CORBA::string_dup ("test_dynsequence")),
57 Test_DynSequence::~Test_DynSequence (void)
59 CORBA::string_free (this->test_name_
);
64 Test_DynSequence::test_name (void) const
66 return this->test_name_
;
70 Test_DynSequence::run_test (void)
72 Data
data (this->orb_
);
73 DynAnyTests::test_seq
ts (2);
79 "\t*=*=*=*= %C =*=*=*=*\n",
83 "testing: constructor(Any)/insert/get/seek/"
84 "rewind/current_component\n"));
86 CORBA::Object_var factory_obj
=
87 this->orb_
->resolve_initial_references ("DynAnyFactory");
89 DynamicAny::DynAnyFactory_var dynany_factory
=
90 DynamicAny::DynAnyFactory::_narrow (factory_obj
.in ());
92 if (CORBA::is_nil (dynany_factory
.in ()))
94 ACE_ERROR_RETURN ((LM_ERROR
,
95 "Nil dynamic any factory after narrow\n"),
99 DynAnyAnalyzer
analyzer (this->orb_
.in (),
100 dynany_factory
.in (),
103 DynAnyTests::SeqShort shortseq1
;
105 shortseq1
.length (2);
112 DynamicAny::DynAny_var shortdany
=
113 dynany_factory
->create_dyn_any (any
);
115 analyzer
.analyze(shortdany
.in ());
118 any3
= shortdany
->to_any ();
120 ts
[0] = data
.m_string2
;
121 ts
[1] = data
.m_string2
;
124 DynamicAny::DynAny_var dp1
=
125 dynany_factory
->create_dyn_any (in_any1
);
127 DynamicAny::DynSequence_var fa1
=
128 DynamicAny::DynSequence::_narrow (dp1
.in ());
132 fa1
->insert_string (data
.m_string1
);
138 CORBA::String_var out_str1
=
141 if (!ACE_OS::strcmp (out_str1
.in (), data
.m_string1
))
143 ACE_DEBUG ((LM_DEBUG
,
148 ++this->error_count_
;
153 "testing: set_elements_as_dyn_any/get_elements_as_dyn_any/equal\n"
156 static const char *values
[] =
163 CORBA::ULong length
= 3;
164 DynamicAny::DynAnySeq
*elem_ptr
= 0;
165 ACE_NEW_RETURN (elem_ptr
,
166 DynamicAny::DynAnySeq (length
),
168 elem_ptr
->length (length
);
169 DynamicAny::DynAnySeq_var
elements (elem_ptr
);
172 for (i
= 0; i
< length
; ++i
)
175 elem_any
<<= CORBA::Any::from_string (values
[i
], 8);
176 elements
[i
] = dynany_factory
->create_dyn_any (elem_any
);
179 fa1
->set_elements_as_dyn_any (elements
.in ());
181 DynamicAny::DynAnySeq_var out_elems
=
182 fa1
->get_elements_as_dyn_any ();
184 if (out_elems
->length () != 3)
186 ++this->error_count_
;
190 analyzer
.analyze (fa1
.in());
192 for (i
= 0; i
< length
; ++i
)
194 if (!compare_string_sequence_elements(i
,
195 elements
.in(), out_elems
.in()))
200 // To show that calling destroy() on a component does
201 // nothing, as required by the spec.
202 out_elems
[i
]->destroy ();
205 // Now verify that we can replace an element using the in/out return
206 // type. This illustrates the problems described in bug # 2877:
207 // http://bugzilla.dre.vanderbilt.edu/show_bug.cgi?id=2877
208 // notice that this code has side-effects on the out_elems sequence, so
209 // do not move this code up or you will make the comparisons above fail.
211 char replacement
[] = "replacement";
213 tmp
<<= CORBA::Any::from_string (replacement
,20);
214 CORBA::ULong io_index
= 0;
215 // Since we directly change an element in a sequence we give
216 // ownership for the previous element to a local temporary object.
217 DynamicAny::DynAny_var io_owner
= out_elems
[io_index
].inout();
218 out_elems
[io_index
].inout() = dynany_factory
->create_dyn_any (tmp
);
220 // Compare the value of the replaced string.
221 CORBA::String_var new_str
= out_elems
[io_index
]->get_string();
222 if (0 != ACE_OS::strcmp(new_str
.in(), replacement
))
225 " Mismatch after replacing through in/out.\n"
226 " expected = %C, got = %C\n",
227 replacement
, new_str
.in()));
228 this->error_count_
++;
234 if (this->error_count_
== 0)
236 ACE_DEBUG ((LM_DEBUG
,
240 ACE_DEBUG ((LM_DEBUG
,
241 "testing: constructor(TypeCode)/from_any/to_any\n"));
243 DynamicAny::DynAny_var ftc1_base
=
244 dynany_factory
->create_dyn_any_from_type_code (
245 DynAnyTests::_tc_test_seq
);
247 DynamicAny::DynSequence_var ftc1
=
248 DynamicAny::DynSequence::_narrow (ftc1_base
.in ());
250 if (CORBA::is_nil (ftc1
.in ()))
252 ACE_ERROR_RETURN ((LM_ERROR
,
253 "DynSequence::_narrow() returned nil\n"),
259 ACE_TEXT ("testing: constructor(%C)/create_dyn_any_from_type_code\n"),
263 DynamicAny::DynAny_var da_bool
=
264 dynany_factory
->create_dyn_any_from_type_code (
265 DynAnyTests::_tc_SeqBoolean
);
267 DynamicAny::DynSequence_var ds_bool
=
268 DynamicAny::DynSequence::_narrow (da_bool
.in ());
270 if (CORBA::is_nil (ds_bool
.in ()))
274 ACE_TEXT ("DynSequence::_narrow() returned nil\n")
276 this->error_count_
++;
281 ACE_TEXT ("testing: constructor(%C)/create_dyn_any_from_type_code\n"),
285 DynamicAny::DynAny_var da_short
=
286 dynany_factory
->create_dyn_any_from_type_code (DynAnyTests::_tc_SeqShort
);
288 DynamicAny::DynSequence_var ds_short
=
289 DynamicAny::DynSequence::_narrow (da_short
.in ());
291 if (CORBA::is_nil (ds_short
.in ()))
295 ACE_TEXT ("DynSequence::_narrow() returned nil\n")
297 this->error_count_
++;
300 ts
[0] = CORBA::string_dup (data
.m_string1
);
303 ftc1
->from_any (in_any2
);
305 analyzer
.analyze (ftc1
.in());
307 CORBA::Any_var out_any1
=
310 const DynAnyTests::test_seq
*ts_out
= 0;
311 out_any1
.in () >>= ts_out
;
313 if (!ACE_OS::strcmp ((*ts_out
)[0U], data
.m_string1
))
315 ACE_DEBUG ((LM_DEBUG
,
320 ++this->error_count_
;
323 ACE_DEBUG ((LM_DEBUG
,
324 "testing: length/set_elements/get_elements\n"));
326 length
= ftc1
->get_length ();
330 ++this->error_count_
;
333 ftc1
->set_length (3);
334 DynamicAny::AnySeq
as_in (3);
337 in_any3
<<= CORBA::Any::from_string (data
.m_string2
, 8);
340 in_any3
<<= CORBA::Any::from_string (data
.m_string1
, 8);
342 ftc1
->set_elements (as_in
);
344 DynamicAny::AnySeq_var as_out
=
345 ftc1
->get_elements ();
347 CORBA::ULong index
= 2;
348 CORBA::Any out_any2
= as_out
[index
];
350 out_any2
>>= CORBA::Any::to_string (out_str2
, 8);
352 if (ACE_OS::strcmp (out_str2
, data
.m_string1
))
354 ++this->error_count_
;
357 if (this->error_count_
== 0)
359 ACE_DEBUG ((LM_DEBUG
,
367 catch (const CORBA::Exception
& ex
)
369 ex
._tao_print_exception ("test_dynsequence::run_test");
370 ++this->error_count_
;
373 ACE_DEBUG ((LM_DEBUG
,
375 this->error_count_
));
378 return !!error_count_
;