Browse Source

fix: PatternMatchingTests

Akeit0 6 months ago
parent
commit
f9136ff4ec
2 changed files with 15 additions and 9 deletions
  1. 5 4
      src/Lua/Standard/TableLibrary.cs
  2. 10 5
      tests/Lua.Tests/PatternMatchingTests.cs

+ 5 - 4
src/Lua/Standard/TableLibrary.cs

@@ -1,4 +1,5 @@
 using Lua.CodeAnalysis;
 using Lua.CodeAnalysis;
+using Lua.Internal;
 using System.Runtime.CompilerServices;
 using System.Runtime.CompilerServices;
 using System.Text;
 using System.Text;
 using Lua.Runtime;
 using Lua.Runtime;
@@ -53,7 +54,7 @@ public sealed class TableLibrary
             ? (long)context.GetArgument<double>(3)
             ? (long)context.GetArgument<double>(3)
             : arg0.ArrayLength;
             : arg0.ArrayLength;
 
 
-        var builder = new ValueStringBuilder(512);
+        using var builder = new PooledList<char>(512);
 
 
         for (long i = arg2; i <= arg3; i++)
         for (long i = arg2; i <= arg3; i++)
         {
         {
@@ -61,18 +62,18 @@ public sealed class TableLibrary
 
 
             if (value.Type is LuaValueType.String)
             if (value.Type is LuaValueType.String)
             {
             {
-                builder.Append(value.Read<string>());
+                builder.AddRange(value.Read<string>());
             }
             }
             else if (value.Type is LuaValueType.Number)
             else if (value.Type is LuaValueType.Number)
             {
             {
-                builder.Append(value.Read<double>().ToString(CultureInfo.InvariantCulture));
+                builder.AddRange(value.Read<double>().ToString(CultureInfo.InvariantCulture));
             }
             }
             else
             else
             {
             {
                 throw new LuaRuntimeException(context.Thread, $"invalid value ({value.Type}) at index {i} in table for 'concat'");
                 throw new LuaRuntimeException(context.Thread, $"invalid value ({value.Type}) at index {i} in table for 'concat'");
             }
             }
 
 
-            if (i != arg3) builder.Append(arg1);
+            if (i != arg3) builder.AddRange(arg1);
         }
         }
 
 
         return new(context.Return(builder.ToString()));
         return new(context.Return(builder.ToString()));

+ 10 - 5
tests/Lua.Tests/PatternMatchingTests.cs

@@ -830,7 +830,7 @@ public class PatternMatchingTests
             
             
             return #matches
             return #matches
         ");
         ");
-        Assert.That(result[0].Read<double>(), Is.EqualTo(0)); // No matches because pattern is wrong
+        Assert.That(result[0].Read<double>(), Is.EqualTo(4));
         
         
         // Test the correct pattern with escaped dollar signs
         // Test the correct pattern with escaped dollar signs
         result = await state.DoStringAsync(@"
         result = await state.DoStringAsync(@"
@@ -844,9 +844,12 @@ public class PatternMatchingTests
             
             
             return table.unpack(matches)
             return table.unpack(matches)
         ");
         ");
-        Assert.That(result.Length, Is.EqualTo(2));
+        Assert.That(result.Length, Is.EqualTo(4));
         Assert.That(result[0].Read<string>(), Is.EqualTo("world"));
         Assert.That(result[0].Read<string>(), Is.EqualTo("world"));
-        Assert.That(result[1].Read<string>(), Is.EqualTo("123"));
+        
+        Assert.That(result[1].Read<string>(), Is.EqualTo(" and "));
+        Assert.That(result[2].Read<string>(), Is.EqualTo("123"));
+        Assert.That(result[3].Read<string>(), Is.EqualTo(" test"));
     }
     }
 
 
     [Test]
     [Test]
@@ -911,9 +914,11 @@ public class PatternMatchingTests
             end
             end
             return table.unpack(matches)
             return table.unpack(matches)
         ");
         ");
-        Assert.That(result.Length, Is.EqualTo(2));
+        Assert.That(result.Length, Is.EqualTo(4));
         Assert.That(result[0].Read<string>(), Is.EqualTo("")); // Empty match
         Assert.That(result[0].Read<string>(), Is.EqualTo("")); // Empty match
-        Assert.That(result[1].Read<string>(), Is.EqualTo("empty"));
+        Assert.That(result[1].Read<string>(), Is.EqualTo(" and ")); // Match with spaces
+        Assert.That(result[2].Read<string>(), Is.EqualTo("empty"));
+        Assert.That(result[3].Read<string>(), Is.EqualTo("")); // Trailing empty match
         
         
         // Test nested or adjacent dollar signs
         // Test nested or adjacent dollar signs
         result = await state.DoStringAsync(@"
         result = await state.DoStringAsync(@"