Wodel is a Domain-Specific Language for the specification and generation of model mutants.

Wodel is domain-independent, as it can be used to generate mutants of models conforming to arbitrary meta-models.

Wodel provides nine mutation primitives for object creation and deletion, reference redirection, attribute modification, cloning, and retyping, among others.

The engine verifies that each generated mutant is a valid model (i.e., it conforms to the domain meta-model and satisfies its integrity constraints).

Wodel includes a mechanism to identify and avoid the generation of duplicated mutants. By default, mutant equivalence is syntactic, but users can provide their own equivalence criteria (e.g., behavioural) through extension points.

The execution of a Wodel program generates a registry of the applied mutations and the objects affected by them.

The IDE provides several metrics that can help in assessing whether a set of mutations is complete or has been correctly implemented.

Also to facilitate the testing of Wodel programs, the IDE permits the automatic synthesis of seed models.

It's development environment is extensible, permitting the incorporation of post-processors for different applications.

To get started, you can access a Wodel tutorial here.

As an example, this repository contains an application consisting on the automated generation of exercises for particular domains (automata, class diagrams, electronic circuits, etc.). We call this extension Wodel-Edu.

This is a sample of a Wodel program that mutates a transition target of a Finite Automaton model:

generate 2 mutants
in "data/out/"
from "data/model/"
metamodel "http://dfaAutomaton/1.0"

with commands {
     modify target tar from one Transition to other State

You can specify when mutants are going to be generated inside a Wodel program with the blocks directive.

Also, you can mutate mutant models generated in a previous block, instead of mutating the seed models.

Furthermore, you can specify OCL constraints that will apply to generated mutants:

generate mutants
in "data/out/"
from "data/model/exercise1.model"
metamodel "http://dfaAutomaton/1.0"

with blocks {
    first {
         modify target tar from one Transition to other State [3]             
} [2]
    second from first repeat=no {
         modify one State with { name = random-string(4,6)}
    } [3]
constraints {
    context State connected:: "isInitial or Set{self}->
            closure(s | Transition.allInstances()->
            select(t | t.tar=s)->collect(src))->exists(s | s.isInitial)"

This is a short video demo of Wodel framework: