From d1aafee184a751be430969359fe17da50bbba4a2 Mon Sep 17 00:00:00 2001 From: Katy Coe Date: Thu, 13 Aug 2020 06:57:41 +0200 Subject: [PATCH] Tests: Update incorrect CppTypeDeclaration test and add alignment tests --- Il2CppTests/TestCppTypeDeclarations.cs | 72 +++++++++++++++----------- Il2CppTests/TestUnityVersion.cs | 2 +- 2 files changed, 42 insertions(+), 32 deletions(-) diff --git a/Il2CppTests/TestCppTypeDeclarations.cs b/Il2CppTests/TestCppTypeDeclarations.cs index 3c0458f..dd8cff6 100644 --- a/Il2CppTests/TestCppTypeDeclarations.cs +++ b/Il2CppTests/TestCppTypeDeclarations.cs @@ -1,5 +1,5 @@ /* - Copyright 2020 Katy Coe - http://www.hearthcode.org - http://www.djkaty.com + Copyright 2020 Katy Coe - http://www.djkaty.com - https://github.com/djkaty All rights reserved. */ @@ -30,92 +30,102 @@ namespace Il2CppInspector // Ensure we can interpret every header from every version of Unity without errors // This will throw InvalidOperationException if there is a problem foreach (var unityTypeHeader in unityTypeHeaders) { - var cppTypes = new CppTypeCollection(64); - cppTypes.AddFromDeclarationText(unityTypeHeader.GetText()); + var cppUnityHeaderTypes = new CppTypeCollection(64); + cppUnityHeaderTypes.AddFromDeclarationText(unityTypeHeader.GetText()); - foreach (var cppType in cppTypes.Types) + foreach (var cppType in cppUnityHeaderTypes.Types) Debug.WriteLine("// " + cppType.Key + "\n" + cppType.Value.ToString("o")); } - // Do a few sanity checks taken from real applications + // Do a few sanity checks taken from real applications (64-bit) // NOTE: Does not provide full code coverage! - var cppTypes2 = CppTypeCollection.FromUnityVersion(new UnityVersion("2019.3.1f1")); + var cppTypes = CppTypeCollection.FromUnityVersion(new UnityVersion("2019.3.1f1")); CppComplexType ct; CppField field; + // Field offset tests + // Un-nested class - ct = (CppComplexType) cppTypes2["Il2CppClass"]; + ct = (CppComplexType) cppTypes["Il2CppClass"]; - field = ct[0xD8].First(); + field = ct[0xE0].First(); - Assert.AreEqual(field.Name, "cctor_finished"); + Assert.AreEqual("cctor_finished", field.Name); - field = ct[0x128].First(); + field = ct[0x130].First(); - Assert.AreEqual(field.Name, "vtable"); + Assert.AreEqual("vtable", field.Name); field = ct["cctor_finished"]; - Assert.AreEqual(field.OffsetBytes, 0xD8); + Assert.AreEqual(0xE0, field.OffsetBytes); field = ct["vtable"]; - Assert.AreEqual(field.OffsetBytes, 0x128); + Assert.AreEqual(0x130, field.OffsetBytes); // Nested class - ct = (CppComplexType) cppTypes2["Il2CppClass_Merged"]; + ct = (CppComplexType) cppTypes["Il2CppClass_Merged"]; var fields = ct.Flattened; - field = fields[0xD8].First(); + field = fields[0xE0].First(); - Assert.AreEqual(field.Name, "cctor_finished"); + Assert.AreEqual("cctor_finished", field.Name); - field = fields[0x128].First(); + field = fields[0x130].First(); - Assert.AreEqual(field.Name, "vtable"); + Assert.AreEqual("vtable", field.Name); field = fields["cctor_finished"]; - Assert.AreEqual(field.OffsetBytes, 0xD8); + Assert.AreEqual(0xE0, field.OffsetBytes); field = fields["vtable"]; - Assert.AreEqual(field.OffsetBytes, 0x128); + Assert.AreEqual(0x130, field.OffsetBytes); // Bitfield - ct = (CppComplexType) cppTypes2["Il2CppType"]; + ct = (CppComplexType) cppTypes["Il2CppType"]; field = ct.Fields[0xB * 8 + 7].First(); - Assert.AreEqual(field.Name, "pinned"); + Assert.AreEqual("pinned", field.Name); // Nested fields - ct = (CppComplexType) cppTypes2["Il2CppWin32Decimal"]; + ct = (CppComplexType) cppTypes["Il2CppWin32Decimal"]; fields = ct.Flattened; field = fields[0x08].First(); - Assert.AreEqual(field.Name, "lo32"); + Assert.AreEqual("lo32", field.Name); field = fields[0x08].Last(); - Assert.AreEqual(field.Name, "lo64"); + Assert.AreEqual("lo64", field.Name); field = fields[0x0C].First(); - Assert.AreEqual(field.Name, "mid32"); + Assert.AreEqual("mid32", field.Name); // Pointer alias - var alias = (CppAlias) cppTypes2.GetType("Il2CppHString"); + var alias = (CppAlias) cppTypes.GetType("Il2CppHString"); - Assert.AreEqual(alias.ElementType.GetType(), typeof(CppPointerType)); - Assert.AreEqual(alias.ElementType.Name, "Il2CppHString__ *"); + Assert.AreEqual(typeof(CppPointerType), alias.ElementType.GetType()); + Assert.AreEqual("Il2CppHString__ *", alias.ElementType.Name); // Typedef struct with no tag - Assert.True(cppTypes2.Types.ContainsKey("Il2CppGenericMethodIndices")); - Assert.True(((CppComplexType)cppTypes2["Il2CppGenericMethodIndices"]).ComplexValueType == ComplexValueType.Struct); + Assert.True(cppTypes.Types.ContainsKey("Il2CppGenericMethodIndices")); + Assert.True(((CppComplexType)cppTypes["Il2CppGenericMethodIndices"]).ComplexValueType == ComplexValueType.Struct); + + // Alignment tests + + // Il2CppArrayType has an int * (sizes) after three uint8_t + Assert.AreEqual(0x10, cppTypes.GetComplexType("Il2CppArrayType")["sizes"].OffsetBytes); + + // Il2CppSafeArray has a uint32_t (element_size) after two uint16_t + Assert.AreEqual(0x4, cppTypes.GetComplexType("Il2CppSafeArray")["element_size"].OffsetBytes); } } } diff --git a/Il2CppTests/TestUnityVersion.cs b/Il2CppTests/TestUnityVersion.cs index c082c28..351606e 100644 --- a/Il2CppTests/TestUnityVersion.cs +++ b/Il2CppTests/TestUnityVersion.cs @@ -1,5 +1,5 @@ /* - Copyright 2017-2020 Katy Coe - http://www.hearthcode.org - http://www.djkaty.com + Copyright 2017-2020 Katy Coe - http://www.djkaty.com - https://github.com/djkaty Copyright 2020 Robert Xiao - https://robertxiao.ca All rights reserved.