Cobertura de pruebas

ForgeIEC esta protegido por un conjunto completo de pruebas automatizadas. Cada commit se verifica antes del merge con 117 pruebas unitarias que cubren el vocabulario completo de IEC 61131-3 Structured Text, todos los bloques funcionales estandar y el sistema de multi-tarea.

Resumen de las suites de pruebas

SuitePruebasVerifica
FStCompilerTest101Vocabulario ST completo
FStLibraryTest8Los 132 bloques estandar (FBs + FCs)
FCodeGeneratorThreadingTest8Planificacion multi-tarea + sincronizacion lock-free
Total1170 errores

1. Vocabulario ST (FStCompilerTest)

101 pruebas verifican cada construccion del lenguaje IEC 61131-3 Structured Text soportada. Cada prueba compila un fragmento ST mediante el FStCompiler y verifica el codigo C++ generado.

1.1 Asignaciones

PruebaCodigo STVerifica
assignSimplea := 42;Asignacion simple
assignExpressiona := b + 1;Asignacion con expresion
assignExternalExtVar := 10;Acceso VAR_EXTERNAL
assignGvlQualifiedGVL.ExtVar := 5;Ruta GVL cualificada

1.2 Operadores aritmeticos

PruebaCodigo STOperador 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;Parentesis

1.3 Operadores de comparacion

PruebaCodigo STOperador C
compareEqualflag := a = b;==
compareNotEqualflag := a <> b;!=
compareLessflag := a < b;<
compareGreaterflag := a > b;>
compareLessEqualflag := a <= b;<=
compareGreaterEqualflag := a >= b;>=

1.4 Operadores booleanos

PruebaCodigo STOperador C
boolAndflag := flag AND flag;&&
boolOrflag := flag OR flag;||
boolXorflag := flag XOR flag;^
boolNotflag := NOT flag;!

1.5 Literales

PruebaCodigo STVerifica
literalIntegera := 12345;Entero
literalRealc := 3.14;Punto flotante
literalBoolTrueflag := TRUE;Valor booleano
literalBoolFalseflag := FALSE;Valor booleano
literalStringtext := 'hello';Cadena de caracteres
literalTimecounter := T#500ms;Constante de tiempo

1.6 Estructuras de control

IF / ELSIF / ELSE / END_IF

PruebaVerifica
ifSimpleCondicion simple
ifElseBifurcacion If-Else
ifElsifBifurcacion multiple con ELSIF
ifNestedBloques IF anidados

FOR / WHILE / REPEAT

PruebaVerifica
forSimpleFOR idx := 0 TO 10 DO
forWithByFOR con paso BY
whileLoopBucle WHILE
repeatUntilBucle REPEAT/UNTIL

CASE

PruebaVerifica
caseStatementCASE/OF con multiples labels + switch/case/break

RETURN / EXIT

PruebaVerifica
returnStatementRETURN → goto __end
exitStatementEXIT dentro de FOR → break

1.7 Bloques funcionales (llamadas FB)

