テストカバレッジ

ForgeIECは包括的な自動テストスイートによって保護されています。 各コミットはマージ前に117のユニットテストで検証されます。これらのテストは IEC 61131-3 Structured Textの完全な言語仕様、全標準ファンクションブロック、 およびマルチタスクシステムをカバーしています。

テストスイートの概要

スイートテスト数検証内容
FStCompilerTest101完全なST言語仕様
FStLibraryTest8全132標準ブロック(FB + FC)
FCodeGeneratorThreadingTest8マルチタスクスケジューリング + ロックフリー同期
合計117エラー0件

1. ST言語仕様(FStCompilerTest)

101のテストが、サポートされている全てのIEC 61131-3 Structured Text 言語構造を検証します。各テストはSTフラグメントをFStCompilerでコンパイルし、 生成されたC++コードを検証します。

1.1 代入

テストSTコード検証内容
assignSimplea := 42;単純代入
assignExpressiona := b + 1;式による代入
assignExternalExtVar := 10;VAR_EXTERNALアクセス
assignGvlQualifiedGVL.ExtVar := 5;修飾GVLパス

1.2 算術演算子

テストSTコードC演算子
arithmeticAdda := b + 1;+
arithmeticSuba := b - 1;-
arithmeticMula := b * 2;*
arithmeticDiva := b / 2;/
arithmeticModa := b MOD 3;%
arithmeticPowerc := x ** 2.0;EXPT()
arithmeticNegatea := -b;-(...)
arithmeticParenthesesa := (b + 1) * 2;括弧

1.3 比較演算子

テストSTコードC演算子
compareEqualflag := a = b;==
compareNotEqualflag := a <> b;!=
compareLessflag := a < b;<
compareGreaterflag := a > b;>
compareLessEqualflag := a <= b;<=
compareGreaterEqualflag := a >= b;>=

1.4 ブール演算子

テストSTコードC演算子
boolAndflag := flag AND flag;&&
boolOrflag := flag OR flag;||
boolXorflag := flag XOR flag;^
boolNotflag := NOT flag;!

1.5 リテラル

テストSTコード検証内容
literalIntegera := 12345;整数
literalRealc := 3.14;浮動小数点
literalBoolTrueflag := TRUE;ブール値
literalBoolFalseflag := FALSE;ブール値
literalStringtext := 'hello';文字列
literalTimecounter := T#500ms;時間定数

1.6 制御構造

IF / ELSIF / ELSE / END_IF

テスト検証内容
ifSimple単純条件
ifElseIf-Else分岐
ifElsifELSIFによる多重分岐
ifNestedネストされたIFブロック

FOR / WHILE / REPEAT

テスト検証内容
forSimpleFOR idx := 0 TO 10 DO
forWithByBYステップ幅付きFOR
whileLoopWHILEループ
repeatUntilREPEAT/UNTILループ

CASE

テスト検証内容
caseStatement複数ラベル付きCASE/OF + switch/case/break

RETURN / EXIT

テスト検証内容
returnStatementRETURN → goto __end
exitStatementFOR内のEXIT → break

1.7 ファンクションブロック(FB呼び出し)

