From c233bafeb2312a413c08b8fc466abbab83d81ea9 Mon Sep 17 00:00:00 2001 From: Kazuki Sakamoto Date: Fri, 7 Oct 2016 11:07:50 -0700 Subject: [PATCH] Introduce CSSNodeGetInstanceCount API Summary: - Add CSSNodeGetInstanceCount API to get the number of native instances. - It makes testing easy. Reviewed By: emilsjolander Differential Revision: D3981990 fbshipit-source-id: 98005ae1fc21d4c8802f24030fff9ffb00bd292d --- CSSLayout/CSSLayout.c | 8 ++++ CSSLayout/CSSLayout.h | 1 + csharp/Facebook.CSSLayout/CSSNode.cs | 5 +++ csharp/Facebook.CSSLayout/Native.cs | 3 ++ .../csharp/Facebook.CSSLayout/CSSNodeTest.cs | 38 +++++++++++++++++++ 5 files changed, 55 insertions(+) diff --git a/CSSLayout/CSSLayout.c b/CSSLayout/CSSLayout.c index 967647b2..ba1b10c6 100644 --- a/CSSLayout/CSSLayout.c +++ b/CSSLayout/CSSLayout.c @@ -129,9 +129,12 @@ computedEdgeValue(const float edges[CSSEdgeCount], const CSSEdge edge, const flo return defaultValue; } +static int32_t gNodeInstanceCount = 0; + CSSNodeRef CSSNodeNew() { const CSSNodeRef node = calloc(1, sizeof(CSSNode)); CSS_ASSERT(node, "Could not allocate memory for node"); + gNodeInstanceCount++; CSSNodeInit(node); return node; @@ -140,6 +143,7 @@ CSSNodeRef CSSNodeNew() { void CSSNodeFree(const CSSNodeRef node) { CSSNodeListFree(node->children); free(node); + gNodeInstanceCount--; } void CSSNodeFreeRecursive(const CSSNodeRef root) { @@ -151,6 +155,10 @@ void CSSNodeFreeRecursive(const CSSNodeRef root) { CSSNodeFree(root); } +int32_t CSSNodeGetInstanceCount() { + return gNodeInstanceCount; +} + void CSSNodeInit(const CSSNodeRef node) { node->parent = NULL; node->children = CSSNodeListNew(4); diff --git a/CSSLayout/CSSLayout.h b/CSSLayout/CSSLayout.h index fd18f276..ea532bbb 100644 --- a/CSSLayout/CSSLayout.h +++ b/CSSLayout/CSSLayout.h @@ -127,6 +127,7 @@ WIN_EXPORT CSSNodeRef CSSNodeNew(); WIN_EXPORT void CSSNodeInit(const CSSNodeRef node); WIN_EXPORT void CSSNodeFree(const CSSNodeRef node); WIN_EXPORT void CSSNodeFreeRecursive(const CSSNodeRef node); +WIN_EXPORT int32_t CSSNodeGetInstanceCount(); WIN_EXPORT void CSSNodeInsertChild(const CSSNodeRef node, const CSSNodeRef child, const uint32_t index); WIN_EXPORT void CSSNodeRemoveChild(const CSSNodeRef node, const CSSNodeRef child); diff --git a/csharp/Facebook.CSSLayout/CSSNode.cs b/csharp/Facebook.CSSLayout/CSSNode.cs index c17b1b00..63f029f0 100644 --- a/csharp/Facebook.CSSLayout/CSSNode.cs +++ b/csharp/Facebook.CSSLayout/CSSNode.cs @@ -711,5 +711,10 @@ namespace Facebook.CSSLayout { return ((IEnumerable)_children).GetEnumerator(); } + + public static int GetInstanceCount() + { + return Native.CSSNodeGetInstanceCount(); + } } } diff --git a/csharp/Facebook.CSSLayout/Native.cs b/csharp/Facebook.CSSLayout/Native.cs index d037aed4..8546d32d 100644 --- a/csharp/Facebook.CSSLayout/Native.cs +++ b/csharp/Facebook.CSSLayout/Native.cs @@ -29,6 +29,9 @@ namespace Facebook.CSSLayout [DllImport(DllName)] public static extern void CSSNodeFree(IntPtr cssNode); + [DllImport(DllName)] + public static extern int CSSNodeGetInstanceCount(); + [DllImport(DllName)] public static extern void CSSNodeInsertChild(IntPtr node, IntPtr child, uint index); diff --git a/tests/csharp/Facebook.CSSLayout/CSSNodeTest.cs b/tests/csharp/Facebook.CSSLayout/CSSNodeTest.cs index 67cc803a..87a5e97d 100644 --- a/tests/csharp/Facebook.CSSLayout/CSSNodeTest.cs +++ b/tests/csharp/Facebook.CSSLayout/CSSNodeTest.cs @@ -8,6 +8,7 @@ */ using NUnit.Framework; +using System; /** * Tests for {@link CSSNode}. @@ -87,16 +88,53 @@ namespace Facebook.CSSLayout [Test] public void TestDispose() { + ForceGC(); + Assert.AreEqual(0, CSSNode.GetInstanceCount()); CSSNode node = new CSSNode(); + Assert.AreEqual(0, CSSNode.GetInstanceCount()); node.Initialize(); + Assert.AreEqual(1, CSSNode.GetInstanceCount()); node.Dispose(); + Assert.AreEqual(0, CSSNode.GetInstanceCount()); + } + + [Test] + public void TestDisposeWithUsing() + { + ForceGC(); + Assert.AreEqual(0, CSSNode.GetInstanceCount()); + using (CSSNode node = new CSSNode()) + { + Assert.AreEqual(0, CSSNode.GetInstanceCount()); + node.Initialize(); + Assert.AreEqual(1, CSSNode.GetInstanceCount()); + } + Assert.AreEqual(0, CSSNode.GetInstanceCount()); } [Test] public void TestDestructor() + { + ForceGC(); + Assert.AreEqual(0, CSSNode.GetInstanceCount()); + TestDestructorFunc(); + ForceGC(); + Assert.AreEqual(0, CSSNode.GetInstanceCount()); + } + + private void TestDestructorFunc() { CSSNode node = new CSSNode(); + Assert.AreEqual(0, CSSNode.GetInstanceCount()); node.Initialize(); + Assert.AreEqual(1, CSSNode.GetInstanceCount()); + node = null; + } + + private void ForceGC() + { + GC.Collect(GC.MaxGeneration); + GC.WaitForPendingFinalizers(); } } }