module Chervil RSpec.describe Lexer do it 'lexes parens' do expect(Lexer.new('()').tokenize).to eq( [ Token.new(:lparen, '('), Token.new(:rparen, ')'), Token.new(:eof, 'eof') ] ) end it 'lexes integers' do expect(Lexer.new('1').get_next_token).to eq(Token.new(:number, '1')) end it 'lexes floats' do expect(Lexer.new('2.3').get_next_token).to eq(Token.new(:number, '2.3')) end it 'ignores whitespace' do expect(Lexer.new('1 2 3').tokenize).to eq( [ Token.new(:number, '1'), Token.new(:number, '2'), Token.new(:number, '3'), Token.new(:eof, 'eof') ] ) end it 'lexes identifiers' do expect(Lexer.new('hello').get_next_token).to eq( Token.new(:identifier, 'hello') ) end it 'lexes strings' do expect(Lexer.new('"hello"').get_next_token).to eq( Token.new(:string, 'hello') ) expect(Lexer.new("'world'").get_next_token).to eq( Token.new(:string, 'world') ) end it 'lexes booleans' do lexer = Lexer.new('#t #f') expect(lexer.get_next_token).to eq(Token.new(:boolean, true)) expect(lexer.get_next_token).to eq(Token.new(:boolean, false)) end end end