CApiGeneratorTests.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using Mono.Cecil;
  2. namespace PixiEditor.Api.CGlueMSBuild.Tests;
  3. public class CApiGeneratorTests
  4. {
  5. [Fact]
  6. public void TestThatLoadAssemblies()
  7. {
  8. CApiGenerator apiGenerator = new CApiGenerator("", "", "", (message) => { });
  9. AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly("TestAssets/CGlueTestLib.dll");
  10. var assemblies = apiGenerator.LoadAssemblies(assembly, "TestAssets");
  11. Assert.Equal(2, assemblies.Count);
  12. }
  13. [Fact]
  14. public void TestThatImportedMethodsAreExtractedCorrectly()
  15. {
  16. CApiGenerator apiGenerator = new CApiGenerator("", "", "", (message) => { });
  17. AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly("TestAssets/CGlueTestLib.dll");
  18. var assemblies = apiGenerator.LoadAssemblies(assembly, "TestAssets");
  19. var importedMethods = CApiGenerator.GetImportedMethods(assemblies.SelectMany(a => a.MainModule.Types).ToArray());
  20. Assert.True(importedMethods.Length > 0);
  21. }
  22. [Fact]
  23. public void TestThatGenerateImportsGeneratesCorrectImports()
  24. {
  25. CApiGenerator apiGenerator = new CApiGenerator("", "", "", (message) => { });
  26. AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly("TestAssets/CGlueTestLib.dll");
  27. var assemblies = apiGenerator.LoadAssemblies(assembly, "TestAssets");
  28. var importedMethods = CApiGenerator.GetImportedMethods(assemblies.SelectMany(a => a.MainModule.Types).ToArray());
  29. string imports = apiGenerator.GenerateImports(importedMethods);
  30. string sanitizedImports = imports.Replace("\n", "").Replace("\r", "");
  31. Assert.Contains("__attribute__((import_name(\"subscribe_to_event\")))", sanitizedImports);
  32. Assert.Contains("void subscribe_to_event(int32_t internalControlId, char* eventName, int32_t eventNameLength);", sanitizedImports);
  33. }
  34. [Fact]
  35. public void TestThatGenerateImportsForStringReturnTypeGeneratesConversionCorrectly()
  36. {
  37. CApiGenerator apiGenerator = new CApiGenerator("", "", "", (message) => { });
  38. AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly("TestAssets/CGlueTestLib.dll");
  39. var assemblies = apiGenerator.LoadAssemblies(assembly, "TestAssets");
  40. var importedMethods = CApiGenerator.GetImportedMethods(assemblies.SelectMany(a => a.MainModule.Types).ToArray());
  41. string imports = apiGenerator.GenerateImports([importedMethods.First(x => x.Name == "string_return_method")]);
  42. string sanitizedImports = imports.Replace("\n", "").Replace("\r", "");
  43. Assert.Contains("__attribute__((import_name(\"string_return_method\")))", sanitizedImports);
  44. Assert.Contains("char* string_return_method();", sanitizedImports);
  45. Assert.Contains("MonoString* internal_string_return_method(){", sanitizedImports);
  46. Assert.Contains("char* result = string_return_method();", sanitizedImports);
  47. Assert.Contains("MonoString* mono_result = mono_string_new(mono_domain_get(), result)", sanitizedImports);
  48. Assert.Contains("return mono_result;", sanitizedImports);
  49. }
  50. [Fact]
  51. public void TestThatGenerateExportsGeneratesCorrectExports()
  52. {
  53. CApiGenerator apiGenerator = new CApiGenerator("", "", "", (message) => { });
  54. AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly("TestAssets/CGlueTestLib.dll");
  55. var assemblies = apiGenerator.LoadAssemblies(assembly, "TestAssets");
  56. var exportedMethods = CApiGenerator.GetExportedMethods(assemblies.SelectMany(a => a.MainModule.Types).ToArray());
  57. string exports = apiGenerator.GenerateExports(exportedMethods);
  58. string sanitizedExports = exports.Replace("\n", "").Replace("\r", "");
  59. Assert.Contains("__attribute__((export_name(\"raise_element_event\")))", sanitizedExports);
  60. Assert.Contains("void raise_element_event(int32_t internalControlId, char* eventName)", sanitizedExports);
  61. Assert.Contains("MonoMethod* method = lookup_interop_method(\"EventRaised\");", sanitizedExports);
  62. Assert.Contains("MonoString* mono_eventName = mono_string_new(mono_domain_get(), eventName);", sanitizedExports);
  63. Assert.Contains("void* args[] = {&internalControlId, mono_eventName};", sanitizedExports);
  64. Assert.Contains("invoke_interop_method(method, args);", sanitizedExports);
  65. Assert.Contains("free(method);", sanitizedExports);
  66. }
  67. [Fact]
  68. public void TestThatAttachImportFunctionsGenerateProperly()
  69. {
  70. CApiGenerator apiGenerator = new CApiGenerator("", "", "", (message) => { });
  71. AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly("TestAssets/CGlueTestLib.dll");
  72. var assemblies = apiGenerator.LoadAssemblies(assembly, "TestAssets");
  73. var importedMethods = CApiGenerator.GetImportedMethods(assemblies.SelectMany(a => a.MainModule.Types).ToArray());
  74. string attachCode = apiGenerator.GenerateAttachImportedFunctions(importedMethods);
  75. string sanitizedImports = attachCode.Replace("\n", "").Replace("\r", "");
  76. Assert.Contains("void attach_imported_functions()", sanitizedImports);
  77. Assert.Contains("mono_add_internal_call(\"PixiEditor.Extensions.Sdk.Bridge.Native::subscribe_to_event\", internal_subscribe_to_event);", sanitizedImports);
  78. }
  79. }