public void IsOperatorRefCounterTest()
        {
            // operator is is increment com ref count - but RCW cleanup free's both references.
            // (This is a change from .net 3.5 -> 4.0)
            var item1 = Xpcom.CreateInstance <nsISupports>(Contracts.Array);
            var ptr   = Marshal.GetIUnknownForObject(item1);

            Marshal.Release(ptr);

            int comCount1 = ComDebug.GetComRefCount(item1);
            int rcwCount1 = ComDebug.GetRcwRefCount(item1);

            bool test = item1 is nsIArray;

            int comCount2 = ComDebug.GetComRefCount(item1);
            int rcwCount2 = ComDebug.GetRcwRefCount(item1);

            Marshal.AddRef(ptr);
            int free = Marshal.ReleaseComObject(item1);

            Assert.AreEqual(0, Marshal.Release(ptr), "Releasing the RCW by ReleaseComObject should have called Release twice.");

            Assert.AreEqual(1, comCount2 - comCount1);
            Assert.AreEqual(0, rcwCount2 - rcwCount1);
            Assert.AreEqual(0, free);
        }
        public void QueryInterfaceRefCounterTest()
        {
            var item1 = Xpcom.CreateInstance <nsISupports>(Contracts.Array);
            var ptr   = Marshal.GetIUnknownForObject(item1);

            Marshal.Release(ptr);

            int comCount1 = ComDebug.GetComRefCount(item1);
            int rcwCount1 = ComDebug.GetRcwRefCount(item1);

            var item2 = Xpcom.QueryInterface <nsIArray>(item1);

            int comCount2 = ComDebug.GetComRefCount(item2);
            int rcwCount2 = ComDebug.GetRcwRefCount(item2);

            Marshal.AddRef(ptr);
            int free1 = Marshal.ReleaseComObject(item2);
            int free2 = Marshal.ReleaseComObject(item1);

            Assert.AreEqual(0, Marshal.Release(ptr));


            Assert.AreEqual(1, comCount2 - comCount1);
            Assert.AreEqual(1, rcwCount2 - rcwCount1);
            Assert.AreEqual(1, free1);
            Assert.AreEqual(0, free2);
        }
        public void GetStringCounter()
        {
            var service  = Xpcom.GetService2 <nsIXULRuntime>(Contracts.XulRuntime);
            int comCount = ComDebug.GetComRefCount(service.Instance);
            int rcwCount = ComDebug.GetRcwRefCount(service.Instance);

            var os = nsString.Get(service.Instance.GetOSAttribute);

            int comCount1 = ComDebug.GetComRefCount(service.Instance);
            int rcwCount1 = ComDebug.GetRcwRefCount(service.Instance);
        }
        public void CreatationRefCounterTest(string contract)
        {
            var item = Xpcom.CreateInstance <nsISupports>(contract);

            int comCount             = ComDebug.GetComRefCount(item);
            int runtimeWrappersCount = ComDebug.GetRcwRefCount(item);

            int freeCount = Marshal.ReleaseComObject(item);

            Assert.AreEqual(2, comCount);
            Assert.AreEqual(1, runtimeWrappersCount);
            Assert.AreEqual(0, freeCount);
        }
        public void IsOperatorRefCounterTest()
        {
            // operator is is NOT increment counters
            var item1 = Xpcom.CreateInstance <nsISupports>(Contracts.Array);

            int comCount1 = ComDebug.GetComRefCount(item1);
            int rcwCount1 = ComDebug.GetRcwRefCount(item1);

            bool test = item1 is nsIArray;

            int comCount2 = ComDebug.GetComRefCount(item1);
            int rcwCount2 = ComDebug.GetRcwRefCount(item1);

            int free = Marshal.ReleaseComObject(item1);

            Assert.AreEqual(0, comCount2 - comCount1);
            Assert.AreEqual(0, rcwCount2 - rcwCount1);
            Assert.AreEqual(0, free);
        }
        public void ExplicitOperatorRefCounterTest()
        {
            // operator explicit is NOT increment counters
            var item1 = Xpcom.CreateInstance <nsISupports>(Contracts.Array);

            int comCount = ComDebug.GetComRefCount(item1);
            int rcwCount = ComDebug.GetRcwRefCount(item1);

            nsIArray item2 = (nsIArray)item1;

            int comCount1 = ComDebug.GetComRefCount(item1);
            int rcwCount1 = ComDebug.GetRcwRefCount(item1);
            int comCount2 = ComDebug.GetComRefCount(item2);
            int rcwCount2 = ComDebug.GetRcwRefCount(item2);

            int free = Marshal.ReleaseComObject(item2);

            Assert.AreEqual(0, comCount2 - comCount1);
            Assert.AreEqual(0, rcwCount2 - rcwCount1);
            Assert.AreEqual(0, comCount2 - comCount);
            Assert.AreEqual(0, rcwCount2 - rcwCount);
            Assert.AreEqual(0, free);
        }