<!-- (c) Electronic Arts. All Rights Reserved. -->
<TESTCLASS>

    <CLASS NAME="UnitTestSoa4Mask4" HEADER="soa4_mask4test.h" SOURCE="soa4_mask4test.inc" RWGENERICHEADER="" RWHOSTHEADER="" GENERIC="false" HOST="false" RWCOMMONHEADER="rw/math/vpu/soa4_mask4.h rw/math/vpu/soa4_mask4_operation.h rw/math/vpu/soa4_maskscalar.h rw/math/vpu/soa4_maskscalar_operation.h" COMMON="true">


    <TYPE NAME="function">

        <TYPE NAME="correctness">

        <TEST NAME="soa4mask4_construction">
        <![CDATA[
            SetFunctionName("Soa4Mask4()");

            {
                Soa4Mask4 s;
                Validate( true );
            }

            //-----------------------------------------------------------------------

            SetFunctionName("Soa4Mask4(const Soa4Mask4&)");

            {
                Soa4Mask4 a( mAllTrue );
                Soa4Mask4 b( mAllFalse );

                Validate( IsEqual( mAllTrue, a ) && IsEqual( mAllFalse, b ) );
            }
            
            //-----------------------------------------------------------------------

            SetFunctionName("operator =(const Soa4Mask4&)");

            {
                Soa4Mask4 a = mAllTrue;
                Soa4Mask4 b = mAllFalse;

                Validate( IsEqual( mAllTrue, a ) && IsEqual( mAllFalse, b ) );
            }


            //-----------------------------------------------------------------------

            SetFunctionName("Soa4Mask4(Soa4MaskScalar::InParam s)");

            {
                Soa4MaskScalar a = CreateSoa4MaskScalar( true, false, true, false );
                Soa4Mask4 mask( a );

                Validate( IsEqual( mask.x, a ) && IsEqual( mask.y, a ) );
            }

            //-----------------------------------------------------------------------

            SetFunctionName("Soa4Mask4(Soa4MaskScalar::InParam, Soa4MaskScalar::InParam)");

            {
                Soa4MaskScalar a = CreateSoa4MaskScalar( true, false, true, false );
                Soa4MaskScalar b = CreateSoa4MaskScalar( false, true, false, true );
                Soa4MaskScalar c = CreateSoa4MaskScalar( true, false, false, true );
                Soa4MaskScalar d = CreateSoa4MaskScalar( false, true, true, false );
                Soa4Mask4 mask( a, b, c, d );

                Validate( IsEqual( mask.x, a ) && IsEqual( mask.y, b ) && IsEqual( mask.z, c ) && IsEqual( mask.w, d ) );
            }

            //-----------------------------------------------------------------------

            SetFunctionName("Soa4Mask4(VectorIntrinsicInParam, VectorIntrinsicInParam, VectorIntrinsicInParam)");

            {
                Soa4MaskScalar a = CreateSoa4MaskScalar( true, false, true, false );
                Soa4MaskScalar b = CreateSoa4MaskScalar( false, true, false, true );
                Soa4MaskScalar c = CreateSoa4MaskScalar( true, false, false, true );
                Soa4MaskScalar d = CreateSoa4MaskScalar( false, true, true, false );

                Soa4Mask4 mask( a.mV, b.mV, c.mV, d.mV );

                Validate( IsEqual( mask.x, a ) && IsEqual( mask.y, b ) && IsEqual( mask.z, c ) && IsEqual( mask.w, d ) );
            }
        ]]>
        </TEST>
            
        <TEST NAME="member_access">
        <![CDATA[
            SetFunctionName("X() const");

            {
                Soa4Mask4 a( mAllTrue );
                const Soa4MaskScalar& x( a.X() );

                Validate( IsEqual( x, a.x ) );
            }

            //-----------------------------------------------------------------------

            SetFunctionName("X()");

            {
                Soa4Mask4 a( mAllTrue );
                Soa4MaskScalar falseMask = CreateSoa4MaskScalar( false, false, false, false );
                a.X() = falseMask;

                Validate( IsEqual( a.x, falseMask ) );
            }

            //-----------------------------------------------------------------------

            SetFunctionName("Y() const");

            {
                Soa4Mask4 a( mAllFalse );
                const Soa4MaskScalar& y( a.Y() );

                Validate( IsEqual( y, a.y ) );           
            }

            //-----------------------------------------------------------------------

            SetFunctionName("Y()");

            {
                Soa4Mask4 a( mAllTrue );
                Soa4MaskScalar falseMask = CreateSoa4MaskScalar( false, false, false, false );
                a.Y() = falseMask;

                Validate( IsEqual( a.y, falseMask ) );
                }

            //-----------------------------------------------------------------------

            SetFunctionName("Z() const");

            {
                Soa4Mask4 a( mAllFalse );
                const Soa4MaskScalar& z( a.Z() );

                Validate( IsEqual( z, a.z ) );           
            }

            //-----------------------------------------------------------------------

            SetFunctionName("Z()");

            {
                Soa4Mask4 a( mAllTrue );
                Soa4MaskScalar falseMask = CreateSoa4MaskScalar( false, false, false, false );
                a.Z() = falseMask;

                Validate( IsEqual( a.z, falseMask ) );
            }
                
            //-----------------------------------------------------------------------

            SetFunctionName("W() const");

            {
                Soa4Mask4 a( mAllFalse );
                const Soa4MaskScalar& w( a.W() );

                Validate( IsEqual( w, a.w ) );           
            }

            //-----------------------------------------------------------------------

            SetFunctionName("W()");

            {
                Soa4Mask4 a( mAllTrue );
                Soa4MaskScalar falseMask = CreateSoa4MaskScalar( false, false, false, false );
                a.W() = falseMask;

                Validate( IsEqual( a.w, falseMask ) );
            }

        ]]>
        </TEST>
           
        <TEST NAME="soa4mask4_operations">
        <![CDATA[
            SetFunctionName("Not");

            {
                Soa4Mask4 a = Not( mAllTrue );
                Validate( IsEqual( a, mAllFalse ) );

                Soa4Mask4 b = Not( mMixed );
                Validate( IsEqual( b.x, mMixed.y ) && IsEqual( b.y, mMixed.x ) && IsEqual( b.z, mMixed.w ) && IsEqual( b.w, mMixed.z ) );
            }

            //-----------------------------------------------------------------------

            SetFunctionName("And");

            {
                Soa4Mask4 a( mMixed.x, mMixed.x, mMixed.x, mMixed.x );
                Soa4Mask4 res = And( a, a );
                Validate( IsEqual( res, a ) );

                Soa4Mask4 b = And( mMixed, mAllFalse );
                Validate( IsEqual( b, mAllFalse ) );
            }

            //-----------------------------------------------------------------------

            SetFunctionName("Or");

            {
                Soa4Mask4 a = Or( mAllFalse, mAllFalse );
                Validate( IsEqual( a, mAllFalse ) );

                a = Or( a, mMixed );
                Validate( IsEqual( a, mMixed ) );

                a = Or( a, mAllTrue );
                Validate( IsEqual( a, mAllTrue ) );
            }

            //-----------------------------------------------------------------------

            SetFunctionName("Xor");
            {
                Soa4Mask4 a = mMixed;

                Soa4Mask4 res = Xor( a, a );
                Validate( IsEqual( res, mAllFalse ) );

                res = Xor( mAllTrue, mAllFalse );
                Validate( IsEqual( res, mAllTrue ) );
            }

            //-----------------------------------------------------------------------
            SetFunctionName("CompEqual");

            {
                Soa4Mask4 a( mMixed.y, mMixed.x, mMixed.w, mMixed.z );
                Soa4Mask4 res = CompEqual( a, mMixed );
                Validate( IsEqual( res, mAllFalse ) );
                
                a = Soa4Mask4( mMixed );
                res = CompEqual( a, mMixed );
                Validate( IsEqual( res, mAllTrue ) );
            }

            //-----------------------------------------------------------------------

            SetFunctionName("CompNotEqual");

            {
                Soa4Mask4 a( mMixed.y, mMixed.x, mMixed.w, mMixed.z );
                Soa4Mask4 res = CompNotEqual( a, mMixed );
                Validate( IsEqual( res, mAllTrue ) );
                
                a = Soa4Mask4( mMixed );
                res = CompNotEqual( a, mMixed );
                Validate( IsEqual( res, mAllFalse ) );
            }

            //-----------------------------------------------------------------------

            SetFunctionName("CompAnyTrue");
            {
                Soa4MaskScalar res = CompAnyTrue( mMixed );
                Validate( IsEqual( res, mAllTrue.x ) );
            }

            //-----------------------------------------------------------------------

            SetFunctionName("CompAllTrue");
            {
                Soa4MaskScalar res = CompAllTrue( mMixed );
                Validate( IsEqual( res, mAllFalse.x ) );

                res = CompAllTrue( mAllTrue );
                Validate( IsEqual( res, mAllTrue.x ) );
            }

            //-----------------------------------------------------------------------

            SetFunctionName("Select(Soa4MaskScalar::InParam mask, Soa4Mask4::InParam trueValue, Soa4Mask4::InParam falseValue )");
            {
                Soa4Mask4 res = Select( mMixed.x, mAllFalse, mAllTrue );
                Soa4Mask4 ref = Soa4Mask4( CreateSoa4MaskScalar( false, true, false, true ), 
                    CreateSoa4MaskScalar( false, true, false, true ),
                    CreateSoa4MaskScalar( false, true, false, true ),
                    CreateSoa4MaskScalar( false, true, false, true ) );
                Validate( IsEqual( res, ref ) );
            }

            //-----------------------------------------------------------------------

            SetFunctionName("Select(Soa4Mask4::InParam mask, Soa4Mask4::InParam trueValue, Soa4Mask4::InParam falseValue )");
            {
                Soa4Mask4 res = Select( mMixed, mAllFalse, mAllTrue );
                Soa4Mask4 ref = Soa4Mask4( CreateSoa4MaskScalar( false, true, false, true ), 
                    CreateSoa4MaskScalar( true, false, true, false ),
                    CreateSoa4MaskScalar( true, false, false, true ),
                    CreateSoa4MaskScalar( false, true, true, false ) );
                Validate( IsEqual( res, ref ) );
            }

        ]]>
        </TEST>

        </TYPE>

        <TYPE NAME="performance">

        </TYPE>

    </TYPE>


</CLASS>

</TESTCLASS>
