/* tslint:disable:no-unused-expression */ import { expect } from "chai"; import Error, { isError } from "../src/error"; import Lexer from "../src/lexer"; import Token, { TokenKind } from "../src/token"; const scan = (source: string): Token[] | Error => { return new Lexer(source).scan(); }; describe("Lexer", () => { it("scans uppercase keywords", () => { const tokens = scan("SELECT FROM WHERE"); expect(tokens).to.deep.equal([ new Token(TokenKind.SELECT, null, 1), new Token(TokenKind.FROM, null, 1), new Token(TokenKind.WHERE, null, 1), new Token(TokenKind.EOF, null, 1), ]); }); it("scans lowercase keywords", () => { const tokens = scan("select from where"); expect(tokens).to.deep.equal([ new Token(TokenKind.SELECT, null, 1), new Token(TokenKind.FROM, null, 1), new Token(TokenKind.WHERE, null, 1), new Token(TokenKind.EOF, null, 1), ]); }); it("scans symbols", () => { const tokens = scan("*=,`;."); expect(tokens).to.deep.equal([ new Token(TokenKind.STAR, null, 1), new Token(TokenKind.EQUALS, null, 1), new Token(TokenKind.COMMA, null, 1), new Token(TokenKind.BACKTICK, null, 1), new Token(TokenKind.SEMICOLON, null, 1), new Token(TokenKind.DOT, null, 1), new Token(TokenKind.EOF, null, 1), ]); }); it("scans identifiers", () => { const tokens = scan("ident ident_ifier Ident"); expect(tokens).to.deep.equal([ new Token(TokenKind.IDENTIFIER, "ident", 1), new Token(TokenKind.IDENTIFIER, "ident_ifier", 1), new Token(TokenKind.IDENTIFIER, "Ident", 1), new Token(TokenKind.EOF, null, 1), ]); }); it("scans numbers", () => { const tokens = scan("1 123.45 .123"); expect(tokens).to.deep.equal([ new Token(TokenKind.NUMBER, "1", 1), new Token(TokenKind.NUMBER, "123.45", 1), new Token(TokenKind.NUMBER, ".123", 1), new Token(TokenKind.EOF, null, 1), ]); }); it("keeps track of line numbers", () => { const tokens = scan("foo\nbar"); expect(tokens).to.deep.equal([ new Token(TokenKind.IDENTIFIER, "foo", 1), new Token(TokenKind.IDENTIFIER, "bar", 2), new Token(TokenKind.EOF, null, 2), ]); }); it("returns an error for an unrecognized character", () => { const error = scan("~"); expect(isError(error)).to.be.ok; if (isError(error)) { expect(error.message).to.equal("Unrecognized character ~"); } }); });