A toy dynamic programming language written in Ruby
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

lexer_spec.rb 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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, :==),
  42. Token.new(TokenKinds::OPERATOR, :and),
  43. Token.new(TokenKinds::OPERATOR, :or),
  44. Token.new(TokenKinds::EOF)
  45. ]
  46. )
  47. end
  48. it 'lexes punctuation' do
  49. expect(Lexer.new('{}()[];,.').scan_all).to eq(
  50. [
  51. Token.new(TokenKinds::LBRACE),
  52. Token.new(TokenKinds::RBRACE),
  53. Token.new(TokenKinds::LPAREN),
  54. Token.new(TokenKinds::RPAREN),
  55. Token.new(TokenKinds::LBRACKET),
  56. Token.new(TokenKinds::RBRACKET),
  57. Token.new(TokenKinds::SEMICOLON),
  58. Token.new(TokenKinds::COMMA),
  59. Token.new(TokenKinds::DOT),
  60. Token.new(TokenKinds::EOF)
  61. ]
  62. )
  63. end
  64. it 'lexes if elseif else' do
  65. expect(Lexer.new('if elseif else').scan_all).to eq(
  66. [
  67. Token.new(TokenKinds::IF),
  68. Token.new(TokenKinds::ELSEIF),
  69. Token.new(TokenKinds::ELSE),
  70. Token.new(TokenKinds::EOF)
  71. ]
  72. )
  73. end
  74. it 'lexes =' do
  75. expect(Lexer.new('=').scan_all).to eq(
  76. [Token.new(TokenKinds::EQUALS), Token.new(TokenKinds::EOF)]
  77. )
  78. end
  79. it 'lexes let' do
  80. expect(Lexer.new('let').scan_all).to eq(
  81. [Token.new(TokenKinds::LET), Token.new(TokenKinds::EOF)]
  82. )
  83. end
  84. it 'lexes identifiers' do
  85. expect(Lexer.new('x').scan_all).to eq(
  86. [Token.new(TokenKinds::IDENTIFIER, 'x'), Token.new(TokenKinds::EOF)]
  87. )
  88. end
  89. it 'lexes function' do
  90. expect(Lexer.new('function').scan_all).to eq(
  91. [Token.new(TokenKinds::FUNCTION), Token.new(TokenKinds::EOF)]
  92. )
  93. end
  94. it 'lexes class' do
  95. expect(Lexer.new('class').scan_all).to eq(
  96. [Token.new(TokenKinds::CLASS), Token.new(TokenKinds::EOF)]
  97. )
  98. end
  99. it 'lexes class names' do
  100. expect(Lexer.new('Class').scan_all).to eq(
  101. [Token.new(TokenKinds::CLASS_NAME, 'Class'), Token.new(TokenKinds::EOF)]
  102. )
  103. end
  104. it 'lexes public and private' do
  105. expect(Lexer.new('public private').scan_all).to eq(
  106. [
  107. Token.new(TokenKinds::PUBLIC),
  108. Token.new(TokenKinds::PRIVATE),
  109. Token.new(TokenKinds::EOF)
  110. ]
  111. )
  112. end
  113. end