/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_cppu.hxx"

#include "sal/config.h"

#include <stdlib.h> // wntmsci10 does not like <cstdlib>

#include "Enum1.hpp"
#include "Enum2.hpp"
#include "Exception1.hpp"
#include "Exception2.hpp"
#include "Exception2a.hpp"
#include "Exception2b.hpp"
#include "Interface1.hpp"
#include "Interface2.hpp"
#include "Interface2a.hpp"
#include "Interface2b.hpp"
#include "Interface3.hpp"
#include "Poly.hpp"
#include "Struct1.hpp"
#include "Struct2.hpp"
#include "Struct2a.hpp"
#include "Struct2b.hpp"
#include "boost/type_traits/is_same.hpp"
#include "com/sun/star/uno/Any.hxx"
#include "com/sun/star/uno/Reference.hxx"
#include "com/sun/star/uno/RuntimeException.hpp"
#include "com/sun/star/uno/Sequence.hxx"
#include "com/sun/star/uno/Type.hxx"
#include "com/sun/star/uno/XInterface.hpp"
#include "osl/diagnose.h"
#include "osl/interlck.h"
#include "rtl/string.h"
#include "rtl/ustring.h"
#include "rtl/ustring.hxx"
#include "sal/types.h"
#include "gtest/gtest.h"

namespace {

namespace css = com::sun::star;

class Base {
public:
    Base(): m_count(0) {}

    void acquire() {
        if (osl_incrementInterlockedCount(&m_count) == SAL_MAX_INT32) {
            abort();
        }
    }

    void release() {
        if (osl_decrementInterlockedCount(&m_count) == 0) {
            delete this;
        }
    }

protected:
    virtual ~Base() {}

private:
    Base(Base &); // not declared
    void operator =(Base &); // not declared

    oslInterlockedCount m_count;
};

class Impl1: public Interface1, private Base {
public:
    virtual css::uno::Any SAL_CALL queryInterface(css::uno::Type const & type)
        throw (css::uno::RuntimeException)
    {
        if (type
            == getCppuType< css::uno::Reference< css::uno::XInterface > >())
        {
            css::uno::Reference< css::uno::XInterface > ref(
                static_cast< css::uno::XInterface * >(this));
            return css::uno::Any(&ref, type);
        } else if (type == getCppuType< css::uno::Reference< Interface1 > >()) {
            css::uno::Reference< Interface1 > ref(this);
            return css::uno::Any(&ref, type);
        } else {
            return css::uno::Any();
        }
    }

    virtual void SAL_CALL acquire() throw () {
        Base::acquire();
    }

    virtual void SAL_CALL release() throw () {
        Base::release();
    }
};

class Impl2: public Interface2a, public Interface3, private Base {
public:
    virtual css::uno::Any SAL_CALL queryInterface(css::uno::Type const & type)
        throw (css::uno::RuntimeException)
    {
        if (type
            == getCppuType< css::uno::Reference< css::uno::XInterface > >())
        {
            css::uno::Reference< css::uno::XInterface > ref(
                static_cast< css::uno::XInterface * >(
                    static_cast< Interface2a * >(this)));
            return css::uno::Any(&ref, type);
        } else if (type == getCppuType< css::uno::Reference< Interface2 > >()) {
            css::uno::Reference< Interface2 > ref(this);
            return css::uno::Any(&ref, type);
        } else if (type == getCppuType< css::uno::Reference< Interface2a > >())
        {
            css::uno::Reference< Interface2a > ref(this);
            return css::uno::Any(&ref, type);
        } else if (type == getCppuType< css::uno::Reference< Interface3 > >()) {
            css::uno::Reference< Interface3 > ref(this);
            return css::uno::Any(&ref, type);
        } else {
            return css::uno::Any();
        }
    }

    virtual void SAL_CALL acquire() throw () {
        Base::acquire();
    }

    virtual void SAL_CALL release() throw () {
        Base::release();
    }
};

class Impl2b: public Interface2b, private Base {
public:
    virtual css::uno::Any SAL_CALL queryInterface(css::uno::Type const & type)
        throw (css::uno::RuntimeException)
    {
        if (type
            == getCppuType< css::uno::Reference< css::uno::XInterface > >())
        {
            css::uno::Reference< css::uno::XInterface > ref(
                static_cast< css::uno::XInterface * >(
                    static_cast< Interface2a * >(this)));
            return css::uno::Any(&ref, type);
        } else if (type == getCppuType< css::uno::Reference< Interface2 > >()) {
            css::uno::Reference< Interface2 > ref(this);
            return css::uno::Any(&ref, type);
        } else if (type == getCppuType< css::uno::Reference< Interface2a > >())
        {
            css::uno::Reference< Interface2a > ref(this);
            return css::uno::Any(&ref, type);
        } else if (type == getCppuType< css::uno::Reference< Interface2b > >())
        {
            css::uno::Reference< Interface2b > ref(this);
            return css::uno::Any(&ref, type);
        } else {
            return css::uno::Any();
        }
    }

    virtual void SAL_CALL acquire() throw () {
        Base::acquire();
    }

