workcraft/workcraft

View on GitHub
workcraft/CircuitPlugin/test-src/org/workcraft/plugins/circuit/JointTransformationCommandTests.java

Summary

Maintainability
A
2 hrs
Test Coverage
package org.workcraft.plugins.circuit;

import java.net.URL;
import java.util.Collection;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.workcraft.Framework;
import org.workcraft.exceptions.DeserialisationException;
import org.workcraft.plugins.circuit.commands.ContractJointTransformationCommand;
import org.workcraft.plugins.circuit.commands.DetachJointTransformationCommand;
import org.workcraft.plugins.circuit.commands.DissolveJointTransformationCommand;
import org.workcraft.plugins.circuit.utils.CircuitUtils;
import org.workcraft.utils.PackageUtils;
import org.workcraft.workspace.WorkspaceEntry;
import org.workcraft.utils.WorkspaceUtils;

class JointTransformationCommandTests {

    @BeforeAll
    static void init() {
        final Framework framework = Framework.getInstance();
        framework.init();
    }

    @Test
    void testVmeJointTransformationCommands() throws DeserialisationException {
        String workName = PackageUtils.getPackagePath(getClass(), "vme-tm.circuit.work");
        testJointTransformationCommands(workName, new String[] {"lds"});
    }

    private void testJointTransformationCommands(String workName, String[] portRefs)
            throws DeserialisationException {

        final Framework framework = Framework.getInstance();
        final ClassLoader classLoader = ClassLoader.getSystemClassLoader();
        URL url = classLoader.getResource(workName);

        WorkspaceEntry we = framework.loadWork(url.getFile());
        Circuit circuit = WorkspaceUtils.getAs(we, Circuit.class);

        int srcForkCount = countForks(circuit);

        DissolveJointTransformationCommand command = new DissolveJointTransformationCommand();
        command.execute(we);

        Assertions.assertEquals(0, circuit.getJoints().size());

        DetachJointTransformationCommand detachCommand = new DetachJointTransformationCommand();
        detachCommand.execute(we);

        Assertions.assertEquals(srcForkCount, circuit.getJoints().size());

        VisualCircuit visualCircuit = WorkspaceUtils.getAs(we, VisualCircuit.class);
        for (String portRef: portRefs) {
            VisualContact port = visualCircuit.getVisualComponentByMathReference(portRef, VisualContact.class);
            if (port != null) {
                visualCircuit.remove(port);
            }
        }

        int redundantJointCount = countRedundantJoints(circuit);

        ContractJointTransformationCommand contractCommand = new ContractJointTransformationCommand();
        contractCommand.execute(we);

        Assertions.assertEquals(srcForkCount, circuit.getJoints().size() + redundantJointCount);

        framework.closeWork(we);
    }

    private int countForks(Circuit circuit) {
        int result = 0;
        for (FunctionComponent component: circuit.getFunctionComponents()) {
            for (FunctionContact contact: component.getFunctionOutputs()) {
                Collection<Contact> driven = CircuitUtils.findDriven(circuit, contact, false);
                if ((driven != null) && (driven.size() > 1)) {
                    result++;
                }
            }
        }
        for (Contact input: circuit.getInputPorts()) {
            Collection<Contact> driven = CircuitUtils.findDriven(circuit, input, false);
            if ((driven != null) && (driven.size() > 1)) {
                result++;
            }
        }
        return result;
    }


    private int countRedundantJoints(Circuit circuit) {
        int result = 0;
        for (Joint joint: circuit.getJoints()) {
            if ((circuit.getPreset(joint).size() < 2) && (circuit.getPostset(joint).size() < 2)) {
                result++;
            }
        }
        return result;
    }

}