public void Hierarchy_WithHierarchy_AddingIncrementally_MaintainsConsistency()
        {
            var go = m_Objects.CreateGameObject("root");

            IncrementalHierarchyFunctions.Build(new [] { go }, out m_Hierarchy, Allocator.Temp);
            AssertSize(1);
            AssertConsistency(go);
            var c1 = m_Objects.CreateGameObject("c1");

            c1.transform.SetParent(go.transform);
            IncrementalHierarchyFunctions.TryAddSingle(m_Hierarchy, c1);
            AssertSize(2);
            AssertConsistency(go);
            var c2 = m_Objects.CreateGameObject("c2");

            c2.transform.SetParent(go.transform);
            IncrementalHierarchyFunctions.TryAddSingle(m_Hierarchy, c2);
            AssertSize(3);
            AssertConsistency(go);
            var c3 = m_Objects.CreateGameObject("c3");

            c3.transform.SetParent(go.transform);
            IncrementalHierarchyFunctions.TryAddSingle(m_Hierarchy, c3);
            AssertSize(4);
            AssertConsistency(go);
        }
        public void Hierarchy_WithHierarchy_Remove1By1_MaintainsConsistency()
        {
            var go = m_Objects.CreateGameObject("root");
            var c1 = m_Objects.CreateGameObject("c1");

            c1.transform.SetParent(go.transform);
            var c2 = m_Objects.CreateGameObject("c2");

            c2.transform.SetParent(go.transform);
            var c3 = m_Objects.CreateGameObject("c3");

            c3.transform.SetParent(go.transform);
            IncrementalHierarchyFunctions.Build(new [] { go }, out m_Hierarchy, Allocator.Temp);
            AssertSize(4);
            AssertConsistency(go);
            IncrementalHierarchyFunctions.Remove(m_Hierarchy, new NativeArray <int>(new [] { c2.GetInstanceID() }, Allocator.Temp));
            Object.DestroyImmediate(c2);
            AssertSize(3);
            AssertConsistency(go);
            IncrementalHierarchyFunctions.Remove(m_Hierarchy, new NativeArray <int>(new [] { c1.GetInstanceID() }, Allocator.Temp));
            Object.DestroyImmediate(c1);
            AssertSize(2);
            AssertConsistency(go);
            IncrementalHierarchyFunctions.Remove(m_Hierarchy, new NativeArray <int>(new [] { c3.GetInstanceID() }, Allocator.Temp));
            Object.DestroyImmediate(c3);
            AssertSize(1);
            AssertConsistency(go);
            IncrementalHierarchyFunctions.Remove(m_Hierarchy, new NativeArray <int>(new [] { go.GetInstanceID() }, Allocator.Temp));
            Object.DestroyImmediate(go);
            AssertSize(0);
        }
        public void Hierarchy_WithSingleGameObject_IsEmptyAfterDelete()
        {
            var go = m_Objects.CreateGameObject("root");

            IncrementalHierarchyFunctions.Build(new [] { go }, out m_Hierarchy, Allocator.Temp);
            AssertSize(1);
            AssertConsistency(go);
            IncrementalHierarchyFunctions.Remove(m_Hierarchy, new NativeArray <int>(new [] { go.GetInstanceID() }, Allocator.Temp));
            AssertSize(0);
        }
        public void Hierarchy_WithHierarchy_DeleteRemovesFullHierarchy()
        {
            var go = m_Objects.CreateGameObject("root");

            m_Objects.CreateGameObject("c1").transform.SetParent(go.transform);
            m_Objects.CreateGameObject("c2").transform.SetParent(go.transform);
            m_Objects.CreateGameObject("c3").transform.SetParent(go.transform);
            IncrementalHierarchyFunctions.Build(new [] { go }, out m_Hierarchy, Allocator.Temp);
            AssertSize(4);
            AssertConsistency(go);
            IncrementalHierarchyFunctions.Remove(m_Hierarchy, new NativeArray <int>(new [] { go.GetInstanceID() }, Allocator.Temp));
            AssertSize(0);
        }
        public void Hierarchy_WithHierarchy_BuildIsConsistent()
        {
            var go = m_Objects.CreateGameObject("root");
            var c1 = m_Objects.CreateGameObject("c1");

            c1.transform.SetParent(go.transform);
            var c2 = m_Objects.CreateGameObject("c2");

            c2.transform.SetParent(go.transform);
            var c3 = m_Objects.CreateGameObject("c3");

            c3.transform.SetParent(go.transform);
            IncrementalHierarchyFunctions.Build(new [] { go }, out m_Hierarchy, Allocator.Temp);
            AssertSize(4);
            AssertConsistency(go);
        }
        public void Hierarchy_WithHierarchy_DeleteOutOfOrder_MaintainsConsistency()
        {
            var root1 = m_Objects.CreateGameObject("root1");
            var c1    = m_Objects.CreateGameObject("c1");

            c1.transform.SetParent(root1.transform);
            var c2 = m_Objects.CreateGameObject("c2");

            c2.transform.SetParent(c1.transform);
            IncrementalHierarchyFunctions.Build(new [] { root1 }, out m_Hierarchy, Allocator.Temp);
            AssertSize(3);
            AssertConsistency(root1);
            IncrementalHierarchyFunctions.Remove(m_Hierarchy, new NativeArray <int>(new [] { c2.GetInstanceID(), c1.GetInstanceID() }, Allocator.Temp));
            Object.DestroyImmediate(c1);
            AssertSize(1);
            AssertConsistency(root1);
        }
        public void Hierarchy_WithHierarchy_DeleteSeparateHierarchy_MaintainsConsistency()
        {
            var root1 = m_Objects.CreateGameObject("root1");

            m_Objects.CreateGameObject("c1").transform.SetParent(root1.transform);
            var root2 = m_Objects.CreateGameObject("root2");

            m_Objects.CreateGameObject("c2").transform.SetParent(root2.transform);
            IncrementalHierarchyFunctions.Build(new [] { root1, root2 }, out m_Hierarchy, Allocator.Temp);
            AssertSize(4);
            AssertConsistency(root1);
            AssertConsistency(root2);
            IncrementalHierarchyFunctions.Remove(m_Hierarchy, new NativeArray <int>(new [] { root1.GetInstanceID() }, Allocator.Temp));
            Object.DestroyImmediate(root1);
            AssertSize(2);
            AssertConsistency(root2);
            IncrementalHierarchyFunctions.Remove(m_Hierarchy, new NativeArray <int>(new [] { root2.GetInstanceID() }, Allocator.Temp));
            AssertSize(0);
        }
        public void Hierarchy_CollectChildIndices_WithHierarchy()
        {
            var go = new GameObject("root");

            new GameObject("c1").transform.SetParent(go.transform);
            var c2 = new GameObject("c2");

            c2.transform.SetParent(go.transform);
            new GameObject("c3").transform.SetParent(go.transform);
            new GameObject("c21").transform.SetParent(c2.transform);
            new GameObject("c22").transform.SetParent(c2.transform);
            IncrementalHierarchyFunctions.Build(new [] { go }, out m_Hierarchy, Allocator.TempJob);

            var changedIds = new NativeList <int>(1, Allocator.TempJob);

            changedIds.Add(go.GetInstanceID());

            var visitedIndices = new NativeHashMap <int, bool>(6, Allocator.TempJob);


            try
            {
                m_Hierarchy.AsReadOnly().CollectHierarchyInstanceIdsAndIndicesAsync(changedIds, visitedIndices).Complete();
                Assert.AreEqual(6, changedIds.Length);
                Assert.AreEqual(6, visitedIndices.Count());
                foreach (var id in GetInstanceIds(go))
                {
                    Assert.IsTrue(changedIds.Contains(id));
                    var  index   = m_Hierarchy.IndexByInstanceId[id];
                    bool success = visitedIndices.TryGetValue(index, out bool isInOriginalList);
                    Assert.IsTrue(success);
                    Assert.AreEqual(id == go.GetInstanceID(), isInOriginalList);
                }
            }
            finally
            {
                changedIds.Dispose();
                visitedIndices.Dispose();
                GameObject.DestroyImmediate(go);
            }
        }
        public void Hierarchy_WithHierarchy_ChangingParents_MaintainsConsistency()
        {
            var go = m_Objects.CreateGameObject("root");
            var c1 = m_Objects.CreateGameObject("c1");

            c1.transform.SetParent(go.transform);
            var c2 = m_Objects.CreateGameObject("c2");

            c2.transform.SetParent(go.transform);
            var c3 = m_Objects.CreateGameObject("c3");

            c3.transform.SetParent(go.transform);
            IncrementalHierarchyFunctions.Build(new [] { go }, out m_Hierarchy, Allocator.Temp);
            AssertSize(4);
            AssertConsistency(go);

            var parentChanges = new NativeHashMap <int, int>(0, Allocator.Temp);

            c3.transform.SetParent(c2.transform);
            parentChanges.Add(c3.GetInstanceID(), c2.GetInstanceID());
            var success = new NativeList <IncrementalConversionChanges.ParentChange>(Allocator.Temp);

            IncrementalHierarchyFunctions.ChangeParents(m_Hierarchy, parentChanges.GetKeyValueArrays(Allocator.Temp), default, success);