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)); } }
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)); } } } } } }