PruebaVerifica
fbCallWithInputsMyTon(IN := flag, PT := T#500ms);
fbCallWithOutputAssignMyTimer(IN := flag, Q => flag); — asignacion OUT =>

1.8 Acceso a arrays

PruebaVerifica
arrayReadSubscripta := arr[3];
arrayWriteSubscriptarr[5] := 42;
arrayComputedIndexa := arr[idx + 1];
arrayInForLoopAcceso a array en bucle FOR

1.9 Conversiones de tipo

El compilador reconoce el patron XXX_TO_YYY y genera casts de estilo C ((TYPE)value), conforme a la norma IEC.

PruebaCodigo STGenera
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 Acceso a miembros de estructura

PruebaVerifica
structMemberAccesspos.x := 42;data__->pos.value.x

1.11 Variables inter-tareas (multi-tarea)

PruebaVerifica
crossPrimitiveGet__GET_EXTERNAL_ATOMIC para lectura lock-free
crossPrimitiveSet__SET_EXTERNAL_ATOMIC para escritura lock-free
crossStructuredGet__snap_ acceso snapshot thread-local
crossStructuredMemberAccess__snap_Struct.field acceso

1.12 Bloques funcionales estandar

Cada FB estandar IEC se instancia y se invoca:

PruebaTipo FBVerifica
fbTonTONRetardo al conectar
fbTofTOFRetardo al desconectar
fbTpTPTimer de impulso
fbCtuCTUContador ascendente
fbCtdCTDContador descendente
fbRtrigR_TRIGFlanco ascendente
fbFtrigF_TRIGFlanco descendente
fbRsRSReset-dominante
fbSrSRSet-dominante

1.13 Funciones estandar

CategoriaPruebasFunciones
Matematicas12ABS, SQRT, SIN, COS, TAN, ASIN, ACOS, ATAN, EXP, LN, LOG, TRUNC
Seleccion4SEL, LIMIT, MIN, MAX
Cadenas6LEN, LEFT, RIGHT, MID, CONCAT, FIND
Desplazamiento de bits4SHL, SHR, ROL, ROR
Conversion de tipo6INT_TO_REAL, REAL_TO_INT, BOOL_TO_INT, …

1.14 Casos limite

PruebaVerifica
complexNestedExpressionExpresiones anidadas
multipleStatementsOnSeparateLinesProgramas multilinea
emptyBodyCuerpo POU vacio
commentOnlyBodySolo comentarios
caseInsensitiveKeywordsIF/if/If
caseInsensitiveVariablesMayusculas/minusculas

2. Biblioteca estandar (FStLibraryTest)

8 pruebas basadas en datos verifican los 132 bloques de la biblioteca estandar (standard_library.sql) automaticamente.

2.1 Bloques funcionales (13 FBs)

PruebaVerifica
fbSingleInstanceCada FB instanciable e invocable individualmente
fbDoubleInstanceDos instancias del mismo tipo FB simultaneamente
fbOutputReadTodas las salidas legibles tras la invocacion

FBs cubiertos: SR, RS, R_TRIG, F_TRIG, CTU, CTD, CTUD, TON, TOF, TP, RTC, SEMA, RampGen

2.2 Funciones (119 FCs)

PruebaVerifica
fcCallCada FC invocable con los parametros correctos (104 probadas)
fcInExpressionValor de retorno FC utilizable en expresiones

Categorias cubiertas:

  • Aritmetica: ADD, SUB, MUL, DIV, MOD, EXPT, ABS
  • Comparacion: EQ, NE, LT, GT, LE, GE
  • Trigonometria: SIN, COS, TAN, ASIN, ACOS, ATAN, ATAN2
  • Logaritmo: EXP, LN, LOG, SQRT
  • Seleccion: SEL, MUX, LIMIT, MIN, MAX, MOVE, CLAMP
  • Cadenas: LEN, LEFT, RIGHT, MID, CONCAT, INSERT, DELETE, REPLACE, FIND
  • Desplazamiento de bits: SHL, SHR, ROL, ROR
  • Conversion de tipo: 60+ funciones de conversion (BOOL_TO_INT, INT_TO_REAL, …)
  • Extensiones ForgeIEC: LERP, MAP_RANGE, HYPOT, DEG, RAD, IK_2Link, CABS, CADD, CMUL, CSUB, CARG, CCONJ, CPOLAR, CRECT

3. Multi-tarea (FCodeGeneratorThreadingTest)

8 pruebas verifican el sistema completo de planificacion multi-tarea segun la especificacion de diseno (MT-spec, docs/design/multi-task-scheduler.md).

PruebaVerifica
singleProgramDefaultTaskUn PROGRAM sin tarea explicita → sintesis DefaultTask, sin threading
twoProgramsTwoTasksDos tareas → RESOURCE0_start__, Legacy-Shim config_run__, ambos hilos de tarea
crossPrimitiveAtomicEmissionVariable INT compartida → almacenamiento Location std::atomic<>, __GET_EXTERNAL_ATOMIC en el cuerpo
crossStructuredDoubleBufferSTRUCT compartido → __DBUF_[2] + thread_local __snap_ + copia Double-Buffer entrada/salida
localVarNoSyncVariable solo en una tarea → __SET_EXTERNAL normal, sin Atomic
conflictTwoWritersDos tareas escriben la misma variable → advertencia de compilacion
singleProgramDefaultTaskRetrocompatibilidad: los proyectos existentes funcionan sin cambios

Arquitectura multi-tarea

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)
    |                               |
    | [bajo bufferLock]             | [lock-free]

Mecanismos de sincronizacion:

  • CrossPrimitive (BOOL, INT, REAL, …): std::atomic<T> en la variable Location, __GET_EXTERNAL_ATOMIC / __SET_EXTERNAL_ATOMIC en el codigo del cuerpo
  • CrossStructured (STRUCT, ARRAY, STRING): Double-Buffer __DBUF_[2] con indice de escritura atomico, snapshots thread_local __snap_ para consistencia del Set

Aseguramiento de la calidad

Verificacion automatizada

Las pruebas se ejecutan en cada build con -DBUILD_TESTS=ON. La integracion en el pipeline CI (Forgejo Actions) esta preparada.

Pruebas basadas en datos

Las pruebas de biblioteca (FStLibraryTest) leen las definiciones de bloques directamente desde standard_library.sql. Cuando se agregan nuevos bloques, se prueban automaticamente — no es necesario crear casos de prueba manualmente.

Completitud

La suite de pruebas cubre el vocabulario completo de IEC 61131-3 Structured Text tal como lo soporta ForgeIEC:

  • Todos los operadores (aritmeticos, comparacion, booleanos, desplazamiento de bits)
  • Todas las estructuras de control (IF, FOR, WHILE, REPEAT, CASE)
  • Todos los tipos de literales (Integer, Real, Bool, String, Time)
  • Todos los FBs y FCs estandar (132 bloques)
  • Acceso a arrays y estructuras
  • Variables cualificadas GVL
  • Sincronizacion inter-tareas (Atomics + Double-Buffer)
  • Conversiones de tipo (generacion de casts C)