protected void AssertValidTrackingState()
 {
     QueryAssertUtils.QueryStateIs(QueryState.Tracking, m_ProxyGroup);
     QueryAssertUtils.ActiveInHierarchy(true, m_Child1ContentObject, m_Child2ContentObject);
     QueryAssertUtils.AssignedDataIdIsValid(m_ChildProxy1, m_ChildProxy2);
 }
        protected override void OnMarsUpdate()
        {
            switch (frameCount)
            {
            case 1:
                AssertValidInitialState();
                break;

            case 2:
            {
                // this data is what the proxies in the prefab need to match
                DatabaseUtils.AddPlane(k_Member1DataId);
                DatabaseUtils.AddPlane(k_Member2DataId);
                ForceUpdateQueries();
                break;
            }

            case 3:
                AssertValidTrackingState();
                AssertGroupQueryDataUseTracked(m_ProxyGroup.queryID);
                break;

            case 4:
                DatabaseUtils.RemovePlane(k_Member1DataId);
                ForceUpdateQueries();
                break;

            case 5:
                Assert.AreEqual(QueryState.Tracking, m_ProxyGroup.queryState);
                Assert.AreEqual(QueryState.Tracking, m_ChildProxy2.queryState);
                Assert.True(m_Child2ContentObject.activeInHierarchy);

                // since this child has been lost its data it should be unavailable
                Assert.AreEqual(QueryState.Unavailable, m_ChildProxy1.queryState);
                Assert.Null(m_ChildProxy1.currentData);
                Assert.False(m_Child1ContentObject.activeInHierarchy);

                // make sure the backend is still tracking this group's data despite partial loss
                AssertGroupQueryDataUseTracked(m_ProxyGroup.queryID);
                break;

            case 6:
                // removing this plane should cause the second member to be lost,
                // causing the group to be lost because all members have now lost their data
                DatabaseUtils.RemovePlane(k_Member2DataId);
                break;

            case 7:
                Assert.AreEqual(ReAcquireOnLoss ? QueryState.Resuming : QueryState.Unavailable, m_ProxyGroup.queryState);
                QueryAssertUtils.QueryStateIs(QueryState.Unavailable, m_ChildProxy1, m_ChildProxy2);
                QueryAssertUtils.AssignedDataIsNull(m_ChildProxy1, m_ChildProxy2);
                QueryAssertUtils.ActiveInHierarchy(false, m_Child1ContentObject, m_Child2ContentObject);

                AssertGroupQueryDataUseTracked(m_ProxyGroup.queryID, false);
                break;

            case 8:
                // re-add the data we need to match, to test reacquire behavior
                DatabaseUtils.AddPlane(k_Member1DataId);
                DatabaseUtils.AddPlane(k_Member2DataId);
                ForceUpdateQueries();
                break;

            case 9:
                if (ReAcquireOnLoss)
                {
                    AssertValidTrackingState();
                    AssertGroupQueryDataUseTracked(m_ProxyGroup.queryID, true);
                }
                else
                {
                    QueryAssertUtils.AssignedDataIsNull(m_ChildProxy1, m_ChildProxy2);
                    QueryAssertUtils.QueryStateIs(QueryState.Unavailable, m_ProxyGroup);
                    QueryAssertUtils.ActiveInHierarchy(false, m_Child1ContentObject, m_Child2ContentObject);
                    AssertGroupQueryDataUseTracked(m_ProxyGroup.queryID, false);
                }
                break;
            }
        }
 protected void AssertValidInitialState()
 {
     QueryAssertUtils.QueryStateIs(QueryState.Unknown, m_ProxyGroup);
     QueryAssertUtils.ActiveInHierarchy(false, m_Child1ContentObject, m_Child2ContentObject);
     QueryAssertUtils.AssignedDataIsNull(m_ChildProxy1, m_ChildProxy2);
 }