public void DoubleForEnumeratorWith3ComponentTest()
        {
            for (uint i = 0; i < 10; i++)
            {
                CreateTestEntity(i, GroupA, (int)i);
            }

            for (uint i = 0; i < 5; i++)
            {
                CreateTestEntity(i, GroupB, (int)i);
            }

            _scheduler.SubmitEntities();

            List <int> results = new List <int>();

            //store the permutation of each group against all the groups without dups
            for (uint i = 0; i < 10; i++)
            {
                for (uint j = i + 1; j < 10; j++)
                {
                    results.Add((int)((i << 16) | j));
                }

                for (uint j = 0; j < 5; j++)
                {
                    results.Add((int)((i << 16) | j));
                }
            }

            for (uint i = 0; i < 5; i++)
            {
                for (uint j = i + 1; j < 5; j++)
                {
                    results.Add((int)((i << 16) | j));
                }
            }

            var dynamicEntities =
                new DoubleEntitiesEnumerator <TestEntityComponent, TestEntityComponentWithProperties,
                                              TestEntityViewComponent>(_neverdoThisEngine.entitiesDB
                                                                       .QueryEntities <TestEntityComponent,
                                                                                       TestEntityComponentWithProperties,
                                                                                       TestEntityViewComponent>(
                                                                           GroupAB));

            var iteration = 0;

            foreach (var((bufferA, _, _, countA), indexA, (bufferB, _, _, countB), indexB) in dynamicEntities)
            {
                Assert.That(indexA < countA, "invalid outer index");
                Assert.That(indexB < countB, "invalid inner index");

                Assert.That(results[iteration]
                            , Is.EqualTo((bufferA[indexA].intValue << 16) | bufferB[indexB].intValue));
                Assert.That(results[iteration++], Is.EqualTo((indexA << 16) | indexB));
            }

            Assert.That(results.Count == iteration);
        }
        public void DoubleForEnumeratorWithOneComponentAndEmptyGroupsTest()
        {
            var dynamicEntities =
                new DoubleEntitiesEnumerator <TestEntityComponent>(
                    _neverdoThisEngine.entitiesDB.QueryEntities <TestEntityComponent>(GroupAB));

            foreach (var none in dynamicEntities)
            {
                Assert.Fail();
            }
        }
        public void DoubleForEnumeratorWithOneComponentAndOneEmptyGroupTest()
        {
            for (uint i = 0; i < 10; i++)
            {
                CreateTestEntity(i, GroupA, (int)i);
            }

            _scheduler.SubmitEntities();

            List <int> results = new List <int>();

            for (uint i = 0; i < 10; i++)
            {
                for (uint j = i + 1; j < 10; j++)
                {
                    results.Add((int)((i << 16) | j));
                }
            }

            var dynamicEntities =
                new DoubleEntitiesEnumerator <TestEntityComponent>(
                    _neverdoThisEngine.entitiesDB.QueryEntities <TestEntityComponent>(GroupAB));

            var iteration = 0;

            foreach (var((bufferA, countA), indexA, groupA, (bufferB, countB), indexB, groupB) in dynamicEntities)
            {
                Assert.That(indexA < countA, "invalid outer index");
                Assert.That(indexB < countB, "invalid inner index");

                Assert.That(results[iteration]
                            , Is.EqualTo((bufferA[indexA].intValue << 16) | bufferB[indexB].intValue));
                Assert.That(results[iteration++], Is.EqualTo((indexA << 16) | indexB));

                Assert.That(groupA == GroupA);
            }

            Assert.That(results.Count == iteration);
        }