123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- /* 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 AS");
- 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.AS, null, 1),
- new Token(TokenKind.EOF, null, 1),
- ]);
- });
-
- it("scans lowercase keywords", () => {
- const tokens = scan("select from where as");
- 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.AS, null, 1),
- new Token(TokenKind.EOF, null, 1),
- ]);
- });
-
- it("scans symbols", () => {
- const tokens = scan("=,`;.+-*/");
- expect(tokens).to.deep.equal([
- 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.PLUS, null, 1),
- new Token(TokenKind.MINUS, null, 1),
- new Token(TokenKind.STAR, null, 1),
- new Token(TokenKind.SLASH, 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 ~");
- }
- });
- });
|