テスト検証内容
fbCallWithInputsMyTon(IN := flag, PT := T#500ms);
fbCallWithOutputAssignMyTimer(IN := flag, Q => flag); — OUT =>代入

1.8 配列アクセス

テスト検証内容
arrayReadSubscripta := arr[3];
arrayWriteSubscriptarr[5] := 42;
arrayComputedIndexa := arr[idx + 1];
arrayInForLoopFORループ内での配列アクセス

1.9 型変換

コンパイラはXXX_TO_YYYパターンを認識し、IEC規格に準拠した Cスタイルキャスト((TYPE)value)を生成します。

テストSTコード生成結果
typeConvIntToRealINT_TO_REAL(a)(REAL)a
convRealToIntREAL_TO_INT(c)(INT)c
convBoolToIntBOOL_TO_INT(flag)(INT)flag
convIntToBoolINT_TO_BOOL(a)(BOOL)a
convDintToRealDINT_TO_REAL(counter)(REAL)counter
convIntToDintINT_TO_DINT(a)(DINT)a

1.10 構造体メンバアクセス

テスト検証内容
structMemberAccesspos.x := 42;data__->pos.value.x

1.11 タスク間変数(マルチタスク)

テスト検証内容
crossPrimitiveGet__GET_EXTERNAL_ATOMIC ロックフリー読み取り用
crossPrimitiveSet__SET_EXTERNAL_ATOMIC ロックフリー書き込み用
crossStructuredGet__snap_ スレッドローカルスナップショットアクセス
crossStructuredMemberAccess__snap_Struct.field アクセス

1.12 標準ファンクションブロック

各IEC標準FBはインスタンスとして生成され、呼び出されます:

テストFB型検証内容
fbTonTONオンディレイ
fbTofTOFオフディレイ
fbTpTPパルスタイマー
fbCtuCTUアップカウンタ
fbCtdCTDダウンカウンタ
fbRtrigR_TRIG立ち上がりエッジ
fbFtrigF_TRIG立ち下がりエッジ
fbRsRSリセット優先
fbSrSRセット優先

1.13 標準関数

カテゴリテスト数関数
数学12ABS, SQRT, SIN, COS, TAN, ASIN, ACOS, ATAN, EXP, LN, LOG, TRUNC
選択4SEL, LIMIT, MIN, MAX
文字列6LEN, LEFT, RIGHT, MID, CONCAT, FIND
ビットシフト4SHL, SHR, ROL, ROR
型変換6INT_TO_REAL, REAL_TO_INT, BOOL_TO_INT, …

1.14 エッジケース

テスト検証内容
complexNestedExpressionネストされた式
multipleStatementsOnSeparateLines複数行プログラム
emptyBody空のPOUボディ
commentOnlyBodyコメントのみ
caseInsensitiveKeywordsIF/if/If
caseInsensitiveVariables大文字・小文字の区別

2. 標準ライブラリ(FStLibraryTest)

8つのデータ駆動テストが標準ライブラリ(standard_library.sql)の 全132ブロックを自動的に検証します。

2.1 ファンクションブロック(13 FB)

テスト検証内容
fbSingleInstance各FBが個別にインスタンス化・呼び出し可能
fbDoubleInstance同一FB型の2インスタンスが同時使用可能
fbOutputRead呼び出し後に全出力が読み取り可能

対象FB: SR, RS, R_TRIG, F_TRIG, CTU, CTD, CTUD, TON, TOF, TP, RTC, SEMA, RampGen

2.2 関数(119 FC)

テスト検証内容
fcCall各FCが正しいパラメータで呼び出し可能(104テスト済み)
fcInExpressionFC戻り値が式中で使用可能

対象カテゴリ:

  • 算術: ADD, SUB, MUL, DIV, MOD, EXPT, ABS
  • 比較: EQ, NE, LT, GT, LE, GE
  • 三角関数: SIN, COS, TAN, ASIN, ACOS, ATAN, ATAN2
  • 対数: EXP, LN, LOG, SQRT
  • 選択: SEL, MUX, LIMIT, MIN, MAX, MOVE, CLAMP
  • 文字列: LEN, LEFT, RIGHT, MID, CONCAT, INSERT, DELETE, REPLACE, FIND
  • ビットシフト: SHL, SHR, ROL, ROR
  • 型変換: 60以上の変換関数(BOOL_TO_INT, INT_TO_REAL, …)
  • ForgeIEC拡張: LERP, MAP_RANGE, HYPOT, DEG, RAD, IK_2Link, CABS, CADD, CMUL, CSUB, CARG, CCONJ, CPOLAR, CRECT

3. マルチタスク(FCodeGeneratorThreadingTest)

8つのテストが設計仕様(MT-spec, docs/design/multi-task-scheduler.md)に従い、 完全なマルチタスクスケジューリングシステムを検証します。

テスト検証内容
singleProgramDefaultTask明示的タスクなしの1つのPROGRAM → DefaultTask合成、スレッドなし
twoProgramsTwoTasks2タスク → RESOURCE0_start__、Legacy-Shim config_run__、両方のタスクスレッド
crossPrimitiveAtomicEmission共有INT変数 → std::atomic<> Locationストレージ、ボディ内の__GET_EXTERNAL_ATOMIC
crossStructuredDoubleBuffer共有STRUCT → __DBUF_[2] + thread_local __snap_ + ダブルバッファのコピーイン/アウト
localVarNoSync1タスクのみの変数 → 通常の__SET_EXTERNAL、Atomicなし
conflictTwoWriters2タスクが同一変数に書き込み → コンパイル警告
singleProgramDefaultTask後方互換性:既存プロジェクトが変更なしで動作

マルチタスクアーキテクチャ

Primary Task (Task 0)          Secondary Tasks (1..N)
    |                               |
    | config_run__()                | RESOURCE0_task_thread__()
    |   ├─ sync_in                  |   ├─ dbuf_rd (copy-in)
    |   ├─ TASK0_body__()           |   ├─ TASKn_body__()
    |   └─ sync_out                 |   └─ dbuf_wr (copy-out)
    |                               |
    | [bufferLock下]                | [lock-free]

同期メカニズム:

  • CrossPrimitive(BOOL, INT, REAL, …):Location変数上のstd::atomic<T>、ボディコード内の__GET_EXTERNAL_ATOMIC / __SET_EXTERNAL_ATOMIC
  • CrossStructured(STRUCT, ARRAY, STRING):アトミック書き込みインデックス付きダブルバッファ__DBUF_[2]、Set一貫性のためのthread_localスナップショット__snap_

品質保証

自動検証

テストは-DBUILD_TESTS=ONで毎回のビルド時に実行されます。 CIパイプライン(Forgejo Actions)への統合は準備済みです。

データ駆動テスト

ライブラリテスト(FStLibraryTest)はブロック定義を standard_library.sqlから直接読み取ります。新しいブロックが追加されると 自動的にテストされます。手動でのテストケース作成は不要です。

完全性

テストスイートは、ForgeIECがサポートするIEC 61131-3 Structured Textの 完全な言語仕様をカバーしています:

  • 全演算子(算術、比較、ブール、ビットシフト)
  • 全制御構造(IF, FOR, WHILE, REPEAT, CASE)
  • 全リテラル型(Integer, Real, Bool, String, Time)
  • 全標準FBおよびFC(132ブロック)
  • 配列および構造体アクセス
  • GVL修飾変数
  • タスク間同期(Atomics + ダブルバッファ)
  • 型変換(Cキャスト生成)