package lexer import lexer.errors.LexingError import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows import kotlin.test.assertEquals /** * Tests for the Prolog lexer. * * These tests are based on the Prolog syntax. */ class ScanPrologParserTests { @Test fun scan_simple_atom() { val tokens = Lexer("atom.").scan() assertEquals(3, tokens.size) assertEquals(TokenType.ALPHANUMERIC, tokens[0].type, "Expected ALPHANUMERIC token, got ${tokens[0].type}") assertEquals(TokenType.DOT, tokens[1].type, "Expected DOT token, got ${tokens[1].type}") assertEquals(TokenType.EOF, tokens[2].type, "Expected EOF token, got ${tokens[2].type}") } @Test fun scan_variable() { val tokens = Lexer("X.").scan() assertEquals(3, tokens.size) assertEquals(TokenType.ALPHANUMERIC, tokens[0].type, "Expected ALPHANUMERIC token, got ${tokens[0].type}") assertEquals(TokenType.DOT, tokens[1].type, "Expected DOT token, got ${tokens[1].type}") assertEquals(TokenType.EOF, tokens[2].type, "Expected EOF token, got ${tokens[2].type}") } @Test fun scan_variable_with_number() { val tokens = Lexer("X1.").scan() assertEquals(3, tokens.size) assertEquals(TokenType.ALPHANUMERIC, tokens[0].type, "Expected ALPHANUMERIC token, got ${tokens[0].type}") assertEquals(TokenType.DOT, tokens[1].type, "Expected DOT token, got ${tokens[1].type}") assertEquals(TokenType.EOF, tokens[2].type, "Expected EOF token, got ${tokens[2].type}") } @Test fun scan_variable_with_underscore() { val tokens = Lexer("X_1.").scan() assertEquals(3, tokens.size) assertEquals(TokenType.ALPHANUMERIC, tokens[0].type, "Expected ALPHANUMERIC token, got ${tokens[0].type}") assertEquals(TokenType.DOT, tokens[1].type, "Expected DOT token, got ${tokens[1].type}") assertEquals(TokenType.EOF, tokens[2].type, "Expected EOF token, got ${tokens[2].type}") } @Test fun scan_variable_that_starts_with_a_number() { assertThrows { Lexer("1X.").scan() } } }