diff --git a/.github/workflows/code_generation_tests.yml b/.github/workflows/code_generation_tests.yml
new file mode 100644
index 0000000..2f6b9cd
--- /dev/null
+++ b/.github/workflows/code_generation_tests.yml
@@ -0,0 +1,422 @@
+name: Code Generation Tests
+
+on:
+ push:
+ pull_request:
+
+jobs:
+ build-artifacts:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout current repository
+ uses: actions/checkout@v4
+
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v3
+ with:
+ dotnet-version: '8.0.x'
+
+ - name: Run generate python3
+ run: |
+ dotnet run --project src/Stater.CodeGeneration.App artifacts/python/ 0 python3
+
+ - name: Run generate javascript
+ run: |
+ dotnet run --project src/Stater.CodeGeneration.App artifacts/js/ 0 javascript
+
+ - name: Run generate typescript
+ run: |
+ dotnet run --project src/Stater.CodeGeneration.App artifacts/ts/ 0 typescript
+
+ - name: Run generate kotlin
+ run: |
+ dotnet run --project src/Stater.CodeGeneration.App artifacts/kotlin/ 0 kotlin
+
+ - name: Run generate java
+ run: |
+ dotnet run --project src/Stater.CodeGeneration.App artifacts/java/ 0 java
+
+ - name: Run generate csharp
+ run: |
+ dotnet run --project src/Stater.CodeGeneration.App artifacts/csharp/ 0 csharp
+
+ - name: Run generate c++
+ run: |
+ dotnet run --project src/Stater.CodeGeneration.App artifacts/cplusplus/ 0 cplusplus
+
+ - name: Save python3 generated files
+ uses: actions/upload-artifact@v4
+ with:
+ name: python-generated-files
+ path: artifacts/python/*
+
+ - name: Save js generated files
+ uses: actions/upload-artifact@v4
+ with:
+ name: js-generated-files
+ path: artifacts/js/*
+
+ - name: Save ts generated files
+ uses: actions/upload-artifact@v4
+ with:
+ name: ts-generated-files
+ path: artifacts/ts/*
+
+ - name: Save kotlin generated files
+ uses: actions/upload-artifact@v4
+ with:
+ name: kotlin-generated-files
+ path: artifacts/kotlin/*
+
+ - name: Save java generated files
+ uses: actions/upload-artifact@v4
+ with:
+ name: java-generated-files
+ path: artifacts/java/*
+
+ - name: Save csharp generated files
+ uses: actions/upload-artifact@v4
+ with:
+ name: csharp-generated-files
+ path: artifacts/csharp/*
+
+ - name: Save c++ generated files
+ uses: actions/upload-artifact@v4
+ with:
+ name: cplusplus-generated-files
+ path: artifacts/cplusplus/*
+
+ test-python:
+ needs: [ build-artifacts ]
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ python-version: [ '3.9', '3.10', '3.11', '3.12', '3.13' ]
+ steps:
+ - name: Set up Python
+ uses: actions/setup-python@v2
+ with:
+ python-version: ${{ matrix.python-version }}
+
+ - name: Install Poetry
+ run: |
+ python -m pip install --upgrade pip
+ pip install poetry
+
+ - name: Checkout specific folder from another repository
+ uses: actions/checkout@v4
+ with:
+ repository: PhoenixNazarov/stater-fsm-code
+
+ - name: Install dependencies
+ run: |
+ cd projects/python
+ poetry install --no-root
+
+ - name: Install pytest and pytest-cov
+ run: |
+ cd projects/python
+ poetry add --dev pytest pytest-cov
+
+ - name: Download generated files
+ uses: actions/download-artifact@v4
+ with:
+ name: python-generated-files
+ path: projects/python/test/
+
+ - name: Run tests with pytest
+ run: |
+ cd projects/python
+ poetry run pytest --cov --junitxml=junit.xml -o junit_family=legacy
+
+ test-javascript:
+ needs: [ build-artifacts ]
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ node-version: [ '16', '18', '20' ]
+ steps:
+ - name: Checkout specific folder from another repository
+ uses: actions/checkout@v4
+ with:
+ repository: PhoenixNazarov/stater-fsm-code
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v3
+ with:
+ node-version: ${{ matrix.node-version }}
+ cache: 'npm'
+ cache-dependency-path: projects/js/package-lock.json
+
+ - name: Install dependencies
+ run: |
+ cd projects/js
+ npm ci
+
+ - name: Download generated files
+ uses: actions/download-artifact@v4
+ with:
+ name: js-generated-files
+ path: projects/js/src/
+
+ - name: Run tests with Jest
+ run: |
+ cd projects/js
+ npm test -- --coverage --json --outputFile=test-results.json
+
+ test-typescript:
+ needs: [ build-artifacts ]
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ node-version: [ '16', '18', '20' ]
+ steps:
+ - name: Checkout specific folder from another repository
+ uses: actions/checkout@v4
+ with:
+ repository: PhoenixNazarov/stater-fsm-code
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v3
+ with:
+ node-version: ${{ matrix.node-version }}
+ cache: 'npm'
+ cache-dependency-path: projects/js/package-lock.json
+
+ - name: Install dependencies
+ run: |
+ cd projects/ts
+ npm ci
+
+ - name: Download generated files
+ uses: actions/download-artifact@v4
+ with:
+ name: ts-generated-files
+ path: projects/ts/src/
+
+ - name: Run tests with Jest
+ run: |
+ cd projects/ts
+ npm test -- --coverage --json --outputFile=test-results.json
+
+ test-kotlin:
+ needs: [ build-artifacts ]
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ java-version: [ '17', '21' ]
+ steps:
+ - name: Checkout specific folder from another repository
+ uses: actions/checkout@v4
+ with:
+ repository: PhoenixNazarov/stater-fsm-code
+
+ - name: Download generated files
+ uses: actions/download-artifact@v4
+ with:
+ name: kotlin-generated-files
+ path: projects/kotlin/src/
+
+ - name: Set up JDK
+ uses: actions/setup-java@v3
+ with:
+ distribution: 'temurin'
+ java-version: ${{ matrix.java-version }}
+ cache: 'gradle'
+
+ - name: Build project
+ run: |
+ cd projects/kotlin
+ ./gradlew build
+
+ - name: Run tests with coverage
+ run: |
+ cd projects/kotlin
+ ./gradlew test jacocoTestReport --console=plain
+
+ - name: Show test results in console
+ run: |
+ cat projects/kotlin/build/test-results/test/TEST-*.xml || true
+
+ - name: Show coverage summary in console
+ run: |
+ cd projects/kotlin
+ ./gradlew jacocoTestCoverageVerification --console=plain || true
+
+ - name: Create JAR
+ run: |
+ cd projects/kotlin
+ ./gradlew jar
+
+ test-java:
+ needs: [ build-artifacts ]
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ java-version: [ 17, 21 ]
+ steps:
+ - name: Checkout specific folder from another repository
+ uses: actions/checkout@v4
+ with:
+ repository: PhoenixNazarov/stater-fsm-code
+
+ - name: Download generated files
+ uses: actions/download-artifact@v4
+ with:
+ name: java-generated-files
+ path: projects/java/src/
+
+ - name: Set up JDK
+ uses: actions/setup-java@v3
+ with:
+ distribution: 'temurin'
+ java-version: ${{ matrix.java-version }}
+ cache: 'maven'
+
+ - name: Run tests with coverage
+ run: |
+ cd projects/java
+ mvn clean verify -P java${{ matrix.java-version }}
+
+ - name: Create JAR
+ run: |
+ cd projects/java
+ mvn clean package -P java${{ matrix.java-version }}
+
+ test-csharp:
+ needs: [ build-artifacts ]
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ dotnet-version: [8.0]
+ steps:
+ - name: Checkout specific folder from another repository
+ uses: actions/checkout@v4
+ with:
+ repository: PhoenixNazarov/stater-fsm-code
+
+ - name: Set up .NET SDK
+ uses: actions/setup-dotnet@v3
+ with:
+ dotnet-version: ${{ matrix.dotnet-version }}
+
+ - name: Download generated files
+ uses: actions/download-artifact@v4
+ with:
+ name: csharp-generated-files
+ path: projects/csharp/Stater.StateMachine.Lib/
+
+ - name: Restore dependencies
+ run: |
+ cd projects/csharp/Stater.StateMachine.Lib
+ dotnet restore
+
+ - name: Build the project
+ run: |
+ cd projects/csharp/Stater.StateMachine.Lib
+ dotnet build --configuration Release
+
+ - name: Run tests with coverage
+ run: |
+ cd projects/csharp/Stater.StateMachine.Lib
+ dotnet test --configuration Release --collect:"XPlat Code Coverage"
+
+ test-cplusplus:
+ needs: [ build-artifacts ]
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ compiler:
+ - { cc: gcc-11, cxx: g++-11 }
+ - { cc: gcc-12, cxx: g++-12 }
+ - { cc: gcc-13, cxx: g++-13 }
+ - { cc: clang-16, cxx: clang++-16 }
+ - { cc: clang-17, cxx: clang++-17 }
+ fail-fast: false
+
+ steps:
+ - name: Checkout specific folder from another repository
+ uses: actions/checkout@v4
+ with:
+ repository: PhoenixNazarov/stater-fsm-code
+
+ - name: Install dependencies
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y lcov cmake
+ sudo apt-get install -y ${{ matrix.compiler.cc }} ${{ matrix.compiler.cxx }}
+ if [ "${{ matrix.compiler.cc }}" = "clang-16" ]; then
+ sudo apt-get install -y llvm-16
+ elif [ "${{ matrix.compiler.cc }}" = "clang-17" ]; then
+ sudo apt-get install -y llvm-17
+ fi
+ pip install gcovr
+
+ - name: Download generated files
+ uses: actions/download-artifact@v4
+ with:
+ name: cplusplus-generated-files
+ path: projects/cPlusPlus/
+
+ - name: Configure CMake
+ env:
+ CC: ${{ matrix.compiler.cc }}
+ CXX: ${{ matrix.compiler.cxx }}
+ run: |
+ cd projects/cPlusPlus
+ sh auto_config_cmake.sh fsm
+ cmake -B build -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="--coverage"
+
+ - name: Build
+ env:
+ CC: ${{ matrix.compiler.cc }}
+ CXX: ${{ matrix.compiler.cxx }}
+ run: |
+ cd projects/cPlusPlus
+ if [[ "${{ matrix.compiler.cc }}" == clang-* ]]; then
+ export CFLAGS="-fprofile-instr-generate -fcoverage-mapping"
+ export CXXFLAGS="-fprofile-instr-generate -fcoverage-mapping"
+ else
+ export CFLAGS="--coverage"
+ export CXXFLAGS="--coverage"
+ fi
+
+ cmake -B build -S . \
+ -DCMAKE_BUILD_TYPE=Debug \
+ -DCMAKE_C_COMPILER=${{ matrix.compiler.cc }} \
+ -DCMAKE_CXX_COMPILER=${{ matrix.compiler.cxx }} \
+ -DCMAKE_C_FLAGS="${CFLAGS}" \
+ -DCMAKE_CXX_FLAGS="${CXXFLAGS}"
+
+ cmake --build build
+
+ - name: Run tests
+ run: |
+ cd projects/cPlusPlus/build
+ if [[ "${{ matrix.compiler.cc }}" == clang-* ]]; then
+ export LLVM_PROFILE_FILE="coverage-%p.profraw"
+ else
+ export LLVM_PROFILE_FILE=""
+ fi
+ ctest --output-on-failure
+
+ - name: Generate and show detailed coverage
+ run: |
+ cd projects/cPlusPlus/build
+ if [ "${{ matrix.compiler.cc }}" = "clang-16" ]; then
+ llvm-profdata-16 merge -sparse coverage-*.profraw -o coverage.profdata
+ llvm-cov-16 report ./generated_test -instr-profile=coverage.profdata --ignore-filename-regex=".*(gtest|nlohmann|CMakeFiles).*"
+ elif [ "${{ matrix.compiler.cc }}" = "clang-17" ]; then
+ llvm-profdata-17 merge -sparse coverage-*.profraw -o coverage.profdata
+ llvm-cov-17 report ./generated_test -instr-profile=coverage.profdata --ignore-filename-regex=".*(gtest|nlohmann|CMakeFiles).*"
+ else
+ if [ "${{ matrix.compiler.cc }}" = "gcc-11" ]; then
+ GCOV_EXEC=gcov-11
+ elif [ "${{ matrix.compiler.cc }}" = "gcc-12" ]; then
+ GCOV_EXEC=gcov-12
+ elif [ "${{ matrix.compiler.cc }}" = "gcc-13" ]; then
+ GCOV_EXEC=gcov-13
+ fi
+ gcovr -r .. --exclude '.*gtest.*' --exclude '.*nlohmann.*' --gcov-executable $GCOV_EXEC --txt
+ fi
+
\ No newline at end of file
diff --git a/.github/workflows/project_tests.yml b/.github/workflows/project_tests.yml
new file mode 100644
index 0000000..6334ea9
--- /dev/null
+++ b/.github/workflows/project_tests.yml
@@ -0,0 +1,29 @@
+name: c# Tests and Coverage
+
+on:
+ push:
+ pull_request:
+
+jobs:
+ build-and-test:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Set up .NET SDK
+ uses: actions/setup-dotnet@v3
+ with:
+ dotnet-version: 8.0
+
+ - name: Restore dependencies
+ run: |
+ dotnet restore
+
+ - name: Build the project
+ run: |
+ dotnet build --configuration Release
+
+ - name: Run tests with coverage
+ run: |
+ dotnet test --configuration Release --collect:"XPlat Code Coverage"
diff --git a/.gitignore b/.gitignore
index 2583106..74c4596 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,4 +10,140 @@ TestResults
StaterV/bu
**/.svn
FBDK/FBParser/exp
-.vs
+.idea
+.lib/*
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+
+# User-specific files
+*.suo
+*.user
+*.sln.docstates
+
+# Build results
+
+[Dd]ebug/
+[Rr]elease/
+x64/
+[Bb]in/
+[Oo]bj/
+
+# MSTest test Results
+[Tt]est[Rr]esult*/
+[Bb]uild[Ll]og.*
+
+*_i.c
+*_p.c
+*_i.h
+*.ilk
+*.meta
+*.obj
+*.pch
+*.pdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.tmp_proj
+*.log
+*.vspscc
+*.vssscc
+.builds
+*.pidb
+*.log
+*.svclog
+*.scc
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opensdf
+*.sdf
+*.cachefile
+
+# Visual Studio profiler
+*.psess
+*.vsp
+*.vspx
+
+# Guidance Automation Toolkit
+*.gpState
+
+# ReSharper is a .NET coding add-in
+_ReSharper*/
+*.[Rr]e[Ss]harper
+*.DotSettings.user
+
+# Click-Once directory
+publish/
+
+# Publish Web Output
+*.Publish.xml
+*.pubxml
+*.azurePubxml
+
+# NuGet Packages Directory
+## TODO: If you have NuGet Package Restore enabled, uncomment the next line
+packages/
+## TODO: If the tool you use requires repositories.config, also uncomment the next line
+!packages/repositories.config
+
+# Windows Azure Build Output
+csx/
+*.build.csdef
+
+# Windows Store app package directory
+AppPackages/
+
+# Others
+sql/
+*.Cache
+ClientBin/
+[Ss]tyle[Cc]op.*
+![Ss]tyle[Cc]op.targets
+~$*
+*~
+*.dbmdl
+*.[Pp]ublish.xml
+
+*.publishsettings
+
+# RIA/Silverlight projects
+Generated_Code/
+
+# Backup & report files from converting an old project file to a newer
+# Visual Studio version. Backup files are not needed, because we have git ;-)
+_UpgradeReport_Files/
+Backup*/
+UpgradeLog*.XML
+UpgradeLog*.htm
+
+# SQL Server files
+App_Data/*.mdf
+App_Data/*.ldf
+
+# =========================
+# Windows detritus
+# =========================
+
+# Windows image file caches
+Thumbs.db
+ehthumbs.db
+
+# Folder config file
+Desktop.ini
+
+# Recycle Bin used on file shares
+$RECYCLE.BIN/
+
+# Mac desktop service store files
+.DS_Store
+
+_NCrunch*
+.vs=
+**.received.**
diff --git a/BasePlugin/BasePlugin.csproj b/BasePlugin/BasePlugin.csproj
new file mode 100644
index 0000000..3a63532
--- /dev/null
+++ b/BasePlugin/BasePlugin.csproj
@@ -0,0 +1,9 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
diff --git a/BasePlugin/Class1.cs b/BasePlugin/Class1.cs
new file mode 100644
index 0000000..83d91b1
--- /dev/null
+++ b/BasePlugin/Class1.cs
@@ -0,0 +1,5 @@
+namespace BasePlugin;
+
+public class Class1
+{
+}
\ No newline at end of file
diff --git a/CFuncGenerator/CFuncGenerator.csproj b/CFuncGenerator1/CFuncGenerator1.csproj
similarity index 98%
rename from CFuncGenerator/CFuncGenerator.csproj
rename to CFuncGenerator1/CFuncGenerator1.csproj
index 099ecf0..241f3b6 100644
--- a/CFuncGenerator/CFuncGenerator.csproj
+++ b/CFuncGenerator1/CFuncGenerator1.csproj
@@ -9,7 +9,7 @@
Library
Properties
CFuncGenerator
- CFuncGenerator
+ CFuncGenerator1
v4.0
512
diff --git a/CFuncGenerator/CGenerator.cs b/CFuncGenerator1/CGenerator.cs
similarity index 99%
rename from CFuncGenerator/CGenerator.cs
rename to CFuncGenerator1/CGenerator.cs
index 1d575a2..ea1177e 100644
--- a/CFuncGenerator/CGenerator.cs
+++ b/CFuncGenerator1/CGenerator.cs
@@ -1,8 +1,6 @@
using System;
using System.Collections.Generic;
using System.IO;
-using System.Linq;
-using System.Text;
using PluginData;
namespace CFuncGenerator
diff --git a/CFuncGenerator/CPlugin.cs b/CFuncGenerator1/CPlugin.cs
similarity index 100%
rename from CFuncGenerator/CPlugin.cs
rename to CFuncGenerator1/CPlugin.cs
diff --git a/CFuncGenerator/Properties/AssemblyInfo.cs b/CFuncGenerator1/Properties/AssemblyInfo.cs
similarity index 93%
rename from CFuncGenerator/Properties/AssemblyInfo.cs
rename to CFuncGenerator1/Properties/AssemblyInfo.cs
index 82991ee..f298866 100644
--- a/CFuncGenerator/Properties/AssemblyInfo.cs
+++ b/CFuncGenerator1/Properties/AssemblyInfo.cs
@@ -5,11 +5,11 @@
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
-[assembly: AssemblyTitle("CFuncGenerator")]
+[assembly: AssemblyTitle("CFuncGenerator1")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("CFuncGenerator")]
+[assembly: AssemblyProduct("CFuncGenerator1")]
[assembly: AssemblyCopyright("Copyright © 2015")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
diff --git a/CSharpCodeGenerator/CSharpCodeGenerator.csproj b/CSharpCodeGenerator1/CSharpCodeGenerator1.csproj
similarity index 98%
rename from CSharpCodeGenerator/CSharpCodeGenerator.csproj
rename to CSharpCodeGenerator1/CSharpCodeGenerator1.csproj
index 2b7beb4..254b87c 100644
--- a/CSharpCodeGenerator/CSharpCodeGenerator.csproj
+++ b/CSharpCodeGenerator1/CSharpCodeGenerator1.csproj
@@ -9,7 +9,7 @@
Library
Properties
CSharpCodeGenerator
- CSharpCodeGenerator
+ CSharpCodeGenerator1
v4.0
512
diff --git a/CSharpCodeGenerator/CSharpCodeGenerator_vs08.csproj b/CSharpCodeGenerator1/CSharpCodeGenerator_vs08.csproj
similarity index 100%
rename from CSharpCodeGenerator/CSharpCodeGenerator_vs08.csproj
rename to CSharpCodeGenerator1/CSharpCodeGenerator_vs08.csproj
diff --git a/CSharpCodeGenerator/Plugin.cs b/CSharpCodeGenerator1/Plugin.cs
similarity index 100%
rename from CSharpCodeGenerator/Plugin.cs
rename to CSharpCodeGenerator1/Plugin.cs
diff --git a/CSharpCodeGenerator/Properties/AssemblyInfo.cs b/CSharpCodeGenerator1/Properties/AssemblyInfo.cs
similarity index 92%
rename from CSharpCodeGenerator/Properties/AssemblyInfo.cs
rename to CSharpCodeGenerator1/Properties/AssemblyInfo.cs
index a49950f..1cfbf0b 100644
--- a/CSharpCodeGenerator/Properties/AssemblyInfo.cs
+++ b/CSharpCodeGenerator1/Properties/AssemblyInfo.cs
@@ -5,11 +5,11 @@
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
-[assembly: AssemblyTitle("CSharpCodeGenerator")]
+[assembly: AssemblyTitle("CSharpCodeGenerator1")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Michael Lukin")]
-[assembly: AssemblyProduct("CSharpCodeGenerator")]
+[assembly: AssemblyProduct("CSharpCodeGenerator1")]
[assembly: AssemblyCopyright("Copyright © Michael Lukin")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..dc4dbc6
--- /dev/null
+++ b/README.md
@@ -0,0 +1,108 @@
+# Stater: редактор конечного автомата
+
+Stater — это мощное приложение, разработанное для упрощения создания, управления и выполнения конечных автоматов с использованием фреймворка C# Avalonia. Stater идеально подходит для разработчиков и дизайнеров, которые имеют дело со сложной логикой состояний. Stater предоставляет интуитивно понятный интерфейс для проектирования и управления конечными автоматами для различных приложений.
+
+## Основные возможности
+
+- **Управление проектами:** Легкое создание и управление проектами, содержащими несколько конечных автоматов.
+- **Редактирование конечного автомата:** Проектирование конечных автоматов с состояниями, переходами и условиями.
+- **Моделирование выполнения:** Моделирование переходов состояний и отслеживание изменений в реальном времени.
+- **Отмена/повтор действий:** Предоставляет функцию отмены/повтора для легкой навигации по различным этапам проектирования конечного автомата.
+- **Поддержка плагинов:** Расширение функциональности с помощью пользовательских плагинов.
+- **Ведение журнала и отслеживание переменных:** Мониторинг выполнения и состояний переменных во время моделирования.
+
+## Установка
+
+Клонируйте репозиторий и создайте приложение с помощью .NET с фреймворком Avalonia.
+
+```bash
+dotnet build
+dotnet run
+```
+
+
+## Использование
+
+### Основные интерфейсы
+
+Stater использует несколько ключевых интерфейсов для обеспечения своей функциональности:
+
+- **`IProjectManager`**: управляет созданием проекта, загрузкой, сохранением и управлением конечными автоматами.
+- **`IEditorManager`**: управляет взаимодействием пользователя с компонентами конечного автомата, такими как состояния, переходы и переменные.
+- **`IExecutor`**: управляет моделированием выполнения конечных автоматов, включая запуск, остановку и пошаговое прохождение состояний.
+
+### Пример: создание конечного автомата
+
+Вот как можно программно создать конечный автомат и добавить состояния и переходы:
+
+```csharp
+var projectManager = new ProjectManager();
+projectManager.CreateProject("Example Project");
+var stateMachine = projectManager.CreateStateMachine();
+
+var state1 = projectManager.CreateState();
+var state2 = projectManager.CreateState();
+
+var transition = projectManager.CreateTransition(state1, state2);
+
+projectManager.UpdateStateMachine(stateMachine);
+```
+
+## Stater.CodeGeneration
+Генерация исходного кода из моделей конечных автоматов с использованием шаблонов и языковых адаптеров.
+
+Этот пакет предоставляет механизм генерации кода для различных языков программирования на основе внутренней модели автомата. Он гибко настраивается с помощью шаблонов и параметров генерации.
+
+Для каждого сгенерированного кода необходимо установить соответсвующую библиотеку [stater-fsm-code](https://github.com/PhoenixNazarov/stater-fsm-code).
+
+### Основные компоненты
+- `CodeGenerator.cs`. Главная точка входа в процесс генерации. Координирует адаптеры, загрузку шаблонов и вывод итоговых файлов.
+- `Entity/`. Модели данных, описывающие параметры генерации:
+ - `GenerationSettings.cs` — общие настройки генерации (язык, режим, путь и т.д.).
+ - `Language.cs` — перечисление поддерживаемых языков.
+ - `Mode.cs` — режимы генерации (например, с тестами / без тестов).
+- `LanguageAdapter/`. Адаптеры для различных языков. Каждый из них отвечает за конкретный синтаксис, соглашения и поведение языка. Основаны на базовом классе `BaseLanguageAdapter`.
+ - `Base/`
+ - `BaseLanguageAdapter.cs` — абстрактный класс, реализующий общую логику адаптеров.
+ - `TemplateLoader.cs` — загрузка и обработка шаблонов Scriban.
+
+### Языковые адаптеры:
+- `CSharpAdapter.cs`
+- `PythonAdapter.cs`
+- `JavaAdapter.cs`
+- `JavaScriptAdapter.cs`
+- `TypeScriptAdapter.cs`
+- `KotlinAdapter.cs`
+- `CPlusPlusAdapter.cs`
+
+`ScenarioFinder.cs`.
+
+Утилита для нахождения и анализа сценариев в модели автомата — возможно используется для генерации тестов или автоматизации переходов.
+
+`Stater.CodeGeneration.csproj`.
+
+Файл проекта .NET с зависимостями, настройками сборки и т.д.
+
+### Шаблоны: Templates/
+Scriban-шаблоны, используемые при генерации:
+
+`{language}.scriban` — основной шаблон генерации.
+
+`{language}-test.scriban` — шаблон для генерации unit-тестов.
+
+Поддерживаемые языки:
+
+- `c#`, `python`, `java`, `javascript`, `typescript`, `kotlin`, `c++`
+
+### Пример генерации
+```c#
+var settings = new GenerationSettings
+{
+ Language = Language.CSharp,
+ OutputDirectory = "./Generated",
+ Mode = Mode.Full
+};
+
+var generator = new CodeGenerator();
+generator.Generate(projectModel, settings);
+```
diff --git a/SpinVeriff/SpinPlugin.cs b/SpinVeriff/SpinPlugin.cs
index f9a6148..f0151ae 100644
--- a/SpinVeriff/SpinPlugin.cs
+++ b/SpinVeriff/SpinPlugin.cs
@@ -10,6 +10,9 @@
using StaterV.PluginManager;
using StaterV.StateMachine;
+// TODO: practice NEED
+
+
namespace SpinVeriff
{
public class SpinPlugin : ButtonPlugin
diff --git a/Stater.sln b/Stater.sln
index ad663f5..829b841 100644
--- a/Stater.sln
+++ b/Stater.sln
@@ -1,53 +1,19 @@
Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{1B39C48B-5F4B-4556-A2B3-E4AC50F30B43}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Stater", "src\Stater\Stater.csproj", "{EA81CCF1-284B-4E2D-8CB8-AE9C8EACC01E}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StaterV", "StaterV\StaterV.csproj", "{B90AF5E3-3BFA-4501-ADAB-CF32D2677DB7}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Stater.CodeGeneration.Tests", "src\Stater.CodeGeneration.Tests\Stater.CodeGeneration.Tests.csproj", "{879047E1-76DD-4892-AF8F-8EC562514AD7}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StaterWPF", "StaterWPF\StaterWPF.csproj", "{8506DC5F-90B6-421A-88E8-CB3C33CE0C91}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Stater.Domain", "src\Stater.Domain\Stater.Domain.csproj", "{3A09EFE1-C88B-46E6-B0C8-00F7A9D00795}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FirstPlugin", "FirstPlugin\FirstPlugin.csproj", "{5B7A672B-3DB0-4406-9DF1-D1BAE6726BF7}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Stater.CodeGeneration", "src\Stater.CodeGeneration\Stater.CodeGeneration.csproj", "{E7786CE3-7E88-456D-ADFE-11035E842ABB}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSharpCodeGenerator", "CSharpCodeGenerator\CSharpCodeGenerator.csproj", "{B21D8C78-FB92-4C38-8773-6ABB244BF407}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Stater.SLXParser", "src\Stater.SLXParser\Stater.SLXParser.csproj", "{1CE08542-B4A2-4632-A066-68462E0BC603}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common", "Common\Common.csproj", "{542E45C9-9853-42DB-B1C5-1D540FA1700E}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Stater.CodeGeneration.App", "src\Stater.CodeGeneration.App\Stater.CodeGeneration.App.csproj", "{EA6A952C-2854-4031-94E0-724CCC388807}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CppCodeGenerator", "CppCodeGenerator\CppCodeGenerator.csproj", "{00BCE648-24B5-4523-8180-74841842DD3C}"
- ProjectSection(ProjectDependencies) = postProject
- {B90AF5E3-3BFA-4501-ADAB-CF32D2677DB7} = {B90AF5E3-3BFA-4501-ADAB-CF32D2677DB7}
- EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SpinVeriff", "SpinVeriff\SpinVeriff.csproj", "{BFBB771A-D679-4C13-885D-BA6425773924}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SpinVeriffWPF", "SpinVeriffWPF\SpinVeriffWPF.csproj", "{C4AF1EE4-CD8F-4A7B-9818-CBCBBCC7B2BC}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PluginData", "PluginData\PluginData.csproj", "{41A0B9E4-C529-4F6D-8F69-AB0EE1AE6951}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ind1", "Ind1\Ind1.csproj", "{29B57FE7-013D-49C5-AEBA-A062637D36A3}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSMultyThread", "CSMultyThread\CSMultyThread.csproj", "{FC4128C8-7183-4097-9DFC-1C168D41F42B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TextProcessor", "TextProcessor\TextProcessor.csproj", "{412DC173-85E2-4A92-B886-11F173CB40E4}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StaterVTest", "StaterVTest\StaterVTest.csproj", "{97A35264-A93D-46E4-9DCE-767D427DFA7D}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{16AA45D4-5DC2-4EA5-9016-ED33F6C3F07E}"
- ProjectSection(SolutionItems) = preProject
- Local.testsettings = Local.testsettings
- Stater.vsmdi = Stater.vsmdi
- TraceAndTestImpact.testsettings = TraceAndTestImpact.testsettings
- EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SpinVeriffTest", "SpinVeriffTest\SpinVeriffTest.csproj", "{D2D3393E-2248-4406-8065-FF4AEF919AC3}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StateFlow", "StateFlow\StateFlow.csproj", "{2FC95B0A-B404-4E88-8FB0-11F357D2A7C1}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JavaMultyThread", "JavaMultyThread\JavaMultyThread.csproj", "{5E9FF3AA-0784-4B4A-BCD2-9CCBC39D4D66}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FBDK", "FBDK\FBDK.csproj", "{09FED13A-1642-496C-AE3F-F0A2770BE9A2}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CFuncGenerator", "CFuncGenerator\CFuncGenerator.csproj", "{EA67DB8A-BB10-4343-87A0-E91EDD783C8B}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Stater.Domain.Tests", "src\Stater.Domain.Tests\Stater.Domain.Tests.csproj", "{D1E2AF9B-55A2-4198-8797-633ABA37AA81}"
EndProject
Global
GlobalSection(TestCaseManagementSettings) = postSolution
@@ -58,93 +24,38 @@ Global
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {B90AF5E3-3BFA-4501-ADAB-CF32D2677DB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {B90AF5E3-3BFA-4501-ADAB-CF32D2677DB7}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {B90AF5E3-3BFA-4501-ADAB-CF32D2677DB7}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {B90AF5E3-3BFA-4501-ADAB-CF32D2677DB7}.Release|Any CPU.Build.0 = Release|Any CPU
- {8506DC5F-90B6-421A-88E8-CB3C33CE0C91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {8506DC5F-90B6-421A-88E8-CB3C33CE0C91}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {8506DC5F-90B6-421A-88E8-CB3C33CE0C91}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {8506DC5F-90B6-421A-88E8-CB3C33CE0C91}.Release|Any CPU.Build.0 = Release|Any CPU
- {5B7A672B-3DB0-4406-9DF1-D1BAE6726BF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {5B7A672B-3DB0-4406-9DF1-D1BAE6726BF7}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {5B7A672B-3DB0-4406-9DF1-D1BAE6726BF7}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {5B7A672B-3DB0-4406-9DF1-D1BAE6726BF7}.Release|Any CPU.Build.0 = Release|Any CPU
- {B21D8C78-FB92-4C38-8773-6ABB244BF407}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {B21D8C78-FB92-4C38-8773-6ABB244BF407}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {B21D8C78-FB92-4C38-8773-6ABB244BF407}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {B21D8C78-FB92-4C38-8773-6ABB244BF407}.Release|Any CPU.Build.0 = Release|Any CPU
- {542E45C9-9853-42DB-B1C5-1D540FA1700E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {542E45C9-9853-42DB-B1C5-1D540FA1700E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {542E45C9-9853-42DB-B1C5-1D540FA1700E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {542E45C9-9853-42DB-B1C5-1D540FA1700E}.Release|Any CPU.Build.0 = Release|Any CPU
- {00BCE648-24B5-4523-8180-74841842DD3C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {00BCE648-24B5-4523-8180-74841842DD3C}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {00BCE648-24B5-4523-8180-74841842DD3C}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {00BCE648-24B5-4523-8180-74841842DD3C}.Release|Any CPU.Build.0 = Release|Any CPU
- {BFBB771A-D679-4C13-885D-BA6425773924}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {BFBB771A-D679-4C13-885D-BA6425773924}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {BFBB771A-D679-4C13-885D-BA6425773924}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {BFBB771A-D679-4C13-885D-BA6425773924}.Release|Any CPU.Build.0 = Release|Any CPU
- {C4AF1EE4-CD8F-4A7B-9818-CBCBBCC7B2BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {C4AF1EE4-CD8F-4A7B-9818-CBCBBCC7B2BC}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {C4AF1EE4-CD8F-4A7B-9818-CBCBBCC7B2BC}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {C4AF1EE4-CD8F-4A7B-9818-CBCBBCC7B2BC}.Release|Any CPU.Build.0 = Release|Any CPU
- {41A0B9E4-C529-4F6D-8F69-AB0EE1AE6951}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {41A0B9E4-C529-4F6D-8F69-AB0EE1AE6951}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {41A0B9E4-C529-4F6D-8F69-AB0EE1AE6951}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {41A0B9E4-C529-4F6D-8F69-AB0EE1AE6951}.Release|Any CPU.Build.0 = Release|Any CPU
- {29B57FE7-013D-49C5-AEBA-A062637D36A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {29B57FE7-013D-49C5-AEBA-A062637D36A3}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {29B57FE7-013D-49C5-AEBA-A062637D36A3}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {29B57FE7-013D-49C5-AEBA-A062637D36A3}.Release|Any CPU.Build.0 = Release|Any CPU
- {FC4128C8-7183-4097-9DFC-1C168D41F42B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {FC4128C8-7183-4097-9DFC-1C168D41F42B}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {FC4128C8-7183-4097-9DFC-1C168D41F42B}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {FC4128C8-7183-4097-9DFC-1C168D41F42B}.Release|Any CPU.Build.0 = Release|Any CPU
- {412DC173-85E2-4A92-B886-11F173CB40E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {412DC173-85E2-4A92-B886-11F173CB40E4}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {412DC173-85E2-4A92-B886-11F173CB40E4}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {412DC173-85E2-4A92-B886-11F173CB40E4}.Release|Any CPU.Build.0 = Release|Any CPU
- {97A35264-A93D-46E4-9DCE-767D427DFA7D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {97A35264-A93D-46E4-9DCE-767D427DFA7D}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {97A35264-A93D-46E4-9DCE-767D427DFA7D}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {97A35264-A93D-46E4-9DCE-767D427DFA7D}.Release|Any CPU.Build.0 = Release|Any CPU
- {D2D3393E-2248-4406-8065-FF4AEF919AC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {D2D3393E-2248-4406-8065-FF4AEF919AC3}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {D2D3393E-2248-4406-8065-FF4AEF919AC3}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {D2D3393E-2248-4406-8065-FF4AEF919AC3}.Release|Any CPU.Build.0 = Release|Any CPU
- {2FC95B0A-B404-4E88-8FB0-11F357D2A7C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {2FC95B0A-B404-4E88-8FB0-11F357D2A7C1}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {2FC95B0A-B404-4E88-8FB0-11F357D2A7C1}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {2FC95B0A-B404-4E88-8FB0-11F357D2A7C1}.Release|Any CPU.Build.0 = Release|Any CPU
- {5E9FF3AA-0784-4B4A-BCD2-9CCBC39D4D66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {5E9FF3AA-0784-4B4A-BCD2-9CCBC39D4D66}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {5E9FF3AA-0784-4B4A-BCD2-9CCBC39D4D66}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {5E9FF3AA-0784-4B4A-BCD2-9CCBC39D4D66}.Release|Any CPU.Build.0 = Release|Any CPU
- {09FED13A-1642-496C-AE3F-F0A2770BE9A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {09FED13A-1642-496C-AE3F-F0A2770BE9A2}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {09FED13A-1642-496C-AE3F-F0A2770BE9A2}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {09FED13A-1642-496C-AE3F-F0A2770BE9A2}.Release|Any CPU.Build.0 = Release|Any CPU
- {EA67DB8A-BB10-4343-87A0-E91EDD783C8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {EA67DB8A-BB10-4343-87A0-E91EDD783C8B}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {EA67DB8A-BB10-4343-87A0-E91EDD783C8B}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {EA67DB8A-BB10-4343-87A0-E91EDD783C8B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {EA81CCF1-284B-4E2D-8CB8-AE9C8EACC01E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {EA81CCF1-284B-4E2D-8CB8-AE9C8EACC01E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {EA81CCF1-284B-4E2D-8CB8-AE9C8EACC01E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {EA81CCF1-284B-4E2D-8CB8-AE9C8EACC01E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {879047E1-76DD-4892-AF8F-8EC562514AD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {879047E1-76DD-4892-AF8F-8EC562514AD7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {879047E1-76DD-4892-AF8F-8EC562514AD7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {879047E1-76DD-4892-AF8F-8EC562514AD7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3A09EFE1-C88B-46E6-B0C8-00F7A9D00795}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3A09EFE1-C88B-46E6-B0C8-00F7A9D00795}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3A09EFE1-C88B-46E6-B0C8-00F7A9D00795}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3A09EFE1-C88B-46E6-B0C8-00F7A9D00795}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E7786CE3-7E88-456D-ADFE-11035E842ABB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E7786CE3-7E88-456D-ADFE-11035E842ABB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E7786CE3-7E88-456D-ADFE-11035E842ABB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E7786CE3-7E88-456D-ADFE-11035E842ABB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1CE08542-B4A2-4632-A066-68462E0BC603}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1CE08542-B4A2-4632-A066-68462E0BC603}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1CE08542-B4A2-4632-A066-68462E0BC603}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1CE08542-B4A2-4632-A066-68462E0BC603}.Release|Any CPU.Build.0 = Release|Any CPU
+ {EA6A952C-2854-4031-94E0-724CCC388807}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {EA6A952C-2854-4031-94E0-724CCC388807}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {EA6A952C-2854-4031-94E0-724CCC388807}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {EA6A952C-2854-4031-94E0-724CCC388807}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D1E2AF9B-55A2-4198-8797-633ABA37AA81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D1E2AF9B-55A2-4198-8797-633ABA37AA81}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D1E2AF9B-55A2-4198-8797-633ABA37AA81}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D1E2AF9B-55A2-4198-8797-633ABA37AA81}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
- {B21D8C78-FB92-4C38-8773-6ABB244BF407} = {1B39C48B-5F4B-4556-A2B3-E4AC50F30B43}
- {542E45C9-9853-42DB-B1C5-1D540FA1700E} = {1B39C48B-5F4B-4556-A2B3-E4AC50F30B43}
- {00BCE648-24B5-4523-8180-74841842DD3C} = {1B39C48B-5F4B-4556-A2B3-E4AC50F30B43}
- {BFBB771A-D679-4C13-885D-BA6425773924} = {1B39C48B-5F4B-4556-A2B3-E4AC50F30B43}
- {C4AF1EE4-CD8F-4A7B-9818-CBCBBCC7B2BC} = {1B39C48B-5F4B-4556-A2B3-E4AC50F30B43}
- {29B57FE7-013D-49C5-AEBA-A062637D36A3} = {1B39C48B-5F4B-4556-A2B3-E4AC50F30B43}
- {FC4128C8-7183-4097-9DFC-1C168D41F42B} = {1B39C48B-5F4B-4556-A2B3-E4AC50F30B43}
- {D2D3393E-2248-4406-8065-FF4AEF919AC3} = {1B39C48B-5F4B-4556-A2B3-E4AC50F30B43}
- {5E9FF3AA-0784-4B4A-BCD2-9CCBC39D4D66} = {1B39C48B-5F4B-4556-A2B3-E4AC50F30B43}
- {09FED13A-1642-496C-AE3F-F0A2770BE9A2} = {1B39C48B-5F4B-4556-A2B3-E4AC50F30B43}
- {EA67DB8A-BB10-4343-87A0-E91EDD783C8B} = {1B39C48B-5F4B-4556-A2B3-E4AC50F30B43}
EndGlobalSection
EndGlobal
diff --git a/Stater.sln.DotSettings.user b/Stater.sln.DotSettings.user
index 5c6e27c..ed3781e 100644
--- a/Stater.sln.DotSettings.user
+++ b/Stater.sln.DotSettings.user
@@ -1,8 +1,29 @@
+ <AssemblyExplorer>
+ <Assembly Path="/Users/vnazarov/.nuget/packages/dynamicdata/9.0.4/lib/net8.0/DynamicData.dll" />
+</AssemblyExplorer>
False
SOLUTION
+ <SessionState ContinuousTestingMode="0" Name="ConvertToKotlin_ShouldGenerateValidCode" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session">
+ <Or>
+ <TestAncestor>
+ <TestId>xUnit::879047E1-76DD-4892-AF8F-8EC562514AD7::net8.0::Stater.CodeGeneration.Tests.LanguageAdapter.Kotlin.KotlinAdapterDoorTests</TestId>
+ <TestId>xUnit::879047E1-76DD-4892-AF8F-8EC562514AD7::net8.0::Stater.CodeGeneration.Tests.LanguageAdapter.Python.PythonAdapterDoorTests</TestId>
+ <TestId>xUnit::879047E1-76DD-4892-AF8F-8EC562514AD7::net8.0::Stater.CodeGeneration.Tests.ScenarioFinderTests.ClazzGenerate</TestId>
+ <TestId>xUnit::D1E2AF9B-55A2-4198-8797-633ABA37AA81::net8.0::Stater.Domain.Tests.Json.StateMachineJsonAdapterTests.TestToJsonSchema</TestId>
+ <TestId>xUnit::D1E2AF9B-55A2-4198-8797-633ABA37AA81::net8.0::Stater.Domain.Tests.Json.StateMachineJsonAdapterTests.TestFromJsonSchema</TestId>
+ </TestAncestor>
+ <ProjectFile>D1E2AF9B-55A2-4198-8797-633ABA37AA81/d:Json/f:StateMachineJsonAdapterTests.cs</ProjectFile>
+ <Project Location="/Users/vnazarov/RiderProjects/Stater3/src/Stater.CodeGeneration.Tests" Presentation="<Stater.CodeGeneration.Tests>" />
+ </Or>
+</SessionState>
+ <SessionState ContinuousTestingMode="0" IsActive="True" Name="Session" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session">
+ <Project Location="/Users/vnazarov/RiderProjects/Stater3/src/Stater.CodeGeneration.Tests" Presentation="<Stater.CodeGeneration.Tests>" />
+</SessionState>
True
True
TestArrayW1
- <Session><Elements /></Session>
\ No newline at end of file
+ <Session><Elements /></Session>
+
+ True
\ No newline at end of file
diff --git a/StaterV/ButtonPlugin.cs b/StaterV/ButtonPlugin.cs
index 1fb596e..e6e3b9f 100644
--- a/StaterV/ButtonPlugin.cs
+++ b/StaterV/ButtonPlugin.cs
@@ -1,8 +1,6 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using StaterV.PluginManager;
+using StaterV.PluginManager;
+
+// TODO: practice NEED
namespace StaterV
{
diff --git a/StaterV/StaterV.csproj b/StaterV/StaterV.csproj
index 6e4ff96..fc3533e 100644
--- a/StaterV/StaterV.csproj
+++ b/StaterV/StaterV.csproj
@@ -384,14 +384,6 @@
-
- {41A0B9E4-C529-4F6D-8F69-AB0EE1AE6951}
- PluginData
-
-
- {2FC95B0A-B404-4E88-8FB0-11F357D2A7C1}
- StateFlow
-
{412DC173-85E2-4A92-B886-11F173CB40E4}
TextProcessor
diff --git a/changelog.md b/changelog.md
new file mode 100644
index 0000000..f4a0eb4
--- /dev/null
+++ b/changelog.md
@@ -0,0 +1,16 @@
+# Changelog
+
+## [Unreleased]
+
+### Добавления
+- Добавлена возможность запуска автомата
+- Добавлено окно справа для контрукторов рекдактирования состояний, переходов..
+- Добавлено окно слева для перехода между конечными автоматами
+
+### Изменения
+- Изменена версия C#: C# Framework 4 -> C# net 8
+- Изменена директория с решением проекта, теперь основное решения находитсяв /src/Stater
+- Изменен фреймворк для интерфейса Windows Forms -> Avalonia
+- Изменена структура приложения, на данный момент приложение использует MVVM архитектуру
+- Изменена система UNDO-REDO, раньше каждая команда требовала отдельного написания для класса, сейчас сохраняется каждое изменение StateMachine, что не требует функциональности для REDO
+- Изменена система плагинов, на данный момент плагин не является отдельным решением
diff --git a/src/Stater.CodeGeneration.App/Program.cs b/src/Stater.CodeGeneration.App/Program.cs
new file mode 100644
index 0000000..9396157
--- /dev/null
+++ b/src/Stater.CodeGeneration.App/Program.cs
@@ -0,0 +1,153 @@
+// See https://aka.ms/new-console-template for more information
+
+
+using Stater.CodeGeneration;
+using Stater.CodeGeneration.App;
+using Stater.CodeGeneration.Entity;
+
+
+if (args.Length < 3)
+{
+ Console.WriteLine("Please write: [output-path] [seed] [language]");
+}
+
+var outputPath = args[0];
+var seed = int.Parse(args[1]);
+var language = args[2];
+
+if (!Directory.Exists(outputPath))
+{
+ Directory.CreateDirectory(outputPath);
+ Console.WriteLine($"Folder created: {outputPath}");
+}
+
+var randomStateMachineGenerator = new RandomStateMachineGenerator(seed);
+
+var states = new List { false, true };
+var codeGenerator = new CodeGenerator();
+
+foreach (var generateMode in new List { Mode.Builder, Mode.Clazz })
+{
+ foreach (var generateStates in states)
+ {
+ foreach (var generateContext in states)
+ {
+ foreach (var generateInterface in states)
+ {
+ var randomStateMachine = randomStateMachineGenerator.GenerateStateMachine(5, 10, 10, 10, 10);
+
+ var path = outputPath;
+ var testPath = outputPath;
+ var languageS = Language.Python3;
+ switch (language)
+ {
+ case "python3":
+ path += randomStateMachine.Name + ".py";
+ testPath += "test_" + randomStateMachine.Name + ".py";
+ languageS = Language.Python3;
+ break;
+ case "javascript":
+ path += randomStateMachine.Name + ".js";
+ testPath += randomStateMachine.Name + ".test.js";
+ languageS = Language.JavaScript;
+ break;
+ case "typescript":
+ path += randomStateMachine.Name + ".ts";
+ testPath += randomStateMachine.Name + ".test.ts";
+ languageS = Language.TypeScript;
+ break;
+ case "kotlin":
+ path += "main/kotlin/fsm/" + randomStateMachine.Name.ToLower() + "/";
+ testPath += "test/kotlin/fsm/" + randomStateMachine.Name.ToLower() + "/";
+ if (!Directory.Exists(path))
+ {
+ Directory.CreateDirectory(path);
+ Console.WriteLine($"Folder created: {path}");
+ }
+ if (!Directory.Exists(testPath))
+ {
+ Directory.CreateDirectory(testPath);
+ Console.WriteLine($"Folder created: {testPath}");
+ }
+ path += randomStateMachine.Name + ".kt";
+ testPath += "Test" + randomStateMachine.Name + ".kt";
+
+ languageS = Language.Kotlin;
+ break;
+ case "java":
+ path += "main/java/fsm/" + randomStateMachine.Name.ToLower() + "/";
+ testPath += "test/java/fsm/" + randomStateMachine.Name.ToLower() + "/";
+ if (!Directory.Exists(path))
+ {
+ Directory.CreateDirectory(path);
+ Console.WriteLine($"Folder created: {path}");
+ }
+ if (!Directory.Exists(testPath))
+ {
+ Directory.CreateDirectory(testPath);
+ Console.WriteLine($"Folder created: {testPath}");
+ }
+ path += randomStateMachine.Name + ".java";
+ testPath += "Test" + randomStateMachine.Name + ".java";
+
+ languageS = Language.Java;
+ break;
+ case "csharp":
+ path += "/Stater.StateMachine.Lib/fsm/" + randomStateMachine.Name.ToLower() + "/";
+ testPath += "/Stater.StateMachine.Lib.Tests/fsm/" + randomStateMachine.Name.ToLower() + "/";
+ if (!Directory.Exists(path))
+ {
+ Directory.CreateDirectory(path);
+ Console.WriteLine($"Folder created: {path}");
+ }
+ if (!Directory.Exists(testPath))
+ {
+ Directory.CreateDirectory(testPath);
+ Console.WriteLine($"Folder created: {testPath}");
+ }
+ path += randomStateMachine.Name + ".cs";
+ testPath += "Test" + randomStateMachine.Name + ".cs";
+
+ languageS = Language.CSharp;
+ break;
+ case "cplusplus":
+ path += "fsm/" + randomStateMachine.Name + "/";
+ testPath += "tests/";
+ if (!Directory.Exists(path))
+ {
+ Directory.CreateDirectory(path);
+ Console.WriteLine($"Folder created: {path}");
+ }
+ if (!Directory.Exists(testPath))
+ {
+ Directory.CreateDirectory(testPath);
+ Console.WriteLine($"Folder created: {testPath}");
+ }
+ path += randomStateMachine.Name + ".h";
+ testPath += "test_" + randomStateMachine.Name + ".cpp";
+
+ languageS = Language.CPlusPlus;
+ break;
+ }
+
+ var settings = new GenerationSettings(
+ languageS
+ , generateMode
+ , GenerateStates: generateStates
+ , GenerateContext: generateContext
+ , GenerateInterface: generateInterface
+ );
+
+ using var sw = new StreamWriter(path);
+ var result = codeGenerator.Generate(randomStateMachine, settings);
+ sw.WriteLine(result);
+
+
+ using var swTest = new StreamWriter(testPath);
+ var results = ScenarioFinder.FindScenarios(randomStateMachine);
+ var resultTest = codeGenerator.GenerateTests(randomStateMachine, settings, results);
+ swTest.WriteLine(resultTest);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.App/RandomStateMachineGenerator.cs b/src/Stater.CodeGeneration.App/RandomStateMachineGenerator.cs
new file mode 100644
index 0000000..d260e12
--- /dev/null
+++ b/src/Stater.CodeGeneration.App/RandomStateMachineGenerator.cs
@@ -0,0 +1,150 @@
+using Stater.Domain.Models;
+
+namespace Stater.CodeGeneration.App;
+
+public class RandomStateMachineGenerator(int seed)
+{
+ private readonly Random random = new(seed);
+
+ private string RandomString(int length)
+ {
+ const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ return new string(Enumerable.Repeat(chars, length)
+ .Select(s => s[random.Next(s.Length)]).ToArray());
+ }
+
+ private State GenerateState() => new(
+ Guid.NewGuid(),
+ RandomString(10),
+ RandomString(20),
+ StateType.Common,
+ 0,
+ 0,
+ new List(),
+ new List()
+ );
+
+ private Transition GenerateTransition(IReadOnlyList states) => new(
+ Guid.NewGuid(),
+ RandomString(15),
+ states[random.Next(states.Count)].Guid,
+ states[random.Next(states.Count)].Guid,
+ null,
+ null
+ );
+
+ private VariableValue.StringVariable GenerateStringVariableValue() => new(RandomString(30));
+ private VariableValue.IntVariable GenerateIntVariableValue() => new(random.Next(99999));
+ private VariableValue.FloatVariable GenerateFloatVariableValue() => new((float)random.NextDouble());
+ private VariableValue.BoolVariable GenerateBoolVariableValue() => new(random.Next(2) == 0);
+
+ private VariableValue GenerateVariableValue() => random.Next(4) switch
+ {
+ 0 => GenerateStringVariableValue(),
+ 1 => GenerateIntVariableValue(),
+ 2 => GenerateFloatVariableValue(),
+ 3 => GenerateBoolVariableValue(),
+ _ => throw new ArgumentOutOfRangeException()
+ };
+
+ private VariableValue GenerateVariableValue(VariableValue variableValue) => variableValue switch
+ {
+ VariableValue.StringVariable => GenerateStringVariableValue(),
+ VariableValue.IntVariable => GenerateIntVariableValue(),
+ VariableValue.FloatVariable => GenerateFloatVariableValue(),
+ VariableValue.BoolVariable => GenerateBoolVariableValue(),
+ _ => throw new ArgumentOutOfRangeException()
+ };
+
+ private Variable GenerateVariable() => new(Guid.NewGuid(), RandomString(15), GenerateVariableValue());
+
+ private Event GenerateEvent(IReadOnlyList variables)
+ {
+ switch (random.Next(2))
+ {
+ case 0:
+ var variable = variables[random.Next(variables.Count)];
+ return new Event.VariableSet(
+ variable.Guid,
+ GenerateVariableValue(variable.StartValue)
+ );
+ case 1:
+ var variable2 = variables[random.Next(variables.Count)];
+ return new Event.VariableMath(
+ variable2.Guid,
+ random.Next(4) switch
+ {
+ 0 => Event.VariableMath.MathTypeEnum.Sum,
+ 1 => Event.VariableMath.MathTypeEnum.Div,
+ 2 => Event.VariableMath.MathTypeEnum.Sub,
+ 3 => Event.VariableMath.MathTypeEnum.Mul,
+ _ => throw new ArgumentOutOfRangeException()
+ },
+ GenerateVariableValue(variable2.StartValue)
+ );
+ }
+
+ throw new ArgumentOutOfRangeException();
+ }
+
+ private Condition GenerateCondition(IReadOnlyList variables)
+ {
+ switch (random.Next(1))
+ {
+ case 0:
+ var variable1 = variables[random.Next(variables.Count)];
+ return new Condition.VariableCondition(
+ variable1.Guid,
+ random.Next(6) switch
+ {
+ 0 => Condition.VariableCondition.ConditionTypeEnum.Lt,
+ 1 => Condition.VariableCondition.ConditionTypeEnum.Le,
+ 2 => Condition.VariableCondition.ConditionTypeEnum.Eq,
+ 3 => Condition.VariableCondition.ConditionTypeEnum.Ne,
+ 4 => Condition.VariableCondition.ConditionTypeEnum.Gt,
+ 5 => Condition.VariableCondition.ConditionTypeEnum.Ge,
+ _ => throw new ArgumentOutOfRangeException()
+ },
+ GenerateVariableValue(variable1.StartValue)
+ );
+ }
+
+ throw new ArgumentOutOfRangeException();
+ }
+
+ public StateMachine GenerateStateMachine(
+ int countState,
+ int countTransitions,
+ int countVariables,
+ int countEvents,
+ int countConditions
+ )
+ {
+ var states = Enumerable.Range(0, countState).Select(_ => GenerateState()).ToList();
+ var startStateIndex = random.Next(countState);
+ states[startStateIndex] = states[startStateIndex] with { Type = StateType.Start };
+ var transitions = Enumerable.Range(0, countTransitions).Select(_ => GenerateTransition(states)).ToList();
+ var variables = Enumerable.Range(0, countVariables).Select(_ => GenerateVariable()).ToList();
+
+ for (var i = 0; i < countEvents; i++)
+ {
+ var transitionIndex = random.Next(countTransitions);
+ transitions[transitionIndex] = transitions[transitionIndex] with { Event = GenerateEvent(variables) };
+ }
+
+ for (var i = 0; i < countConditions; i++)
+ {
+ var transitionIndex = random.Next(countTransitions);
+ transitions[transitionIndex] =
+ transitions[transitionIndex] with { Condition = GenerateCondition(variables) };
+ }
+
+ return new StateMachine(
+ Guid.NewGuid(),
+ RandomString(20),
+ states,
+ transitions,
+ variables
+ );
+ }
+}
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.App/Stater.CodeGeneration.App.csproj b/src/Stater.CodeGeneration.App/Stater.CodeGeneration.App.csproj
new file mode 100644
index 0000000..1fa968a
--- /dev/null
+++ b/src/Stater.CodeGeneration.App/Stater.CodeGeneration.App.csproj
@@ -0,0 +1,13 @@
+
+
+
+ Exe
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/BaseTestAdapterGenerateDoorTests.cs b/src/Stater.CodeGeneration.Tests/LanguageAdapter/BaseTestAdapterGenerateDoorTests.cs
new file mode 100644
index 0000000..c6eedb2
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/BaseTestAdapterGenerateDoorTests.cs
@@ -0,0 +1,235 @@
+using Stater.CodeGeneration.Entity;
+using Stater.CodeGeneration.LanguageAdapter.Base;
+
+namespace Stater.CodeGeneration.Tests.LanguageAdapter;
+
+public abstract class BaseTestAdapterGenerateDoorTests
+{
+ protected abstract BaseLanguageAdapter Adapter { get; }
+ protected abstract Language Language { get; }
+
+
+
+ [Fact]
+ public Task ClazzGenerate()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var settings = new GenerationSettings(
+ Language
+ );
+ var result = Adapter.Generate(stateMachine, settings);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+
+ [Fact]
+ public Task ClazzGenerateWithInterface()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var settings = new GenerationSettings(
+ Language,
+ GenerateInterface: true
+ );
+
+ var result = Adapter.Generate(stateMachine, settings);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+
+ [Fact]
+ public Task ClazzStateGenerate()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var settings = new GenerationSettings(
+ Language,
+ GenerateStates: true
+ );
+
+ var result = Adapter.Generate(stateMachine, settings);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+
+ [Fact]
+ public Task ClazzStateGenerateWithInterface()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var settings = new GenerationSettings(
+ Language,
+ GenerateStates: true,
+ GenerateInterface: true
+ );
+
+ var result = Adapter.Generate(stateMachine, settings);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+
+ [Fact]
+ public Task ClazzContextGenerate()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var settings = new GenerationSettings(
+ Language,
+ GenerateContext: true
+ );
+
+ var result = Adapter.Generate(stateMachine, settings);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+
+ [Fact]
+ public Task ClazzContextGenerateWithInterface()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var settings = new GenerationSettings(
+ Language,
+ GenerateContext: true,
+ GenerateInterface: true
+ );
+
+ var result = Adapter.Generate(stateMachine, settings);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+
+ [Fact]
+ public Task ClazzStateContextGenerate()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var settings = new GenerationSettings(
+ Language,
+ GenerateStates: true,
+ GenerateContext: true
+ );
+
+ var result = Adapter.Generate(stateMachine, settings);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+
+ [Fact]
+ public Task ClazzStateContextGenerateWithInterface()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var settings = new GenerationSettings(
+ Language,
+ GenerateStates: true,
+ GenerateContext: true,
+ GenerateInterface: true
+ );
+
+ var result = Adapter.Generate(stateMachine, settings);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+
+ [Fact]
+ public Task BuilderGenerate()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var settings = new GenerationSettings(
+ Language,
+ Mode.Builder
+ );
+
+ var result = Adapter.Generate(stateMachine, settings);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+
+ [Fact]
+ public Task BuilderGenerateWithInterface()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var settings = new GenerationSettings(
+ Language,
+ Mode.Builder,
+ GenerateInterface: true
+ );
+
+ var result = Adapter.Generate(stateMachine, settings);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+
+ [Fact]
+ public Task BuilderStateGenerate()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var settings = new GenerationSettings(
+ Language,
+ Mode.Builder,
+ GenerateStates: true
+ );
+
+ var result = Adapter.Generate(stateMachine, settings);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+
+ [Fact]
+ public Task BuilderStateGenerateWithInterface()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var settings = new GenerationSettings(
+ Language,
+ Mode.Builder,
+ GenerateStates: true,
+ GenerateInterface: true
+ );
+
+ var result = Adapter.Generate(stateMachine, settings);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+
+ [Fact]
+ public Task BuilderContextGenerate()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var settings = new GenerationSettings(
+ Language,
+ Mode.Builder,
+ GenerateContext: true
+ );
+
+ var result = Adapter.Generate(stateMachine, settings);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+
+ [Fact]
+ public Task BuilderContextGenerateWithInterface()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var settings = new GenerationSettings(
+ Language,
+ Mode.Builder,
+ GenerateContext: true,
+ GenerateInterface: true
+ );
+
+ var result = Adapter.Generate(stateMachine, settings);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+
+ [Fact]
+ public Task BuilderStateContextGenerate()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var settings = new GenerationSettings(
+ Language,
+ Mode.Builder,
+ GenerateStates: true,
+ GenerateContext: true
+ );
+
+ var result = Adapter.Generate(stateMachine, settings);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+
+ [Fact]
+ public Task BuilderStateContextGenerateWithInterface()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var settings = new GenerationSettings(
+ Language,
+ Mode.Builder,
+ GenerateStates: true,
+ GenerateContext: true,
+ GenerateInterface: true
+ );
+
+ var result = Adapter.Generate(stateMachine, settings);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+}
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/BaseTestAdapterGenerateTestsDoorTests.cs b/src/Stater.CodeGeneration.Tests/LanguageAdapter/BaseTestAdapterGenerateTestsDoorTests.cs
new file mode 100644
index 0000000..a029e39
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/BaseTestAdapterGenerateTestsDoorTests.cs
@@ -0,0 +1,251 @@
+using Stater.CodeGeneration.Entity;
+using Stater.CodeGeneration.LanguageAdapter.Base;
+
+namespace Stater.CodeGeneration.Tests.LanguageAdapter;
+
+public abstract class BaseTestAdapterGenerateTestsDoorTests
+{
+ protected abstract BaseLanguageAdapter Adapter { get; }
+ protected abstract Language Language { get; }
+
+
+
+ [Fact]
+ public Task ClazzTestsGenerate()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var scenarios = ScenarioFinder.FindScenarios(stateMachine);
+ var settings = new GenerationSettings(
+ Language
+ );
+ var result = Adapter.GenerateTests(stateMachine, settings, scenarios);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+
+ [Fact]
+ public Task ClazzTestsGenerateWithInterface()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var scenarios = ScenarioFinder.FindScenarios(stateMachine);
+ var settings = new GenerationSettings(
+ Language,
+ GenerateInterface: true
+ );
+
+ var result = Adapter.GenerateTests(stateMachine, settings, scenarios);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+
+ [Fact]
+ public Task ClazzTestsStateGenerate()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var scenarios = ScenarioFinder.FindScenarios(stateMachine);
+ var settings = new GenerationSettings(
+ Language,
+ GenerateStates: true
+ );
+
+ var result = Adapter.GenerateTests(stateMachine, settings, scenarios);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+
+ [Fact]
+ public Task ClazzTestsStateGenerateWithInterface()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var scenarios = ScenarioFinder.FindScenarios(stateMachine);
+ var settings = new GenerationSettings(
+ Language,
+ GenerateStates: true,
+ GenerateInterface: true
+ );
+
+ var result = Adapter.GenerateTests(stateMachine, settings, scenarios);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+
+ [Fact]
+ public Task ClazzTestsContextGenerate()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var scenarios = ScenarioFinder.FindScenarios(stateMachine);
+ var settings = new GenerationSettings(
+ Language,
+ GenerateContext: true
+ );
+
+ var result = Adapter.GenerateTests(stateMachine, settings, scenarios);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+
+ [Fact]
+ public Task ClazzTestsContextGenerateWithInterface()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var scenarios = ScenarioFinder.FindScenarios(stateMachine);
+ var settings = new GenerationSettings(
+ Language,
+ GenerateContext: true,
+ GenerateInterface: true
+ );
+
+ var result = Adapter.GenerateTests(stateMachine, settings, scenarios);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+
+ [Fact]
+ public Task ClazzTestsStateContextGenerate()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var scenarios = ScenarioFinder.FindScenarios(stateMachine);
+ var settings = new GenerationSettings(
+ Language,
+ GenerateStates: true,
+ GenerateContext: true
+ );
+
+ var result = Adapter.GenerateTests(stateMachine, settings, scenarios);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+
+ [Fact]
+ public Task ClazzTestsStateContextGenerateWithInterface()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var scenarios = ScenarioFinder.FindScenarios(stateMachine);
+ var settings = new GenerationSettings(
+ Language,
+ GenerateStates: true,
+ GenerateContext: true,
+ GenerateInterface: true
+ );
+
+ var result = Adapter.GenerateTests(stateMachine, settings, scenarios);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+
+ [Fact]
+ public Task BuilderTestsGenerate()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var scenarios = ScenarioFinder.FindScenarios(stateMachine);
+ var settings = new GenerationSettings(
+ Language,
+ Mode.Builder
+ );
+
+ var result = Adapter.GenerateTests(stateMachine, settings, scenarios);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+
+ [Fact]
+ public Task BuilderTestsGenerateWithInterface()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var scenarios = ScenarioFinder.FindScenarios(stateMachine);
+ var settings = new GenerationSettings(
+ Language,
+ Mode.Builder,
+ GenerateInterface: true
+ );
+
+ var result = Adapter.GenerateTests(stateMachine, settings, scenarios);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+
+ [Fact]
+ public Task BuilderTestsStateGenerate()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var scenarios = ScenarioFinder.FindScenarios(stateMachine);
+ var settings = new GenerationSettings(
+ Language,
+ Mode.Builder,
+ GenerateStates: true
+ );
+
+ var result = Adapter.GenerateTests(stateMachine, settings, scenarios);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+
+ [Fact]
+ public Task BuilderTestsStateGenerateWithInterface()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var scenarios = ScenarioFinder.FindScenarios(stateMachine);
+ var settings = new GenerationSettings(
+ Language,
+ Mode.Builder,
+ GenerateStates: true,
+ GenerateInterface: true
+ );
+
+ var result = Adapter.GenerateTests(stateMachine, settings, scenarios);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+
+ [Fact]
+ public Task BuilderTestsContextGenerate()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var scenarios = ScenarioFinder.FindScenarios(stateMachine);
+ var settings = new GenerationSettings(
+ Language,
+ Mode.Builder,
+ GenerateContext: true
+ );
+
+ var result = Adapter.GenerateTests(stateMachine, settings, scenarios);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+
+ [Fact]
+ public Task BuilderTestsContextGenerateWithInterface()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var scenarios = ScenarioFinder.FindScenarios(stateMachine);
+ var settings = new GenerationSettings(
+ Language,
+ Mode.Builder,
+ GenerateContext: true,
+ GenerateInterface: true
+ );
+
+ var result = Adapter.GenerateTests(stateMachine, settings, scenarios);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+
+ [Fact]
+ public Task BuilderTestsStateContextGenerate()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var scenarios = ScenarioFinder.FindScenarios(stateMachine);
+ var settings = new GenerationSettings(
+ Language,
+ Mode.Builder,
+ GenerateStates: true,
+ GenerateContext: true
+ );
+
+ var result = Adapter.GenerateTests(stateMachine, settings, scenarios);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+
+ [Fact]
+ public Task BuilderTestsStateContextGenerateWithInterface()
+ {
+ var stateMachine = DoorStateMachineTestData.CreateDoorStateMachine();
+ var scenarios = ScenarioFinder.FindScenarios(stateMachine);
+ var settings = new GenerationSettings(
+ Language,
+ Mode.Builder,
+ GenerateStates: true,
+ GenerateContext: true,
+ GenerateInterface: true
+ );
+
+ var result = Adapter.GenerateTests(stateMachine, settings, scenarios);
+ return Verify(result).UseDirectory(Language.ToString());
+ }
+}
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.BuilderContextGenerate.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.BuilderContextGenerate.verified.txt
new file mode 100644
index 0000000..ff105a5
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.BuilderContextGenerate.verified.txt
@@ -0,0 +1,29 @@
+#pragma once
+
+#include
+
+class Door_context final : context {
+public:
+ int degreeOfOpening = 0;
+ bool closeVariable = true;
+ std::string doorName = "asd";
+ float floatVariable = 0f;
+};
+
+inline stater_state_machine_builder builder_Door_state_machine = stater_state_machine_builder()
+ .set_start_state("OPEN")
+ .set_context(new Door_context())
+ .add_transition("preOpen", "CLOSE", "AJAR")
+ .set_transition_event("preOpen", [](Door_context *ctx) { ctx->degreeOfOpening = 1; })
+ .add_transition("preClose", "OPEN", "AJAR")
+ .set_transition_event("preClose", [](Door_context *ctx) { ctx->degreeOfOpening = 99; })
+ .add_transition("open", "AJAR", "OPEN")
+ .set_transition_condition("open", [](Door_context *ctx) { return ctx->degreeOfOpening >= 0; })
+ .set_transition_event("open", [](Door_context *ctx) { ctx->degreeOfOpening = 100; })
+ .add_transition("close", "AJAR", "CLOSE")
+ .set_transition_condition("close", [](Door_context *ctx) { return ctx->degreeOfOpening <= 0; })
+ .set_transition_event("close", [](Door_context *ctx) { ctx->degreeOfOpening = 0; })
+ .add_transition("ajarPlus", "AJAR", "AJAR")
+ .set_transition_event("ajarPlus", [](Door_context *ctx) { ctx->degreeOfOpening = ctx->degreeOfOpening + 1; })
+ .add_transition("ajarMinus", "AJAR", "AJAR")
+ .set_transition_event("ajarMinus", [](Door_context *ctx) { ctx->degreeOfOpening = ctx->degreeOfOpening - 1; });
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.BuilderContextGenerateWithInterface.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.BuilderContextGenerateWithInterface.verified.txt
new file mode 100644
index 0000000..2a3fab2
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.BuilderContextGenerateWithInterface.verified.txt
@@ -0,0 +1,108 @@
+#pragma once
+
+#include
+
+class Door_context final : context {
+public:
+ int degreeOfOpening = 0;
+ bool closeVariable = true;
+ std::string doorName = "asd";
+ float floatVariable = 0f;
+};
+
+class types_Door_state_machine : public stater_state_machine {
+public:
+ types_Door_state_machine(
+ const std::vector> &transitions,
+ Door_context *context,
+ const std::string &start_state,
+ const std::unordered_set &states,
+ const std::unordered_map>> &transition_middlewares,
+ const std::vector> &transition_all_middlewares,
+ const std::unordered_map>> &transition_callbacks,
+ const std::vector> &transition_all_callbacks,
+ const std::unordered_map>> &state_callbacks,
+ const std::vector> &state_all_callbacks,
+ const std::shared_ptr<::context_json_adapter > &context_json_adapter
+ ) : stater_state_machine(
+ transitions,
+ context,
+ start_state,
+ states,
+ transition_middlewares,
+ transition_all_middlewares,
+ transition_callbacks,
+ transition_all_callbacks,
+ state_callbacks,
+ state_all_callbacks,
+ context_json_adapter
+ ) {
+ }
+
+ void preOpen() {
+ transition("preOpen");
+ }
+
+ void preClose() {
+ transition("preClose");
+ }
+
+ void open() {
+ transition("open");
+ }
+
+ void close() {
+ transition("close");
+ }
+
+ void ajarPlus() {
+ transition("ajarPlus");
+ }
+
+ void ajarMinus() {
+ transition("ajarMinus");
+ }
+};
+
+inline state_machine_factory typed_Door_factory = [](
+ const std::vector > &transitions,
+ Door_context *context,
+ std::string start_state,
+ const std::unordered_set &states,
+ const std::unordered_map > > &
+ transition_middleware,
+ const std::vector > &
+ transition_all_middlewares,
+ const std::unordered_map > > &
+ transition_callbacks,
+ const std::vector > &transition_all_callbacks,
+ const std::unordered_map<::std::string, std::vector > > &state_callbacks,
+ const std::vector > &state_all_callbacks,
+ const std::shared_ptr >& context_json_adapter_) ->
+ std::unique_ptr {
+ return std::make_unique(
+ transitions, context, start_state, states,
+ transition_middleware, transition_all_middlewares,
+ transition_callbacks, transition_all_callbacks,
+ state_callbacks, state_all_callbacks, context_json_adapter_);
+};
+
+
+inline stater_state_machine_builder builder_Door_state_machine = stater_state_machine_builder()
+ .set_start_state("OPEN")
+ .set_context(new Door_context())
+ .set_factory(typed_Door_factory)
+ .add_transition("preOpen", "CLOSE", "AJAR")
+ .set_transition_event("preOpen", [](Door_context *ctx) { ctx->degreeOfOpening = 1; })
+ .add_transition("preClose", "OPEN", "AJAR")
+ .set_transition_event("preClose", [](Door_context *ctx) { ctx->degreeOfOpening = 99; })
+ .add_transition("open", "AJAR", "OPEN")
+ .set_transition_condition("open", [](Door_context *ctx) { return ctx->degreeOfOpening >= 0; })
+ .set_transition_event("open", [](Door_context *ctx) { ctx->degreeOfOpening = 100; })
+ .add_transition("close", "AJAR", "CLOSE")
+ .set_transition_condition("close", [](Door_context *ctx) { return ctx->degreeOfOpening <= 0; })
+ .set_transition_event("close", [](Door_context *ctx) { ctx->degreeOfOpening = 0; })
+ .add_transition("ajarPlus", "AJAR", "AJAR")
+ .set_transition_event("ajarPlus", [](Door_context *ctx) { ctx->degreeOfOpening = ctx->degreeOfOpening + 1; })
+ .add_transition("ajarMinus", "AJAR", "AJAR")
+ .set_transition_event("ajarMinus", [](Door_context *ctx) { ctx->degreeOfOpening = ctx->degreeOfOpening - 1; });
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.BuilderGenerate.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.BuilderGenerate.verified.txt
new file mode 100644
index 0000000..e040396
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.BuilderGenerate.verified.txt
@@ -0,0 +1,13 @@
+#pragma once
+
+#include
+
+inline stater_state_machine_builder builder_Door_state_machine = stater_state_machine_builder()
+ .set_start_state("OPEN")
+ .set_context(new empty_context())
+ .add_transition("preOpen", "CLOSE", "AJAR")
+ .add_transition("preClose", "OPEN", "AJAR")
+ .add_transition("open", "AJAR", "OPEN")
+ .add_transition("close", "AJAR", "CLOSE")
+ .add_transition("ajarPlus", "AJAR", "AJAR")
+ .add_transition("ajarMinus", "AJAR", "AJAR");
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.BuilderGenerateWithInterface.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.BuilderGenerateWithInterface.verified.txt
new file mode 100644
index 0000000..a83f586
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.BuilderGenerateWithInterface.verified.txt
@@ -0,0 +1,92 @@
+#pragma once
+
+#include
+
+class types_Door_state_machine : public stater_state_machine {
+public:
+ types_Door_state_machine(
+ const std::vector> &transitions,
+ empty_context *context,
+ const std::string &start_state,
+ const std::unordered_set &states,
+ const std::unordered_map>> &transition_middlewares,
+ const std::vector> &transition_all_middlewares,
+ const std::unordered_map>> &transition_callbacks,
+ const std::vector> &transition_all_callbacks,
+ const std::unordered_map>> &state_callbacks,
+ const std::vector> &state_all_callbacks,
+ const std::shared_ptr<::context_json_adapter > &context_json_adapter
+ ) : stater_state_machine(
+ transitions,
+ context,
+ start_state,
+ states,
+ transition_middlewares,
+ transition_all_middlewares,
+ transition_callbacks,
+ transition_all_callbacks,
+ state_callbacks,
+ state_all_callbacks,
+ context_json_adapter
+ ) {
+ }
+
+ void preOpen() {
+ transition("preOpen");
+ }
+
+ void preClose() {
+ transition("preClose");
+ }
+
+ void open() {
+ transition("open");
+ }
+
+ void close() {
+ transition("close");
+ }
+
+ void ajarPlus() {
+ transition("ajarPlus");
+ }
+
+ void ajarMinus() {
+ transition("ajarMinus");
+ }
+};
+
+inline state_machine_factory typed_Door_factory = [](
+ const std::vector > &transitions,
+ empty_context *context,
+ std::string start_state,
+ const std::unordered_set &states,
+ const std::unordered_map > > &
+ transition_middleware,
+ const std::vector > &
+ transition_all_middlewares,
+ const std::unordered_map > > &
+ transition_callbacks,
+ const std::vector > &transition_all_callbacks,
+ const std::unordered_map<::std::string, std::vector > > &state_callbacks,
+ const std::vector > &state_all_callbacks,
+ const std::shared_ptr >& context_json_adapter_) ->
+ std::unique_ptr {
+ return std::make_unique(
+ transitions, context, start_state, states,
+ transition_middleware, transition_all_middlewares,
+ transition_callbacks, transition_all_callbacks,
+ state_callbacks, state_all_callbacks, context_json_adapter_);
+};
+
+
+inline stater_state_machine_builder builder_Door_state_machine = stater_state_machine_builder()
+ .set_start_state("OPEN")
+ .set_context(new empty_context())
+ .set_factory(typed_Door_factory)
+ .add_transition("preOpen", "CLOSE", "AJAR")
+ .add_transition("preClose", "OPEN", "AJAR")
+ .add_transition("open", "AJAR", "OPEN")
+ .add_transition("close", "AJAR", "CLOSE")
+ .add_transition("ajarPlus", "AJAR", "AJAR")
+ .add_transition("ajarMinus", "AJAR", "AJAR");
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.BuilderStateContextGenerate.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.BuilderStateContextGenerate.verified.txt
new file mode 100644
index 0000000..1c67b15
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.BuilderStateContextGenerate.verified.txt
@@ -0,0 +1,54 @@
+#pragma once
+
+#include
+
+enum class e_Door_states {
+ OPEN,
+ AJAR,
+ CLOSE
+};
+
+inline void to_json(nlohmann::json &j, const e_Door_states &e) {
+ switch (e) {
+ case e_Door_states::OPEN: j = "OPEN";
+ break;
+ case e_Door_states::AJAR: j = "AJAR";
+ break;
+ case e_Door_states::CLOSE: j = "CLOSE";
+ break;
+ }
+}
+
+inline void from_json(const nlohmann::json &j, e_Door_states &e) {
+ std::string state_str = j.get();
+
+ if (state_str == "OPEN") e = e_Door_states::OPEN;
+ else if (state_str == "AJAR") e = e_Door_states::AJAR;
+ else if (state_str == "CLOSE") e = e_Door_states::CLOSE;
+}
+
+class Door_context final : context {
+public:
+ int degreeOfOpening = 0;
+ bool closeVariable = true;
+ std::string doorName = "asd";
+ float floatVariable = 0f;
+};
+
+inline stater_state_machine_builder builder_Door_state_machine = stater_state_machine_builder()
+ .set_start_state(e_Door_states::OPEN)
+ .set_context(new Door_context())
+ .add_transition("preOpen", e_Door_states::CLOSE, e_Door_states::AJAR)
+ .set_transition_event("preOpen", [](Door_context *ctx) { ctx->degreeOfOpening = 1; })
+ .add_transition("preClose", e_Door_states::OPEN, e_Door_states::AJAR)
+ .set_transition_event("preClose", [](Door_context *ctx) { ctx->degreeOfOpening = 99; })
+ .add_transition("open", e_Door_states::AJAR, e_Door_states::OPEN)
+ .set_transition_condition("open", [](Door_context *ctx) { return ctx->degreeOfOpening >= 0; })
+ .set_transition_event("open", [](Door_context *ctx) { ctx->degreeOfOpening = 100; })
+ .add_transition("close", e_Door_states::AJAR, e_Door_states::CLOSE)
+ .set_transition_condition("close", [](Door_context *ctx) { return ctx->degreeOfOpening <= 0; })
+ .set_transition_event("close", [](Door_context *ctx) { ctx->degreeOfOpening = 0; })
+ .add_transition("ajarPlus", e_Door_states::AJAR, e_Door_states::AJAR)
+ .set_transition_event("ajarPlus", [](Door_context *ctx) { ctx->degreeOfOpening = ctx->degreeOfOpening + 1; })
+ .add_transition("ajarMinus", e_Door_states::AJAR, e_Door_states::AJAR)
+ .set_transition_event("ajarMinus", [](Door_context *ctx) { ctx->degreeOfOpening = ctx->degreeOfOpening - 1; });
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.BuilderStateContextGenerateWithInterface.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.BuilderStateContextGenerateWithInterface.verified.txt
new file mode 100644
index 0000000..76428e9
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.BuilderStateContextGenerateWithInterface.verified.txt
@@ -0,0 +1,133 @@
+#pragma once
+
+#include
+
+enum class e_Door_states {
+ OPEN,
+ AJAR,
+ CLOSE
+};
+
+inline void to_json(nlohmann::json &j, const e_Door_states &e) {
+ switch (e) {
+ case e_Door_states::OPEN: j = "OPEN";
+ break;
+ case e_Door_states::AJAR: j = "AJAR";
+ break;
+ case e_Door_states::CLOSE: j = "CLOSE";
+ break;
+ }
+}
+
+inline void from_json(const nlohmann::json &j, e_Door_states &e) {
+ std::string state_str = j.get();
+
+ if (state_str == "OPEN") e = e_Door_states::OPEN;
+ else if (state_str == "AJAR") e = e_Door_states::AJAR;
+ else if (state_str == "CLOSE") e = e_Door_states::CLOSE;
+}
+
+class Door_context final : context {
+public:
+ int degreeOfOpening = 0;
+ bool closeVariable = true;
+ std::string doorName = "asd";
+ float floatVariable = 0f;
+};
+
+class types_Door_state_machine : public stater_state_machine {
+public:
+ types_Door_state_machine(
+ const std::vector> &transitions,
+ Door_context *context,
+ const e_Door_states &start_state,
+ const std::unordered_set &states,
+ const std::unordered_map>> &transition_middlewares,
+ const std::vector> &transition_all_middlewares,
+ const std::unordered_map>> &transition_callbacks,
+ const std::vector> &transition_all_callbacks,
+ const std::unordered_map>> &state_callbacks,
+ const std::vector> &state_all_callbacks,
+ const std::shared_ptr<::context_json_adapter > &context_json_adapter
+ ) : stater_state_machine(
+ transitions,
+ context,
+ start_state,
+ states,
+ transition_middlewares,
+ transition_all_middlewares,
+ transition_callbacks,
+ transition_all_callbacks,
+ state_callbacks,
+ state_all_callbacks,
+ context_json_adapter
+ ) {
+ }
+
+ void preOpen() {
+ transition("preOpen");
+ }
+
+ void preClose() {
+ transition("preClose");
+ }
+
+ void open() {
+ transition("open");
+ }
+
+ void close() {
+ transition("close");
+ }
+
+ void ajarPlus() {
+ transition("ajarPlus");
+ }
+
+ void ajarMinus() {
+ transition("ajarMinus");
+ }
+};
+
+inline state_machine_factory typed_Door_factory = [](
+ const std::vector > &transitions,
+ Door_context *context,
+ e_Door_states start_state,
+ const std::unordered_set &states,
+ const std::unordered_map > > &
+ transition_middleware,
+ const std::vector > &
+ transition_all_middlewares,
+ const std::unordered_map > > &
+ transition_callbacks,
+ const std::vector > &transition_all_callbacks,
+ const std::unordered_map<::e_Door_states, std::vector > > &state_callbacks,
+ const std::vector > &state_all_callbacks,
+ const std::shared_ptr >& context_json_adapter_) ->
+ std::unique_ptr {
+ return std::make_unique(
+ transitions, context, start_state, states,
+ transition_middleware, transition_all_middlewares,
+ transition_callbacks, transition_all_callbacks,
+ state_callbacks, state_all_callbacks, context_json_adapter_);
+};
+
+
+inline stater_state_machine_builder builder_Door_state_machine = stater_state_machine_builder()
+ .set_start_state(e_Door_states::OPEN)
+ .set_context(new Door_context())
+ .set_factory(typed_Door_factory)
+ .add_transition("preOpen", e_Door_states::CLOSE, e_Door_states::AJAR)
+ .set_transition_event("preOpen", [](Door_context *ctx) { ctx->degreeOfOpening = 1; })
+ .add_transition("preClose", e_Door_states::OPEN, e_Door_states::AJAR)
+ .set_transition_event("preClose", [](Door_context *ctx) { ctx->degreeOfOpening = 99; })
+ .add_transition("open", e_Door_states::AJAR, e_Door_states::OPEN)
+ .set_transition_condition("open", [](Door_context *ctx) { return ctx->degreeOfOpening >= 0; })
+ .set_transition_event("open", [](Door_context *ctx) { ctx->degreeOfOpening = 100; })
+ .add_transition("close", e_Door_states::AJAR, e_Door_states::CLOSE)
+ .set_transition_condition("close", [](Door_context *ctx) { return ctx->degreeOfOpening <= 0; })
+ .set_transition_event("close", [](Door_context *ctx) { ctx->degreeOfOpening = 0; })
+ .add_transition("ajarPlus", e_Door_states::AJAR, e_Door_states::AJAR)
+ .set_transition_event("ajarPlus", [](Door_context *ctx) { ctx->degreeOfOpening = ctx->degreeOfOpening + 1; })
+ .add_transition("ajarMinus", e_Door_states::AJAR, e_Door_states::AJAR)
+ .set_transition_event("ajarMinus", [](Door_context *ctx) { ctx->degreeOfOpening = ctx->degreeOfOpening - 1; });
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.BuilderStateGenerate.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.BuilderStateGenerate.verified.txt
new file mode 100644
index 0000000..c12c426
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.BuilderStateGenerate.verified.txt
@@ -0,0 +1,38 @@
+#pragma once
+
+#include
+
+enum class e_Door_states {
+ OPEN,
+ AJAR,
+ CLOSE
+};
+
+inline void to_json(nlohmann::json &j, const e_Door_states &e) {
+ switch (e) {
+ case e_Door_states::OPEN: j = "OPEN";
+ break;
+ case e_Door_states::AJAR: j = "AJAR";
+ break;
+ case e_Door_states::CLOSE: j = "CLOSE";
+ break;
+ }
+}
+
+inline void from_json(const nlohmann::json &j, e_Door_states &e) {
+ std::string state_str = j.get();
+
+ if (state_str == "OPEN") e = e_Door_states::OPEN;
+ else if (state_str == "AJAR") e = e_Door_states::AJAR;
+ else if (state_str == "CLOSE") e = e_Door_states::CLOSE;
+}
+
+inline stater_state_machine_builder builder_Door_state_machine = stater_state_machine_builder()
+ .set_start_state(e_Door_states::OPEN)
+ .set_context(new empty_context())
+ .add_transition("preOpen", e_Door_states::CLOSE, e_Door_states::AJAR)
+ .add_transition("preClose", e_Door_states::OPEN, e_Door_states::AJAR)
+ .add_transition("open", e_Door_states::AJAR, e_Door_states::OPEN)
+ .add_transition("close", e_Door_states::AJAR, e_Door_states::CLOSE)
+ .add_transition("ajarPlus", e_Door_states::AJAR, e_Door_states::AJAR)
+ .add_transition("ajarMinus", e_Door_states::AJAR, e_Door_states::AJAR);
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.BuilderStateGenerateWithInterface.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.BuilderStateGenerateWithInterface.verified.txt
new file mode 100644
index 0000000..d6398dd
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.BuilderStateGenerateWithInterface.verified.txt
@@ -0,0 +1,117 @@
+#pragma once
+
+#include
+
+enum class e_Door_states {
+ OPEN,
+ AJAR,
+ CLOSE
+};
+
+inline void to_json(nlohmann::json &j, const e_Door_states &e) {
+ switch (e) {
+ case e_Door_states::OPEN: j = "OPEN";
+ break;
+ case e_Door_states::AJAR: j = "AJAR";
+ break;
+ case e_Door_states::CLOSE: j = "CLOSE";
+ break;
+ }
+}
+
+inline void from_json(const nlohmann::json &j, e_Door_states &e) {
+ std::string state_str = j.get();
+
+ if (state_str == "OPEN") e = e_Door_states::OPEN;
+ else if (state_str == "AJAR") e = e_Door_states::AJAR;
+ else if (state_str == "CLOSE") e = e_Door_states::CLOSE;
+}
+
+class types_Door_state_machine : public stater_state_machine {
+public:
+ types_Door_state_machine(
+ const std::vector> &transitions,
+ empty_context *context,
+ const e_Door_states &start_state,
+ const std::unordered_set &states,
+ const std::unordered_map>> &transition_middlewares,
+ const std::vector> &transition_all_middlewares,
+ const std::unordered_map>> &transition_callbacks,
+ const std::vector> &transition_all_callbacks,
+ const std::unordered_map>> &state_callbacks,
+ const std::vector> &state_all_callbacks,
+ const std::shared_ptr<::context_json_adapter > &context_json_adapter
+ ) : stater_state_machine(
+ transitions,
+ context,
+ start_state,
+ states,
+ transition_middlewares,
+ transition_all_middlewares,
+ transition_callbacks,
+ transition_all_callbacks,
+ state_callbacks,
+ state_all_callbacks,
+ context_json_adapter
+ ) {
+ }
+
+ void preOpen() {
+ transition("preOpen");
+ }
+
+ void preClose() {
+ transition("preClose");
+ }
+
+ void open() {
+ transition("open");
+ }
+
+ void close() {
+ transition("close");
+ }
+
+ void ajarPlus() {
+ transition("ajarPlus");
+ }
+
+ void ajarMinus() {
+ transition("ajarMinus");
+ }
+};
+
+inline state_machine_factory typed_Door_factory = [](
+ const std::vector > &transitions,
+ empty_context *context,
+ e_Door_states start_state,
+ const std::unordered_set &states,
+ const std::unordered_map > > &
+ transition_middleware,
+ const std::vector > &
+ transition_all_middlewares,
+ const std::unordered_map > > &
+ transition_callbacks,
+ const std::vector > &transition_all_callbacks,
+ const std::unordered_map<::e_Door_states, std::vector > > &state_callbacks,
+ const std::vector > &state_all_callbacks,
+ const std::shared_ptr >& context_json_adapter_) ->
+ std::unique_ptr {
+ return std::make_unique(
+ transitions, context, start_state, states,
+ transition_middleware, transition_all_middlewares,
+ transition_callbacks, transition_all_callbacks,
+ state_callbacks, state_all_callbacks, context_json_adapter_);
+};
+
+
+inline stater_state_machine_builder builder_Door_state_machine = stater_state_machine_builder()
+ .set_start_state(e_Door_states::OPEN)
+ .set_context(new empty_context())
+ .set_factory(typed_Door_factory)
+ .add_transition("preOpen", e_Door_states::CLOSE, e_Door_states::AJAR)
+ .add_transition("preClose", e_Door_states::OPEN, e_Door_states::AJAR)
+ .add_transition("open", e_Door_states::AJAR, e_Door_states::OPEN)
+ .add_transition("close", e_Door_states::AJAR, e_Door_states::CLOSE)
+ .add_transition("ajarPlus", e_Door_states::AJAR, e_Door_states::AJAR)
+ .add_transition("ajarMinus", e_Door_states::AJAR, e_Door_states::AJAR);
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.ClazzContextGenerate.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.ClazzContextGenerate.verified.txt
new file mode 100644
index 0000000..fed2f33
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.ClazzContextGenerate.verified.txt
@@ -0,0 +1,65 @@
+#pragma once
+
+#include
+
+class Door_context final : context {
+public:
+ int degreeOfOpening = 0;
+ bool closeVariable = true;
+ std::string doorName = "asd";
+ float floatVariable = 0f;
+};
+
+class Door_state_machine : public stater_state_machine {
+public:
+ Door_state_machine() : stater_state_machine (
+ {
+ transition_t<::std::string, Door_context>(
+ "preOpen",
+ "CLOSE",
+ "AJAR",
+ [](Door_context *ctx) { return true; },
+ [](Door_context *ctx) { ctx->degreeOfOpening = 1; }
+ ),
+ transition_t<::std::string, Door_context>(
+ "preClose",
+ "OPEN",
+ "AJAR",
+ [](Door_context *ctx) { return true; },
+ [](Door_context *ctx) { ctx->degreeOfOpening = 99; }
+ ),
+ transition_t<::std::string, Door_context>(
+ "open",
+ "AJAR",
+ "OPEN",
+ [](Door_context *ctx) { return ctx->degreeOfOpening >= 0; },
+ [](Door_context *ctx) { ctx->degreeOfOpening = 100; }
+ ),
+ transition_t<::std::string, Door_context>(
+ "close",
+ "AJAR",
+ "CLOSE",
+ [](Door_context *ctx) { return ctx->degreeOfOpening <= 0; },
+ [](Door_context *ctx) { ctx->degreeOfOpening = 0; }
+ ),
+ transition_t<::std::string, Door_context>(
+ "ajarPlus",
+ "AJAR",
+ "AJAR",
+ [](Door_context *ctx) { return true; },
+ [](Door_context *ctx) { ctx->degreeOfOpening = ctx->degreeOfOpening + 1; }
+ ),
+ transition_t<::std::string, Door_context>(
+ "ajarMinus",
+ "AJAR",
+ "AJAR",
+ [](Door_context *ctx) { return true; },
+ [](Door_context *ctx) { ctx->degreeOfOpening = ctx->degreeOfOpening - 1; }
+ )
+ },
+ new Door_context(),
+ "OPEN"
+ ) {
+ }
+
+};
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.ClazzContextGenerateWithInterface.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.ClazzContextGenerateWithInterface.verified.txt
new file mode 100644
index 0000000..f1aa929
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.ClazzContextGenerateWithInterface.verified.txt
@@ -0,0 +1,88 @@
+#pragma once
+
+#include
+
+class Door_context final : context {
+public:
+ int degreeOfOpening = 0;
+ bool closeVariable = true;
+ std::string doorName = "asd";
+ float floatVariable = 0f;
+};
+
+class Door_state_machine : public stater_state_machine {
+public:
+ Door_state_machine() : stater_state_machine (
+ {
+ transition_t<::std::string, Door_context>(
+ "preOpen",
+ "CLOSE",
+ "AJAR",
+ [](Door_context *ctx) { return true; },
+ [](Door_context *ctx) { ctx->degreeOfOpening = 1; }
+ ),
+ transition_t<::std::string, Door_context>(
+ "preClose",
+ "OPEN",
+ "AJAR",
+ [](Door_context *ctx) { return true; },
+ [](Door_context *ctx) { ctx->degreeOfOpening = 99; }
+ ),
+ transition_t<::std::string, Door_context>(
+ "open",
+ "AJAR",
+ "OPEN",
+ [](Door_context *ctx) { return ctx->degreeOfOpening >= 0; },
+ [](Door_context *ctx) { ctx->degreeOfOpening = 100; }
+ ),
+ transition_t<::std::string, Door_context>(
+ "close",
+ "AJAR",
+ "CLOSE",
+ [](Door_context *ctx) { return ctx->degreeOfOpening <= 0; },
+ [](Door_context *ctx) { ctx->degreeOfOpening = 0; }
+ ),
+ transition_t<::std::string, Door_context>(
+ "ajarPlus",
+ "AJAR",
+ "AJAR",
+ [](Door_context *ctx) { return true; },
+ [](Door_context *ctx) { ctx->degreeOfOpening = ctx->degreeOfOpening + 1; }
+ ),
+ transition_t<::std::string, Door_context>(
+ "ajarMinus",
+ "AJAR",
+ "AJAR",
+ [](Door_context *ctx) { return true; },
+ [](Door_context *ctx) { ctx->degreeOfOpening = ctx->degreeOfOpening - 1; }
+ )
+ },
+ new Door_context(),
+ "OPEN"
+ ) {
+ }
+
+ void preOpen() {
+ transition("preOpen");
+ }
+
+ void preClose() {
+ transition("preClose");
+ }
+
+ void open() {
+ transition("open");
+ }
+
+ void close() {
+ transition("close");
+ }
+
+ void ajarPlus() {
+ transition("ajarPlus");
+ }
+
+ void ajarMinus() {
+ transition("ajarMinus");
+ }
+};
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.ClazzGenerate.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.ClazzGenerate.verified.txt
new file mode 100644
index 0000000..324f61b
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.ClazzGenerate.verified.txt
@@ -0,0 +1,57 @@
+#pragma once
+
+#include
+
+class Door_state_machine : public stater_state_machine {
+public:
+ Door_state_machine() : stater_state_machine (
+ {
+ transition_t<::std::string, empty_context>(
+ "preOpen",
+ "CLOSE",
+ "AJAR",
+ [](empty_context *ctx) { return true; },
+ [](empty_context *ctx) { }
+ ),
+ transition_t<::std::string, empty_context>(
+ "preClose",
+ "OPEN",
+ "AJAR",
+ [](empty_context *ctx) { return true; },
+ [](empty_context *ctx) { }
+ ),
+ transition_t<::std::string, empty_context>(
+ "open",
+ "AJAR",
+ "OPEN",
+ [](empty_context *ctx) { return true; },
+ [](empty_context *ctx) { }
+ ),
+ transition_t<::std::string, empty_context>(
+ "close",
+ "AJAR",
+ "CLOSE",
+ [](empty_context *ctx) { return true; },
+ [](empty_context *ctx) { }
+ ),
+ transition_t<::std::string, empty_context>(
+ "ajarPlus",
+ "AJAR",
+ "AJAR",
+ [](empty_context *ctx) { return true; },
+ [](empty_context *ctx) { }
+ ),
+ transition_t<::std::string, empty_context>(
+ "ajarMinus",
+ "AJAR",
+ "AJAR",
+ [](empty_context *ctx) { return true; },
+ [](empty_context *ctx) { }
+ )
+ },
+ new empty_context(),
+ "OPEN"
+ ) {
+ }
+
+};
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.ClazzGenerateWithInterface.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.ClazzGenerateWithInterface.verified.txt
new file mode 100644
index 0000000..2df84f0
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.ClazzGenerateWithInterface.verified.txt
@@ -0,0 +1,80 @@
+#pragma once
+
+#include
+
+class Door_state_machine : public stater_state_machine {
+public:
+ Door_state_machine() : stater_state_machine (
+ {
+ transition_t<::std::string, empty_context>(
+ "preOpen",
+ "CLOSE",
+ "AJAR",
+ [](empty_context *ctx) { return true; },
+ [](empty_context *ctx) { }
+ ),
+ transition_t<::std::string, empty_context>(
+ "preClose",
+ "OPEN",
+ "AJAR",
+ [](empty_context *ctx) { return true; },
+ [](empty_context *ctx) { }
+ ),
+ transition_t<::std::string, empty_context>(
+ "open",
+ "AJAR",
+ "OPEN",
+ [](empty_context *ctx) { return true; },
+ [](empty_context *ctx) { }
+ ),
+ transition_t<::std::string, empty_context>(
+ "close",
+ "AJAR",
+ "CLOSE",
+ [](empty_context *ctx) { return true; },
+ [](empty_context *ctx) { }
+ ),
+ transition_t<::std::string, empty_context>(
+ "ajarPlus",
+ "AJAR",
+ "AJAR",
+ [](empty_context *ctx) { return true; },
+ [](empty_context *ctx) { }
+ ),
+ transition_t<::std::string, empty_context>(
+ "ajarMinus",
+ "AJAR",
+ "AJAR",
+ [](empty_context *ctx) { return true; },
+ [](empty_context *ctx) { }
+ )
+ },
+ new empty_context(),
+ "OPEN"
+ ) {
+ }
+
+ void preOpen() {
+ transition("preOpen");
+ }
+
+ void preClose() {
+ transition("preClose");
+ }
+
+ void open() {
+ transition("open");
+ }
+
+ void close() {
+ transition("close");
+ }
+
+ void ajarPlus() {
+ transition("ajarPlus");
+ }
+
+ void ajarMinus() {
+ transition("ajarMinus");
+ }
+};
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.ClazzStateContextGenerate.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.ClazzStateContextGenerate.verified.txt
new file mode 100644
index 0000000..93712ec
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.ClazzStateContextGenerate.verified.txt
@@ -0,0 +1,90 @@
+#pragma once
+
+#include
+
+enum class e_Door_states {
+ OPEN,
+ AJAR,
+ CLOSE
+};
+
+inline void to_json(nlohmann::json &j, const e_Door_states &e) {
+ switch (e) {
+ case e_Door_states::OPEN: j = "OPEN";
+ break;
+ case e_Door_states::AJAR: j = "AJAR";
+ break;
+ case e_Door_states::CLOSE: j = "CLOSE";
+ break;
+ }
+}
+
+inline void from_json(const nlohmann::json &j, e_Door_states &e) {
+ std::string state_str = j.get();
+
+ if (state_str == "OPEN") e = e_Door_states::OPEN;
+ else if (state_str == "AJAR") e = e_Door_states::AJAR;
+ else if (state_str == "CLOSE") e = e_Door_states::CLOSE;
+}
+
+class Door_context final : context {
+public:
+ int degreeOfOpening = 0;
+ bool closeVariable = true;
+ std::string doorName = "asd";
+ float floatVariable = 0f;
+};
+
+class Door_state_machine : public stater_state_machine {
+public:
+ Door_state_machine() : stater_state_machine (
+ {
+ transition_t<::e_Door_states, Door_context>(
+ "preOpen",
+ e_Door_states::CLOSE,
+ e_Door_states::AJAR,
+ [](Door_context *ctx) { return true; },
+ [](Door_context *ctx) { ctx->degreeOfOpening = 1; }
+ ),
+ transition_t<::e_Door_states, Door_context>(
+ "preClose",
+ e_Door_states::OPEN,
+ e_Door_states::AJAR,
+ [](Door_context *ctx) { return true; },
+ [](Door_context *ctx) { ctx->degreeOfOpening = 99; }
+ ),
+ transition_t<::e_Door_states, Door_context>(
+ "open",
+ e_Door_states::AJAR,
+ e_Door_states::OPEN,
+ [](Door_context *ctx) { return ctx->degreeOfOpening >= 0; },
+ [](Door_context *ctx) { ctx->degreeOfOpening = 100; }
+ ),
+ transition_t<::e_Door_states, Door_context>(
+ "close",
+ e_Door_states::AJAR,
+ e_Door_states::CLOSE,
+ [](Door_context *ctx) { return ctx->degreeOfOpening <= 0; },
+ [](Door_context *ctx) { ctx->degreeOfOpening = 0; }
+ ),
+ transition_t<::e_Door_states, Door_context>(
+ "ajarPlus",
+ e_Door_states::AJAR,
+ e_Door_states::AJAR,
+ [](Door_context *ctx) { return true; },
+ [](Door_context *ctx) { ctx->degreeOfOpening = ctx->degreeOfOpening + 1; }
+ ),
+ transition_t<::e_Door_states, Door_context>(
+ "ajarMinus",
+ e_Door_states::AJAR,
+ e_Door_states::AJAR,
+ [](Door_context *ctx) { return true; },
+ [](Door_context *ctx) { ctx->degreeOfOpening = ctx->degreeOfOpening - 1; }
+ )
+ },
+ new Door_context(),
+ e_Door_states::OPEN
+ ) {
+ }
+
+};
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.ClazzStateContextGenerateWithInterface.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.ClazzStateContextGenerateWithInterface.verified.txt
new file mode 100644
index 0000000..065cb21
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.ClazzStateContextGenerateWithInterface.verified.txt
@@ -0,0 +1,113 @@
+#pragma once
+
+#include
+
+enum class e_Door_states {
+ OPEN,
+ AJAR,
+ CLOSE
+};
+
+inline void to_json(nlohmann::json &j, const e_Door_states &e) {
+ switch (e) {
+ case e_Door_states::OPEN: j = "OPEN";
+ break;
+ case e_Door_states::AJAR: j = "AJAR";
+ break;
+ case e_Door_states::CLOSE: j = "CLOSE";
+ break;
+ }
+}
+
+inline void from_json(const nlohmann::json &j, e_Door_states &e) {
+ std::string state_str = j.get();
+
+ if (state_str == "OPEN") e = e_Door_states::OPEN;
+ else if (state_str == "AJAR") e = e_Door_states::AJAR;
+ else if (state_str == "CLOSE") e = e_Door_states::CLOSE;
+}
+
+class Door_context final : context {
+public:
+ int degreeOfOpening = 0;
+ bool closeVariable = true;
+ std::string doorName = "asd";
+ float floatVariable = 0f;
+};
+
+class Door_state_machine : public stater_state_machine {
+public:
+ Door_state_machine() : stater_state_machine (
+ {
+ transition_t<::e_Door_states, Door_context>(
+ "preOpen",
+ e_Door_states::CLOSE,
+ e_Door_states::AJAR,
+ [](Door_context *ctx) { return true; },
+ [](Door_context *ctx) { ctx->degreeOfOpening = 1; }
+ ),
+ transition_t<::e_Door_states, Door_context>(
+ "preClose",
+ e_Door_states::OPEN,
+ e_Door_states::AJAR,
+ [](Door_context *ctx) { return true; },
+ [](Door_context *ctx) { ctx->degreeOfOpening = 99; }
+ ),
+ transition_t<::e_Door_states, Door_context>(
+ "open",
+ e_Door_states::AJAR,
+ e_Door_states::OPEN,
+ [](Door_context *ctx) { return ctx->degreeOfOpening >= 0; },
+ [](Door_context *ctx) { ctx->degreeOfOpening = 100; }
+ ),
+ transition_t<::e_Door_states, Door_context>(
+ "close",
+ e_Door_states::AJAR,
+ e_Door_states::CLOSE,
+ [](Door_context *ctx) { return ctx->degreeOfOpening <= 0; },
+ [](Door_context *ctx) { ctx->degreeOfOpening = 0; }
+ ),
+ transition_t<::e_Door_states, Door_context>(
+ "ajarPlus",
+ e_Door_states::AJAR,
+ e_Door_states::AJAR,
+ [](Door_context *ctx) { return true; },
+ [](Door_context *ctx) { ctx->degreeOfOpening = ctx->degreeOfOpening + 1; }
+ ),
+ transition_t<::e_Door_states, Door_context>(
+ "ajarMinus",
+ e_Door_states::AJAR,
+ e_Door_states::AJAR,
+ [](Door_context *ctx) { return true; },
+ [](Door_context *ctx) { ctx->degreeOfOpening = ctx->degreeOfOpening - 1; }
+ )
+ },
+ new Door_context(),
+ e_Door_states::OPEN
+ ) {
+ }
+
+ void preOpen() {
+ transition("preOpen");
+ }
+
+ void preClose() {
+ transition("preClose");
+ }
+
+ void open() {
+ transition("open");
+ }
+
+ void close() {
+ transition("close");
+ }
+
+ void ajarPlus() {
+ transition("ajarPlus");
+ }
+
+ void ajarMinus() {
+ transition("ajarMinus");
+ }
+};
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.ClazzStateGenerate.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.ClazzStateGenerate.verified.txt
new file mode 100644
index 0000000..b2a15f6
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.ClazzStateGenerate.verified.txt
@@ -0,0 +1,82 @@
+#pragma once
+
+#include
+
+enum class e_Door_states {
+ OPEN,
+ AJAR,
+ CLOSE
+};
+
+inline void to_json(nlohmann::json &j, const e_Door_states &e) {
+ switch (e) {
+ case e_Door_states::OPEN: j = "OPEN";
+ break;
+ case e_Door_states::AJAR: j = "AJAR";
+ break;
+ case e_Door_states::CLOSE: j = "CLOSE";
+ break;
+ }
+}
+
+inline void from_json(const nlohmann::json &j, e_Door_states &e) {
+ std::string state_str = j.get();
+
+ if (state_str == "OPEN") e = e_Door_states::OPEN;
+ else if (state_str == "AJAR") e = e_Door_states::AJAR;
+ else if (state_str == "CLOSE") e = e_Door_states::CLOSE;
+}
+
+class Door_state_machine : public stater_state_machine {
+public:
+ Door_state_machine() : stater_state_machine (
+ {
+ transition_t<::e_Door_states, empty_context>(
+ "preOpen",
+ e_Door_states::CLOSE,
+ e_Door_states::AJAR,
+ [](empty_context *ctx) { return true; },
+ [](empty_context *ctx) { }
+ ),
+ transition_t<::e_Door_states, empty_context>(
+ "preClose",
+ e_Door_states::OPEN,
+ e_Door_states::AJAR,
+ [](empty_context *ctx) { return true; },
+ [](empty_context *ctx) { }
+ ),
+ transition_t<::e_Door_states, empty_context>(
+ "open",
+ e_Door_states::AJAR,
+ e_Door_states::OPEN,
+ [](empty_context *ctx) { return true; },
+ [](empty_context *ctx) { }
+ ),
+ transition_t<::e_Door_states, empty_context>(
+ "close",
+ e_Door_states::AJAR,
+ e_Door_states::CLOSE,
+ [](empty_context *ctx) { return true; },
+ [](empty_context *ctx) { }
+ ),
+ transition_t<::e_Door_states, empty_context>(
+ "ajarPlus",
+ e_Door_states::AJAR,
+ e_Door_states::AJAR,
+ [](empty_context *ctx) { return true; },
+ [](empty_context *ctx) { }
+ ),
+ transition_t<::e_Door_states, empty_context>(
+ "ajarMinus",
+ e_Door_states::AJAR,
+ e_Door_states::AJAR,
+ [](empty_context *ctx) { return true; },
+ [](empty_context *ctx) { }
+ )
+ },
+ new empty_context(),
+ e_Door_states::OPEN
+ ) {
+ }
+
+};
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.ClazzStateGenerateWithInterface.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.ClazzStateGenerateWithInterface.verified.txt
new file mode 100644
index 0000000..322b8d0
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateDoorTests.ClazzStateGenerateWithInterface.verified.txt
@@ -0,0 +1,105 @@
+#pragma once
+
+#include
+
+enum class e_Door_states {
+ OPEN,
+ AJAR,
+ CLOSE
+};
+
+inline void to_json(nlohmann::json &j, const e_Door_states &e) {
+ switch (e) {
+ case e_Door_states::OPEN: j = "OPEN";
+ break;
+ case e_Door_states::AJAR: j = "AJAR";
+ break;
+ case e_Door_states::CLOSE: j = "CLOSE";
+ break;
+ }
+}
+
+inline void from_json(const nlohmann::json &j, e_Door_states &e) {
+ std::string state_str = j.get();
+
+ if (state_str == "OPEN") e = e_Door_states::OPEN;
+ else if (state_str == "AJAR") e = e_Door_states::AJAR;
+ else if (state_str == "CLOSE") e = e_Door_states::CLOSE;
+}
+
+class Door_state_machine : public stater_state_machine {
+public:
+ Door_state_machine() : stater_state_machine (
+ {
+ transition_t<::e_Door_states, empty_context>(
+ "preOpen",
+ e_Door_states::CLOSE,
+ e_Door_states::AJAR,
+ [](empty_context *ctx) { return true; },
+ [](empty_context *ctx) { }
+ ),
+ transition_t<::e_Door_states, empty_context>(
+ "preClose",
+ e_Door_states::OPEN,
+ e_Door_states::AJAR,
+ [](empty_context *ctx) { return true; },
+ [](empty_context *ctx) { }
+ ),
+ transition_t<::e_Door_states, empty_context>(
+ "open",
+ e_Door_states::AJAR,
+ e_Door_states::OPEN,
+ [](empty_context *ctx) { return true; },
+ [](empty_context *ctx) { }
+ ),
+ transition_t<::e_Door_states, empty_context>(
+ "close",
+ e_Door_states::AJAR,
+ e_Door_states::CLOSE,
+ [](empty_context *ctx) { return true; },
+ [](empty_context *ctx) { }
+ ),
+ transition_t<::e_Door_states, empty_context>(
+ "ajarPlus",
+ e_Door_states::AJAR,
+ e_Door_states::AJAR,
+ [](empty_context *ctx) { return true; },
+ [](empty_context *ctx) { }
+ ),
+ transition_t<::e_Door_states, empty_context>(
+ "ajarMinus",
+ e_Door_states::AJAR,
+ e_Door_states::AJAR,
+ [](empty_context *ctx) { return true; },
+ [](empty_context *ctx) { }
+ )
+ },
+ new empty_context(),
+ e_Door_states::OPEN
+ ) {
+ }
+
+ void preOpen() {
+ transition("preOpen");
+ }
+
+ void preClose() {
+ transition("preClose");
+ }
+
+ void open() {
+ transition("open");
+ }
+
+ void close() {
+ transition("close");
+ }
+
+ void ajarPlus() {
+ transition("ajarPlus");
+ }
+
+ void ajarMinus() {
+ transition("ajarMinus");
+ }
+};
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.BuilderTestsContextGenerate.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.BuilderTestsContextGenerate.verified.txt
new file mode 100644
index 0000000..707e61f
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.BuilderTestsContextGenerate.verified.txt
@@ -0,0 +1,254 @@
+#include
+
+#include
+
+
+
+TEST(Door_state_machine_test, test_init) {
+ builder_Door_state_machine.build();
+}
+
+
+TEST(Door_state_machine_test, test_scenario_0) {
+ const auto sm = builder_Door_state_machine.build();
+ sm->disable_events();
+
+
+ sm->transition("preClose");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("close");
+ ASSERT_EQ(sm->get_state(), "CLOSE");
+
+ sm->transition("preOpen");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("ajarPlus");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("open");
+ ASSERT_EQ(sm->get_state(), "OPEN");
+}
+
+TEST(Door_state_machine_test, test_scenario_1) {
+ const auto sm = builder_Door_state_machine.build();
+ sm->disable_events();
+
+
+ sm->transition("preClose");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("ajarPlus");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("close");
+ ASSERT_EQ(sm->get_state(), "CLOSE");
+
+ sm->transition("preOpen");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("open");
+ ASSERT_EQ(sm->get_state(), "OPEN");
+}
+
+TEST(Door_state_machine_test, test_scenario_2) {
+ const auto sm = builder_Door_state_machine.build();
+ sm->disable_events();
+
+
+ sm->transition("preClose");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("close");
+ ASSERT_EQ(sm->get_state(), "CLOSE");
+
+ sm->transition("preOpen");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("open");
+ ASSERT_EQ(sm->get_state(), "OPEN");
+}
+
+TEST(Door_state_machine_test, test_json_schema) {
+ auto sm = builder_Door_state_machine.build();
+ ASSERT_EQ(nlohmann::json::parse(R"({
+ "states": [
+ "AJAR",
+ "CLOSE",
+ "OPEN"
+ ],
+ "startState": "OPEN",
+ "transitions": [
+ {
+ "name": "preOpen",
+ "start": "CLOSE",
+ "end": "AJAR"
+ },
+ {
+ "name": "preClose",
+ "start": "OPEN",
+ "end": "AJAR"
+ },
+ {
+ "name": "open",
+ "start": "AJAR",
+ "end": "OPEN"
+ },
+ {
+ "name": "close",
+ "start": "AJAR",
+ "end": "CLOSE"
+ },
+ {
+ "name": "ajarPlus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "ajarMinus",
+ "start": "AJAR",
+ "end": "AJAR"
+ }
+ ]
+})"), nlohmann::json::parse(sm->to_json_schema()));
+}
+
+TEST(Door_state_machine_test, test_system_append_state_transition) {
+ auto sm_builder = builder_Door_state_machine;
+
+ sm_builder = sm_builder.add_state("__test_state_1__");
+ ASSERT_EQ(nlohmann::json::parse(R"({
+ "states": [
+ "__test_state_1__",
+ "AJAR",
+ "CLOSE",
+ "OPEN"
+ ],
+ "startState": "OPEN",
+ "transitions": [
+ {
+ "name": "preOpen",
+ "start": "CLOSE",
+ "end": "AJAR"
+ },
+ {
+ "name": "preClose",
+ "start": "OPEN",
+ "end": "AJAR"
+ },
+ {
+ "name": "open",
+ "start": "AJAR",
+ "end": "OPEN"
+ },
+ {
+ "name": "close",
+ "start": "AJAR",
+ "end": "CLOSE"
+ },
+ {
+ "name": "ajarPlus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "ajarMinus",
+ "start": "AJAR",
+ "end": "AJAR"
+ }
+ ]
+})"), nlohmann::json::parse(sm_builder.build()->to_json_schema()));
+
+ sm_builder = sm_builder.add_state("__test_state_2__");
+ ASSERT_EQ(nlohmann::json::parse(R"({
+ "states": [
+ "__test_state_1__",
+ "__test_state_2__",
+ "AJAR",
+ "CLOSE",
+ "OPEN"
+ ],
+ "startState": "OPEN",
+ "transitions": [
+ {
+ "name": "preOpen",
+ "start": "CLOSE",
+ "end": "AJAR"
+ },
+ {
+ "name": "preClose",
+ "start": "OPEN",
+ "end": "AJAR"
+ },
+ {
+ "name": "open",
+ "start": "AJAR",
+ "end": "OPEN"
+ },
+ {
+ "name": "close",
+ "start": "AJAR",
+ "end": "CLOSE"
+ },
+ {
+ "name": "ajarPlus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "ajarMinus",
+ "start": "AJAR",
+ "end": "AJAR"
+ }
+ ]
+})"), nlohmann::json::parse(sm_builder.build()->to_json_schema()));
+
+ sm_builder = sm_builder.add_transition("__test_transition__", "__test_state_1__", "__test_state_2__");
+ ASSERT_EQ(nlohmann::json::parse(R"({
+ "states": [
+ "__test_state_1__",
+ "__test_state_2__",
+ "AJAR",
+ "CLOSE",
+ "OPEN"
+ ],
+ "startState": "OPEN",
+ "transitions": [
+ {
+ "name": "preOpen",
+ "start": "CLOSE",
+ "end": "AJAR"
+ },
+ {
+ "name": "preClose",
+ "start": "OPEN",
+ "end": "AJAR"
+ },
+ {
+ "name": "open",
+ "start": "AJAR",
+ "end": "OPEN"
+ },
+ {
+ "name": "close",
+ "start": "AJAR",
+ "end": "CLOSE"
+ },
+ {
+ "name": "ajarPlus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "ajarMinus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "__test_transition__",
+ "start": "__test_state_1__",
+ "end": "__test_state_2__"
+ }
+ ]
+})"), nlohmann::json::parse(sm_builder.build()->to_json_schema()));
+}
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.BuilderTestsContextGenerateWithInterface.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.BuilderTestsContextGenerateWithInterface.verified.txt
new file mode 100644
index 0000000..f7a80a3
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.BuilderTestsContextGenerateWithInterface.verified.txt
@@ -0,0 +1,259 @@
+#include
+
+#include
+
+
+
+TEST(Door_state_machine_test, test_init) {
+ const auto st = builder_Door_state_machine.build();
+ dynamic_cast(st.get());
+}
+
+
+TEST(Door_state_machine_test, test_scenario_0) {
+ const auto st = builder_Door_state_machine.build();
+ const auto sm = dynamic_cast(st.get());
+ sm->disable_events();
+
+
+ sm->preClose();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->close();
+ ASSERT_EQ(sm->get_state(), "CLOSE");
+
+ sm->preOpen();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->ajarPlus();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->open();
+ ASSERT_EQ(sm->get_state(), "OPEN");
+}
+
+TEST(Door_state_machine_test, test_scenario_1) {
+ const auto st = builder_Door_state_machine.build();
+ const auto sm = dynamic_cast(st.get());
+ sm->disable_events();
+
+
+ sm->preClose();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->ajarPlus();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->close();
+ ASSERT_EQ(sm->get_state(), "CLOSE");
+
+ sm->preOpen();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->open();
+ ASSERT_EQ(sm->get_state(), "OPEN");
+}
+
+TEST(Door_state_machine_test, test_scenario_2) {
+ const auto st = builder_Door_state_machine.build();
+ const auto sm = dynamic_cast(st.get());
+ sm->disable_events();
+
+
+ sm->preClose();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->close();
+ ASSERT_EQ(sm->get_state(), "CLOSE");
+
+ sm->preOpen();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->open();
+ ASSERT_EQ(sm->get_state(), "OPEN");
+}
+
+TEST(Door_state_machine_test, test_json_schema) {
+ const auto st = builder_Door_state_machine.build();
+ auto sm = dynamic_cast(st.get());
+ ASSERT_EQ(nlohmann::json::parse(R"({
+ "states": [
+ "AJAR",
+ "CLOSE",
+ "OPEN"
+ ],
+ "startState": "OPEN",
+ "transitions": [
+ {
+ "name": "preOpen",
+ "start": "CLOSE",
+ "end": "AJAR"
+ },
+ {
+ "name": "preClose",
+ "start": "OPEN",
+ "end": "AJAR"
+ },
+ {
+ "name": "open",
+ "start": "AJAR",
+ "end": "OPEN"
+ },
+ {
+ "name": "close",
+ "start": "AJAR",
+ "end": "CLOSE"
+ },
+ {
+ "name": "ajarPlus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "ajarMinus",
+ "start": "AJAR",
+ "end": "AJAR"
+ }
+ ]
+})"), nlohmann::json::parse(sm->to_json_schema()));
+}
+
+TEST(Door_state_machine_test, test_system_append_state_transition) {
+ auto sm_builder = builder_Door_state_machine;
+
+ sm_builder = sm_builder.add_state("__test_state_1__");
+ ASSERT_EQ(nlohmann::json::parse(R"({
+ "states": [
+ "__test_state_1__",
+ "AJAR",
+ "CLOSE",
+ "OPEN"
+ ],
+ "startState": "OPEN",
+ "transitions": [
+ {
+ "name": "preOpen",
+ "start": "CLOSE",
+ "end": "AJAR"
+ },
+ {
+ "name": "preClose",
+ "start": "OPEN",
+ "end": "AJAR"
+ },
+ {
+ "name": "open",
+ "start": "AJAR",
+ "end": "OPEN"
+ },
+ {
+ "name": "close",
+ "start": "AJAR",
+ "end": "CLOSE"
+ },
+ {
+ "name": "ajarPlus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "ajarMinus",
+ "start": "AJAR",
+ "end": "AJAR"
+ }
+ ]
+})"), nlohmann::json::parse(sm_builder.build()->to_json_schema()));
+
+ sm_builder = sm_builder.add_state("__test_state_2__");
+ ASSERT_EQ(nlohmann::json::parse(R"({
+ "states": [
+ "__test_state_1__",
+ "__test_state_2__",
+ "AJAR",
+ "CLOSE",
+ "OPEN"
+ ],
+ "startState": "OPEN",
+ "transitions": [
+ {
+ "name": "preOpen",
+ "start": "CLOSE",
+ "end": "AJAR"
+ },
+ {
+ "name": "preClose",
+ "start": "OPEN",
+ "end": "AJAR"
+ },
+ {
+ "name": "open",
+ "start": "AJAR",
+ "end": "OPEN"
+ },
+ {
+ "name": "close",
+ "start": "AJAR",
+ "end": "CLOSE"
+ },
+ {
+ "name": "ajarPlus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "ajarMinus",
+ "start": "AJAR",
+ "end": "AJAR"
+ }
+ ]
+})"), nlohmann::json::parse(sm_builder.build()->to_json_schema()));
+
+ sm_builder = sm_builder.add_transition("__test_transition__", "__test_state_1__", "__test_state_2__");
+ ASSERT_EQ(nlohmann::json::parse(R"({
+ "states": [
+ "__test_state_1__",
+ "__test_state_2__",
+ "AJAR",
+ "CLOSE",
+ "OPEN"
+ ],
+ "startState": "OPEN",
+ "transitions": [
+ {
+ "name": "preOpen",
+ "start": "CLOSE",
+ "end": "AJAR"
+ },
+ {
+ "name": "preClose",
+ "start": "OPEN",
+ "end": "AJAR"
+ },
+ {
+ "name": "open",
+ "start": "AJAR",
+ "end": "OPEN"
+ },
+ {
+ "name": "close",
+ "start": "AJAR",
+ "end": "CLOSE"
+ },
+ {
+ "name": "ajarPlus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "ajarMinus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "__test_transition__",
+ "start": "__test_state_1__",
+ "end": "__test_state_2__"
+ }
+ ]
+})"), nlohmann::json::parse(sm_builder.build()->to_json_schema()));
+}
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.BuilderTestsGenerate.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.BuilderTestsGenerate.verified.txt
new file mode 100644
index 0000000..707e61f
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.BuilderTestsGenerate.verified.txt
@@ -0,0 +1,254 @@
+#include
+
+#include
+
+
+
+TEST(Door_state_machine_test, test_init) {
+ builder_Door_state_machine.build();
+}
+
+
+TEST(Door_state_machine_test, test_scenario_0) {
+ const auto sm = builder_Door_state_machine.build();
+ sm->disable_events();
+
+
+ sm->transition("preClose");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("close");
+ ASSERT_EQ(sm->get_state(), "CLOSE");
+
+ sm->transition("preOpen");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("ajarPlus");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("open");
+ ASSERT_EQ(sm->get_state(), "OPEN");
+}
+
+TEST(Door_state_machine_test, test_scenario_1) {
+ const auto sm = builder_Door_state_machine.build();
+ sm->disable_events();
+
+
+ sm->transition("preClose");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("ajarPlus");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("close");
+ ASSERT_EQ(sm->get_state(), "CLOSE");
+
+ sm->transition("preOpen");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("open");
+ ASSERT_EQ(sm->get_state(), "OPEN");
+}
+
+TEST(Door_state_machine_test, test_scenario_2) {
+ const auto sm = builder_Door_state_machine.build();
+ sm->disable_events();
+
+
+ sm->transition("preClose");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("close");
+ ASSERT_EQ(sm->get_state(), "CLOSE");
+
+ sm->transition("preOpen");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("open");
+ ASSERT_EQ(sm->get_state(), "OPEN");
+}
+
+TEST(Door_state_machine_test, test_json_schema) {
+ auto sm = builder_Door_state_machine.build();
+ ASSERT_EQ(nlohmann::json::parse(R"({
+ "states": [
+ "AJAR",
+ "CLOSE",
+ "OPEN"
+ ],
+ "startState": "OPEN",
+ "transitions": [
+ {
+ "name": "preOpen",
+ "start": "CLOSE",
+ "end": "AJAR"
+ },
+ {
+ "name": "preClose",
+ "start": "OPEN",
+ "end": "AJAR"
+ },
+ {
+ "name": "open",
+ "start": "AJAR",
+ "end": "OPEN"
+ },
+ {
+ "name": "close",
+ "start": "AJAR",
+ "end": "CLOSE"
+ },
+ {
+ "name": "ajarPlus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "ajarMinus",
+ "start": "AJAR",
+ "end": "AJAR"
+ }
+ ]
+})"), nlohmann::json::parse(sm->to_json_schema()));
+}
+
+TEST(Door_state_machine_test, test_system_append_state_transition) {
+ auto sm_builder = builder_Door_state_machine;
+
+ sm_builder = sm_builder.add_state("__test_state_1__");
+ ASSERT_EQ(nlohmann::json::parse(R"({
+ "states": [
+ "__test_state_1__",
+ "AJAR",
+ "CLOSE",
+ "OPEN"
+ ],
+ "startState": "OPEN",
+ "transitions": [
+ {
+ "name": "preOpen",
+ "start": "CLOSE",
+ "end": "AJAR"
+ },
+ {
+ "name": "preClose",
+ "start": "OPEN",
+ "end": "AJAR"
+ },
+ {
+ "name": "open",
+ "start": "AJAR",
+ "end": "OPEN"
+ },
+ {
+ "name": "close",
+ "start": "AJAR",
+ "end": "CLOSE"
+ },
+ {
+ "name": "ajarPlus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "ajarMinus",
+ "start": "AJAR",
+ "end": "AJAR"
+ }
+ ]
+})"), nlohmann::json::parse(sm_builder.build()->to_json_schema()));
+
+ sm_builder = sm_builder.add_state("__test_state_2__");
+ ASSERT_EQ(nlohmann::json::parse(R"({
+ "states": [
+ "__test_state_1__",
+ "__test_state_2__",
+ "AJAR",
+ "CLOSE",
+ "OPEN"
+ ],
+ "startState": "OPEN",
+ "transitions": [
+ {
+ "name": "preOpen",
+ "start": "CLOSE",
+ "end": "AJAR"
+ },
+ {
+ "name": "preClose",
+ "start": "OPEN",
+ "end": "AJAR"
+ },
+ {
+ "name": "open",
+ "start": "AJAR",
+ "end": "OPEN"
+ },
+ {
+ "name": "close",
+ "start": "AJAR",
+ "end": "CLOSE"
+ },
+ {
+ "name": "ajarPlus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "ajarMinus",
+ "start": "AJAR",
+ "end": "AJAR"
+ }
+ ]
+})"), nlohmann::json::parse(sm_builder.build()->to_json_schema()));
+
+ sm_builder = sm_builder.add_transition("__test_transition__", "__test_state_1__", "__test_state_2__");
+ ASSERT_EQ(nlohmann::json::parse(R"({
+ "states": [
+ "__test_state_1__",
+ "__test_state_2__",
+ "AJAR",
+ "CLOSE",
+ "OPEN"
+ ],
+ "startState": "OPEN",
+ "transitions": [
+ {
+ "name": "preOpen",
+ "start": "CLOSE",
+ "end": "AJAR"
+ },
+ {
+ "name": "preClose",
+ "start": "OPEN",
+ "end": "AJAR"
+ },
+ {
+ "name": "open",
+ "start": "AJAR",
+ "end": "OPEN"
+ },
+ {
+ "name": "close",
+ "start": "AJAR",
+ "end": "CLOSE"
+ },
+ {
+ "name": "ajarPlus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "ajarMinus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "__test_transition__",
+ "start": "__test_state_1__",
+ "end": "__test_state_2__"
+ }
+ ]
+})"), nlohmann::json::parse(sm_builder.build()->to_json_schema()));
+}
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.BuilderTestsGenerateWithInterface.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.BuilderTestsGenerateWithInterface.verified.txt
new file mode 100644
index 0000000..f7a80a3
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.BuilderTestsGenerateWithInterface.verified.txt
@@ -0,0 +1,259 @@
+#include
+
+#include
+
+
+
+TEST(Door_state_machine_test, test_init) {
+ const auto st = builder_Door_state_machine.build();
+ dynamic_cast(st.get());
+}
+
+
+TEST(Door_state_machine_test, test_scenario_0) {
+ const auto st = builder_Door_state_machine.build();
+ const auto sm = dynamic_cast(st.get());
+ sm->disable_events();
+
+
+ sm->preClose();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->close();
+ ASSERT_EQ(sm->get_state(), "CLOSE");
+
+ sm->preOpen();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->ajarPlus();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->open();
+ ASSERT_EQ(sm->get_state(), "OPEN");
+}
+
+TEST(Door_state_machine_test, test_scenario_1) {
+ const auto st = builder_Door_state_machine.build();
+ const auto sm = dynamic_cast(st.get());
+ sm->disable_events();
+
+
+ sm->preClose();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->ajarPlus();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->close();
+ ASSERT_EQ(sm->get_state(), "CLOSE");
+
+ sm->preOpen();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->open();
+ ASSERT_EQ(sm->get_state(), "OPEN");
+}
+
+TEST(Door_state_machine_test, test_scenario_2) {
+ const auto st = builder_Door_state_machine.build();
+ const auto sm = dynamic_cast(st.get());
+ sm->disable_events();
+
+
+ sm->preClose();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->close();
+ ASSERT_EQ(sm->get_state(), "CLOSE");
+
+ sm->preOpen();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->open();
+ ASSERT_EQ(sm->get_state(), "OPEN");
+}
+
+TEST(Door_state_machine_test, test_json_schema) {
+ const auto st = builder_Door_state_machine.build();
+ auto sm = dynamic_cast(st.get());
+ ASSERT_EQ(nlohmann::json::parse(R"({
+ "states": [
+ "AJAR",
+ "CLOSE",
+ "OPEN"
+ ],
+ "startState": "OPEN",
+ "transitions": [
+ {
+ "name": "preOpen",
+ "start": "CLOSE",
+ "end": "AJAR"
+ },
+ {
+ "name": "preClose",
+ "start": "OPEN",
+ "end": "AJAR"
+ },
+ {
+ "name": "open",
+ "start": "AJAR",
+ "end": "OPEN"
+ },
+ {
+ "name": "close",
+ "start": "AJAR",
+ "end": "CLOSE"
+ },
+ {
+ "name": "ajarPlus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "ajarMinus",
+ "start": "AJAR",
+ "end": "AJAR"
+ }
+ ]
+})"), nlohmann::json::parse(sm->to_json_schema()));
+}
+
+TEST(Door_state_machine_test, test_system_append_state_transition) {
+ auto sm_builder = builder_Door_state_machine;
+
+ sm_builder = sm_builder.add_state("__test_state_1__");
+ ASSERT_EQ(nlohmann::json::parse(R"({
+ "states": [
+ "__test_state_1__",
+ "AJAR",
+ "CLOSE",
+ "OPEN"
+ ],
+ "startState": "OPEN",
+ "transitions": [
+ {
+ "name": "preOpen",
+ "start": "CLOSE",
+ "end": "AJAR"
+ },
+ {
+ "name": "preClose",
+ "start": "OPEN",
+ "end": "AJAR"
+ },
+ {
+ "name": "open",
+ "start": "AJAR",
+ "end": "OPEN"
+ },
+ {
+ "name": "close",
+ "start": "AJAR",
+ "end": "CLOSE"
+ },
+ {
+ "name": "ajarPlus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "ajarMinus",
+ "start": "AJAR",
+ "end": "AJAR"
+ }
+ ]
+})"), nlohmann::json::parse(sm_builder.build()->to_json_schema()));
+
+ sm_builder = sm_builder.add_state("__test_state_2__");
+ ASSERT_EQ(nlohmann::json::parse(R"({
+ "states": [
+ "__test_state_1__",
+ "__test_state_2__",
+ "AJAR",
+ "CLOSE",
+ "OPEN"
+ ],
+ "startState": "OPEN",
+ "transitions": [
+ {
+ "name": "preOpen",
+ "start": "CLOSE",
+ "end": "AJAR"
+ },
+ {
+ "name": "preClose",
+ "start": "OPEN",
+ "end": "AJAR"
+ },
+ {
+ "name": "open",
+ "start": "AJAR",
+ "end": "OPEN"
+ },
+ {
+ "name": "close",
+ "start": "AJAR",
+ "end": "CLOSE"
+ },
+ {
+ "name": "ajarPlus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "ajarMinus",
+ "start": "AJAR",
+ "end": "AJAR"
+ }
+ ]
+})"), nlohmann::json::parse(sm_builder.build()->to_json_schema()));
+
+ sm_builder = sm_builder.add_transition("__test_transition__", "__test_state_1__", "__test_state_2__");
+ ASSERT_EQ(nlohmann::json::parse(R"({
+ "states": [
+ "__test_state_1__",
+ "__test_state_2__",
+ "AJAR",
+ "CLOSE",
+ "OPEN"
+ ],
+ "startState": "OPEN",
+ "transitions": [
+ {
+ "name": "preOpen",
+ "start": "CLOSE",
+ "end": "AJAR"
+ },
+ {
+ "name": "preClose",
+ "start": "OPEN",
+ "end": "AJAR"
+ },
+ {
+ "name": "open",
+ "start": "AJAR",
+ "end": "OPEN"
+ },
+ {
+ "name": "close",
+ "start": "AJAR",
+ "end": "CLOSE"
+ },
+ {
+ "name": "ajarPlus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "ajarMinus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "__test_transition__",
+ "start": "__test_state_1__",
+ "end": "__test_state_2__"
+ }
+ ]
+})"), nlohmann::json::parse(sm_builder.build()->to_json_schema()));
+}
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.BuilderTestsStateContextGenerate.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.BuilderTestsStateContextGenerate.verified.txt
new file mode 100644
index 0000000..a238513
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.BuilderTestsStateContextGenerate.verified.txt
@@ -0,0 +1,114 @@
+#include
+
+#include
+
+
+
+TEST(Door_state_machine_test, test_init) {
+ builder_Door_state_machine.build();
+}
+
+
+TEST(Door_state_machine_test, test_scenario_0) {
+ const auto sm = builder_Door_state_machine.build();
+ sm->disable_events();
+
+
+ sm->transition("preClose");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("close");
+ ASSERT_EQ(sm->get_state(), e_Door_states::CLOSE);
+
+ sm->transition("preOpen");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("ajarPlus");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("open");
+ ASSERT_EQ(sm->get_state(), e_Door_states::OPEN);
+}
+
+TEST(Door_state_machine_test, test_scenario_1) {
+ const auto sm = builder_Door_state_machine.build();
+ sm->disable_events();
+
+
+ sm->transition("preClose");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("ajarPlus");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("close");
+ ASSERT_EQ(sm->get_state(), e_Door_states::CLOSE);
+
+ sm->transition("preOpen");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("open");
+ ASSERT_EQ(sm->get_state(), e_Door_states::OPEN);
+}
+
+TEST(Door_state_machine_test, test_scenario_2) {
+ const auto sm = builder_Door_state_machine.build();
+ sm->disable_events();
+
+
+ sm->transition("preClose");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("close");
+ ASSERT_EQ(sm->get_state(), e_Door_states::CLOSE);
+
+ sm->transition("preOpen");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("open");
+ ASSERT_EQ(sm->get_state(), e_Door_states::OPEN);
+}
+
+TEST(Door_state_machine_test, test_json_schema) {
+ auto sm = builder_Door_state_machine.build();
+ ASSERT_EQ(nlohmann::json::parse(R"({
+ "states": [
+ "AJAR",
+ "CLOSE",
+ "OPEN"
+ ],
+ "startState": "OPEN",
+ "transitions": [
+ {
+ "name": "preOpen",
+ "start": "CLOSE",
+ "end": "AJAR"
+ },
+ {
+ "name": "preClose",
+ "start": "OPEN",
+ "end": "AJAR"
+ },
+ {
+ "name": "open",
+ "start": "AJAR",
+ "end": "OPEN"
+ },
+ {
+ "name": "close",
+ "start": "AJAR",
+ "end": "CLOSE"
+ },
+ {
+ "name": "ajarPlus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "ajarMinus",
+ "start": "AJAR",
+ "end": "AJAR"
+ }
+ ]
+})"), nlohmann::json::parse(sm->to_json_schema()));
+}
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.BuilderTestsStateContextGenerateWithInterface.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.BuilderTestsStateContextGenerateWithInterface.verified.txt
new file mode 100644
index 0000000..73c17ac
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.BuilderTestsStateContextGenerateWithInterface.verified.txt
@@ -0,0 +1,119 @@
+#include
+
+#include
+
+
+
+TEST(Door_state_machine_test, test_init) {
+ const auto st = builder_Door_state_machine.build();
+ dynamic_cast(st.get());
+}
+
+
+TEST(Door_state_machine_test, test_scenario_0) {
+ const auto st = builder_Door_state_machine.build();
+ const auto sm = dynamic_cast(st.get());
+ sm->disable_events();
+
+
+ sm->preClose();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->close();
+ ASSERT_EQ(sm->get_state(), e_Door_states::CLOSE);
+
+ sm->preOpen();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->ajarPlus();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->open();
+ ASSERT_EQ(sm->get_state(), e_Door_states::OPEN);
+}
+
+TEST(Door_state_machine_test, test_scenario_1) {
+ const auto st = builder_Door_state_machine.build();
+ const auto sm = dynamic_cast(st.get());
+ sm->disable_events();
+
+
+ sm->preClose();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->ajarPlus();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->close();
+ ASSERT_EQ(sm->get_state(), e_Door_states::CLOSE);
+
+ sm->preOpen();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->open();
+ ASSERT_EQ(sm->get_state(), e_Door_states::OPEN);
+}
+
+TEST(Door_state_machine_test, test_scenario_2) {
+ const auto st = builder_Door_state_machine.build();
+ const auto sm = dynamic_cast(st.get());
+ sm->disable_events();
+
+
+ sm->preClose();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->close();
+ ASSERT_EQ(sm->get_state(), e_Door_states::CLOSE);
+
+ sm->preOpen();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->open();
+ ASSERT_EQ(sm->get_state(), e_Door_states::OPEN);
+}
+
+TEST(Door_state_machine_test, test_json_schema) {
+ const auto st = builder_Door_state_machine.build();
+ auto sm = dynamic_cast(st.get());
+ ASSERT_EQ(nlohmann::json::parse(R"({
+ "states": [
+ "AJAR",
+ "CLOSE",
+ "OPEN"
+ ],
+ "startState": "OPEN",
+ "transitions": [
+ {
+ "name": "preOpen",
+ "start": "CLOSE",
+ "end": "AJAR"
+ },
+ {
+ "name": "preClose",
+ "start": "OPEN",
+ "end": "AJAR"
+ },
+ {
+ "name": "open",
+ "start": "AJAR",
+ "end": "OPEN"
+ },
+ {
+ "name": "close",
+ "start": "AJAR",
+ "end": "CLOSE"
+ },
+ {
+ "name": "ajarPlus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "ajarMinus",
+ "start": "AJAR",
+ "end": "AJAR"
+ }
+ ]
+})"), nlohmann::json::parse(sm->to_json_schema()));
+}
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.BuilderTestsStateGenerate.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.BuilderTestsStateGenerate.verified.txt
new file mode 100644
index 0000000..a238513
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.BuilderTestsStateGenerate.verified.txt
@@ -0,0 +1,114 @@
+#include
+
+#include
+
+
+
+TEST(Door_state_machine_test, test_init) {
+ builder_Door_state_machine.build();
+}
+
+
+TEST(Door_state_machine_test, test_scenario_0) {
+ const auto sm = builder_Door_state_machine.build();
+ sm->disable_events();
+
+
+ sm->transition("preClose");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("close");
+ ASSERT_EQ(sm->get_state(), e_Door_states::CLOSE);
+
+ sm->transition("preOpen");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("ajarPlus");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("open");
+ ASSERT_EQ(sm->get_state(), e_Door_states::OPEN);
+}
+
+TEST(Door_state_machine_test, test_scenario_1) {
+ const auto sm = builder_Door_state_machine.build();
+ sm->disable_events();
+
+
+ sm->transition("preClose");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("ajarPlus");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("close");
+ ASSERT_EQ(sm->get_state(), e_Door_states::CLOSE);
+
+ sm->transition("preOpen");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("open");
+ ASSERT_EQ(sm->get_state(), e_Door_states::OPEN);
+}
+
+TEST(Door_state_machine_test, test_scenario_2) {
+ const auto sm = builder_Door_state_machine.build();
+ sm->disable_events();
+
+
+ sm->transition("preClose");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("close");
+ ASSERT_EQ(sm->get_state(), e_Door_states::CLOSE);
+
+ sm->transition("preOpen");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("open");
+ ASSERT_EQ(sm->get_state(), e_Door_states::OPEN);
+}
+
+TEST(Door_state_machine_test, test_json_schema) {
+ auto sm = builder_Door_state_machine.build();
+ ASSERT_EQ(nlohmann::json::parse(R"({
+ "states": [
+ "AJAR",
+ "CLOSE",
+ "OPEN"
+ ],
+ "startState": "OPEN",
+ "transitions": [
+ {
+ "name": "preOpen",
+ "start": "CLOSE",
+ "end": "AJAR"
+ },
+ {
+ "name": "preClose",
+ "start": "OPEN",
+ "end": "AJAR"
+ },
+ {
+ "name": "open",
+ "start": "AJAR",
+ "end": "OPEN"
+ },
+ {
+ "name": "close",
+ "start": "AJAR",
+ "end": "CLOSE"
+ },
+ {
+ "name": "ajarPlus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "ajarMinus",
+ "start": "AJAR",
+ "end": "AJAR"
+ }
+ ]
+})"), nlohmann::json::parse(sm->to_json_schema()));
+}
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.BuilderTestsStateGenerateWithInterface.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.BuilderTestsStateGenerateWithInterface.verified.txt
new file mode 100644
index 0000000..73c17ac
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.BuilderTestsStateGenerateWithInterface.verified.txt
@@ -0,0 +1,119 @@
+#include
+
+#include
+
+
+
+TEST(Door_state_machine_test, test_init) {
+ const auto st = builder_Door_state_machine.build();
+ dynamic_cast(st.get());
+}
+
+
+TEST(Door_state_machine_test, test_scenario_0) {
+ const auto st = builder_Door_state_machine.build();
+ const auto sm = dynamic_cast(st.get());
+ sm->disable_events();
+
+
+ sm->preClose();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->close();
+ ASSERT_EQ(sm->get_state(), e_Door_states::CLOSE);
+
+ sm->preOpen();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->ajarPlus();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->open();
+ ASSERT_EQ(sm->get_state(), e_Door_states::OPEN);
+}
+
+TEST(Door_state_machine_test, test_scenario_1) {
+ const auto st = builder_Door_state_machine.build();
+ const auto sm = dynamic_cast(st.get());
+ sm->disable_events();
+
+
+ sm->preClose();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->ajarPlus();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->close();
+ ASSERT_EQ(sm->get_state(), e_Door_states::CLOSE);
+
+ sm->preOpen();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->open();
+ ASSERT_EQ(sm->get_state(), e_Door_states::OPEN);
+}
+
+TEST(Door_state_machine_test, test_scenario_2) {
+ const auto st = builder_Door_state_machine.build();
+ const auto sm = dynamic_cast(st.get());
+ sm->disable_events();
+
+
+ sm->preClose();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->close();
+ ASSERT_EQ(sm->get_state(), e_Door_states::CLOSE);
+
+ sm->preOpen();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->open();
+ ASSERT_EQ(sm->get_state(), e_Door_states::OPEN);
+}
+
+TEST(Door_state_machine_test, test_json_schema) {
+ const auto st = builder_Door_state_machine.build();
+ auto sm = dynamic_cast(st.get());
+ ASSERT_EQ(nlohmann::json::parse(R"({
+ "states": [
+ "AJAR",
+ "CLOSE",
+ "OPEN"
+ ],
+ "startState": "OPEN",
+ "transitions": [
+ {
+ "name": "preOpen",
+ "start": "CLOSE",
+ "end": "AJAR"
+ },
+ {
+ "name": "preClose",
+ "start": "OPEN",
+ "end": "AJAR"
+ },
+ {
+ "name": "open",
+ "start": "AJAR",
+ "end": "OPEN"
+ },
+ {
+ "name": "close",
+ "start": "AJAR",
+ "end": "CLOSE"
+ },
+ {
+ "name": "ajarPlus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "ajarMinus",
+ "start": "AJAR",
+ "end": "AJAR"
+ }
+ ]
+})"), nlohmann::json::parse(sm->to_json_schema()));
+}
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.ClazzTestsContextGenerate.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.ClazzTestsContextGenerate.verified.txt
new file mode 100644
index 0000000..b2df42c
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.ClazzTestsContextGenerate.verified.txt
@@ -0,0 +1,114 @@
+#include
+
+#include
+
+
+
+TEST(Door_state_machine_test, test_init) {
+ new Door_state_machine();
+}
+
+
+TEST(Door_state_machine_test, test_scenario_0) {
+ const auto sm = new Door_state_machine();
+ sm->disable_events();
+
+
+ sm->transition("preClose");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("close");
+ ASSERT_EQ(sm->get_state(), "CLOSE");
+
+ sm->transition("preOpen");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("ajarPlus");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("open");
+ ASSERT_EQ(sm->get_state(), "OPEN");
+}
+
+TEST(Door_state_machine_test, test_scenario_1) {
+ const auto sm = new Door_state_machine();
+ sm->disable_events();
+
+
+ sm->transition("preClose");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("ajarPlus");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("close");
+ ASSERT_EQ(sm->get_state(), "CLOSE");
+
+ sm->transition("preOpen");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("open");
+ ASSERT_EQ(sm->get_state(), "OPEN");
+}
+
+TEST(Door_state_machine_test, test_scenario_2) {
+ const auto sm = new Door_state_machine();
+ sm->disable_events();
+
+
+ sm->transition("preClose");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("close");
+ ASSERT_EQ(sm->get_state(), "CLOSE");
+
+ sm->transition("preOpen");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("open");
+ ASSERT_EQ(sm->get_state(), "OPEN");
+}
+
+TEST(Door_state_machine_test, test_json_schema) {
+ auto sm = new Door_state_machine();
+ ASSERT_EQ(nlohmann::json::parse(R"({
+ "states": [
+ "AJAR",
+ "CLOSE",
+ "OPEN"
+ ],
+ "startState": "OPEN",
+ "transitions": [
+ {
+ "name": "preOpen",
+ "start": "CLOSE",
+ "end": "AJAR"
+ },
+ {
+ "name": "preClose",
+ "start": "OPEN",
+ "end": "AJAR"
+ },
+ {
+ "name": "open",
+ "start": "AJAR",
+ "end": "OPEN"
+ },
+ {
+ "name": "close",
+ "start": "AJAR",
+ "end": "CLOSE"
+ },
+ {
+ "name": "ajarPlus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "ajarMinus",
+ "start": "AJAR",
+ "end": "AJAR"
+ }
+ ]
+})"), nlohmann::json::parse(sm->to_json_schema()));
+}
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.ClazzTestsContextGenerateWithInterface.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.ClazzTestsContextGenerateWithInterface.verified.txt
new file mode 100644
index 0000000..47d878a
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.ClazzTestsContextGenerateWithInterface.verified.txt
@@ -0,0 +1,114 @@
+#include
+
+#include
+
+
+
+TEST(Door_state_machine_test, test_init) {
+ new Door_state_machine();
+}
+
+
+TEST(Door_state_machine_test, test_scenario_0) {
+ const auto sm = new Door_state_machine();
+ sm->disable_events();
+
+
+ sm->preClose();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->close();
+ ASSERT_EQ(sm->get_state(), "CLOSE");
+
+ sm->preOpen();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->ajarPlus();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->open();
+ ASSERT_EQ(sm->get_state(), "OPEN");
+}
+
+TEST(Door_state_machine_test, test_scenario_1) {
+ const auto sm = new Door_state_machine();
+ sm->disable_events();
+
+
+ sm->preClose();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->ajarPlus();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->close();
+ ASSERT_EQ(sm->get_state(), "CLOSE");
+
+ sm->preOpen();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->open();
+ ASSERT_EQ(sm->get_state(), "OPEN");
+}
+
+TEST(Door_state_machine_test, test_scenario_2) {
+ const auto sm = new Door_state_machine();
+ sm->disable_events();
+
+
+ sm->preClose();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->close();
+ ASSERT_EQ(sm->get_state(), "CLOSE");
+
+ sm->preOpen();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->open();
+ ASSERT_EQ(sm->get_state(), "OPEN");
+}
+
+TEST(Door_state_machine_test, test_json_schema) {
+ auto sm = new Door_state_machine();
+ ASSERT_EQ(nlohmann::json::parse(R"({
+ "states": [
+ "AJAR",
+ "CLOSE",
+ "OPEN"
+ ],
+ "startState": "OPEN",
+ "transitions": [
+ {
+ "name": "preOpen",
+ "start": "CLOSE",
+ "end": "AJAR"
+ },
+ {
+ "name": "preClose",
+ "start": "OPEN",
+ "end": "AJAR"
+ },
+ {
+ "name": "open",
+ "start": "AJAR",
+ "end": "OPEN"
+ },
+ {
+ "name": "close",
+ "start": "AJAR",
+ "end": "CLOSE"
+ },
+ {
+ "name": "ajarPlus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "ajarMinus",
+ "start": "AJAR",
+ "end": "AJAR"
+ }
+ ]
+})"), nlohmann::json::parse(sm->to_json_schema()));
+}
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.ClazzTestsGenerate.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.ClazzTestsGenerate.verified.txt
new file mode 100644
index 0000000..b2df42c
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.ClazzTestsGenerate.verified.txt
@@ -0,0 +1,114 @@
+#include
+
+#include
+
+
+
+TEST(Door_state_machine_test, test_init) {
+ new Door_state_machine();
+}
+
+
+TEST(Door_state_machine_test, test_scenario_0) {
+ const auto sm = new Door_state_machine();
+ sm->disable_events();
+
+
+ sm->transition("preClose");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("close");
+ ASSERT_EQ(sm->get_state(), "CLOSE");
+
+ sm->transition("preOpen");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("ajarPlus");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("open");
+ ASSERT_EQ(sm->get_state(), "OPEN");
+}
+
+TEST(Door_state_machine_test, test_scenario_1) {
+ const auto sm = new Door_state_machine();
+ sm->disable_events();
+
+
+ sm->transition("preClose");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("ajarPlus");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("close");
+ ASSERT_EQ(sm->get_state(), "CLOSE");
+
+ sm->transition("preOpen");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("open");
+ ASSERT_EQ(sm->get_state(), "OPEN");
+}
+
+TEST(Door_state_machine_test, test_scenario_2) {
+ const auto sm = new Door_state_machine();
+ sm->disable_events();
+
+
+ sm->transition("preClose");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("close");
+ ASSERT_EQ(sm->get_state(), "CLOSE");
+
+ sm->transition("preOpen");
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->transition("open");
+ ASSERT_EQ(sm->get_state(), "OPEN");
+}
+
+TEST(Door_state_machine_test, test_json_schema) {
+ auto sm = new Door_state_machine();
+ ASSERT_EQ(nlohmann::json::parse(R"({
+ "states": [
+ "AJAR",
+ "CLOSE",
+ "OPEN"
+ ],
+ "startState": "OPEN",
+ "transitions": [
+ {
+ "name": "preOpen",
+ "start": "CLOSE",
+ "end": "AJAR"
+ },
+ {
+ "name": "preClose",
+ "start": "OPEN",
+ "end": "AJAR"
+ },
+ {
+ "name": "open",
+ "start": "AJAR",
+ "end": "OPEN"
+ },
+ {
+ "name": "close",
+ "start": "AJAR",
+ "end": "CLOSE"
+ },
+ {
+ "name": "ajarPlus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "ajarMinus",
+ "start": "AJAR",
+ "end": "AJAR"
+ }
+ ]
+})"), nlohmann::json::parse(sm->to_json_schema()));
+}
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.ClazzTestsGenerateWithInterface.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.ClazzTestsGenerateWithInterface.verified.txt
new file mode 100644
index 0000000..47d878a
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.ClazzTestsGenerateWithInterface.verified.txt
@@ -0,0 +1,114 @@
+#include
+
+#include
+
+
+
+TEST(Door_state_machine_test, test_init) {
+ new Door_state_machine();
+}
+
+
+TEST(Door_state_machine_test, test_scenario_0) {
+ const auto sm = new Door_state_machine();
+ sm->disable_events();
+
+
+ sm->preClose();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->close();
+ ASSERT_EQ(sm->get_state(), "CLOSE");
+
+ sm->preOpen();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->ajarPlus();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->open();
+ ASSERT_EQ(sm->get_state(), "OPEN");
+}
+
+TEST(Door_state_machine_test, test_scenario_1) {
+ const auto sm = new Door_state_machine();
+ sm->disable_events();
+
+
+ sm->preClose();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->ajarPlus();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->close();
+ ASSERT_EQ(sm->get_state(), "CLOSE");
+
+ sm->preOpen();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->open();
+ ASSERT_EQ(sm->get_state(), "OPEN");
+}
+
+TEST(Door_state_machine_test, test_scenario_2) {
+ const auto sm = new Door_state_machine();
+ sm->disable_events();
+
+
+ sm->preClose();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->close();
+ ASSERT_EQ(sm->get_state(), "CLOSE");
+
+ sm->preOpen();
+ ASSERT_EQ(sm->get_state(), "AJAR");
+
+ sm->open();
+ ASSERT_EQ(sm->get_state(), "OPEN");
+}
+
+TEST(Door_state_machine_test, test_json_schema) {
+ auto sm = new Door_state_machine();
+ ASSERT_EQ(nlohmann::json::parse(R"({
+ "states": [
+ "AJAR",
+ "CLOSE",
+ "OPEN"
+ ],
+ "startState": "OPEN",
+ "transitions": [
+ {
+ "name": "preOpen",
+ "start": "CLOSE",
+ "end": "AJAR"
+ },
+ {
+ "name": "preClose",
+ "start": "OPEN",
+ "end": "AJAR"
+ },
+ {
+ "name": "open",
+ "start": "AJAR",
+ "end": "OPEN"
+ },
+ {
+ "name": "close",
+ "start": "AJAR",
+ "end": "CLOSE"
+ },
+ {
+ "name": "ajarPlus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "ajarMinus",
+ "start": "AJAR",
+ "end": "AJAR"
+ }
+ ]
+})"), nlohmann::json::parse(sm->to_json_schema()));
+}
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.ClazzTestsStateContextGenerate.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.ClazzTestsStateContextGenerate.verified.txt
new file mode 100644
index 0000000..8bf2ac3
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.ClazzTestsStateContextGenerate.verified.txt
@@ -0,0 +1,114 @@
+#include
+
+#include
+
+
+
+TEST(Door_state_machine_test, test_init) {
+ new Door_state_machine();
+}
+
+
+TEST(Door_state_machine_test, test_scenario_0) {
+ const auto sm = new Door_state_machine();
+ sm->disable_events();
+
+
+ sm->transition("preClose");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("close");
+ ASSERT_EQ(sm->get_state(), e_Door_states::CLOSE);
+
+ sm->transition("preOpen");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("ajarPlus");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("open");
+ ASSERT_EQ(sm->get_state(), e_Door_states::OPEN);
+}
+
+TEST(Door_state_machine_test, test_scenario_1) {
+ const auto sm = new Door_state_machine();
+ sm->disable_events();
+
+
+ sm->transition("preClose");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("ajarPlus");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("close");
+ ASSERT_EQ(sm->get_state(), e_Door_states::CLOSE);
+
+ sm->transition("preOpen");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("open");
+ ASSERT_EQ(sm->get_state(), e_Door_states::OPEN);
+}
+
+TEST(Door_state_machine_test, test_scenario_2) {
+ const auto sm = new Door_state_machine();
+ sm->disable_events();
+
+
+ sm->transition("preClose");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("close");
+ ASSERT_EQ(sm->get_state(), e_Door_states::CLOSE);
+
+ sm->transition("preOpen");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("open");
+ ASSERT_EQ(sm->get_state(), e_Door_states::OPEN);
+}
+
+TEST(Door_state_machine_test, test_json_schema) {
+ auto sm = new Door_state_machine();
+ ASSERT_EQ(nlohmann::json::parse(R"({
+ "states": [
+ "AJAR",
+ "CLOSE",
+ "OPEN"
+ ],
+ "startState": "OPEN",
+ "transitions": [
+ {
+ "name": "preOpen",
+ "start": "CLOSE",
+ "end": "AJAR"
+ },
+ {
+ "name": "preClose",
+ "start": "OPEN",
+ "end": "AJAR"
+ },
+ {
+ "name": "open",
+ "start": "AJAR",
+ "end": "OPEN"
+ },
+ {
+ "name": "close",
+ "start": "AJAR",
+ "end": "CLOSE"
+ },
+ {
+ "name": "ajarPlus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "ajarMinus",
+ "start": "AJAR",
+ "end": "AJAR"
+ }
+ ]
+})"), nlohmann::json::parse(sm->to_json_schema()));
+}
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.ClazzTestsStateContextGenerateWithInterface.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.ClazzTestsStateContextGenerateWithInterface.verified.txt
new file mode 100644
index 0000000..6da3797
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.ClazzTestsStateContextGenerateWithInterface.verified.txt
@@ -0,0 +1,114 @@
+#include
+
+#include
+
+
+
+TEST(Door_state_machine_test, test_init) {
+ new Door_state_machine();
+}
+
+
+TEST(Door_state_machine_test, test_scenario_0) {
+ const auto sm = new Door_state_machine();
+ sm->disable_events();
+
+
+ sm->preClose();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->close();
+ ASSERT_EQ(sm->get_state(), e_Door_states::CLOSE);
+
+ sm->preOpen();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->ajarPlus();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->open();
+ ASSERT_EQ(sm->get_state(), e_Door_states::OPEN);
+}
+
+TEST(Door_state_machine_test, test_scenario_1) {
+ const auto sm = new Door_state_machine();
+ sm->disable_events();
+
+
+ sm->preClose();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->ajarPlus();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->close();
+ ASSERT_EQ(sm->get_state(), e_Door_states::CLOSE);
+
+ sm->preOpen();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->open();
+ ASSERT_EQ(sm->get_state(), e_Door_states::OPEN);
+}
+
+TEST(Door_state_machine_test, test_scenario_2) {
+ const auto sm = new Door_state_machine();
+ sm->disable_events();
+
+
+ sm->preClose();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->close();
+ ASSERT_EQ(sm->get_state(), e_Door_states::CLOSE);
+
+ sm->preOpen();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->open();
+ ASSERT_EQ(sm->get_state(), e_Door_states::OPEN);
+}
+
+TEST(Door_state_machine_test, test_json_schema) {
+ auto sm = new Door_state_machine();
+ ASSERT_EQ(nlohmann::json::parse(R"({
+ "states": [
+ "AJAR",
+ "CLOSE",
+ "OPEN"
+ ],
+ "startState": "OPEN",
+ "transitions": [
+ {
+ "name": "preOpen",
+ "start": "CLOSE",
+ "end": "AJAR"
+ },
+ {
+ "name": "preClose",
+ "start": "OPEN",
+ "end": "AJAR"
+ },
+ {
+ "name": "open",
+ "start": "AJAR",
+ "end": "OPEN"
+ },
+ {
+ "name": "close",
+ "start": "AJAR",
+ "end": "CLOSE"
+ },
+ {
+ "name": "ajarPlus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "ajarMinus",
+ "start": "AJAR",
+ "end": "AJAR"
+ }
+ ]
+})"), nlohmann::json::parse(sm->to_json_schema()));
+}
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.ClazzTestsStateGenerate.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.ClazzTestsStateGenerate.verified.txt
new file mode 100644
index 0000000..8bf2ac3
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.ClazzTestsStateGenerate.verified.txt
@@ -0,0 +1,114 @@
+#include
+
+#include
+
+
+
+TEST(Door_state_machine_test, test_init) {
+ new Door_state_machine();
+}
+
+
+TEST(Door_state_machine_test, test_scenario_0) {
+ const auto sm = new Door_state_machine();
+ sm->disable_events();
+
+
+ sm->transition("preClose");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("close");
+ ASSERT_EQ(sm->get_state(), e_Door_states::CLOSE);
+
+ sm->transition("preOpen");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("ajarPlus");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("open");
+ ASSERT_EQ(sm->get_state(), e_Door_states::OPEN);
+}
+
+TEST(Door_state_machine_test, test_scenario_1) {
+ const auto sm = new Door_state_machine();
+ sm->disable_events();
+
+
+ sm->transition("preClose");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("ajarPlus");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("close");
+ ASSERT_EQ(sm->get_state(), e_Door_states::CLOSE);
+
+ sm->transition("preOpen");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("open");
+ ASSERT_EQ(sm->get_state(), e_Door_states::OPEN);
+}
+
+TEST(Door_state_machine_test, test_scenario_2) {
+ const auto sm = new Door_state_machine();
+ sm->disable_events();
+
+
+ sm->transition("preClose");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("close");
+ ASSERT_EQ(sm->get_state(), e_Door_states::CLOSE);
+
+ sm->transition("preOpen");
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->transition("open");
+ ASSERT_EQ(sm->get_state(), e_Door_states::OPEN);
+}
+
+TEST(Door_state_machine_test, test_json_schema) {
+ auto sm = new Door_state_machine();
+ ASSERT_EQ(nlohmann::json::parse(R"({
+ "states": [
+ "AJAR",
+ "CLOSE",
+ "OPEN"
+ ],
+ "startState": "OPEN",
+ "transitions": [
+ {
+ "name": "preOpen",
+ "start": "CLOSE",
+ "end": "AJAR"
+ },
+ {
+ "name": "preClose",
+ "start": "OPEN",
+ "end": "AJAR"
+ },
+ {
+ "name": "open",
+ "start": "AJAR",
+ "end": "OPEN"
+ },
+ {
+ "name": "close",
+ "start": "AJAR",
+ "end": "CLOSE"
+ },
+ {
+ "name": "ajarPlus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "ajarMinus",
+ "start": "AJAR",
+ "end": "AJAR"
+ }
+ ]
+})"), nlohmann::json::parse(sm->to_json_schema()));
+}
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.ClazzTestsStateGenerateWithInterface.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.ClazzTestsStateGenerateWithInterface.verified.txt
new file mode 100644
index 0000000..6da3797
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlus/CPlusPlusAdapterGenerateTestsDoorTests.ClazzTestsStateGenerateWithInterface.verified.txt
@@ -0,0 +1,114 @@
+#include
+
+#include
+
+
+
+TEST(Door_state_machine_test, test_init) {
+ new Door_state_machine();
+}
+
+
+TEST(Door_state_machine_test, test_scenario_0) {
+ const auto sm = new Door_state_machine();
+ sm->disable_events();
+
+
+ sm->preClose();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->close();
+ ASSERT_EQ(sm->get_state(), e_Door_states::CLOSE);
+
+ sm->preOpen();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->ajarPlus();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->open();
+ ASSERT_EQ(sm->get_state(), e_Door_states::OPEN);
+}
+
+TEST(Door_state_machine_test, test_scenario_1) {
+ const auto sm = new Door_state_machine();
+ sm->disable_events();
+
+
+ sm->preClose();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->ajarPlus();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->close();
+ ASSERT_EQ(sm->get_state(), e_Door_states::CLOSE);
+
+ sm->preOpen();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->open();
+ ASSERT_EQ(sm->get_state(), e_Door_states::OPEN);
+}
+
+TEST(Door_state_machine_test, test_scenario_2) {
+ const auto sm = new Door_state_machine();
+ sm->disable_events();
+
+
+ sm->preClose();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->close();
+ ASSERT_EQ(sm->get_state(), e_Door_states::CLOSE);
+
+ sm->preOpen();
+ ASSERT_EQ(sm->get_state(), e_Door_states::AJAR);
+
+ sm->open();
+ ASSERT_EQ(sm->get_state(), e_Door_states::OPEN);
+}
+
+TEST(Door_state_machine_test, test_json_schema) {
+ auto sm = new Door_state_machine();
+ ASSERT_EQ(nlohmann::json::parse(R"({
+ "states": [
+ "AJAR",
+ "CLOSE",
+ "OPEN"
+ ],
+ "startState": "OPEN",
+ "transitions": [
+ {
+ "name": "preOpen",
+ "start": "CLOSE",
+ "end": "AJAR"
+ },
+ {
+ "name": "preClose",
+ "start": "OPEN",
+ "end": "AJAR"
+ },
+ {
+ "name": "open",
+ "start": "AJAR",
+ "end": "OPEN"
+ },
+ {
+ "name": "close",
+ "start": "AJAR",
+ "end": "CLOSE"
+ },
+ {
+ "name": "ajarPlus",
+ "start": "AJAR",
+ "end": "AJAR"
+ },
+ {
+ "name": "ajarMinus",
+ "start": "AJAR",
+ "end": "AJAR"
+ }
+ ]
+})"), nlohmann::json::parse(sm->to_json_schema()));
+}
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlusAdapterGenerateDoorTests.cs b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlusAdapterGenerateDoorTests.cs
new file mode 100644
index 0000000..9c80bfb
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CPlusPlusAdapterGenerateDoorTests.cs
@@ -0,0 +1,20 @@
+using Stater.CodeGeneration.Entity;
+using Stater.CodeGeneration.LanguageAdapter.Base;
+using Stater.CodeGeneration.LanguageAdapter.CPlusPlus;
+using Stater.CodeGeneration.LanguageAdapter.CSharp;
+using Stater.CodeGeneration.LanguageAdapter.Java;
+using Stater.CodeGeneration.LanguageAdapter.Kotlin;
+
+namespace Stater.CodeGeneration.Tests.LanguageAdapter;
+
+public class CPlusPlusAdapterGenerateDoorTests : BaseTestAdapterGenerateDoorTests
+{
+ protected override BaseLanguageAdapter Adapter => new CPlusPlusAdapter();
+ protected override Language Language => Language.CPlusPlus;
+}
+
+public class CPlusPlusAdapterGenerateTestsDoorTests : BaseTestAdapterGenerateTestsDoorTests
+{
+ protected override BaseLanguageAdapter Adapter => new CPlusPlusAdapter();
+ protected override Language Language => Language.CPlusPlus;
+}
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CSharp/CShaprAdapterGenerateDoorTests.BuilderContextGenerate.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CSharp/CShaprAdapterGenerateDoorTests.BuilderContextGenerate.verified.txt
new file mode 100644
index 0000000..f3772d1
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CSharp/CShaprAdapterGenerateDoorTests.BuilderContextGenerate.verified.txt
@@ -0,0 +1,30 @@
+namespace fsm.door;
+
+using Stater.StateMachine.Lib;
+
+public class DoorFSMContext : IContext{
+ public int degreeOfOpening = 0;
+ public bool closeVariable = true;
+ public string doorName = "asd";
+ public float floatVariable = 0f;
+}
+
+public class Door {
+ public static StaterStateMachineBuilder BuilderDoorStateMachine = new StaterStateMachineBuilder()
+ .SetStartState("OPEN")
+ .SetContext(new DoorFSMContext())
+ .AddTransition("preOpen", "CLOSE", "AJAR")
+ .SetTransitionEvent("preOpen", ctx => ctx.degreeOfOpening = 1)
+ .AddTransition("preClose", "OPEN", "AJAR")
+ .SetTransitionEvent("preClose", ctx => ctx.degreeOfOpening = 99)
+ .AddTransition("open", "AJAR", "OPEN")
+ .SetTransitionCondition("open", ctx => ctx.degreeOfOpening >= 0)
+ .SetTransitionEvent("open", ctx => ctx.degreeOfOpening = 100)
+ .AddTransition("close", "AJAR", "CLOSE")
+ .SetTransitionCondition("close", ctx => ctx.degreeOfOpening <= 0)
+ .SetTransitionEvent("close", ctx => ctx.degreeOfOpening = 0)
+ .AddTransition("ajarPlus", "AJAR", "AJAR")
+ .SetTransitionEvent("ajarPlus", ctx => ctx.degreeOfOpening = ctx.degreeOfOpening + 1)
+ .AddTransition("ajarMinus", "AJAR", "AJAR")
+ .SetTransitionEvent("ajarMinus", ctx => ctx.degreeOfOpening = ctx.degreeOfOpening - 1);
+}
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CSharp/CShaprAdapterGenerateDoorTests.BuilderContextGenerateWithInterface.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CSharp/CShaprAdapterGenerateDoorTests.BuilderContextGenerateWithInterface.verified.txt
new file mode 100644
index 0000000..e5fc93c
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CSharp/CShaprAdapterGenerateDoorTests.BuilderContextGenerateWithInterface.verified.txt
@@ -0,0 +1,114 @@
+namespace fsm.door;
+
+using Stater.StateMachine.Lib;
+
+public class DoorFSMContext : IContext{
+ public int degreeOfOpening = 0;
+ public bool closeVariable = true;
+ public string doorName = "asd";
+ public float floatVariable = 0f;
+}
+
+public class Door {
+ public class TypesDoorStateMachine(
+ List> transitions,
+ DoorFSMContext context,
+ String startState,
+ HashSet states,
+ Dictionary>> transitionMiddlewares,
+ List> transitionAllMiddlewares,
+ Dictionary>> transitionCallbacks,
+ List> transitionAllCallbacks,
+ Dictionary>> stateCallbacks,
+ List> stateAllCallbacks,
+ IContextJsonAdapter contextJsonAdapter
+ ) : StaterStateMachine(
+ transitions,
+ context,
+ startState,
+ states,
+ transitionMiddlewares,
+ transitionAllMiddlewares,
+ transitionCallbacks,
+ transitionAllCallbacks,
+ stateCallbacks,
+ stateAllCallbacks,
+ contextJsonAdapter
+ )
+ {
+ public void preOpen()
+ {
+ Transition("preOpen");
+ }
+
+ public void preClose()
+ {
+ Transition("preClose");
+ }
+
+ public void open()
+ {
+ Transition("open");
+ }
+
+ public void close()
+ {
+ Transition("close");
+ }
+
+ public void ajarPlus()
+ {
+ Transition("ajarPlus");
+ }
+
+ public void ajarMinus()
+ {
+ Transition("ajarMinus");
+ }
+ }
+ private static StateMachineFactory TypedDoorFactory = (
+ transitionsA,
+ contextA,
+ startStateA,
+ statesA,
+ transitionMiddlewaresA,
+ transitionAllMiddlewaresA,
+ transitionCallbacksA,
+ transitionAllCallbacksA,
+ stateCallbacksA,
+ stateAllCallbacksA,
+ contextJsonAdapterA
+ ) => new TypesDoorStateMachine(
+ transitionsA,
+ contextA,
+ startStateA,
+ statesA,
+ transitionMiddlewaresA,
+ transitionAllMiddlewaresA,
+ transitionCallbacksA,
+ transitionAllCallbacksA,
+ stateCallbacksA,
+ stateAllCallbacksA,
+ contextJsonAdapterA
+ );
+
+
+ public static StaterStateMachineBuilder BuilderDoorStateMachine = new StaterStateMachineBuilder()
+ .SetStartState("OPEN")
+ .SetContext(new DoorFSMContext())
+ .SetFactory(TypedDoorFactory)
+ .AddTransition("preOpen", "CLOSE", "AJAR")
+ .SetTransitionEvent("preOpen", ctx => ctx.degreeOfOpening = 1)
+ .AddTransition("preClose", "OPEN", "AJAR")
+ .SetTransitionEvent("preClose", ctx => ctx.degreeOfOpening = 99)
+ .AddTransition("open", "AJAR", "OPEN")
+ .SetTransitionCondition("open", ctx => ctx.degreeOfOpening >= 0)
+ .SetTransitionEvent("open", ctx => ctx.degreeOfOpening = 100)
+ .AddTransition("close", "AJAR", "CLOSE")
+ .SetTransitionCondition("close", ctx => ctx.degreeOfOpening <= 0)
+ .SetTransitionEvent("close", ctx => ctx.degreeOfOpening = 0)
+ .AddTransition("ajarPlus", "AJAR", "AJAR")
+ .SetTransitionEvent("ajarPlus", ctx => ctx.degreeOfOpening = ctx.degreeOfOpening + 1)
+ .AddTransition("ajarMinus", "AJAR", "AJAR")
+ .SetTransitionEvent("ajarMinus", ctx => ctx.degreeOfOpening = ctx.degreeOfOpening - 1);
+}
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CSharp/CShaprAdapterGenerateDoorTests.BuilderGenerate.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CSharp/CShaprAdapterGenerateDoorTests.BuilderGenerate.verified.txt
new file mode 100644
index 0000000..f654445
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CSharp/CShaprAdapterGenerateDoorTests.BuilderGenerate.verified.txt
@@ -0,0 +1,15 @@
+namespace fsm.door;
+
+using Stater.StateMachine.Lib;
+
+public class Door {
+ public static StaterStateMachineBuilder BuilderDoorStateMachine = new StaterStateMachineBuilder()
+ .SetStartState("OPEN")
+ .SetContext(new EmptyContext())
+ .AddTransition("preOpen", "CLOSE", "AJAR")
+ .AddTransition("preClose", "OPEN", "AJAR")
+ .AddTransition("open", "AJAR", "OPEN")
+ .AddTransition("close", "AJAR", "CLOSE")
+ .AddTransition("ajarPlus", "AJAR", "AJAR")
+ .AddTransition("ajarMinus", "AJAR", "AJAR");
+}
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CSharp/CShaprAdapterGenerateDoorTests.BuilderGenerateWithInterface.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CSharp/CShaprAdapterGenerateDoorTests.BuilderGenerateWithInterface.verified.txt
new file mode 100644
index 0000000..9452f85
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CSharp/CShaprAdapterGenerateDoorTests.BuilderGenerateWithInterface.verified.txt
@@ -0,0 +1,99 @@
+namespace fsm.door;
+
+using Stater.StateMachine.Lib;
+
+public class Door {
+ public class TypesDoorStateMachine(
+ List> transitions,
+ EmptyContext context,
+ String startState,
+ HashSet states,
+ Dictionary>> transitionMiddlewares,
+ List> transitionAllMiddlewares,
+ Dictionary>> transitionCallbacks,
+ List> transitionAllCallbacks,
+ Dictionary>> stateCallbacks,
+ List> stateAllCallbacks,
+ IContextJsonAdapter contextJsonAdapter
+ ) : StaterStateMachine(
+ transitions,
+ context,
+ startState,
+ states,
+ transitionMiddlewares,
+ transitionAllMiddlewares,
+ transitionCallbacks,
+ transitionAllCallbacks,
+ stateCallbacks,
+ stateAllCallbacks,
+ contextJsonAdapter
+ )
+ {
+ public void preOpen()
+ {
+ Transition("preOpen");
+ }
+
+ public void preClose()
+ {
+ Transition("preClose");
+ }
+
+ public void open()
+ {
+ Transition("open");
+ }
+
+ public void close()
+ {
+ Transition("close");
+ }
+
+ public void ajarPlus()
+ {
+ Transition("ajarPlus");
+ }
+
+ public void ajarMinus()
+ {
+ Transition("ajarMinus");
+ }
+ }
+ private static StateMachineFactory TypedDoorFactory = (
+ transitionsA,
+ contextA,
+ startStateA,
+ statesA,
+ transitionMiddlewaresA,
+ transitionAllMiddlewaresA,
+ transitionCallbacksA,
+ transitionAllCallbacksA,
+ stateCallbacksA,
+ stateAllCallbacksA,
+ contextJsonAdapterA
+ ) => new TypesDoorStateMachine(
+ transitionsA,
+ contextA,
+ startStateA,
+ statesA,
+ transitionMiddlewaresA,
+ transitionAllMiddlewaresA,
+ transitionCallbacksA,
+ transitionAllCallbacksA,
+ stateCallbacksA,
+ stateAllCallbacksA,
+ contextJsonAdapterA
+ );
+
+
+ public static StaterStateMachineBuilder BuilderDoorStateMachine = new StaterStateMachineBuilder()
+ .SetStartState("OPEN")
+ .SetContext(new EmptyContext())
+ .SetFactory(TypedDoorFactory)
+ .AddTransition("preOpen", "CLOSE", "AJAR")
+ .AddTransition("preClose", "OPEN", "AJAR")
+ .AddTransition("open", "AJAR", "OPEN")
+ .AddTransition("close", "AJAR", "CLOSE")
+ .AddTransition("ajarPlus", "AJAR", "AJAR")
+ .AddTransition("ajarMinus", "AJAR", "AJAR");
+}
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CSharp/CShaprAdapterGenerateDoorTests.BuilderStateContextGenerate.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CSharp/CShaprAdapterGenerateDoorTests.BuilderStateContextGenerate.verified.txt
new file mode 100644
index 0000000..ff7b863
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CSharp/CShaprAdapterGenerateDoorTests.BuilderStateContextGenerate.verified.txt
@@ -0,0 +1,36 @@
+namespace fsm.door;
+
+using Stater.StateMachine.Lib;
+
+public enum States {
+ OPEN,
+ AJAR,
+ CLOSE
+}
+
+public class DoorFSMContext : IContext{
+ public int degreeOfOpening = 0;
+ public bool closeVariable = true;
+ public string doorName = "asd";
+ public float floatVariable = 0f;
+}
+
+public class Door {
+ public static StaterStateMachineBuilder BuilderDoorStateMachine = new StaterStateMachineBuilder()
+ .SetStartState(States.OPEN)
+ .SetContext(new DoorFSMContext())
+ .AddTransition("preOpen", States.CLOSE, States.AJAR)
+ .SetTransitionEvent("preOpen", ctx => ctx.degreeOfOpening = 1)
+ .AddTransition("preClose", States.OPEN, States.AJAR)
+ .SetTransitionEvent("preClose", ctx => ctx.degreeOfOpening = 99)
+ .AddTransition("open", States.AJAR, States.OPEN)
+ .SetTransitionCondition("open", ctx => ctx.degreeOfOpening >= 0)
+ .SetTransitionEvent("open", ctx => ctx.degreeOfOpening = 100)
+ .AddTransition("close", States.AJAR, States.CLOSE)
+ .SetTransitionCondition("close", ctx => ctx.degreeOfOpening <= 0)
+ .SetTransitionEvent("close", ctx => ctx.degreeOfOpening = 0)
+ .AddTransition("ajarPlus", States.AJAR, States.AJAR)
+ .SetTransitionEvent("ajarPlus", ctx => ctx.degreeOfOpening = ctx.degreeOfOpening + 1)
+ .AddTransition("ajarMinus", States.AJAR, States.AJAR)
+ .SetTransitionEvent("ajarMinus", ctx => ctx.degreeOfOpening = ctx.degreeOfOpening - 1);
+}
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CSharp/CShaprAdapterGenerateDoorTests.BuilderStateContextGenerateWithInterface.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CSharp/CShaprAdapterGenerateDoorTests.BuilderStateContextGenerateWithInterface.verified.txt
new file mode 100644
index 0000000..e3e9312
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CSharp/CShaprAdapterGenerateDoorTests.BuilderStateContextGenerateWithInterface.verified.txt
@@ -0,0 +1,120 @@
+namespace fsm.door;
+
+using Stater.StateMachine.Lib;
+
+public enum States {
+ OPEN,
+ AJAR,
+ CLOSE
+}
+
+public class DoorFSMContext : IContext{
+ public int degreeOfOpening = 0;
+ public bool closeVariable = true;
+ public string doorName = "asd";
+ public float floatVariable = 0f;
+}
+
+public class Door {
+ public class TypesDoorStateMachine(
+ List> transitions,
+ DoorFSMContext context,
+ States startState,
+ HashSet states,
+ Dictionary>> transitionMiddlewares,
+ List> transitionAllMiddlewares,
+ Dictionary>> transitionCallbacks,
+ List> transitionAllCallbacks,
+ Dictionary>> stateCallbacks,
+ List> stateAllCallbacks,
+ IContextJsonAdapter contextJsonAdapter
+ ) : StaterStateMachine(
+ transitions,
+ context,
+ startState,
+ states,
+ transitionMiddlewares,
+ transitionAllMiddlewares,
+ transitionCallbacks,
+ transitionAllCallbacks,
+ stateCallbacks,
+ stateAllCallbacks,
+ contextJsonAdapter
+ )
+ {
+ public void preOpen()
+ {
+ Transition("preOpen");
+ }
+
+ public void preClose()
+ {
+ Transition("preClose");
+ }
+
+ public void open()
+ {
+ Transition("open");
+ }
+
+ public void close()
+ {
+ Transition("close");
+ }
+
+ public void ajarPlus()
+ {
+ Transition("ajarPlus");
+ }
+
+ public void ajarMinus()
+ {
+ Transition("ajarMinus");
+ }
+ }
+ private static StateMachineFactory TypedDoorFactory = (
+ transitionsA,
+ contextA,
+ startStateA,
+ statesA,
+ transitionMiddlewaresA,
+ transitionAllMiddlewaresA,
+ transitionCallbacksA,
+ transitionAllCallbacksA,
+ stateCallbacksA,
+ stateAllCallbacksA,
+ contextJsonAdapterA
+ ) => new TypesDoorStateMachine(
+ transitionsA,
+ contextA,
+ startStateA,
+ statesA,
+ transitionMiddlewaresA,
+ transitionAllMiddlewaresA,
+ transitionCallbacksA,
+ transitionAllCallbacksA,
+ stateCallbacksA,
+ stateAllCallbacksA,
+ contextJsonAdapterA
+ );
+
+
+ public static StaterStateMachineBuilder BuilderDoorStateMachine = new StaterStateMachineBuilder()
+ .SetStartState(States.OPEN)
+ .SetContext(new DoorFSMContext())
+ .SetFactory(TypedDoorFactory)
+ .AddTransition("preOpen", States.CLOSE, States.AJAR)
+ .SetTransitionEvent("preOpen", ctx => ctx.degreeOfOpening = 1)
+ .AddTransition("preClose", States.OPEN, States.AJAR)
+ .SetTransitionEvent("preClose", ctx => ctx.degreeOfOpening = 99)
+ .AddTransition("open", States.AJAR, States.OPEN)
+ .SetTransitionCondition("open", ctx => ctx.degreeOfOpening >= 0)
+ .SetTransitionEvent("open", ctx => ctx.degreeOfOpening = 100)
+ .AddTransition("close", States.AJAR, States.CLOSE)
+ .SetTransitionCondition("close", ctx => ctx.degreeOfOpening <= 0)
+ .SetTransitionEvent("close", ctx => ctx.degreeOfOpening = 0)
+ .AddTransition("ajarPlus", States.AJAR, States.AJAR)
+ .SetTransitionEvent("ajarPlus", ctx => ctx.degreeOfOpening = ctx.degreeOfOpening + 1)
+ .AddTransition("ajarMinus", States.AJAR, States.AJAR)
+ .SetTransitionEvent("ajarMinus", ctx => ctx.degreeOfOpening = ctx.degreeOfOpening - 1);
+}
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CSharp/CShaprAdapterGenerateDoorTests.BuilderStateGenerate.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CSharp/CShaprAdapterGenerateDoorTests.BuilderStateGenerate.verified.txt
new file mode 100644
index 0000000..2ce669b
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CSharp/CShaprAdapterGenerateDoorTests.BuilderStateGenerate.verified.txt
@@ -0,0 +1,21 @@
+namespace fsm.door;
+
+using Stater.StateMachine.Lib;
+
+public enum States {
+ OPEN,
+ AJAR,
+ CLOSE
+}
+
+public class Door {
+ public static StaterStateMachineBuilder BuilderDoorStateMachine = new StaterStateMachineBuilder()
+ .SetStartState(States.OPEN)
+ .SetContext(new EmptyContext())
+ .AddTransition("preOpen", States.CLOSE, States.AJAR)
+ .AddTransition("preClose", States.OPEN, States.AJAR)
+ .AddTransition("open", States.AJAR, States.OPEN)
+ .AddTransition("close", States.AJAR, States.CLOSE)
+ .AddTransition("ajarPlus", States.AJAR, States.AJAR)
+ .AddTransition("ajarMinus", States.AJAR, States.AJAR);
+}
\ No newline at end of file
diff --git a/src/Stater.CodeGeneration.Tests/LanguageAdapter/CSharp/CShaprAdapterGenerateDoorTests.BuilderStateGenerateWithInterface.verified.txt b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CSharp/CShaprAdapterGenerateDoorTests.BuilderStateGenerateWithInterface.verified.txt
new file mode 100644
index 0000000..cba52d6
--- /dev/null
+++ b/src/Stater.CodeGeneration.Tests/LanguageAdapter/CSharp/CShaprAdapterGenerateDoorTests.BuilderStateGenerateWithInterface.verified.txt
@@ -0,0 +1,105 @@
+namespace fsm.door;
+
+using Stater.StateMachine.Lib;
+
+public enum States {
+ OPEN,
+ AJAR,
+ CLOSE
+}
+
+public class Door {
+ public class TypesDoorStateMachine(
+ List> transitions,
+ EmptyContext context,
+ States startState,
+ HashSet states,
+ Dictionary>> transitionMiddlewares,
+ List> transitionAllMiddlewares,
+ Dictionary>> transitionCallbacks,
+ List> transitionAllCallbacks,
+ Dictionary>> stateCallbacks,
+ List> stateAllCallbacks,
+ IContextJsonAdapter contextJsonAdapter
+ ) : StaterStateMachine