Usage

Transition system definition using Java DSL

The different kinds of transitions systems supported by VIBeS may be defined by redefining one of the following abstract classes and by implementing its define() method:

  • LabelledTransitionSystemDefinition: used to define labelled transition systems.
  • FeaturedTransitionDefinition: used to define featured transition systems
  • UsageModelDefinition: used to define usage models (labelled transition systems with probabilities over transitions)
    import be.unamur.transitionsystem.dsl.*;
    
    public class MyLTS extends LabelledTransitionSystemDefinition{
    
        public MyLTS(){
            super();
        }
    
        @Override
        protected void define() {
            initial("initial");
            
            from("initial").action("act1").to("s1");
            
            from("s1").action("doX").to("s2");
            from("s1").action("doXY").to("s3");
            
            from("s2").action("doY").to("s3");
            
            from("s3").action("exit").to("initial");
        }
    
        public static void main(String[] args){
            MyLTS def = new MyLTS();
            LabelledTransitionSystem lts = def.getTransitionSystem();
        }
    }

Feature expression grammar

Feature expressions are boolean expressions defined over features. In VIBeS, feature expressions have to respect the following grammar:

FEXPRESSION: 
        'true'
    |   'false'
    |   FEATURENAME
    |   '!' FEXPRESSION
    |   FEXPRESSION '&&' FEXPRESSION
    |   FEXPRESSION '||' FEXPRESSION
    |   '(' FEXPRESSION ')'

FEATURENAME:
    LETTER (LETTER | DIGIT)*

LETTER:
    'A'..'Z' | 'a'..'z' | '_'

DIGIT:
    '0'..'9'

The operators priority is defined as following : parenthesis ('(' FEXPRESSION ')') > not ('!') > and ('&&'), or ('||')

Transition system XML load and save using Java DSL

Various transition systems may be loaded/saved in XML files.

import static be.unamur.transitionsystem.dsl.TransitionSystemXmlLoaders.*;
import static be.unamur.transitionsystem.dsl.TransitionSystemXmlPrinter.*;

public Main{
    public static void main(String[] args){
        LabelledTransitionSystem lts = loadLabelledTransitionSystem("myLTS.xml");
        // [...]
        print(lts, "otherLTS.xml");
    }
}

Mutation testing

The class ConfiguredMutagen allows to easilly generate mutants using a configuration file specifying the mutation operators configuration:

import static be.unamur.transitionsystem.dsl.TransitionSystemXmlLoaders.*;
import static be.unamur.transitionsystem.dsl.test.mutation.ConfiguredMutagen.*;

public Main{
    public static void main(String[] args){
        LabelledTransitionSystem lts = new MyLTS().getTransitionSystem();
        // Loads the mutation operators configuration

        // E.g., ennumerative mutants generation
        configure("operatorsConfig.xml")
            .outputDir("mutants/") // Generates mutants in the given folder
            .mutate(lts);

        // E.g., FMM generation
        configure("operatorsConfig.xml")
            .ftsMutant("fmm.fts") // Generates FMM's FTS with given name
            .tvlMutant("fmm.tvl") // Generates FMM's FD in TVL format
            .mutate(lts);

        // E.g., ennumerative and FMM generation (will generate the same mutants)
        configure("operatorsConfig.xml")
            .outputDir("mutants/") // Generates mutants in the given folder
            .ftsMutant("fmm.fts") // Generates FMM's FTS with given name
            .tvlMutant("fmm.tvl") // Generates FMM's FD in TVL format
            .mutate(lts);   
    }
}

Here is a exemple of configuration file (in XML):

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <mutantsSize>200</mutantsSize> <!-- Default mutant size (may be redefined) -->
    <!-- Default selection strategies for each operator (may be redefined) -->
    <actionSelection>be.unamur.transitionsystem.test.mutation.RandomSelectionStrategy</actionSelection>
    <stateSelection>be.unamur.transitionsystem.test.mutation.RandomSelectionStrategy</stateSelection>
    <transitionSelection>be.unamur.transitionsystem.test.mutation.RandomSelectionStrategy</transitionSelection>
    <unique>true</unique> <!-- Default uniqueness of each mutant (may be redefined) -->
    <!-- Operators -->
    <operators>
        <operator>
            <class>be.unamur.transitionsystem.test.mutation.ActionExchange</class>
        </operator>
        <operator>
            <class>be.unamur.transitionsystem.test.mutation.ActionMissing</class>
        </operator>
        <operator>
            <class>be.unamur.transitionsystem.test.mutation.StateMissing</class>
        </operator>
        <operator>
            <class>be.unamur.transitionsystem.test.mutation.TransitionAdd</class>
        </operator>
        <operator>
            <class>be.unamur.transitionsystem.test.mutation.TransitionDestinationExchange</class>
        </operator>
        <operator>
            <class>be.unamur.transitionsystem.test.mutation.TransitionMissing</class>
        </operator>
        <operator>
            <class>be.unamur.transitionsystem.test.mutation.WrongInitialState</class>
            <mutantsSize>100</mutantsSize>
            <actionSelection>be.unamur.transitionsystem.test.mutation.RandomSelectionStrategy</actionSelection>
            <stateSelection>be.unamur.transitionsystem.test.mutation.RandomSelectionStrategy</stateSelection>
            <transitionSelection>be.unamur.transitionsystem.test.mutation.RandomSelectionStrategy</transitionSelection>
            <unique>false</unique>
        </operator>
    </operators>
</config>

It is also possible to configure a particular mutation operator for a given transition system using the Mutagen class:

import static be.unamur.transitionsystem.dsl.TransitionSystemXmlLoaders.*;
import static be.unamur.transitionsystem.dsl.test.mutation.Mutagen.*;
import be.unamur.transitionsystem.test.mutation.*;

public Main{
    public static void main(String[] args){
        LabelledTransitionSystem lts = new MyLTS().getTransitionSystem();
        FeaturedTransitionSystem fts = new F
        // Initialise the operatro for the given transition system
        MutationOperator op = transitionMissing(lts)
            .transitionSelectionStrategy(new RandomSelectionStrategy())
            .done();

        // Apply the operator 
        op.apply();
        // Get the mutant transition system (enumerative version)
        LabelledTransitionSystem mutant = (LabelledTransitionSystem) op.result();
        // Enrich the FMM's FTS with the new mutant
        op.transpose(ftsFMM);
        // Get the feature ID used in the FMM's FTS (should be added to the used feature diagram)
        String mutantFeatureId = op.getFeatureId();
    }
}