LexerTests.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. using Lua.CodeAnalysis.Syntax;
  2. namespace Lua.Tests;
  3. public class LexerTests
  4. {
  5. [Test]
  6. [TestCase("0")]
  7. [TestCase("123")]
  8. [TestCase("1234567890")]
  9. public void Test_Numeric_Integer(string x)
  10. {
  11. var expected = new[] { SyntaxToken.Number(x, new(1, 0)) };
  12. var actual = GetTokens(x);
  13. CollectionAssert.AreEqual(expected, actual);
  14. }
  15. [Test]
  16. [TestCase("1.2")]
  17. [TestCase("123.45")]
  18. [TestCase("12345.6789")]
  19. public void Test_Numeric_Decimal(string x)
  20. {
  21. var expected = new[] { SyntaxToken.Number(x, new(1, 0)) };
  22. var actual = GetTokens(x);
  23. CollectionAssert.AreEqual(expected, actual);
  24. }
  25. [Test]
  26. [TestCase("0x123")]
  27. [TestCase("0x456")]
  28. [TestCase("0x789")]
  29. public void Test_Numeric_Hex(string x)
  30. {
  31. var expected = new[] { SyntaxToken.Number(x, new(1, 0)) };
  32. var actual = GetTokens(x);
  33. CollectionAssert.AreEqual(expected, actual);
  34. }
  35. [Test]
  36. [TestCase("12E3")]
  37. [TestCase("45E+6")]
  38. [TestCase("78E-9")]
  39. [TestCase("1e+2")]
  40. [TestCase("3e-4")]
  41. public void Test_Numeric_Exponential(string x)
  42. {
  43. var expected = new[] { SyntaxToken.Number(x, new(1, 0)) };
  44. var actual = GetTokens(x);
  45. CollectionAssert.AreEqual(expected, actual);
  46. }
  47. [Test]
  48. [TestCase("\"\"")]
  49. [TestCase("\"hello\"")]
  50. [TestCase("\"1.23\"")]
  51. [TestCase("\"1-2-3-4-5\"")]
  52. [TestCase("\'hello\'")]
  53. public void Test_String(string x)
  54. {
  55. var expected = new[] { SyntaxToken.String(x.AsMemory(1, x.Length - 2), new(1, 0)) };
  56. var actual = GetTokens(x);
  57. CollectionAssert.AreEqual(expected, actual);
  58. }
  59. [Test]
  60. [TestCase("foo")]
  61. [TestCase("bar")]
  62. [TestCase("baz")]
  63. public void Test_Identifier(string x)
  64. {
  65. var expected = new[] { SyntaxToken.Identifier(x, new(1, 0)) };
  66. var actual = GetTokens(x);
  67. CollectionAssert.AreEqual(expected, actual);
  68. }
  69. [Test]
  70. [TestCase("-- hello!")]
  71. [TestCase("-- how are you?")]
  72. [TestCase("-- goodbye!")]
  73. public void Test_Comment_Line(string code)
  74. {
  75. var expected = Array.Empty<SyntaxToken>();
  76. var actual = GetTokens(code);
  77. CollectionAssert.AreEqual(expected, actual);
  78. }
  79. [Test]
  80. [TestCase(@"--[[
  81. hello!
  82. how are you?
  83. goodbye!
  84. ]]--")]
  85. [TestCase(@"--[[
  86. hello!
  87. how are you?
  88. goodbye!
  89. ]]")]
  90. public void Test_Comment_Block(string code)
  91. {
  92. var expected = Array.Empty<SyntaxToken>();
  93. var actual = GetTokens(code);
  94. CollectionAssert.AreEqual(expected, actual);
  95. }
  96. [Test]
  97. [TestCase("--[[ \n hello")]
  98. [TestCase("--[[ \r hello")]
  99. [TestCase("--[[ \r\n hello")]
  100. public void Test_Comment_Block_Error(string code)
  101. {
  102. Assert.Throws<LuaParseException>(() => GetTokens(code), "main.lua:(1,5): unfinished long comment (starting at line 0)");
  103. }
  104. [Test]
  105. public void Test_Comment_Line_WithCode()
  106. {
  107. var expected = new[] { SyntaxToken.Number("10.0", new(1, 0)) };
  108. var actual = GetTokens("10.0 -- this is numeric literal");
  109. CollectionAssert.AreEqual(expected, actual);
  110. }
  111. [Test]
  112. public void Test_Nil()
  113. {
  114. var expected = new[] { SyntaxToken.Nil(new(1, 0)) };
  115. var actual = GetTokens("nil");
  116. CollectionAssert.AreEqual(expected, actual);
  117. }
  118. [Test]
  119. public void Test_True()
  120. {
  121. var expected = new[] { SyntaxToken.True(new(1, 0)) };
  122. var actual = GetTokens("true");
  123. CollectionAssert.AreEqual(expected, actual);
  124. }
  125. [Test]
  126. public void Test_False()
  127. {
  128. var expected = new[] { SyntaxToken.False(new(1, 0)) };
  129. var actual = GetTokens("false");
  130. CollectionAssert.AreEqual(expected, actual);
  131. }
  132. [Test]
  133. public void Test_If()
  134. {
  135. var expected = new[] { SyntaxToken.If(new(1, 0)), SyntaxToken.Identifier("x", new(1, 3)), SyntaxToken.Equality(new(1, 5)), SyntaxToken.Number("1.0", new(1, 8)), SyntaxToken.Then(new(1, 12)), SyntaxToken.EndOfLine(new(1, 16)), SyntaxToken.Return(new(2, 4)), SyntaxToken.Nil(new(2, 11)), SyntaxToken.EndOfLine(new(2, 14)), SyntaxToken.End(new(3, 0)) };
  136. var actual = GetTokens(
  137. @"if x == 1.0 then
  138. return nil
  139. end");
  140. CollectionAssert.AreEqual(expected, actual);
  141. }
  142. [Test]
  143. public void Test_If_Else()
  144. {
  145. var expected = new[] { SyntaxToken.If(new(1, 0)), SyntaxToken.Identifier("x", new(1, 3)), SyntaxToken.Equality(new(1, 5)), SyntaxToken.Number("1.0", new(1, 8)), SyntaxToken.Then(new(1, 12)), SyntaxToken.EndOfLine(new(1, 16)), SyntaxToken.Return(new(2, 4)), SyntaxToken.Number("1.0", new(2, 11)), SyntaxToken.EndOfLine(new(2, 14)), SyntaxToken.Else(new(3, 0)), SyntaxToken.EndOfLine(new(3, 4)), SyntaxToken.Return(new(4, 4)), SyntaxToken.Number("0.0", new(4, 11)), SyntaxToken.EndOfLine(new(4, 14)), SyntaxToken.End(new(5, 0)) };
  146. var actual = GetTokens(
  147. @"if x == 1.0 then
  148. return 1.0
  149. else
  150. return 0.0
  151. end");
  152. CollectionAssert.AreEqual(expected, actual);
  153. }
  154. static SyntaxToken[] GetTokens(string source)
  155. {
  156. var list = new List<SyntaxToken>();
  157. var lexer = new Lexer { Source = source.AsMemory(), ChunkName = "main.lua" };
  158. while (lexer.MoveNext())
  159. {
  160. list.Add(lexer.Current);
  161. }
  162. return list.ToArray();
  163. }
  164. }