package org.sample.junit.impl;

import java.util.ArrayList;
import java.util.List;
import com.modeliosoft.modelio.javadesigner.annotations.objid;
import org.modelio.metamodel.uml.infrastructure.Dependency;
import org.modelio.metamodel.uml.infrastructure.Element;
import org.modelio.metamodel.uml.statik.Class;
import org.modelio.metamodel.uml.statik.Package;
import org.modelio.metamodel.visitors.DefaultModelVisitor;


public class TestModelUpdater extends DefaultModelVisitor {

    @Override
    public Object visitPackage(Package obj) {
        List<Class> toDelete = new ArrayList<>();

        for (Class c : obj.getOwnedElement(Class.class)) {
            // Check all owned test cases
            if (c.isStereotyped("JUnit", "JUnit")) {
                boolean hasTestedClass = false;
                // Check that there is a link towards a tested class
                for (Dependency dep : c.getDependsOnDependency()) {
                    if (dep.isStereotyped("JUnit", "JUnitDependency")) {
                        hasTestedClass = true;
                    }
                }

                // No tested class means the test case must be deleted
                if (hasTestedClass == false) {
                    toDelete.add(c);
                }
            }
        }

        if (toDelete.isEmpty()) {
            return Boolean.FALSE;
        } else {
            // Delete orphan test cases
            for (Class c : toDelete) {
                c.delete();
            }
            return Boolean.TRUE;
        }
    }

    @Override
    public Object visitElement(Element obj) {
        return Boolean.FALSE;
    }
}