public void MaskedMemCpy_EndToEnd_HasExpectedValueAfterMemMask()
        {
            // see: MaskedMemCpy_MaskedMemCopyTestsData_HasExpectedMask for the prerequisites:
            // --> we got a size of 12 bytes for the test data, 16 byte block size thus 48 byte of mask block data.
            MaskedMemCpy_MaskedMemCopyTestsData_HasExpectedMask(); // adding test here such that it can not get removed accidentally.

            // we generate some test data (24 bytes, which will initially set all padding to zero), and hash it.
            // then we mess up the padding bytes, we hash again which will give a different value. (assert#1)
            // we assert (AssertMemberwiseEqual) that we actually did not change any members (padding is transparent when accessing the members)
            // finally we apply the expected padding mask which should bring back everything to the original state

            const int seed      = 0x72;
            var       testData0 = new MemMaskTestData_Mask
            {
                Offset0 = true,
                Offset4 = 0x19abcdef,
                Offset8 = true
            };

            var testData1 = new MemMaskTestData_Mask
            {
                Offset0 = true,
                Offset4 = 0x01abcdef,
                Offset8 = true
            };

            var mask = Masks.GetMaskView <MemMaskTestData_Mask>();

            using (var _ = new NativeArray <MemMaskTestData_Mask>(2, Allocator.Persistent))
            {
                var data = _;
                data[0] = testData0;
                data[1] = testData1;

                var view = NativeViewUtility.GetReadView(data);
                var h0   = HashUtility.GetDenseHash(view, seed);

                MessUpPaddingBytes(view, mask);

                var h1 = HashUtility.GetDenseHash(view, seed);
                Assert.AreNotEqual(h0, h1);

                AssertMemberwiseEqual(testData0, data[0]);
                AssertMemberwiseEqual(testData1, data[1]);

                MaskedMemCopy.ApplyMask(view, mask);
                Assert.AreEqual(h0, HashUtility.GetDenseHash(view, seed));
            }
        }
        void MessUpPaddingBytes(NativeView view, NativeView mask)
        {
            var maskLength = mask.LengthInBytes;

            for (int i = 0; i < view.LengthInBytes; i++)
            {
                var maskIndex = i % maskLength;
                var isUnused  = NativeViewUtility.ReadByte(mask, maskIndex) == 0;

                if (isUnused)
                {
                    NativeViewUtility.WriteByte(view, i, (byte)i);
                }
            }
        }
Пример #3
0
        public void HashUtility_ZeroPadding_EntityWithBufferEndToEnd_HasExpectedHash()
        {
            using (var world = new World("HashUtilityTests_BufferTestWorld"))
            {
                var bufferElement = new HashUtilityTest_BufferElement {
                    Offset0 = true, Offset4 = 0xBeef
                };

                var entity = world.EntityManager.CreateEntity();
                var buffer = world.EntityManager.AddBuffer <HashUtilityTest_BufferElement>(entity);

                buffer.Add(bufferElement);

                using (var chunks = world.EntityManager.GetAllChunks(Allocator.Persistent))
                {
                    Assert.AreEqual(chunks.Length, 1);

                    var chunk = chunks[0];
                    using (var types = chunk.GetNonzeroComponentTypes(Allocator.Persistent))
                    {
                        Assert.AreEqual(types.Length, 2 /* Entity, HashUtilityTest_BufferElement */);

                        using (var _ = new NativeArray <uint>(3, Allocator.Persistent))
                        {
                            var hashes = _;
                            hashes[0] = HashUtility.GetDenseHash(NativeViewUtility.GetView(ref entity), SeedForTesting);

                            var mask       = NativeViewUtility.GetReadView(Masks.GetTypeMask <HashUtilityTest_BufferElement>());
                            var bufferHash = HashUtility.GetMaskedHash(NativeViewUtility.GetView(ref bufferElement), mask, SeedForTesting);
                            hashes[1] = HashUtility.GetDenseHash(NativeViewUtility.GetView(ref bufferHash), SeedForTesting);

                            hashes[2] = HashUtility.GetChunkHeaderHash(chunk, SeedForTesting);

                            using (var expected = HashUtility.GetChunkHashes(chunk, MaskedHasher, SeedForTesting))
                            {
                                Assert.That(hashes, Is.EquivalentTo(expected), DeterminismTestUtility.PrintAll(hashes, expected));
                            }
                        }
                    }
                }
            }
        }
        static uint MimicChunkedLocalToWorldHash(LocalToWorld ltw, uint seed)
        {
            var h = HashUtility.GetDenseHash(NativeViewUtility.GetView(ref ltw), seed);

            return(HashUtility.GetDenseHash(NativeViewUtility.GetView(ref h), seed));
        }