From 3b9c3a7076b6ccbdd297311cd5a3dd2add610511 Mon Sep 17 00:00:00 2001 From: Will Hawkins Date: Mon, 30 Mar 2026 05:18:00 -0400 Subject: [PATCH] Add Select Expression Tests Signed-off-by: Will Hawkins --- .../ExpressionTests/SelectExpression.swift | 139 ++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 Tests/p4rseTests/ExpressionTests/SelectExpression.swift diff --git a/Tests/p4rseTests/ExpressionTests/SelectExpression.swift b/Tests/p4rseTests/ExpressionTests/SelectExpression.swift new file mode 100644 index 0000000..da06f9e --- /dev/null +++ b/Tests/p4rseTests/ExpressionTests/SelectExpression.swift @@ -0,0 +1,139 @@ +// p4rse, Copyright 2026, Will Hawkins +// +// This file is part of p4rse. +// +// This file is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +import Common +import Foundation +import Macros +import P4Lang +import P4Runtime +import SwiftTreeSitter +import Testing +import TreeSitter +import TreeSitterP4 + +@testable import P4Compiler + +@Test func test_simple_parser_with_transition_select_case_nondefault_expressions() async throws { + let simple_parser_declaration = """ + parser main_parser() { + state start { + transition select (true) { + false: reject; + true: accept; + }; + } + }; + """ + + let program = try #UseOkResult(Program.Compile(simple_parser_declaration)) + let parser = try #UseOkResult(program.find_parser(withName: Identifier(name: "main_parser"))) + let runtime = try #UseOkResult(P4Runtime.ParserRuntime.create(program: program)) + let (state_result, _) = try! #UseOkResult(runtime.run()) + + #expect(parser.states.count() == 1) + + #expect(AsInstantiatedParserState(state_result) == P4Lang.accept) +} + +@Test func test_simple_parser_with_transition_select_case_default_expression() async throws { + let simple_parser_declaration = """ + parser main_parser() { + state start { + transition select (5) { + 5: reject; + _: accept; + }; + } + }; + """ + + let program = try #UseOkResult(Program.Compile(simple_parser_declaration)) + let parser = try #UseOkResult(program.find_parser(withName: Identifier(name: "main_parser"))) + let runtime = try #UseOkResult(P4Runtime.ParserRuntime.create(program: program)) + let (state_result, _) = try! #UseOkResult(runtime.run()) + + #expect(parser.states.count() == 1) + + #expect(AsInstantiatedParserState(state_result) == P4Lang.reject) +} + +@Test func test_simple_parser_with_transition_select_case_default_expression2() async throws { + let simple_parser_declaration = """ + parser main_parser() { + state start { + transition select (1) { + 5: reject; + _: accept; + }; + } + }; + """ + + let program = try #UseOkResult(Program.Compile(simple_parser_declaration)) + let parser = try #UseOkResult(program.find_parser(withName: Identifier(name: "main_parser"))) + let runtime = try #UseOkResult(P4Runtime.ParserRuntime.create(program: program)) + let (state_result, _) = try! #UseOkResult(runtime.run()) + + #expect(parser.states.count() == 1) + + #expect(AsInstantiatedParserState(state_result) == P4Lang.accept) +} + +@Test func test_simple_parser_with_transition_select_case_default_expression3() async throws { + let simple_parser_declaration = """ + parser main_parser() { + state start { + transition select (6) { + 5: reject; + 6: reject; + _: accept; + }; + } + }; + """ + + let program = try #UseOkResult(Program.Compile(simple_parser_declaration)) + let parser = try #UseOkResult(program.find_parser(withName: Identifier(name: "main_parser"))) + let runtime = try #UseOkResult(P4Runtime.ParserRuntime.create(program: program)) + let (state_result, _) = try! #UseOkResult(runtime.run()) + + #expect(parser.states.count() == 1) + + #expect(AsInstantiatedParserState(state_result) == P4Lang.reject) +} + +@Test func test_simple_parser_with_transition_select_case_invalid_type() async throws { + let simple_parser_declaration = """ + parser main_parser() { + state start { + transition select (6) { + true: reject; + 6: reject; + _: accept; + }; + } + }; + """ + + #expect( + #RequireErrorResult( + Error( + withMessage: + "Error(s) parsing select cases: {81, 12}: Keyset expression type does not match selector expression type" + ), + Program.Compile(simple_parser_declaration))) +}