MetaTests.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. using Lua.Platforms;
  2. using Lua.Standard;
  3. using Lua.Tests.Helpers;
  4. using System.Globalization;
  5. namespace Lua.Tests;
  6. [LuaObject]
  7. partial class MetaFloat
  8. {
  9. [LuaMember("value")] public double Value { get; set; }
  10. [LuaMetamethod(LuaObjectMetamethod.Call)]
  11. public static MetaFloat Create(LuaValue dummy, double value)
  12. {
  13. return new MetaFloat() { Value = value };
  14. }
  15. [LuaMetamethod(LuaObjectMetamethod.Add)]
  16. public static MetaFloat Add(MetaFloat a, MetaFloat b)
  17. {
  18. return new MetaFloat() { Value = a.Value + b.Value };
  19. }
  20. [LuaMetamethod(LuaObjectMetamethod.Lt)]
  21. public static bool Lt(MetaFloat a, MetaFloat b)
  22. {
  23. return a.Value < b.Value;
  24. }
  25. [LuaMetamethod(LuaObjectMetamethod.Len)]
  26. public static double Len(MetaFloat a)
  27. {
  28. return a.Value;
  29. }
  30. [LuaMetamethod(LuaObjectMetamethod.ToString)]
  31. public override string ToString()
  32. {
  33. return Value.ToString(CultureInfo.InvariantCulture);
  34. }
  35. }
  36. [LuaObject]
  37. partial class MetaAsyncFloat
  38. {
  39. [LuaMember("value")] public double Value { get; set; }
  40. [LuaMetamethod(LuaObjectMetamethod.Call)]
  41. public static async Task<MetaFloat> Create(LuaValue dummy, double value)
  42. {
  43. await Task.Delay(1);
  44. return new MetaFloat() { Value = value };
  45. }
  46. [LuaMetamethod(LuaObjectMetamethod.Add)]
  47. public static async Task<MetaFloat> Add(MetaFloat a, MetaFloat b)
  48. {
  49. await Task.Delay(1);
  50. return new MetaFloat() { Value = a.Value + b.Value };
  51. }
  52. [LuaMetamethod(LuaObjectMetamethod.Lt)]
  53. public static async Task<bool> Lt(MetaFloat a, MetaFloat b)
  54. {
  55. await Task.Delay(1);
  56. return a.Value < b.Value;
  57. }
  58. [LuaMetamethod(LuaObjectMetamethod.Len)]
  59. public static async Task<double> Len(MetaFloat a)
  60. {
  61. await Task.Delay(1);
  62. return a.Value;
  63. }
  64. [LuaMetamethod(LuaObjectMetamethod.ToString)]
  65. public override string ToString()
  66. {
  67. return Value.ToString(CultureInfo.InvariantCulture);
  68. }
  69. }
  70. public class MetaTests
  71. {
  72. const string TestFloatScript = """
  73. local a = MetaFloat(10)
  74. local b = MetaFloat(20)
  75. local function test(x,y)
  76. local z = x + y
  77. local v = z.value
  78. local len, str = #z, tostring(z)
  79. return v, y > x ,len, str
  80. end
  81. local v, comp, len, str = test(a,b)
  82. assert(v == 30)
  83. assert(comp == true)
  84. assert(len == 30)
  85. assert(str == "30")
  86. local c = a + b
  87. return c.value, a < b,#c, tostring(c)
  88. """;
  89. const string TestIndexScript = """
  90. local obj = setmetatable({}, {__index = getindentityMethod})
  91. local a
  92. local b = 1
  93. local c =obj
  94. a = obj:getindentity()
  95. local d = obj.getindentity(obj)
  96. print(d)
  97. assert(a == obj)
  98. assert(b == 1)
  99. assert(obj == c)
  100. assert(d == c)
  101. """;
  102. [Test]
  103. public async Task TestMetaFloat()
  104. {
  105. var lua = LuaState.Create();
  106. lua.OpenBasicLibrary();
  107. lua.Environment["MetaFloat"] = new MetaFloat();
  108. var result = await lua.DoStringAsync(TestFloatScript);
  109. Assert.That(result.Length, Is.EqualTo(4));
  110. Assert.That(result[0].Read<double>(), Is.EqualTo(30));
  111. Assert.That(result[1].Read<bool>(), Is.EqualTo(true));
  112. Assert.That(result[2].Read<double>(), Is.EqualTo(30));
  113. Assert.That(result[3].Read<string>(), Is.EqualTo("30"));
  114. }
  115. [Test]
  116. public async Task TestMetaAsyncFloat()
  117. {
  118. var lua = LuaState.Create();
  119. lua.OpenBasicLibrary();
  120. lua.Environment["MetaFloat"] = new MetaAsyncFloat();
  121. var result = await lua.DoStringAsync(TestFloatScript);
  122. Assert.That(result.Length, Is.EqualTo(4));
  123. Assert.That(result[0].Read<double>(), Is.EqualTo(30));
  124. Assert.That(result[1].Read<bool>(), Is.EqualTo(true));
  125. Assert.That(result[2].Read<double>(), Is.EqualTo(30));
  126. Assert.That(result[3].Read<string>(), Is.EqualTo("30"));
  127. }
  128. [Test]
  129. public async Task TestMetaIndex()
  130. {
  131. var lua = LuaState.Create(LuaPlatform.Default with { StandardIO = new TestStandardIO() });
  132. lua.OpenBasicLibrary();
  133. lua.Environment["getindentityMethod"] = new LuaFunction("getindentity", (context, ct) =>
  134. {
  135. var obj = context.GetArgument(0);
  136. return new(context.Return(new LuaFunction("getIndexed",
  137. (ctx, ct2) =>
  138. new(ctx.Return(obj)))));
  139. });
  140. var result = await lua.DoStringAsync(TestIndexScript);
  141. }
  142. [Test]
  143. public async Task TestMetaIndexAsync()
  144. {
  145. var lua = LuaState.Create(LuaPlatform.Default with { StandardIO = new TestStandardIO() });
  146. lua.OpenBasicLibrary();
  147. lua.Environment["getindentityMethod"] = new LuaFunction("getindentity", async (context, ct) =>
  148. {
  149. var obj = context.GetArgument(0);
  150. await Task.Delay(1);
  151. return (context.Return(new LuaFunction("getIndexed", (ctx, ct2)
  152. => new(ctx.Return(obj)))));
  153. });
  154. var result = await lua.DoStringAsync(TestIndexScript);
  155. }
  156. }