summaryrefslogtreecommitdiff
path: root/TAO/tests/DynUnion_Test/DynUnionTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tests/DynUnion_Test/DynUnionTest.cpp')
-rw-r--r--TAO/tests/DynUnion_Test/DynUnionTest.cpp167
1 files changed, 167 insertions, 0 deletions
diff --git a/TAO/tests/DynUnion_Test/DynUnionTest.cpp b/TAO/tests/DynUnion_Test/DynUnionTest.cpp
new file mode 100644
index 00000000000..6d13995b006
--- /dev/null
+++ b/TAO/tests/DynUnion_Test/DynUnionTest.cpp
@@ -0,0 +1,167 @@
+// $Id$
+
+#include "dynanyC.h"
+#include "tao/DynamicAny/DynamicAny.h"
+#include "tao/TypeCodeFactory/TypeCodeFactory_Loader.h"
+#include "tao/TypeCodeFactory/TypeCodeFactory_Adapter_Impl.h"
+
+// Creates DynUnion using typecodes generated through IDL compiler.
+int runStatic(CORBA::ORB_ptr orb)
+{
+ try
+ {
+ CORBA::Object_var obj =
+ orb->resolve_initial_references("DynAnyFactory");
+
+ DynamicAny::DynAnyFactory_var dfact =
+ DynamicAny::DynAnyFactory::_narrow(obj.in ());
+
+ if (CORBA::is_nil (dfact.in ()))
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Nil dynamic any factory after narrow\n"),
+ -1);
+ }
+
+ DynamicAny::DynAny_var dany =
+ dfact->create_dyn_any_from_type_code(DynAnyTest::_tc_EventData);
+
+ DynamicAny::DynUnion_var dunion =
+ DynamicAny::DynUnion::_narrow(dany.in ());
+
+ DynamicAny::DynAny_var disc = dunion->get_discriminator();
+
+ DynamicAny::DynEnum_var denum =
+ DynamicAny::DynEnum::_narrow(disc.in ());
+
+ if (CORBA::is_nil (denum.in ()))
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Nil dynamic enum after narrow\n"),
+ -1);
+ }
+
+ ACE_DEBUG ((LM_DEBUG, "Static Test Passed\n"));
+ }
+ catch (const CORBA::Exception & ex)
+ {
+ ex._tao_print_exception ("runStatic");
+ return -1;
+ }
+
+ return 0;
+}
+
+// Creates DynUnion from typecode created programmatically
+
+int runDynamic(CORBA::ORB_ptr orb)
+{
+ try
+ {
+ // Create typecode for EventKind.
+
+ CORBA::EnumMemberSeq eseq;
+
+ eseq.length(2);
+
+ eseq[0] = CORBA::string_dup("ALARM_EVENT");
+ eseq[1] = CORBA::string_dup("LOG_EVENT");
+
+ CORBA::TypeCode_var eventKindTc;
+
+ eventKindTc = orb->create_enum_tc("IDL:DynAnyTest/EventKind:1.0",
+ "EventKind",
+ eseq);
+
+ // Create typecode for EventData. EventKind tc is used.
+
+ CORBA::Any label;
+ CORBA::UnionMemberSeq useq;
+
+ useq.length(2);
+
+ label <<= DynAnyTest::ALARM_EVENT;
+ useq[0].name = CORBA::string_dup("ev_data");
+ useq[0].label = label;
+ useq[0].type = CORBA::TypeCode::_duplicate(CORBA::_tc_any);
+ useq[0].type_def = CORBA::IDLType::_nil ();
+
+ label <<= DynAnyTest::LOG_EVENT;
+ useq[1].name = CORBA::string_dup("ev_desc");
+ useq[1].label = label;
+ useq[1].type = CORBA::TypeCode::_duplicate(CORBA::_tc_string);
+ useq[1].type_def = CORBA::IDLType::_nil ();
+
+ CORBA::TypeCode_var eventDataTc;
+
+ eventDataTc = orb->create_union_tc("IDL:DynAnyTest/EventData:1.0",
+ "EventData",
+ eventKindTc.in (),
+ useq);
+
+ // Now create DynUnion
+
+ CORBA::Object_var obj = orb->resolve_initial_references("DynAnyFactory");
+
+ DynamicAny::DynAnyFactory_var dfact =
+ DynamicAny::DynAnyFactory::_narrow(obj.in ());
+
+ if (CORBA::is_nil (dfact.in ()))
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Nil dynamic any factory after narrow\n"),
+ -1);
+ }
+
+ DynamicAny::DynAny_var dany =
+ dfact->create_dyn_any_from_type_code(eventDataTc.in ());
+
+ DynamicAny::DynUnion_var dunion =
+ DynamicAny::DynUnion::_narrow(dany.in ());
+
+ DynamicAny::DynAny_var disc = dunion->get_discriminator();
+
+ DynamicAny::DynEnum_var denum =
+ DynamicAny::DynEnum::_narrow(disc.in ());
+
+ // This fails. The type of discriminator is ulong
+ if (CORBA::is_nil (denum.in ()))
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Nil dynamic enum after narrow\n"),
+ -1);
+ }
+
+ ACE_DEBUG ((LM_DEBUG, "Dynamic Test Passed\n"));
+
+ denum->destroy();
+ dunion->destroy();
+ }
+ catch (const CORBA::Exception & ex)
+ {
+ ex._tao_print_exception ("Dynamic Test Failed with exception");
+ }
+ return 0;
+}
+
+int main(int argc, char * argv[])
+{
+ try
+ {
+ CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
+
+ if (runStatic(orb.in()) != 0)
+ return -1;
+
+ if (runDynamic(orb.in()) != 0)
+ return -1;
+ }
+ catch (const CORBA::Exception & ex)
+ {
+ ex._tao_print_exception ("Tests failed with exception");
+ return 1;
+ }
+
+ return 0;
+}
+