Skip to content

Commit

Permalink
Added 'final' test.
Browse files Browse the repository at this point in the history
  • Loading branch information
clnhlzmn committed Mar 28, 2021
1 parent eb81731 commit 9e006df
Show file tree
Hide file tree
Showing 6 changed files with 135 additions and 20 deletions.
42 changes: 22 additions & 20 deletions makina-compiler/src/xyz/colinholzman/makina/CodeGenerator.kt
Original file line number Diff line number Diff line change
Expand Up @@ -95,29 +95,31 @@ class CodeGenerator(val machine: Machine,
for (activeAtomicState in machine.states.filter { it.isAtomic() }) {
println("static int ${machine.id}_${activeAtomicState.getFullyQualifiedIdString()}($machineStructName *self, $machineEventName *event) {")
println("\tif (!self || !event) return -1;")
val config = activeAtomicState.getStateConfiguration()
println("\tswitch (event->id) {")
val handlerGroups = config.getHandlers().groupByIdAndRemoveRedundantHandlers()
for (entry in handlerGroups) {
val eventId = entry.key
println("\tcase ${machine.id}_event_$eventId:")
for (handlerStatePair in entry.value) {
val sourceState = handlerStatePair.first
val handler = handlerStatePair.second
val guard = if (handler.guard != null) "${handler.guard}(self, event)" else "1"
println("\t\tif ($guard) {")
generateExitActions(handler, sourceState, activeAtomicState, output)
if (handler.action != null) {
println("\t\t\t${handler.action}(self, event);")
if (!activeAtomicState.final) {
val config = activeAtomicState.getStateConfiguration()
println("\tswitch (event->id) {")
val handlerGroups = config.getHandlers().groupByIdAndRemoveRedundantHandlers()
for (entry in handlerGroups) {
val eventId = entry.key
println("\tcase ${machine.id}_event_$eventId:")
for (handlerStatePair in entry.value) {
val sourceState = handlerStatePair.first
val handler = handlerStatePair.second
val guard = if (handler.guard != null) "${handler.guard}(self, event)" else "1"
println("\t\tif ($guard) {")
generateExitActions(handler, sourceState, activeAtomicState, output)
if (handler.action != null) {
println("\t\t\t${handler.action}(self, event);")
}
generateEntryActions(handler, sourceState, activeAtomicState, output)
println("\t\t\tbreak;")
println("\t\t}")
}
generateEntryActions(handler, sourceState, activeAtomicState, output)
println("\t\t\tbreak;")
println("\t\t}")
println("\t\tbreak;")
}
println("\t\tbreak;")
println("\tdefault: break;")
println("\t}")
}
println("\tdefault: break;")
println("\t}")
println("\treturn 0;")
println("}")
println()
Expand Down
10 changes: 10 additions & 0 deletions makina-compiler/test/xyz/colinholzman/makina/FinalTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package xyz.colinholzman.makina

import org.junit.jupiter.api.Test

class FinalTest {
@Test
fun final() {
externalMakefileTest("./../test/final")
}
}
2 changes: 2 additions & 0 deletions test/final/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
out
.vscode
16 changes: 16 additions & 0 deletions test/final/makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
.PHONY: test
test: out/test
./out/test

out/test: test_driver.c out/test.c out/test.h out
gcc test_driver.c out/test.c -I "." -std=c99 -Wall -Wextra -Werror -o out/test -g

out/test.c:
java -jar ../../makina-compiler/out/artifacts/makina_compiler_jar/makina-compiler.jar test_source.mkna -o out

out:
mkdir out

.PHONY: clean
clean:
rm -rf out
70 changes: 70 additions & 0 deletions test/final/test_driver.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@

#include <stdio.h>
#include <assert.h>
#include <string.h>
#include "out/test.h"

static const char *expected_output[] = {
"s1_entry",
"s1_s2_entry",
"s1_s2_exit",
"f_entry"
};

#define N_EVENTS (sizeof(expected_output) / sizeof(const char *))

static const char *actual_output[N_EVENTS];

static size_t output_index = 0;

#define PUSH_EVENT(e) do { \
assert(output_index < N_EVENTS); \
actual_output[output_index++] = e; \
} while (0)

int s1_s2_entry(struct test *self, struct test_event *event) {
(void)self; (void)event;
PUSH_EVENT("s1_s2_entry");
return 0;
}

int s1_s2_exit(struct test *self, struct test_event *event) {
(void)self; (void)event;
PUSH_EVENT("s1_s2_exit");
return 0;
}

int f_entry(struct test *self, struct test_event *event) {
(void)self; (void)event;
PUSH_EVENT("f_entry");
return 0;
}

int s1_e1_action(struct test *self, struct test_event *event) {
(void)self; (void)event;
PUSH_EVENT("s1_e1_action");
return 0;
}

int s1_entry(struct test *self, struct test_event *event) {
(void)self; (void)event;
PUSH_EVENT("s1_entry");
return 0;
}

int s1_exit(struct test *self, struct test_event *event) {
(void)self; (void)event;
PUSH_EVENT("s1_exit");
return 0;
}

int main (void) {
struct test instance;
test_init(&instance);
test_process_event(&instance, &(struct test_event){.id = test_event_e1});
test_process_event(&instance, &(struct test_event){.id = test_event_e1});
for (size_t i = 0; i < N_EVENTS; ++i) {
assert(strcmp(expected_output[i], actual_output[i]) == 0);
}
return 0;
}
15 changes: 15 additions & 0 deletions test/final/test_source.mkna
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
machine test;

state s1 {
on e1 s1_e1_action;
entry s1_entry;
state s2 {
entry s1_s2_entry;
on e1 -> f;
exit s1_s2_exit;
}
final state f {
entry f_entry;
}
exit s1_exit;
}

0 comments on commit 9e006df

Please sign in to comment.