UNPKG

@adamsy/bhai-lang

Version:

<h1 align="center">Bhai Lang</h1> <p align="center"> <a href="https://lgtm.com/projects/g/DulLabs/bhai-lang/alerts/"><img alt="Total alerts" src="https://img.shields.io/lgtm/alerts/g/DulLabs/bhai-lang.svg?logo=lgtm&logoWidth=18"/></a> <a href="https://lgt

167 lines (133 loc) 4.61 kB
import { NodeType } from "bhai-lang-parser"; import { RuntimeException } from "../../src"; import Scope from "../../src/components/scope"; import AssignmentExpression from "../../src/components/visitor/assignmentExpression"; import BinaryExpression from "../../src/components/visitor/binaryExpression"; import IdentifierExpression from "../../src/components/visitor/identifierExpression"; import PrintStatement from "../../src/components/visitor/printStatement"; import Program from "../../src/components/visitor/program"; import VariableDeclaration from "../../src/components/visitor/variableDeclaration"; import VariableStatement from "../../src/components/visitor/variableStatement"; import InvalidStateException from "../../src/exceptions/invalidStateException"; jest.mock("../../src/module/interpreterModule"); const assignmentExpression = new AssignmentExpression(); const binaryExpression = new BinaryExpression(); const identifierExpression = new IdentifierExpression(); const program = new Program(); const variableDeclaration = new VariableDeclaration(); const variableStatement = new VariableStatement(); const printStatement = new PrintStatement(); const scope = new Scope(null); test("interpreter test assignmentExpression without left node should throw an exception", () => { const astNode = { type: NodeType.ExpressionStatement, operator: "=", }; expect(() => assignmentExpression.visitNode(astNode)).toThrow( InvalidStateException ); }); test("interpreter test binaryExpression without left node should throw an exception", () => { const astNode = { type: NodeType.BinaryExpression, operator: "=", }; expect(() => binaryExpression.visitNode(astNode)).toThrow( InvalidStateException ); }); test("interpreter test binaryExpression without right node should throw an exception", () => { const astNode = { type: NodeType.BinaryExpression, operator: "=", left: { type: NodeType.NumericLiteral, value: 5, }, }; expect(() => binaryExpression.visitNode(astNode)).toThrow( InvalidStateException ); }); test("interpreter test binaryExpression without operator should throw an exception", () => { const astNode = { type: NodeType.BinaryExpression, left: { type: NodeType.NumericLiteral, value: 5, }, right: { type: NodeType.NumericLiteral, value: 10, }, }; expect(() => binaryExpression.visitNode(astNode)).toThrow( InvalidStateException ); }); test("interpreter test identifierExpression without identifier should throw an exception", () => { const astNode = { type: NodeType.IdentifierExpression, }; expect(() => identifierExpression.visitNode(astNode)).toThrow( InvalidStateException ); }); test(`interpreter test "Program" without body should throw an exception`, () => { const astNode = { type: NodeType.Program, }; expect(() => program.visitNode(astNode)).toThrow(InvalidStateException); }); test(`interpreter test "Program" with an array body should throw an exception`, () => { const astNode = { type: NodeType.Program, body: [], }; expect(() => program.visitNode(astNode)).toThrow(InvalidStateException); }); test("interpreter test VariableDeclaration without an id should throw an exception", () => { const astNode = { type: NodeType.VariableDeclaration, init: { type: NodeType.NullLiteral, value: null, }, }; expect(() => variableDeclaration.visitNode(astNode)).toThrow( InvalidStateException ); }); test("interpreter test VariableDeclaration without an init should throw an exception", () => { const astNode = { type: NodeType.VariableDeclaration, id: { type: NodeType.IdentifierExpression, name: "a", }, }; expect(() => variableDeclaration.visitNode(astNode)).toThrow( InvalidStateException ); }); test("interpreter test VariableStatement without variable declarations should throw an exception", () => { const astNode = { type: NodeType.VariableStatement, }; expect(() => variableStatement.visitNode(astNode)).toThrow( InvalidStateException ); }); test("interpreter test PrintStatement without expressions should throw an exception", () => { const astNode = { type: NodeType.PrintStatement, }; expect(() => printStatement.visitNode(astNode)).toThrow( InvalidStateException ); }); test("interpreter test Scope assign with undeclared variable should throw an exception", () => { expect(() => scope.assign("undeclared_identifier", 45)).toThrow( RuntimeException ); });