    virtual void SAL_CALL release() throw () {
        Base::release();
    }
};

class Test: public ::testing::Test {
public:
};

TEST_F(Test, testVoid) {
    css::uno::Any a;
    ASSERT_TRUE(a.getValueType() == getVoidCppuType());
    {
        bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "bool";
    }
    {
        sal_Bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "sal_Bool";
    }
    {
        sal_Int8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int8";
    }
    {
        sal_uInt8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt8";
    }
    {
        sal_Int16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int16";
    }
    {
        sal_uInt16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt16";
    }
    {
        sal_Int32 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int32";
    }
    {
        sal_uInt32 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt32";
    }
    {
        sal_Int64 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int64";
    }
    {
        sal_uInt64 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt64";
    }
    {
        float b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "float";
    }
    {
        double b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "double";
    }
    {
        sal_Unicode b = '2';
        ASSERT_TRUE(!(a >>= b) && b == '2') << "sal_Unicode";
    }
    {
        rtl::OUString b(RTL_CONSTASCII_USTRINGPARAM("2"));
        ASSERT_TRUE(
            !(a >>= b) && b.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("2"))) << "rtl::OUString";
    }
    {
        css::uno::Type b(getCppuType< rtl::OUString >());
        ASSERT_TRUE(
            !(a >>= b) && b == getCppuType< rtl::OUString >()) << "css::uno::Type";
    }
    {
        css::uno::Any b(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("2")));
        ASSERT_TRUE((a >>= b) && b == a) << "css::uno::Any";
    }
    {
        css::uno::Sequence< rtl::OUString > b(2);
        ASSERT_TRUE(!(a >>= b) && b.getLength() == 2) << "css::uno::Sequence<rtl::OUString>";
    }
    {
        Enum1 b = Enum1_M2;
        ASSERT_TRUE(!(a >>= b) && b == Enum1_M2) << "Enum1";
    }
    {
        Struct1 b(2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Struct1";
    }
    {
        Exception1 b(
            rtl::OUString(), css::uno::Reference< css::uno::XInterface >(), 2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Exception1";
    }
    {
        css::uno::Reference< Interface1 > i(new Impl1);
        css::uno::Reference< Interface1 > b(i);
        ASSERT_TRUE(!(a >>= b) && b == i) << "Interface1";
    }
}

TEST_F(Test, testBoolean) {
    css::uno::Any a(false);
    ASSERT_TRUE(a.getValueType() == getCppuType< sal_Bool >());
    {
        bool b = true;
        ASSERT_TRUE((a >>= b) && !b) << "bool";
    }
    {
        sal_Bool b = true;
        ASSERT_TRUE((a >>= b) && !b) << "sal_Bool";
    }
    {
        sal_Int8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int8";
    }
    {
        sal_uInt8 b = 2;
        if (boost::is_same< sal_uInt8, sal_Bool >::value) {
            ASSERT_TRUE((a >>= b) && b == 0) << "@sal_uInt8";
        } else {
            ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt8";
        }
    }
    {
        sal_Int16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int16";
    }
    {
        sal_uInt16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt16";
    }
    {
        sal_Int32 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int32";
    }
    {
        sal_uInt32 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt32";
    }
    {
        sal_Int64 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int64";
    }
    {
        sal_uInt64 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt64";
    }
    {
        float b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "float";
    }
    {
        double b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "double";
    }
    {
        sal_Unicode b = '2';
        ASSERT_TRUE(!(a >>= b) && b == '2') << "sal_Unicode";
    }
    {
        rtl::OUString b(RTL_CONSTASCII_USTRINGPARAM("2"));
        ASSERT_TRUE(!(a >>= b) && b.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("2"))) <<
            "rtl::OUString";
    }
    {
        css::uno::Type b(getCppuType< rtl::OUString >());
        ASSERT_TRUE(!(a >>= b) && b == getCppuType< rtl::OUString >()) <<
            "css::uno::Type";
    }
    {
        css::uno::Any b(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("2")));
        ASSERT_TRUE((a >>= b) && b == a) << "css::uno::Any";
    }
    {
        css::uno::Sequence< rtl::OUString > b(2);
        ASSERT_TRUE(!(a >>= b) && b.getLength() == 2) <<
            "css::uno::Sequence<rtl::OUString>";
    }
    {
        Enum1 b = Enum1_M2;
        ASSERT_TRUE(!(a >>= b) && b == Enum1_M2) << "Enum1";
    }
    {
        Struct1 b(2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Struct1";
    }
    {
        Exception1 b(
            rtl::OUString(), css::uno::Reference< css::uno::XInterface >(), 2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Exception1";
    }
    {
        css::uno::Reference< Interface1 > i(new Impl1);
        css::uno::Reference< Interface1 > b(i);
        ASSERT_TRUE(!(a >>= b) && b == i) << "Interface1";
    }
}

TEST_F(Test, testByte) {
    css::uno::Any a(static_cast< sal_Int8 >(1));
    ASSERT_TRUE(a.getValueType() == getCppuType< sal_Int8 >());
    {
        bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "bool";
    }
    {
        sal_Bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "sal_Bool";
    }
    {
        sal_Int8 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_Int8";
    }
    {
        sal_uInt8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt8";
    }
    {
        sal_Int16 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_Int16";
    }
    {
        sal_uInt16 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_uInt16";
    }
    {
        sal_Int32 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_Int32";
    }
    {
        sal_uInt32 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_uInt32";
    }
    {
        sal_Int64 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_Int64";
    }
    {
        sal_uInt64 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_uInt64";
    }
    {
        float b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "float";
    }
    {
        double b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "double";
    }
    {
        sal_Unicode b = '2';
        if (boost::is_same< sal_Unicode, sal_uInt16 >::value) {
            ASSERT_TRUE((a >>= b) && b == 1) << "@sal_Unicode";
        } else {
            ASSERT_TRUE(!(a >>= b) && b == '2') << "sal_Unicode";
        }
    }
    {
        rtl::OUString b(RTL_CONSTASCII_USTRINGPARAM("2"));
        ASSERT_TRUE(!(a >>= b) && b.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("2"))) <<
            "rtl::OUString";
    }
    {
        css::uno::Type b(getCppuType< rtl::OUString >());
        ASSERT_TRUE(!(a >>= b) && b == getCppuType< rtl::OUString >()) <<
            "css::uno::Type";
    }
    {
        css::uno::Any b(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("2")));
        ASSERT_TRUE((a >>= b) && b == a) << "css::uno::Any";
    }
    {
        css::uno::Sequence< rtl::OUString > b(2);
        ASSERT_TRUE(!(a >>= b) && b.getLength() == 2) <<
            "css::uno::Sequence<rtl::OUString>";
    }
    {
        Enum1 b = Enum1_M2;
        ASSERT_TRUE(!(a >>= b) && b == Enum1_M2) << "Enum1";
    }
    {
        Struct1 b(2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Struct1";
    }
    {
        Exception1 b(
            rtl::OUString(), css::uno::Reference< css::uno::XInterface >(), 2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Exception1";
    }
    {
        css::uno::Reference< Interface1 > i(new Impl1);
        css::uno::Reference< Interface1 > b(i);
        ASSERT_TRUE(!(a >>= b) && b == i) << "Interface1";
    }
}

TEST_F(Test, testShort) {
    css::uno::Any a(static_cast< sal_Int16 >(1));
    ASSERT_TRUE(a.getValueType() == getCppuType< sal_Int16 >());
    {
        bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "bool";
    }
    {
        sal_Bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "sal_Bool";
    }
    {
        sal_Int8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int8";
    }
    {
        sal_uInt8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt8";
    }
    {
        sal_Int16 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_Int16";
    }
    {
        sal_uInt16 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_uInt16";
    }
    {
        sal_Int32 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_Int32";
    }
    {
        sal_uInt32 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_uInt32";
    }
    {
        sal_Int64 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_Int64";
    }
    {
        sal_uInt64 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_uInt64";
    }
    {
        float b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "float";
    }
    {
        double b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "double";
    }
    {
        sal_Unicode b = '2';
        if (boost::is_same< sal_Unicode, sal_uInt16 >::value) {
            ASSERT_TRUE((a >>= b) && b == 1) << "@sal_Unicode";
        } else {
            ASSERT_TRUE(!(a >>= b) && b == '2') << "sal_Unicode";
        }
    }
    {
        rtl::OUString b(RTL_CONSTASCII_USTRINGPARAM("2"));
        ASSERT_TRUE(!(a >>= b) && b.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("2"))) <<
            "rtl::OUString";
    }
    {
        css::uno::Type b(getCppuType< rtl::OUString >());
        ASSERT_TRUE(!(a >>= b) && b == getCppuType< rtl::OUString >()) <<
            "css::uno::Type";
    }
    {
        css::uno::Any b(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("2")));
        ASSERT_TRUE((a >>= b) && b == a) << "css::uno::Any";
    }
    {
        css::uno::Sequence< rtl::OUString > b(2);
        ASSERT_TRUE(!(a >>= b) && b.getLength() == 2) <<
            "css::uno::Sequence<rtl::OUString>";
    }
    {
        Enum1 b = Enum1_M2;
        ASSERT_TRUE(!(a >>= b) && b == Enum1_M2) << "Enum1";
    }
    {
        Struct1 b(2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Struct1";
    }
    {
        Exception1 b(
            rtl::OUString(), css::uno::Reference< css::uno::XInterface >(), 2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Exception1";
    }
    {
        css::uno::Reference< Interface1 > i(new Impl1);
        css::uno::Reference< Interface1 > b(i);
        ASSERT_TRUE(!(a >>= b) && b == i) << "Interface1";
    }
}

TEST_F(Test, testUnsignedShort) {
    sal_uInt16 n = 1;
    css::uno::Any a(&n, getCppuType(static_cast< sal_uInt16 const * >(0)));
    ASSERT_TRUE(
        a.getValueType() == getCppuType(static_cast< sal_uInt16 const * >(0)));
    {
        bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "bool";
    }
    {
        sal_Bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "sal_Bool";
    }
    {
        sal_Int8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int8";
    }
    {
        sal_uInt8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt8";
    }
    {
        sal_Int16 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_Int16";
    }
    {
        sal_uInt16 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_uInt16";
    }
    {
        sal_Int32 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_Int32";
    }
    {
        sal_uInt32 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_uInt32";
    }
    {
        sal_Int64 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_Int64";
    }
    {
        sal_uInt64 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_uInt64";
    }
    {
        float b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "float";
    }
    {
        double b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "double";
    }
    {
        sal_Unicode b = '2';
        if (boost::is_same< sal_Unicode, sal_uInt16 >::value) {
            ASSERT_TRUE((a >>= b) && b == 1) << "@sal_Unicode";
        } else {
            ASSERT_TRUE(!(a >>= b) && b == '2') << "sal_Unicode";
        }
    }
    {
        rtl::OUString b(RTL_CONSTASCII_USTRINGPARAM("2"));
        ASSERT_TRUE(!(a >>= b) && b.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("2"))) <<
            "rtl::OUString";
    }
    {
        css::uno::Type b(getCppuType< rtl::OUString >());
        ASSERT_TRUE(!(a >>= b) && b == getCppuType< rtl::OUString >()) <<
            "css::uno::Type";
    }
    {
        css::uno::Any b(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("2")));
        ASSERT_TRUE((a >>= b) && b == a) << "css::uno::Any";
    }
    {
        css::uno::Sequence< rtl::OUString > b(2);
        ASSERT_TRUE(!(a >>= b) && b.getLength() == 2) <<
            "css::uno::Sequence<rtl::OUString>";
    }
    {
        Enum1 b = Enum1_M2;
        ASSERT_TRUE(!(a >>= b) && b == Enum1_M2) << "Enum1";
    }
    {
        Struct1 b(2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Struct1";
    }
    {
        Exception1 b(
            rtl::OUString(), css::uno::Reference< css::uno::XInterface >(), 2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Exception1";
    }
    {
        css::uno::Reference< Interface1 > i(new Impl1);
        css::uno::Reference< Interface1 > b(i);
        ASSERT_TRUE(!(a >>= b) && b == i) << "Interface1";
    }
}

TEST_F(Test, testLong) {
    css::uno::Any a(static_cast< sal_Int32 >(1));
    ASSERT_TRUE(a.getValueType() == getCppuType< sal_Int32 >());
    {
        bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "bool";
    }
    {
        sal_Bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "sal_Bool";
    }
    {
        sal_Int8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int8";
    }
    {
        sal_uInt8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt8";
    }
    {
        sal_Int16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int16";
    }
    {
        sal_uInt16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt16";
    }
    {
        sal_Int32 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_Int32";
    }
    {
        sal_uInt32 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_uInt32";
    }
    {
        sal_Int64 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_Int64";
    }
    {
        sal_uInt64 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_uInt64";
    }
    {
        float b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "float";
    }
    {
        double b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "double";
    }
    {
        sal_Unicode b = '2';
        ASSERT_TRUE(!(a >>= b) && b == '2') << "sal_Unicode";
    }
    {
        rtl::OUString b(RTL_CONSTASCII_USTRINGPARAM("2"));
        ASSERT_TRUE(!(a >>= b) && b.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("2"))) <<
            "rtl::OUString";
    }
    {
        css::uno::Type b(getCppuType< rtl::OUString >());
        ASSERT_TRUE(!(a >>= b) && b == getCppuType< rtl::OUString >()) <<
            "css::uno::Type";
    }
    {
        css::uno::Any b(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("2")));
        ASSERT_TRUE((a >>= b) && b == a) << "css::uno::Any";
    }
    {
        css::uno::Sequence< rtl::OUString > b(2);
        ASSERT_TRUE(!(a >>= b) && b.getLength() == 2) <<
            "css::uno::Sequence<rtl::OUString>";
    }
    {
        Enum1 b = Enum1_M2;
        ASSERT_TRUE(!(a >>= b) && b == Enum1_M2) << "Enum1";
    }
    {
        Struct1 b(2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Struct1";
    }
    {
        Exception1 b(
            rtl::OUString(), css::uno::Reference< css::uno::XInterface >(), 2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Exception1";
    }
    {
        css::uno::Reference< Interface1 > i(new Impl1);
        css::uno::Reference< Interface1 > b(i);
        ASSERT_TRUE(!(a >>= b) && b == i) << "Interface1";
    }
}

TEST_F(Test, testUnsignedLong) {
    css::uno::Any a(static_cast< sal_uInt32 >(1));
    ASSERT_TRUE(a.getValueType() == getCppuType< sal_uInt32 >());
    {
        bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "bool";
    }
    {
        sal_Bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "sal_Bool";
    }
    {
        sal_Int8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int8";
    }
    {
        sal_uInt8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt8";
    }
    {
        sal_Int16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int16";
    }
    {
        sal_uInt16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt16";
    }
    {
        sal_Int32 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_Int32";
    }
    {
        sal_uInt32 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_uInt32";
    }
    {
        sal_Int64 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_Int64";
    }
    {
        sal_uInt64 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_uInt64";
    }
    {
        float b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "float";
    }
    {
        double b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "double";
    }
    {
        sal_Unicode b = '2';
        ASSERT_TRUE(!(a >>= b) && b == '2') << "sal_Unicode";
    }
    {
        rtl::OUString b(RTL_CONSTASCII_USTRINGPARAM("2"));
        ASSERT_TRUE(!(a >>= b) && b.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("2"))) <<
            "rtl::OUString";
    }
    {
        css::uno::Type b(getCppuType< rtl::OUString >());
        ASSERT_TRUE(!(a >>= b) && b == getCppuType< rtl::OUString >()) <<
            "css::uno::Type";
    }
    {
        css::uno::Any b(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("2")));
        ASSERT_TRUE((a >>= b) && b == a) << "css::uno::Any";
    }
    {
        css::uno::Sequence< rtl::OUString > b(2);
        ASSERT_TRUE(!(a >>= b) && b.getLength() == 2) <<
            "css::uno::Sequence<rtl::OUString>";
    }
    {
        Enum1 b = Enum1_M2;
        ASSERT_TRUE(!(a >>= b) && b == Enum1_M2) << "Enum1";
    }
    {
        Struct1 b(2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Struct1";
    }
    {
        Exception1 b(
            rtl::OUString(), css::uno::Reference< css::uno::XInterface >(), 2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Exception1";
    }
    {
        css::uno::Reference< Interface1 > i(new Impl1);
        css::uno::Reference< Interface1 > b(i);
        ASSERT_TRUE(!(a >>= b) && b == i) << "Interface1";
    }
}

TEST_F(Test, testHyper) {
    css::uno::Any a(static_cast< sal_Int64 >(1));
    ASSERT_TRUE(a.getValueType() == getCppuType< sal_Int64 >());
    {
        bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "bool";
    }
    {
        sal_Bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "sal_Bool";
    }
    {
        sal_Int8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int8";
    }
    {
        sal_uInt8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt8";
    }
    {
        sal_Int16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int16";
    }
    {
        sal_uInt16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt16";
    }
    {
        sal_Int32 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int32";
    }
    {
        sal_uInt32 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt32";
    }
    {
        sal_Int64 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_Int64";
    }
    {
        sal_uInt64 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_uInt64";
    }
    {
        float b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "float";
    }
    {
        double b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "double";
    }
    {
        sal_Unicode b = '2';
        ASSERT_TRUE(!(a >>= b) && b == '2') << "sal_Unicode";
    }
    {
        rtl::OUString b(RTL_CONSTASCII_USTRINGPARAM("2"));
        ASSERT_TRUE(!(a >>= b) && b.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("2"))) <<
            "rtl::OUString";
    }
    {
        css::uno::Type b(getCppuType< rtl::OUString >());
        ASSERT_TRUE(!(a >>= b) && b == getCppuType< rtl::OUString >()) <<
            "css::uno::Type";
    }
    {
        css::uno::Any b(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("2")));
        ASSERT_TRUE((a >>= b) && b == a) << "css::uno::Any";
    }
    {
        css::uno::Sequence< rtl::OUString > b(2);
        ASSERT_TRUE(!(a >>= b) && b.getLength() == 2) <<
            "css::uno::Sequence<rtl::OUString>";
    }
    {
        Enum1 b = Enum1_M2;
        ASSERT_TRUE(!(a >>= b) && b == Enum1_M2) << "Enum1";
    }
    {
        Struct1 b(2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Struct1";
    }
    {
        Exception1 b(
            rtl::OUString(), css::uno::Reference< css::uno::XInterface >(), 2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Exception1";
    }
    {
        css::uno::Reference< Interface1 > i(new Impl1);
        css::uno::Reference< Interface1 > b(i);
        ASSERT_TRUE(!(a >>= b) && b == i) << "Interface1";
    }
}

TEST_F(Test, testUnsignedHyper) {
    css::uno::Any a(static_cast< sal_uInt64 >(1));
    ASSERT_TRUE(a.getValueType() == getCppuType< sal_uInt64 >());
    {
        bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "bool";
    }
    {
        sal_Bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "sal_Bool";
    }
    {
        sal_Int8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int8";
    }
    {
        sal_uInt8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt8";
    }
    {
        sal_Int16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int16";
    }
    {
        sal_uInt16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt16";
    }
    {
        sal_Int32 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int32";
    }
    {
        sal_uInt32 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt32";
    }
    {
        sal_Int64 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_Int64";
    }
    {
        sal_uInt64 b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "sal_uInt64";
    }
    {
        float b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "float";
    }
    {
        double b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "double";
    }
    {
        sal_Unicode b = '2';
        ASSERT_TRUE(!(a >>= b) && b == '2') << "sal_Unicode";
    }
    {
        rtl::OUString b(RTL_CONSTASCII_USTRINGPARAM("2"));
        ASSERT_TRUE(!(a >>= b) && b.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("2"))) <<
            "rtl::OUString";
    }
    {
        css::uno::Type b(getCppuType< rtl::OUString >());
        ASSERT_TRUE(!(a >>= b) && b == getCppuType< rtl::OUString >()) <<
            "css::uno::Type";
    }
    {
        css::uno::Any b(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("2")));
        ASSERT_TRUE((a >>= b) && b == a) << "css::uno::Any";
    }
    {
        css::uno::Sequence< rtl::OUString > b(2);
        ASSERT_TRUE(!(a >>= b) && b.getLength() == 2) <<
            "css::uno::Sequence<rtl::OUString>";
    }
    {
        Enum1 b = Enum1_M2;
        ASSERT_TRUE(!(a >>= b) && b == Enum1_M2) << "Enum1";
    }
    {
        Struct1 b(2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Struct1";
    }
    {
        Exception1 b(
            rtl::OUString(), css::uno::Reference< css::uno::XInterface >(), 2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Exception1";
    }
    {
        css::uno::Reference< Interface1 > i(new Impl1);
        css::uno::Reference< Interface1 > b(i);
        ASSERT_TRUE(!(a >>= b) && b == i) << "Interface1";
    }
}

TEST_F(Test, testFloat) {
    css::uno::Any a(1.f);
    ASSERT_TRUE(a.getValueType() == getCppuType< float >());
    {
        bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "bool";
    }
    {
        sal_Bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "sal_Bool";
    }
    {
        sal_Int8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int8";
    }
    {
        sal_uInt8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt8";
    }
    {
        sal_Int16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int16";
    }
    {
        sal_uInt16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt16";
    }
    {
        sal_Int32 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int32";
    }
    {
        sal_uInt32 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt32";
    }
    {
        sal_Int64 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int64";
    }
    {
        sal_uInt64 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt64";
    }
    {
        float b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "float";
    }
    {
        double b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "double";
    }
    {
        sal_Unicode b = '2';
        ASSERT_TRUE(!(a >>= b) && b == '2') << "sal_Unicode";
    }
    {
        rtl::OUString b(RTL_CONSTASCII_USTRINGPARAM("2"));
        ASSERT_TRUE(!(a >>= b) && b.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("2"))) <<
            "rtl::OUString";
    }
    {
        css::uno::Type b(getCppuType< rtl::OUString >());
        ASSERT_TRUE(!(a >>= b) && b == getCppuType< rtl::OUString >()) <<
            "css::uno::Type";
    }
    {
        css::uno::Any b(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("2")));
        ASSERT_TRUE((a >>= b) && b == a) << "css::uno::Any";
    }
    {
        css::uno::Sequence< rtl::OUString > b(2);
        ASSERT_TRUE(!(a >>= b) && b.getLength() == 2) <<
            "css::uno::Sequence<rtl::OUString>";
    }
    {
        Enum1 b = Enum1_M2;
        ASSERT_TRUE(!(a >>= b) && b == Enum1_M2) << "Enum1";
    }
    {
        Struct1 b(2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Struct1";
    }
    {
        Exception1 b(
            rtl::OUString(), css::uno::Reference< css::uno::XInterface >(), 2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Exception1";
    }
    {
        css::uno::Reference< Interface1 > i(new Impl1);
        css::uno::Reference< Interface1 > b(i);
        ASSERT_TRUE(!(a >>= b) && b == i) << "Interface1";
    }
}

TEST_F(Test, testDouble) {
    css::uno::Any a(1.);
    ASSERT_TRUE(a.getValueType() == getCppuType< double >());
    {
        bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "bool";
    }
    {
        sal_Bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "sal_Bool";
    }
    {
        sal_Int8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int8";
    }
    {
        sal_uInt8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt8";
    }
    {
        sal_Int16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int16";
    }
    {
        sal_uInt16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt16";
    }
    {
        sal_Int32 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int32";
    }
    {
        sal_uInt32 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt32";
    }
    {
        sal_Int64 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int64";
    }
    {
        sal_uInt64 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt64";
    }
    {
        float b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "float";
    }
    {
        double b = 2;
        ASSERT_TRUE((a >>= b) && b == 1) << "double";
    }
    {
        sal_Unicode b = '2';
        ASSERT_TRUE(!(a >>= b) && b == '2') << "sal_Unicode";
    }
    {
        rtl::OUString b(RTL_CONSTASCII_USTRINGPARAM("2"));
        ASSERT_TRUE(!(a >>= b) && b.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("2"))) <<
            "rtl::OUString";
    }
    {
        css::uno::Type b(getCppuType< rtl::OUString >());
        ASSERT_TRUE(!(a >>= b) && b == getCppuType< rtl::OUString >()) <<
            "css::uno::Type";
    }
    {
        css::uno::Any b(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("2")));
        ASSERT_TRUE((a >>= b) && b == a) << "css::uno::Any";
    }
    {
        css::uno::Sequence< rtl::OUString > b(2);
        ASSERT_TRUE(!(a >>= b) && b.getLength() == 2) <<
            "css::uno::Sequence<rtl::OUString>";
    }
    {
        Enum1 b = Enum1_M2;
        ASSERT_TRUE(!(a >>= b) && b == Enum1_M2) << "Enum1";
    }
    {
        Struct1 b(2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Struct1";
    }
    {
        Exception1 b(
            rtl::OUString(), css::uno::Reference< css::uno::XInterface >(), 2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Exception1";
    }
    {
        css::uno::Reference< Interface1 > i(new Impl1);
        css::uno::Reference< Interface1 > b(i);
        ASSERT_TRUE(!(a >>= b) && b == i) << "Interface1";
    }
}

TEST_F(Test, testChar) {
    sal_Unicode c = '1';
    css::uno::Any a(&c, getCppuType< sal_Unicode >());
    ASSERT_TRUE(a.getValueType() == getCppuType< sal_Unicode >());
    {
        bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "bool";
    }
    {
        sal_Bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "sal_Bool";
    }
    {
        sal_Int8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int8";
    }
    {
        sal_uInt8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt8";
    }
    {
        sal_Int16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int16";
    }
    {
        sal_uInt16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt16";
    }
    {
        sal_Int32 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int32";
    }
    {
        sal_uInt32 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt32";
    }
    {
        sal_Int64 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int64";
    }
    {
        sal_uInt64 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt64";
    }
    {
        float b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "float";
    }
    {
        double b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "double";
    }
    {
        sal_Unicode b = '2';
        if (boost::is_same< sal_Unicode, sal_uInt16 >::value) {
            ASSERT_TRUE(!(a >>= b) && b == '2') << "@sal_Unicode";
        } else {
            ASSERT_TRUE((a >>= b) && b == '1') << "sal_Unicode";
        }
    }
    {
        rtl::OUString b(RTL_CONSTASCII_USTRINGPARAM("2"));
        ASSERT_TRUE(!(a >>= b) && b.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("2"))) <<
            "rtl::OUString";
    }
    {
        css::uno::Type b(getCppuType< rtl::OUString >());
        ASSERT_TRUE(!(a >>= b) && b == getCppuType< rtl::OUString >()) <<
            "css::uno::Type";
    }
    {
        css::uno::Any b(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("2")));
        ASSERT_TRUE((a >>= b) && b == a) << "css::uno::Any";
    }
    {
        css::uno::Sequence< rtl::OUString > b(2);
        ASSERT_TRUE(!(a >>= b) && b.getLength() == 2) <<
            "css::uno::Sequence<rtl::OUString>";
    }
    {
        Enum1 b = Enum1_M2;
        ASSERT_TRUE(!(a >>= b) && b == Enum1_M2) << "Enum1";
    }
    {
        Struct1 b(2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Struct1";
    }
    {
        Exception1 b(
            rtl::OUString(), css::uno::Reference< css::uno::XInterface >(), 2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Exception1";
    }
    {
        css::uno::Reference< Interface1 > i(new Impl1);
        css::uno::Reference< Interface1 > b(i);
        ASSERT_TRUE(!(a >>= b) && b == i) << "Interface1";
    }
}

TEST_F(Test, testString) {
    css::uno::Any a(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("1")));
    ASSERT_TRUE(a.getValueType() == getCppuType< rtl::OUString >());
    {
        bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "bool";
    }
    {
        sal_Bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "sal_Bool";
    }
    {
        sal_Int8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int8";
    }
    {
        sal_uInt8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt8";
    }
    {
        sal_Int16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int16";
    }
    {
        sal_uInt16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt16";
    }
    {
        sal_Int32 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int32";
    }
    {
        sal_uInt32 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt32";
    }
    {
        sal_Int64 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int64";
    }
    {
        sal_uInt64 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt64";
    }
    {
        float b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "float";
    }
    {
        double b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "double";
    }
    {
        sal_Unicode b = '2';
        ASSERT_TRUE(!(a >>= b) && b == '2') << "sal_Unicode";
    }
    {
        rtl::OUString b(RTL_CONSTASCII_USTRINGPARAM("2"));
        ASSERT_TRUE((a >>= b) && b.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("1"))) <<
            "rtl::OUString";
    }
    {
        css::uno::Type b(getCppuType< rtl::OUString >());
        ASSERT_TRUE(!(a >>= b) && b == getCppuType< rtl::OUString >()) <<
            "css::uno::Type";
    }
    {
        css::uno::Any b(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("2")));
        ASSERT_TRUE((a >>= b) && b == a) << "css::uno::Any";
    }
    {
        css::uno::Sequence< rtl::OUString > b(2);
        ASSERT_TRUE(!(a >>= b) && b.getLength() == 2) <<
            "css::uno::Sequence<rtl::OUString>";
    }
    {
        Enum1 b = Enum1_M2;
        ASSERT_TRUE(!(a >>= b) && b == Enum1_M2) << "Enum1";
    }
    {
        Struct1 b(2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Struct1";
    }
    {
        Exception1 b(
            rtl::OUString(), css::uno::Reference< css::uno::XInterface >(), 2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Exception1";
    }
    {
        css::uno::Reference< Interface1 > i(new Impl1);
        css::uno::Reference< Interface1 > b(i);
        ASSERT_TRUE(!(a >>= b) && b == i) << "Interface1";
    }
}

TEST_F(Test, testType) {
    css::uno::Any a(getCppuType< sal_Int32 >());
    ASSERT_TRUE(a.getValueType() == getCppuType< css::uno::Type >());
    {
        bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "bool";
    }
    {
        sal_Bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "sal_Bool";
    }
    {
        sal_Int8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int8";
    }
    {
        sal_uInt8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt8";
    }
    {
        sal_Int16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int16";
    }
    {
        sal_uInt16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt16";
    }
    {
        sal_Int32 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int32";
    }
    {
        sal_uInt32 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt32";
    }
    {
        sal_Int64 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int64";
    }
    {
        sal_uInt64 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt64";
    }
    {
        float b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "float";
    }
    {
        double b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "double";
    }
    {
        sal_Unicode b = '2';
        ASSERT_TRUE(!(a >>= b) && b == '2') << "sal_Unicode";
    }
    {
        rtl::OUString b(RTL_CONSTASCII_USTRINGPARAM("2"));
        ASSERT_TRUE(!(a >>= b) && b.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("2"))) <<
            "rtl::OUString";
    }
    {
        css::uno::Type b(getCppuType< rtl::OUString >());
        ASSERT_TRUE((a >>= b) && b == getCppuType< sal_Int32 >()) <<
            "css::uno::Type";
    }
    {
        css::uno::Any b(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("2")));
        ASSERT_TRUE((a >>= b) && b == a) << "css::uno::Any";
    }
    {
        css::uno::Sequence< rtl::OUString > b(2);
        ASSERT_TRUE(!(a >>= b) && b.getLength() == 2) <<
            "css::uno::Sequence<rtl::OUString>";
    }
    {
        Enum1 b = Enum1_M2;
        ASSERT_TRUE(!(a >>= b) && b == Enum1_M2) << "Enum1";
    }
    {
        Struct1 b(2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Struct1";
    }
    {
        Exception1 b(
            rtl::OUString(), css::uno::Reference< css::uno::XInterface >(), 2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Exception1";
    }
    {
        css::uno::Reference< Interface1 > i(new Impl1);
        css::uno::Reference< Interface1 > b(i);
        ASSERT_TRUE(!(a >>= b) && b == i) << "Interface1";
    }
}

TEST_F(Test, testSequence) {
    sal_Int32 n = 1;
    css::uno::Any a(css::uno::Sequence< sal_Int32 >(&n, 1));
    ASSERT_TRUE(
        a.getValueType() == getCppuType< css::uno::Sequence< sal_Int32 > >());
    {
        bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "bool";
    }
    {
        sal_Bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "sal_Bool";
    }
    {
        sal_Int8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int8";
    }
    {
        sal_uInt8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt8";
    }
    {
        sal_Int16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int16";
    }
    {
        sal_uInt16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt16";
    }
    {
        sal_Int32 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int32";
    }
    {
        sal_uInt32 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt32";
    }
    {
        sal_Int64 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int64";
    }
    {
        sal_uInt64 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt64";
    }
    {
        float b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "float";
    }
    {
        double b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "double";
    }
    {
        sal_Unicode b = '2';
        ASSERT_TRUE(!(a >>= b) && b == '2') << "sal_Unicode";
    }
    {
        rtl::OUString b(RTL_CONSTASCII_USTRINGPARAM("2"));
        ASSERT_TRUE(!(a >>= b) && b.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("2"))) <<
            "rtl::OUString";
    }
    {
        css::uno::Type b(getCppuType< rtl::OUString >());
        ASSERT_TRUE(!(a >>= b) && b == getCppuType< rtl::OUString >()) <<
            "css::uno::Type";
    }
    {
        css::uno::Any b(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("2")));
        ASSERT_TRUE((a >>= b) && b == a) << "css::uno::Any";
    }
    {
        css::uno::Sequence< rtl::OUString > b(2);
        ASSERT_TRUE(!(a >>= b) && b.getLength() == 2) <<
            "css::uno::Sequence<rtl::OUString>";
    }
    {
        css::uno::Sequence< sal_Int32 > b(2);
        ASSERT_TRUE((a >>= b) && b.getLength() == 1 && b[0] == 1) <<
            "css::uno::Sequence<sal_Int32>";
    }
    {
        Enum1 b = Enum1_M2;
        ASSERT_TRUE(!(a >>= b) && b == Enum1_M2) << "Enum1";
    }
    {
        Struct1 b(2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Struct1";
    }
    {
        Exception1 b(
            rtl::OUString(), css::uno::Reference< css::uno::XInterface >(), 2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Exception1";
    }
    {
        css::uno::Reference< Interface1 > i(new Impl1);
        css::uno::Reference< Interface1 > b(i);
        ASSERT_TRUE(!(a >>= b) && b == i) << "Interface1";
    }
}

TEST_F(Test, testEnum) {
    css::uno::Any a(Enum2_M1);
    ASSERT_TRUE(a.getValueType() == getCppuType< Enum2 >());
    {
        bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "bool";
    }
    {
        sal_Bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "sal_Bool";
    }
    {
        sal_Int8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int8";
    }
    {
        sal_uInt8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt8";
    }
    {
        sal_Int16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int16";
    }
    {
        sal_uInt16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt16";
    }
    {
        sal_Int32 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int32";
    }
    {
        sal_uInt32 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt32";
    }
    {
        sal_Int64 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int64";
    }
    {
        sal_uInt64 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt64";
    }
    {
        float b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "float";
    }
    {
        double b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "double";
    }
    {
        sal_Unicode b = '2';
        ASSERT_TRUE(!(a >>= b) && b == '2') << "sal_Unicode";
    }
    {
        rtl::OUString b(RTL_CONSTASCII_USTRINGPARAM("2"));
        ASSERT_TRUE(!(a >>= b) && b.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("2"))) <<
            "rtl::OUString";
    }
    {
        css::uno::Type b(getCppuType< rtl::OUString >());
        ASSERT_TRUE(!(a >>= b) && b == getCppuType< rtl::OUString >()) <<
            "css::uno::Type";
    }
    {
        css::uno::Any b(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("2")));
        ASSERT_TRUE((a >>= b) && b == a) << "css::uno::Any";
    }
    {
        css::uno::Sequence< rtl::OUString > b(2);
        ASSERT_TRUE(!(a >>= b) && b.getLength() == 2) <<
            "css::uno::Sequence<rtl::OUString>";
    }
    {
        Enum1 b = Enum1_M2;
        ASSERT_TRUE(!(a >>= b) && b == Enum1_M2) << "Enum1";
    }
    {
        Enum2 b = Enum2_M2;
        ASSERT_TRUE((a >>= b) && b == Enum2_M1) << "Enum2";
    }
    {
        Struct1 b(2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Struct1";
    }
    {
        Exception1 b(
            rtl::OUString(), css::uno::Reference< css::uno::XInterface >(), 2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Exception1";
    }
    {
        css::uno::Reference< Interface1 > i(new Impl1);
        css::uno::Reference< Interface1 > b(i);
        ASSERT_TRUE(!(a >>= b) && b == i) << "Interface1";
    }
}

TEST_F(Test, testStruct) {
    css::uno::Any a(Struct2a(1, 3));
    ASSERT_TRUE(a.getValueType() == getCppuType< Struct2a >());
    {
        bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "bool";
    }
    {
        sal_Bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "sal_Bool";
    }
    {
        sal_Int8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int8";
    }
    {
        sal_uInt8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt8";
    }
    {
        sal_Int16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int16";
    }
    {
        sal_uInt16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt16";
    }
    {
        sal_Int32 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int32";
    }
    {
        sal_uInt32 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt32";
    }
    {
        sal_Int64 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int64";
    }
    {
        sal_uInt64 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt64";
    }
    {
        float b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "float";
    }
    {
        double b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "double";
    }
    {
        sal_Unicode b = '2';
        ASSERT_TRUE(!(a >>= b) && b == '2') << "sal_Unicode";
    }
    {
        rtl::OUString b(RTL_CONSTASCII_USTRINGPARAM("2"));
        ASSERT_TRUE(!(a >>= b) && b.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("2"))) <<
            "rtl::OUString";
    }
    {
        css::uno::Type b(getCppuType< rtl::OUString >());
        ASSERT_TRUE(!(a >>= b) && b == getCppuType< rtl::OUString >()) <<
            "css::uno::Type";
    }
    {
        css::uno::Any b(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("2")));
        ASSERT_TRUE((a >>= b) && b == a) << "css::uno::Any";
    }
    {
        css::uno::Sequence< rtl::OUString > b(2);
        ASSERT_TRUE(!(a >>= b) && b.getLength() == 2) <<
            "css::uno::Sequence<rtl::OUString>";
    }
    {
        Enum1 b = Enum1_M2;
        ASSERT_TRUE(!(a >>= b) && b == Enum1_M2) << "Enum1";
    }
    {
        Struct1 b(2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Struct1";
    }
    {
        Struct2 b(2);
        ASSERT_TRUE((a >>= b) && b.member == 1) << "Struct2";
    }
    {
        Struct2a b(2, 2);
        ASSERT_TRUE((a >>= b) && b.member == 1 && b.member2 == 3) <<
            "Struct2a";
    }
    {
        Struct2b b(2, 2, 2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Struct2b";
    }
    {
        Exception1 b(
            rtl::OUString(), css::uno::Reference< css::uno::XInterface >(), 2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Exception1";
    }
    {
        css::uno::Reference< Interface1 > i(new Impl1);
        css::uno::Reference< Interface1 > b(i);
        ASSERT_TRUE(!(a >>= b) && b == i) << "Interface1";
    }
}

TEST_F(Test, testPoly) {
    css::uno::Any a;
    a <<= Poly< css::uno::Sequence< ::sal_Unicode > >();
    ASSERT_TRUE(a.getValueType().getTypeName().equalsAsciiL(
            RTL_CONSTASCII_STRINGPARAM("Poly<[]char>"))) <<
        "type name";
    ASSERT_TRUE(a == css::uno::Any(Poly< css::uno::Sequence< ::sal_Unicode > >())) <<
        "constructor";
}

TEST_F(Test, testException) {
    css::uno::Any a(
        Exception2a(
            rtl::OUString(), css::uno::Reference< css::uno::XInterface >(), 1,
            3));
    ASSERT_TRUE(a.getValueType() == getCppuType< Exception2a >());
    {
        bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "bool";
    }
    {
        sal_Bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "sal_Bool";
    }
    {
        sal_Int8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int8";
    }
    {
        sal_uInt8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt8";
    }
    {
        sal_Int16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int16";
    }
    {
        sal_uInt16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt16";
    }
    {
        sal_Int32 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int32";
    }
    {
        sal_uInt32 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt32";
    }
    {
        sal_Int64 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int64";
    }
    {
        sal_uInt64 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt64";
    }
    {
        float b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "float";
    }
    {
        double b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "double";
    }
    {
        sal_Unicode b = '2';
        ASSERT_TRUE(!(a >>= b) && b == '2') << "sal_Unicode";
    }
    {
        rtl::OUString b(RTL_CONSTASCII_USTRINGPARAM("2"));
        ASSERT_TRUE(!(a >>= b) && b.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("2"))) <<
            "rtl::OUString";
    }
    {
        css::uno::Type b(getCppuType< rtl::OUString >());
        ASSERT_TRUE(!(a >>= b) && b == getCppuType< rtl::OUString >()) <<
            "css::uno::Type";
    }
    {
        css::uno::Any b(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("2")));
        ASSERT_TRUE((a >>= b) && b == a) << "css::uno::Any";
    }
    {
        css::uno::Sequence< rtl::OUString > b(2);
        ASSERT_TRUE(!(a >>= b) && b.getLength() == 2) <<
            "css::uno::Sequence<rtl::OUString>";
    }
    {
        Enum1 b = Enum1_M2;
        ASSERT_TRUE(!(a >>= b) && b == Enum1_M2) << "Enum1";
    }
    {
        Struct1 b(2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Struct1";
    }
    {
        Exception1 b(
            rtl::OUString(), css::uno::Reference< css::uno::XInterface >(), 2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Exception1";
    }
    {
        Exception2 b(
            rtl::OUString(), css::uno::Reference< css::uno::XInterface >(), 2);
        ASSERT_TRUE((a >>= b) && b.member == 1) << "Exception2";
    }
    {
        Exception2a b(
            rtl::OUString(), css::uno::Reference< css::uno::XInterface >(), 2,
            2);
        ASSERT_TRUE((a >>= b) && b.member == 1 && b.member2 == 3) <<
            "Exception2a";
    }
    {
        Exception2b b(
            rtl::OUString(), css::uno::Reference< css::uno::XInterface >(), 2,
            2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Exception2b";
    }
    {
        css::uno::Reference< Interface1 > i(new Impl1);
        css::uno::Reference< Interface1 > b(i);
        ASSERT_TRUE(!(a >>= b) && b == i) << "Interface1";
    }
}

TEST_F(Test, testInterface) {
    css::uno::Reference< Interface2a > i2(new Impl2);
    css::uno::Any a(i2);
    ASSERT_TRUE(
        a.getValueType()
        == getCppuType< css::uno::Reference< Interface2a > >());
    {
        bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "bool";
    }
    {
        sal_Bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "sal_Bool";
    }
    {
        sal_Int8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int8";
    }
    {
        sal_uInt8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt8";
    }
    {
        sal_Int16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int16";
    }
    {
        sal_uInt16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt16";
    }
    {
        sal_Int32 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int32";
    }
    {
        sal_uInt32 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt32";
    }
    {
        sal_Int64 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int64";
    }
    {
        sal_uInt64 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt64";
    }
    {
        float b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "float";
    }
    {
        double b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "double";
    }
    {
        sal_Unicode b = '2';
        ASSERT_TRUE(!(a >>= b) && b == '2') << "sal_Unicode";
    }
    {
        rtl::OUString b(RTL_CONSTASCII_USTRINGPARAM("2"));
        ASSERT_TRUE(!(a >>= b) && b.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("2"))) <<
            "rtl::OUString";
    }
    {
        css::uno::Type b(getCppuType< rtl::OUString >());
        ASSERT_TRUE(!(a >>= b) && b == getCppuType< rtl::OUString >()) <<
            "css::uno::Type";
    }
    {
        css::uno::Any b(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("2")));
        ASSERT_TRUE((a >>= b) && b == a) << "css::uno::Any";
    }
    {
        css::uno::Sequence< rtl::OUString > b(2);
        ASSERT_TRUE(!(a >>= b) && b.getLength() == 2) <<
            "css::uno::Sequence<rtl::OUString>";
    }
    {
        Enum1 b = Enum1_M2;
        ASSERT_TRUE(!(a >>= b) && b == Enum1_M2) << "Enum1";
    }
    {
        Struct1 b(2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Struct1";
    }
    {
        Exception1 b(
            rtl::OUString(), css::uno::Reference< css::uno::XInterface >(), 2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Exception1";
    }
    {
        css::uno::Reference< Interface1 > i(new Impl1);
        css::uno::Reference< Interface1 > b(i);
        ASSERT_TRUE(!(a >>= b) && b == i) << "Interface1";
    }
    {
        css::uno::Reference< Interface2 > b(new Impl2);
        ASSERT_TRUE((a >>= b) && b == i2) << "Interface2";
    }
    {
        css::uno::Reference< Interface2a > b(new Impl2);
        ASSERT_TRUE((a >>= b) && b == i2) << "Interface2a";
    }
    {
        css::uno::Reference< Interface2b > i(new Impl2b);
        css::uno::Reference< Interface2b > b(i);
        ASSERT_TRUE(!(a >>= b) && b == i) << "Interface2b";
    }
    {
        css::uno::Reference< Interface3 > b(new Impl2);
        ASSERT_TRUE((a >>= b) && b == i2) << "Interface3";
    }
}

TEST_F(Test, testNull) {
    css::uno::Any a = css::uno::Any(css::uno::Reference< Interface2a >());
    ASSERT_TRUE(
        a.getValueType()
        == getCppuType< css::uno::Reference< Interface2a > >());
    {
        bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "bool";
    }
    {
        sal_Bool b = true;
        ASSERT_TRUE(!(a >>= b) && b) << "sal_Bool";
    }
    {
        sal_Int8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int8";
    }
    {
        sal_uInt8 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt8";
    }
    {
        sal_Int16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int16";
    }
    {
        sal_uInt16 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt16";
    }
    {
        sal_Int32 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int32";
    }
    {
        sal_uInt32 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt32";
    }
    {
        sal_Int64 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_Int64";
    }
    {
        sal_uInt64 b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "sal_uInt64";
    }
    {
        float b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "float";
    }
    {
        double b = 2;
        ASSERT_TRUE(!(a >>= b) && b == 2) << "double";
    }
    {
        sal_Unicode b = '2';
        ASSERT_TRUE(!(a >>= b) && b == '2') << "sal_Unicode";
    }
    {
        rtl::OUString b(RTL_CONSTASCII_USTRINGPARAM("2"));
        ASSERT_TRUE(!(a >>= b) && b.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("2"))) <<
            "rtl::OUString";
    }
    {
        css::uno::Type b(getCppuType< rtl::OUString >());
        ASSERT_TRUE(!(a >>= b) && b == getCppuType< rtl::OUString >()) <<
            "css::uno::Type";
    }
    {
        css::uno::Any b(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("2")));
        ASSERT_TRUE((a >>= b) && b == a) << "css::uno::Any";
    }
    {
        css::uno::Sequence< rtl::OUString > b(2);
        ASSERT_TRUE(!(a >>= b) && b.getLength() == 2) <<
            "css::uno::Sequence<rtl::OUString>";
    }
    {
        Enum1 b = Enum1_M2;
        ASSERT_TRUE(!(a >>= b) && b == Enum1_M2) << "Enum1";
    }
    {
        Struct1 b(2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Struct1";
    }
    {
        Exception1 b(
            rtl::OUString(), css::uno::Reference< css::uno::XInterface >(), 2);
        ASSERT_TRUE(!(a >>= b) && b.member == 2) << "Exception1";
    }
    {
        css::uno::Reference< Interface1 > b(new Impl1);
        ASSERT_TRUE((a >>= b) && !b.is()) <<
            "Interface1";
    }
    {
        css::uno::Reference< Interface2 > b(new Impl2);
        ASSERT_TRUE((a >>= b) && !b.is()) <<
            "Interface2";
    }
    {
        css::uno::Reference< Interface2a > b(new Impl2);
        ASSERT_TRUE((a >>= b) && !b.is()) << "Interface2a";
    }
    {
        css::uno::Reference< Interface2b > b(new Impl2b);
        ASSERT_TRUE((a >>= b) && !b.is()) <<
            "Interface2b";
    }
    {
        css::uno::Reference< Interface3 > b(new Impl2);
        ASSERT_TRUE((a >>= b) && !b.is()) <<
            "Interface3";
    }
}

}
