diff --git a/Il2CppTests/TestGenericTypes.cs b/Il2CppTests/TestGenericTypes.cs new file mode 100644 index 0000000..7de63de --- /dev/null +++ b/Il2CppTests/TestGenericTypes.cs @@ -0,0 +1,80 @@ +/* + Copyright 2019 Katy Coe - http://www.hearthcode.org - http://www.djkaty.com + + All rights reserved. +*/ + +using System; +using System.IO; +using Il2CppInspector.Reflection; +using NUnit.Framework; + +namespace Il2CppInspector +{ + [TestFixture] + public class FixedTests + { + // Check generic flags according to https://docs.microsoft.com/en-us/dotnet/api/system.type.isgenerictype?view=netframework-4.8 + [Test] + public void TestGenericTypes() { + + // Arrange + // We're currently in IlCppTests\bin\Debug\netcoreapp3.0 or similar + var testPath = Path.GetFullPath(Directory.GetCurrentDirectory() + @"\..\..\..\TestBinaries\GenericTypes"); + + // Build model + var inspectors = Il2CppInspector.LoadFromFile(testPath + @"\GenericTypes.so", testPath + @"\global-metadata.dat"); + var model = new Il2CppModel(inspectors[0]); + + var asm = model.GetAssembly("GenericTypes.dll"); + + // Act + TypeInfo tDerived = asm.GetType("Il2CppTests.TestSources.Derived`1[V]"); + TypeInfo tDerivedBase = tDerived.BaseType; + + // TODO: array of Derived + // TypeInfo tDerivedArray + + TypeInfo tT = asm.GetType("Il2CppTests.TestSources.Base`2[T,U]").GenericTypeParameters[0]; + TypeInfo tF = tDerived.GetField("F").FieldType; + TypeInfo tNested = asm.GetType("Il2CppTests.TestSources.Derived`1[V]+Nested[V]"); + + DisplayGenericType(tDerived, "Derived"); + DisplayGenericType(tDerivedBase, "Base type of Derived"); + //DisplayGenericType(tDerivedArray, "Array of Derived"); + DisplayGenericType(tT, "Type parameter T from Base"); + DisplayGenericType(tF, "Field type, G>"); + DisplayGenericType(tNested, "Nested type in Derived"); + + // Assert + var checks = new[] { + (tDerived, "Derived`1[V]", true, true, true, false), + (tDerivedBase, "Base`2[System.String,V]", true, false, true, false), + //(tDerivedArray, "Derived`1[System.Int32][]", false, false, false, false), + (tT, "T", false, false, true, true), + (tF, "G`1[Derived`1[V]]", true, false, true, false), + (tNested, "Derived`1+Nested[V]", true, true, true, false) + }; + + foreach (var check in checks) { + var t = check.Item1; + + Assert.That(t.ToString(), Is.EqualTo(check.Item2)); + Assert.That(t.IsGenericType, Is.EqualTo(check.Item3)); + Assert.That(t.IsGenericTypeDefinition, Is.EqualTo(check.Item4)); + Assert.That(t.ContainsGenericParameters, Is.EqualTo(check.Item5)); + Assert.That(t.IsGenericParameter, Is.EqualTo(check.Item6)); + } + } + + private void DisplayGenericType(TypeInfo t, string caption) { + Console.WriteLine("\n{0}", caption); + Console.WriteLine(" Type: {0}", t); + + Console.WriteLine("\t IsGenericType: {0}", t.IsGenericType); + Console.WriteLine("\t IsGenericTypeDefinition: {0}", t.IsGenericTypeDefinition); + Console.WriteLine("\tContainsGenericParameters: {0}", t.ContainsGenericParameters); + Console.WriteLine("\t IsGenericParameter: {0}", t.IsGenericParameter); + } + } +}