public void VerifyIsWrappingReturnsFalseForNoMatch()
        {
            JET_CALLBACK callback = CreateCallback();
            var          wrapper  = new JetCallbackWrapper(callback);

            Assert.IsFalse(wrapper.IsWrapping(CreateCallback()));
            GC.KeepAlive(callback);
        }
        public void VerifyWrapperReturnsReturnCode()
        {
            var wrapper = new JetCallbackWrapper(
                (sesid, dbid, tableid, cbtyp, arg1, arg2, context, unused) => JET_err.WriteConflict);

            Assert.AreEqual(
                JET_err.WriteConflict,
                wrapper.NativeCallback(IntPtr.Zero, 0, IntPtr.Zero, 0, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero));
        }
        public void VerifyWrapperPassesArguments()
        {
            JET_SESID expectedSesid = new JET_SESID {
                Value = (IntPtr)1
            };
            JET_DBID expectedDbid = new JET_DBID {
                Value = 2
            };
            JET_TABLEID expectedTableid = new JET_TABLEID {
                Value = (IntPtr)3
            };
            JET_cbtyp expectedCbtyp   = JET_cbtyp.AfterReplace;
            object    expectedArg1    = null;
            object    expectedArg2    = null;
            IntPtr    expectedContext = (IntPtr)4;

            JET_SESID   actualSesid   = new JET_SESID();
            JET_DBID    actualDbid    = new JET_DBID();
            JET_TABLEID actualTableid = new JET_TABLEID();
            JET_cbtyp   actualCbtyp   = JET_cbtyp.Null;
            object      actualArg1    = null;
            object      actualArg2    = null;
            IntPtr      actualContext = new IntPtr();

            var wrapper = new JetCallbackWrapper(
                (sesid, dbid, tableid, cbtyp, arg1, arg2, context, unused) =>
            {
                actualSesid   = sesid;
                actualDbid    = dbid;
                actualTableid = tableid;
                actualCbtyp   = cbtyp;
                actualArg1    = arg1;
                actualArg2    = arg2;
                actualContext = context;
                return(JET_err.Success);
            });

            wrapper.NativeCallback(
                expectedSesid.Value,
                expectedDbid.Value,
                expectedTableid.Value,
                (uint)expectedCbtyp,
                IntPtr.Zero,
                IntPtr.Zero,
                expectedContext,
                IntPtr.Zero);

            Assert.AreEqual(expectedSesid, actualSesid);
            Assert.AreEqual(expectedDbid, actualDbid);
            Assert.AreEqual(expectedTableid, actualTableid);
            Assert.AreEqual(expectedCbtyp, actualCbtyp);
            Assert.AreEqual(expectedArg1, actualArg1);
            Assert.AreEqual(expectedArg2, actualArg2);
            Assert.AreEqual(expectedContext, actualContext);
        }
        public void VerifyNativeCallbackIsNotGarbageCollected()
        {
            JET_CALLBACK callback = CreateCallback();

            var callbackWrappers       = new CallbackWrappers();
            JetCallbackWrapper wrapper = callbackWrappers.Add(callback);
            WeakReference      weakRef = new WeakReference(wrapper.NativeCallback);

            RunFullGarbageCollection();
            Assert.IsTrue(weakRef.IsAlive);
            GC.KeepAlive(wrapper);
        }
        public void VerifyExceptionInCallbackIsCaught()
        {
            var wrapper = new JetCallbackWrapper(
                (sesid, dbid, tableid, cbtyp, arg1, arg2, context, unused) =>
            {
                throw new ArgumentNullException();
            });

            Assert.AreEqual(
                JET_err.CallbackFailed,
                wrapper.NativeCallback(IntPtr.Zero, 0, IntPtr.Zero, 0, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero));
        }
        public void VerifyWrapperCallsCallback()
        {
            bool callbackWasCalled = false;
            var  wrapper           = new JetCallbackWrapper(
                (sesid, dbid, tableid, cbtyp, arg1, arg2, context, unused) =>
            {
                callbackWasCalled = true;
                return(JET_err.Success);
            });

            wrapper.NativeCallback(IntPtr.Zero, 0, IntPtr.Zero, 0, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
            Assert.IsTrue(callbackWasCalled);
        }