A toy dynamic programming language written in Ruby
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

lexer_spec.rb 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. RSpec.describe Lexer do
  2. it 'lexes null' do
  3. expect(Lexer.new('null').scan_all).to eq(
  4. [Token.new(TokenKinds::NULL), Token.new(TokenKinds::EOF)]
  5. )
  6. end
  7. it 'lexes booleans' do
  8. expect(Lexer.new('true false').scan_all).to eq(
  9. [
  10. Token.new(TokenKinds::BOOLEAN, true),
  11. Token.new(TokenKinds::BOOLEAN, false),
  12. Token.new(TokenKinds::EOF)
  13. ]
  14. )
  15. end
  16. it 'lexes numbers' do
  17. expect(Lexer.new('1 2.3').scan_all).to eq(
  18. [
  19. Token.new(TokenKinds::NUMBER, 1.0),
  20. Token.new(TokenKinds::NUMBER, 2.3),
  21. Token.new(TokenKinds::EOF)
  22. ]
  23. )
  24. end
  25. it 'lexes strings' do
  26. expect(Lexer.new('"hello world"').scan_all).to eq(
  27. [Token.new(TokenKinds::STRING, 'hello world'), Token.new(TokenKinds::EOF)]
  28. )
  29. end
  30. it 'lexes operators' do
  31. expect(Lexer.new('+-*/<<=>>= and or').scan_all).to eq(
  32. [
  33. Token.new(TokenKinds::OPERATOR, :+),
  34. Token.new(TokenKinds::OPERATOR, :-),
  35. Token.new(TokenKinds::OPERATOR, :*),
  36. Token.new(TokenKinds::OPERATOR, :/),
  37. Token.new(TokenKinds::OPERATOR, :<),
  38. Token.new(TokenKinds::OPERATOR, :<=),
  39. Token.new(TokenKinds::OPERATOR, :>),
  40. Token.new(TokenKinds::OPERATOR, :>=),
  41. Token.new(TokenKinds::OPERATOR, :and),
  42. Token.new(TokenKinds::OPERATOR, :or),
  43. Token.new(TokenKinds::EOF)
  44. ]
  45. )
  46. end
  47. it 'lexes punctuation' do
  48. expect(Lexer.new('{}()[];,.').scan_all).to eq(
  49. [
  50. Token.new(TokenKinds::LBRACE),
  51. Token.new(TokenKinds::RBRACE),
  52. Token.new(TokenKinds::LPAREN),
  53. Token.new(TokenKinds::RPAREN),
  54. Token.new(TokenKinds::LBRACKET),
  55. Token.new(TokenKinds::RBRACKET),
  56. Token.new(TokenKinds::SEMICOLON),
  57. Token.new(TokenKinds::COMMA),
  58. Token.new(TokenKinds::DOT),
  59. Token.new(TokenKinds::EOF)
  60. ]
  61. )
  62. end
  63. it 'lexes if elseif else' do
  64. expect(Lexer.new('if elseif else').scan_all).to eq(
  65. [
  66. Token.new(TokenKinds::IF),
  67. Token.new(TokenKinds::ELSEIF),
  68. Token.new(TokenKinds::ELSE),
  69. Token.new(TokenKinds::EOF)
  70. ]
  71. )
  72. end
  73. it 'lexes =' do
  74. expect(Lexer.new('=').scan_all).to eq(
  75. [Token.new(TokenKinds::EQUALS), Token.new(TokenKinds::EOF)]
  76. )
  77. end
  78. it 'lexes let' do
  79. expect(Lexer.new('let').scan_all).to eq(
  80. [Token.new(TokenKinds::LET), Token.new(TokenKinds::EOF)]
  81. )
  82. end
  83. it 'lexes identifiers' do
  84. expect(Lexer.new('x').scan_all).to eq(
  85. [Token.new(TokenKinds::IDENTIFIER, 'x'), Token.new(TokenKinds::EOF)]
  86. )
  87. end
  88. it 'lexes function' do
  89. expect(Lexer.new('function').scan_all).to eq(
  90. [Token.new(TokenKinds::FUNCTION), Token.new(TokenKinds::EOF)]
  91. )
  92. end
  93. it 'lexes class' do
  94. expect(Lexer.new('class').scan_all).to eq(
  95. [Token.new(TokenKinds::CLASS), Token.new(TokenKinds::EOF)]
  96. )
  97. end
  98. it 'lexes class names' do
  99. expect(Lexer.new('Class').scan_all).to eq(
  100. [Token.new(TokenKinds::CLASS_NAME, 'Class'), Token.new(TokenKinds::EOF)]
  101. )
  102. end
  103. it 'lexes public and private' do
  104. expect(Lexer.new('public private').scan_all).to eq(
  105. [
  106. Token.new(TokenKinds::PUBLIC),
  107. Token.new(TokenKinds::PRIVATE),
  108. Token.new(TokenKinds::EOF)
  109. ]
  110. )
  111. end
  112. end