LuaObjectTests.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. using Lua.Standard;
  2. namespace Lua.Tests;
  3. [LuaObject]
  4. public partial class LuaTestObj {
  5. int x;
  6. int y;
  7. [LuaMember("x")]
  8. public int X {
  9. get => x;
  10. set => x = value;
  11. }
  12. [LuaMember("y")]
  13. public int Y {
  14. get => y;
  15. set => y = value;
  16. }
  17. [LuaMember("create")]
  18. public static LuaTestObj Create(int x, int y) {
  19. return new LuaTestObj() {
  20. x = x,
  21. y = y
  22. };
  23. }
  24. [LuaMetamethod(LuaObjectMetamethod.Add)]
  25. public static LuaTestObj Add(LuaTestObj a, LuaTestObj b) {
  26. return new LuaTestObj() {
  27. x = a.x + b.x,
  28. y = a.y + b.y
  29. };
  30. }
  31. [LuaMetamethod(LuaObjectMetamethod.Sub)]
  32. public static async Task<LuaTestObj> Sub(LuaTestObj a, LuaTestObj b) {
  33. await Task.Delay(1);
  34. return new LuaTestObj() {
  35. x = a.x - b.x,
  36. y = a.y - b.y
  37. };
  38. }
  39. }
  40. [LuaObject]
  41. public partial class TestUserData
  42. {
  43. [LuaMember]
  44. public int Property { get; set; }
  45. [LuaMember]
  46. public LuaValue LuaValueProperty { get; set; }
  47. [LuaMember("p2")]
  48. public string PropertyWithName { get; set; } = "";
  49. [LuaMember]
  50. public static void MethodVoid()
  51. {
  52. Console.WriteLine("HEY!");
  53. }
  54. [LuaMember]
  55. public static async Task MethodAsync()
  56. {
  57. await Task.CompletedTask;
  58. }
  59. [LuaMember]
  60. public static double StaticMethodWithReturnValue(double a, double b)
  61. {
  62. Console.WriteLine($"HEY! {a} {b}");
  63. return a + b;
  64. }
  65. [LuaMember]
  66. public double InstanceMethodWithReturnValue()
  67. {
  68. return Property;
  69. }
  70. [LuaMember]
  71. public async ValueTask<LuaValue> InstanceMethodWithReturnValueAsync(LuaValue value, CancellationToken ct)
  72. {
  73. await Task.Delay(1, ct);
  74. return value;
  75. }
  76. [LuaMetamethod(LuaObjectMetamethod.Call)]
  77. public string Call()
  78. {
  79. return "Called!";
  80. }
  81. }
  82. public class LuaObjectTests
  83. {
  84. [Test]
  85. public async Task Test_Property()
  86. {
  87. var userData = new TestUserData { Property = 1 };
  88. var state = LuaState.Create();
  89. state.Environment["test"] = userData;
  90. var results = await state.DoStringAsync("return test.Property");
  91. Assert.That(results, Has.Length.EqualTo(1));
  92. Assert.That(results[0], Is.EqualTo(new LuaValue(1)));
  93. }
  94. [Test]
  95. public async Task Test_PropertyWithName()
  96. {
  97. var userData = new TestUserData { PropertyWithName = "foo" };
  98. var state = LuaState.Create();
  99. state.Environment["test"] = userData;
  100. var results = await state.DoStringAsync("return test.p2");
  101. Assert.That(results, Has.Length.EqualTo(1));
  102. Assert.That(results[0], Is.EqualTo(new LuaValue("foo")));
  103. }
  104. [Test]
  105. public async Task Test_MethodVoid()
  106. {
  107. var userData = new TestUserData();
  108. var state = LuaState.Create();
  109. state.Environment["test"] = userData;
  110. var results = await state.DoStringAsync("return test.MethodVoid()");
  111. Assert.That(results, Has.Length.EqualTo(0));
  112. }
  113. [Test]
  114. public async Task Test_MethodAsync()
  115. {
  116. var userData = new TestUserData();
  117. var state = LuaState.Create();
  118. state.Environment["test"] = userData;
  119. var results = await state.DoStringAsync("return test.MethodAsync()");
  120. Assert.That(results, Has.Length.EqualTo(0));
  121. }
  122. [Test]
  123. public async Task Test_StaticMethodWithReturnValue()
  124. {
  125. var userData = new TestUserData();
  126. var state = LuaState.Create();
  127. state.Environment["test"] = userData;
  128. var results = await state.DoStringAsync("return test.StaticMethodWithReturnValue(1, 2)");
  129. Assert.That(results, Has.Length.EqualTo(1));
  130. Assert.That(results[0], Is.EqualTo(new LuaValue(3)));
  131. }
  132. [Test]
  133. public async Task Test_InstanceMethodWithReturnValue()
  134. {
  135. var userData = new TestUserData { Property = 1 };
  136. var state = LuaState.Create();
  137. state.Environment["test"] = userData;
  138. var results = await state.DoStringAsync("return test:InstanceMethodWithReturnValue()");
  139. Assert.That(results, Has.Length.EqualTo(1));
  140. Assert.That(results[0], Is.EqualTo(new LuaValue(1)));
  141. }
  142. [Test]
  143. public async Task Test_InstanceMethodWithReturnValueAsync()
  144. {
  145. var userData = new TestUserData { Property = 1 };
  146. var state = LuaState.Create();
  147. state.Environment["test"] = userData;
  148. var results = await state.DoStringAsync("return test:InstanceMethodWithReturnValueAsync(2)");
  149. Assert.That(results, Has.Length.EqualTo(1));
  150. Assert.That(results[0], Is.EqualTo(new LuaValue(2)));
  151. }
  152. [Test]
  153. public async Task Test_CallMetamethod()
  154. {
  155. var userData = new TestUserData();
  156. var state = LuaState.Create();
  157. state.OpenBasicLibrary();
  158. state.Environment["test"] = userData;
  159. var results = await state.DoStringAsync("""
  160. assert(test() == 'Called!')
  161. return test()
  162. """);
  163. Assert.That(results, Has.Length.EqualTo(1));
  164. Assert.That(results[0], Is.EqualTo(new LuaValue("Called!")));
  165. }
  166. [Test]
  167. public async Task Test_ArithMetamethod()
  168. {
  169. var userData = new LuaTestObj();
  170. var state = LuaState.Create();
  171. state.OpenBasicLibrary();
  172. state.Environment["TestObj"]=userData;
  173. var results = await state.DoStringAsync("""
  174. local a = TestObj.create(1, 2)
  175. local b = TestObj.create(3, 4)
  176. return a + b, a - b
  177. """);
  178. Assert.That(results, Has.Length.EqualTo(2));
  179. Assert.That(results[0].Read<object>(), Is.TypeOf<LuaTestObj>());
  180. var objAdd = results[0].Read<LuaTestObj>();
  181. Assert.That(objAdd.X, Is.EqualTo(4));
  182. Assert.That(objAdd.Y, Is.EqualTo(6));
  183. Assert.That(results[1].Read<object>(), Is.TypeOf<LuaTestObj>());
  184. var objSub = results[1].Read<LuaTestObj>();
  185. Assert.That(objSub.X, Is.EqualTo(-2));
  186. Assert.That(objSub.Y, Is.EqualTo(-2));
  187. }
  188. }