#include "test.h"


CORBA::ORB_var orb;
CORBA::BOA_var boa;


void dyn_union ()
{
    CORBA::DynUnion_var da =
        orb->create_dyn_union (_tc_Union);

    CORBA::DynEnum_var disc = CORBA::DynEnum::_narrow (
        da->discriminator());
    assert (!CORBA::is_nil (disc));

    da->set_as_default (TRUE);
    assert (disc->value_as_ulong() == 2);

    CORBA::Boolean r = da->seek (1);
    assert (r);
    CORBA::DynAny_var value = da->current_component();
    value->insert_short (10);

    da->set_as_default (FALSE);
    assert (disc->value_as_ulong() != 2);

    r = da->seek (1);
    assert (r);
    disc->value_as_string ("el2");
    da->insert_boolean (TRUE);

    da->destroy ();
}

void dyn_seq ()
{
    CORBA::DynSequence_var da =
        orb->create_dyn_sequence (_tc_Sequence);
    da->length (10);

    for (int i = 0; i < 10; ++i) {
        da->insert_short (i);
    }

    CORBA::AnySeq_var seq = da->get_elements();
    for (int i = 0; i < 10; ++i) {
        CORBA::Short s;
        CORBA::Boolean r = (seq[i] >>= s);
	assert (r);
        assert (s == i);
    }

    da->destroy ();
}

void dyn_enum ()
{
    CORBA::DynEnum_var da = orb->create_dyn_enum (_tc_Enum);
    da->value_as_string ("el1");
    assert (da->value_as_ulong() == 0);

    da->value_as_ulong (1);
    CORBA::String_var str = da->value_as_string ();
    assert (!strcmp (str, "el2"));

    da->destroy ();
}

void dyn_struct ()
{
    CORBA::Any a;
    Struct s;
    s.l = 10;
    s.s = (const char *)"foobar";
    a <<= s;
    
    CORBA::DynAny_var da = orb->create_dyn_any (a);
    CORBA::Long l = da->get_long ();
    assert (l == 10);
    CORBA::String_var str = da->get_string ();
    assert (!strcmp (str, "foobar"));

    CORBA::Any_var av = da->to_any ();
    assert (a == av);

    da->destroy ();
}

void dyn_basic ()
{
    CORBA::DynAny_var da = orb->create_basic_dyn_any(CORBA::_tc_long);
    da->insert_long (10);

    CORBA::Long l = da->get_long();
    assert (l == 10);

    da->destroy ();
}

int main (int argc, char *argv[])
{
    // ORB initialization
    orb = CORBA::ORB_init( argc, argv, "mico-local-orb" );
    boa = orb->BOA_init (argc, argv, "mico-local-boa");

    dyn_basic ();
    dyn_struct ();
    dyn_enum ();
    dyn_seq ();
    dyn_union ();
    return 0;
}
