/*
* SPDX-FileCopyrightText: 2021-2023 The Refinery Authors
*
* SPDX-License-Identifier: EPL-2.0
*/
package tools.refinery.store.dse;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import tools.refinery.store.dse.internal.action.*;
import tools.refinery.store.dse.strategy.DepthFirstStrategy;
import tools.refinery.store.model.Model;
import tools.refinery.store.model.ModelStore;
import tools.refinery.store.query.dnf.Query;
import tools.refinery.store.query.viatra.ViatraModelQueryAdapter;
import tools.refinery.store.query.view.KeyOnlyView;
import tools.refinery.store.representation.Symbol;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
public class ActionEqualsTest {
private static Model model;
private static Symbol type1;
private static Symbol relation1;
private static Symbol relation2;
@BeforeAll
public static void init() {
type1 = Symbol.of("type1", 1);
relation1 = Symbol.of("relation1", 2);
relation2 = Symbol.of("relation2", 2);
var type1View = new KeyOnlyView<>(type1);
var precondition1 = Query.of("CreateClassPrecondition",
(builder, model) -> builder.clause(
type1View.call(model)
));
var precondition2 = Query.of("CreateFeaturePrecondition",
(builder, model) -> builder.clause(
type1View.call(model)
));
var store = ModelStore.builder()
.symbols(type1, relation2, relation1)
.with(ViatraModelQueryAdapter.builder()
.queries(precondition1, precondition2))
.with(DesignSpaceExplorationAdapter.builder()
.strategy(new DepthFirstStrategy()))
.build();
model = store.createEmptyModel();
}
@Test
void emptyActionEqualsTest() {
var action1 = new TransformationAction();
var action2 = new TransformationAction();
assertTrue(action1.equalsWithSubstitution(action1));
assertTrue(action2.equalsWithSubstitution(action2));
assertTrue(action1.equalsWithSubstitution(action2));
}
@Test
void actionTrivialTest() {
var newItemSymbol1 = new NewItemVariable();
var activationSymbol = new ActivationVariable();
var insertAction1 = new InsertAction<>(model.getInterpretation(type1), true, newItemSymbol1);
var insertAction2 = new InsertAction<>(model.getInterpretation(relation1), true, newItemSymbol1,
activationSymbol);
var insertAction3 = new InsertAction<>(model.getInterpretation(type1), true, newItemSymbol1);
var insertAction4 = new InsertAction<>(model.getInterpretation(relation1), true, newItemSymbol1,
activationSymbol);
var action1 = new TransformationAction();
action1.add(newItemSymbol1);
action1.add(activationSymbol);
action1.add(insertAction1);
action1.add(insertAction2);
action1.prepare(model);
var action2 = new TransformationAction();
action2.add(newItemSymbol1);
action2.add(activationSymbol);
action2.add(insertAction3);
action2.add(insertAction4);
action2.prepare(model);
assertTrue(action1.equalsWithSubstitution(action2));
}
@Test
void actionIdenticalTest() {
var newItemSymbol1 = new NewItemVariable();
var activationSymbol1 = new ActivationVariable();
var insertAction1 = new InsertAction<>(model.getInterpretation(relation1), true, newItemSymbol1,
activationSymbol1);
var action1 = new TransformationAction();
action1.add(newItemSymbol1);
action1.add(activationSymbol1);
action1.add(insertAction1);
action1.prepare(model);
var newItemSymbol2 = new NewItemVariable();
var activationSymbol2 = new ActivationVariable();
var insertAction2 = new InsertAction<>(model.getInterpretation(relation1), true, newItemSymbol2,
activationSymbol2);
var action2 = new TransformationAction();
action2.add(newItemSymbol2);
action2.add(activationSymbol2);
action2.add(insertAction2);
action2.prepare(model);
assertTrue(action1.equalsWithSubstitution(action2));
}
@Test
void actionSymbolGlobalOrderTest() {
var newItemSymbol1 = new NewItemVariable();
var activationSymbol1 = new ActivationVariable();
var insertAction1 = new InsertAction<>(model.getInterpretation(relation1), true, newItemSymbol1,
activationSymbol1);
var action1 = new TransformationAction();
action1.add(newItemSymbol1);
action1.add(activationSymbol1);
action1.add(insertAction1);
action1.prepare(model);
var newItemSymbol2 = new NewItemVariable();
var activationSymbol2 = new ActivationVariable();
var insertAction2 = new InsertAction<>(model.getInterpretation(relation1), true, newItemSymbol2,
activationSymbol2);
var action2 = new TransformationAction();
action2.add(activationSymbol2);
action2.add(newItemSymbol2);
action2.add(insertAction2);
action2.prepare(model);
assertFalse(action1.equalsWithSubstitution(action2));
}
@Test
void actionSymbolRepeatedInInsertActionTest() {
var newItemSymbol1 = new NewItemVariable();
var insertAction1 = new InsertAction<>(model.getInterpretation(relation1), true, newItemSymbol1,
newItemSymbol1);
var action1 = new TransformationAction();
action1.add(newItemSymbol1);
action1.add(insertAction1);
action1.prepare(model);
var newItemSymbol2 = new NewItemVariable();
var insertAction2 = new InsertAction<>(model.getInterpretation(relation1), true, newItemSymbol2,
newItemSymbol2);
var action2 = new TransformationAction();
action2.add(newItemSymbol2);
action2.add(insertAction2);
action2.prepare(model);
assertTrue(action1.equalsWithSubstitution(action2));
}
@Test
void identicalInsertActionInDifferentOrderTest() {
var newItemSymbol1 = new NewItemVariable();
var activationSymbol1 = new ActivationVariable();
var insertAction1 = new InsertAction<>(model.getInterpretation(relation1), true, newItemSymbol1,
activationSymbol1);
var insertAction2 = new InsertAction<>(model.getInterpretation(relation1), true, newItemSymbol1,
activationSymbol1);
var action1 = new TransformationAction();
action1.add(newItemSymbol1);
action1.add(activationSymbol1);
action1.add(insertAction1);
action1.add(insertAction2);
action1.prepare(model);
var action2 = new TransformationAction();
action2.add(newItemSymbol1);
action2.add(activationSymbol1);
action2.add(insertAction2);
action2.add(insertAction1);
action2.prepare(model);
assertTrue(action1.equalsWithSubstitution(action2));
}
@Test
void identicalActionAndSymbolDifferentOrderTest() {
var newItemSymbol1 = new NewItemVariable();
var newItemSymbol2 = new NewItemVariable();
var activationSymbol1 = new ActivationVariable();
var activationSymbol2 = new ActivationVariable();
var insertAction1 = new InsertAction<>(model.getInterpretation(relation1), true, newItemSymbol1,
activationSymbol1);
var insertAction2 = new InsertAction<>(model.getInterpretation(relation1), true, newItemSymbol2,
activationSymbol2);
var action1 = new TransformationAction();
action1.add(newItemSymbol1);
action1.add(newItemSymbol2);
action1.add(activationSymbol1);
action1.add(activationSymbol2);
action1.add(insertAction1);
action1.add(insertAction2);
action1.prepare(model);
var action2 = new TransformationAction();
action2.add(newItemSymbol2);
action2.add(newItemSymbol1);
action2.add(activationSymbol2);
action2.add(activationSymbol1);
action2.add(insertAction2);
action2.add(insertAction1);
action2.prepare(model);
assertTrue(action1.equalsWithSubstitution(action2));
}
@Test
void identicalActionAndSymbolMixedOrderTest() {
var newItemSymbol1 = new NewItemVariable();
var activationSymbol1 = new ActivationVariable();
var insertAction1 = new InsertAction<>(model.getInterpretation(relation1), true, newItemSymbol1,
activationSymbol1);
var newItemSymbol2 = new NewItemVariable();
var activationSymbol2 = new ActivationVariable();
var insertAction2 = new InsertAction<>(model.getInterpretation(relation1), true, newItemSymbol2,
activationSymbol2);
var action1 = new TransformationAction();
action1.add(newItemSymbol1);
action1.add(newItemSymbol2);
action1.add(activationSymbol1);
action1.add(activationSymbol2);
action1.add(insertAction1);
action1.add(insertAction2);
action1.prepare(model);
var action2 = new TransformationAction();
action2.add(insertAction1);
action2.add(newItemSymbol1);
action2.add(newItemSymbol2);
action2.add(activationSymbol1);
action2.add(insertAction2);
action2.add(activationSymbol2);
action2.prepare(model);
assertTrue(action1.equalsWithSubstitution(action2));
}
@Test
void insertActionInterpretationTest() {
var newItemSymbol1 = new NewItemVariable();
var activationSymbol1 = new ActivationVariable();
var insertAction1 = new InsertAction<>(model.getInterpretation(relation1), true, newItemSymbol1,
activationSymbol1);
var insertAction2 = new InsertAction<>(model.getInterpretation(relation2), true, newItemSymbol1,
activationSymbol1);
var action1 = new TransformationAction();
action1.add(newItemSymbol1);
action1.add(activationSymbol1);
action1.add(insertAction1);
action1.prepare(model);
var action2 = new TransformationAction();
action2.add(newItemSymbol1);
action2.add(activationSymbol1);
action2.add(insertAction2);
action2.prepare(model);
assertFalse(action1.equalsWithSubstitution(action2));
}
@Test
void insertActionValueTest() {
var newItemSymbol1 = new NewItemVariable();
var activationSymbol1 = new ActivationVariable();
var insertAction1 = new InsertAction<>(model.getInterpretation(relation1), true, newItemSymbol1,
activationSymbol1);
var insertAction2 = new InsertAction<>(model.getInterpretation(relation1), false, newItemSymbol1,
activationSymbol1);
var action1 = new TransformationAction();
action1.add(newItemSymbol1);
action1.add(activationSymbol1);
action1.add(insertAction1);
action1.prepare(model);
var action2 = new TransformationAction();
action2.add(newItemSymbol1);
action2.add(activationSymbol1);
action2.add(insertAction2);
action2.prepare(model);
assertFalse(action1.equalsWithSubstitution(action2));
}
@Test
void newItemSymbolDuplicateTest() {
var newItemSymbol1 = new NewItemVariable();
var newItemSymbol2 = new NewItemVariable();
var activationSymbol1 = new ActivationVariable();
var insertAction1 = new InsertAction<>(model.getInterpretation(relation1), true, newItemSymbol1,
activationSymbol1);
var insertAction2 = new InsertAction<>(model.getInterpretation(relation1), true, newItemSymbol2,
activationSymbol1);
var action1 = new TransformationAction();
action1.add(newItemSymbol1);
action1.add(activationSymbol1);
action1.add(insertAction1);
action1.prepare(model);
var action2 = new TransformationAction();
action2.add(newItemSymbol2);
action2.add(activationSymbol1);
action2.add(insertAction2);
action2.prepare(model);
assertTrue(action1.equalsWithSubstitution(action2));
}
@Test
void activationSymbolDuplicateTest() {
var newItemSymbol1 = new NewItemVariable();
var activationSymbol1 = new ActivationVariable();
var activationSymbol2 = new ActivationVariable();
var insertAction1 = new InsertAction<>(model.getInterpretation(relation1), true, newItemSymbol1,
activationSymbol1);
var insertAction2 = new InsertAction<>(model.getInterpretation(relation1), true, newItemSymbol1,
activationSymbol2);
var action1 = new TransformationAction();
action1.add(newItemSymbol1);
action1.add(activationSymbol1);
action1.add(insertAction1);
action1.prepare(model);
var action2 = new TransformationAction();
action2.add(newItemSymbol1);
action2.add(activationSymbol2);
action2.add(insertAction2);
action2.prepare(model);
assertTrue(action1.equalsWithSubstitution(action2));
}
@Test
void activationSymbolIndexTest() {
var newItemSymbol1 = new NewItemVariable();
var activationSymbol1 = new ActivationVariable(0);
var activationSymbol2 = new ActivationVariable(1);
var insertAction1 = new InsertAction<>(model.getInterpretation(relation1), true, newItemSymbol1,
activationSymbol1);
var insertAction2 = new InsertAction<>(model.getInterpretation(relation1), true, newItemSymbol1,
activationSymbol2);
var action1 = new TransformationAction();
action1.add(newItemSymbol1);
action1.add(activationSymbol1);
action1.add(insertAction1);
action1.prepare(model);
var action2 = new TransformationAction();
action2.add(newItemSymbol1);
action2.add(activationSymbol2);
action2.add(insertAction2);
action2.prepare(model);
assertFalse(action1.equalsWithSubstitution(action2));
}
@Test
void deleteActionTest() {
var newItemSymbol = new NewItemVariable();
var activationSymbol = new ActivationVariable(0);
var insertAction = new InsertAction<>(model.getInterpretation(relation1), false, newItemSymbol,
activationSymbol);
var deleteAction = new DeleteAction(activationSymbol);
var action1 = new TransformationAction();
action1.add(newItemSymbol);
action1.add(activationSymbol);
action1.add(insertAction);
action1.add(deleteAction);
action1.prepare(model);
var action2 = new TransformationAction();
action2.add(newItemSymbol);
action2.add(activationSymbol);
action2.add(insertAction);
action2.add(deleteAction);
action2.prepare(model);
assertTrue(action1.equalsWithSubstitution(action2));
}
@Test
void deleteActionMissingTest() {
var newItemSymbol = new NewItemVariable();
var activationSymbol = new ActivationVariable(0);
var insertAction = new InsertAction<>(model.getInterpretation(relation1), false, newItemSymbol,
activationSymbol);
var deleteAction = new DeleteAction(activationSymbol);
var action1 = new TransformationAction();
action1.add(newItemSymbol);
action1.add(activationSymbol);
action1.add(insertAction);
action1.add(deleteAction);
action1.prepare(model);
var action2 = new TransformationAction();
action2.add(newItemSymbol);
action2.add(activationSymbol);
action2.add(insertAction);
action2.prepare(model);
assertFalse(action1.equalsWithSubstitution(action2));
}
@Test
void deleteActionIdenticalTest() {
var newItemSymbol = new NewItemVariable();
var activationSymbol = new ActivationVariable(0);
var insertAction = new InsertAction<>(model.getInterpretation(relation1), false, newItemSymbol,
activationSymbol);
var deleteAction1 = new DeleteAction(activationSymbol);
var deleteAction2 = new DeleteAction(activationSymbol);
var action1 = new TransformationAction();
action1.add(newItemSymbol);
action1.add(activationSymbol);
action1.add(insertAction);
action1.add(deleteAction1);
action1.prepare(model);
var action2 = new TransformationAction();
action2.add(newItemSymbol);
action2.add(activationSymbol);
action2.add(insertAction);
action2.add(deleteAction2);
action2.prepare(model);
assertTrue(action1.equalsWithSubstitution(action2));
}
@Test
void deleteActionSymbolTypeTest() {
var newItemSymbol = new NewItemVariable();
var activationSymbol = new ActivationVariable(0);
var insertAction = new InsertAction<>(model.getInterpretation(relation1), false, newItemSymbol,
activationSymbol);
var deleteAction1 = new DeleteAction(activationSymbol);
var deleteAction2 = new DeleteAction(newItemSymbol);
var action1 = new TransformationAction();
action1.add(newItemSymbol);
action1.add(activationSymbol);
action1.add(insertAction);
action1.add(deleteAction1);
action1.prepare(model);
var action2 = new TransformationAction();
action2.add(newItemSymbol);
action2.add(activationSymbol);
action2.add(insertAction);
action2.add(deleteAction2);
action2.prepare(model);
assertFalse(action1.equalsWithSubstitution(action2));
}
@Test
void deleteActionOrderTest() {
var newItemSymbol = new NewItemVariable();
var activationSymbol = new ActivationVariable(0);
var insertAction = new InsertAction<>(model.getInterpretation(relation1), false, newItemSymbol,
activationSymbol);
var deleteAction1 = new DeleteAction(activationSymbol);
var deleteAction2 = new DeleteAction(newItemSymbol);
var action1 = new TransformationAction();
action1.add(newItemSymbol);
action1.add(activationSymbol);
action1.add(insertAction);
action1.add(deleteAction1);
action1.add(deleteAction2);
action1.prepare(model);
var action2 = new TransformationAction();
action2.add(newItemSymbol);
action2.add(activationSymbol);
action2.add(insertAction);
action2.add(deleteAction2);
action2.add(deleteAction1);
action2.prepare(model);
assertFalse(action1.equalsWithSubstitution(action2));
}
@Test
void actionsMixedOrderTest() {
var newItemSymbol1 = new NewItemVariable();
var activationSymbol1 = new ActivationVariable();
var insertAction1 = new InsertAction<>(model.getInterpretation(relation1), true, newItemSymbol1,
activationSymbol1);
var deleteAction1 = new DeleteAction(newItemSymbol1);
var newItemSymbol2 = new NewItemVariable();
var activationSymbol2 = new ActivationVariable();
var insertAction2 = new InsertAction<>(model.getInterpretation(relation1), true, newItemSymbol2,
activationSymbol2);
var deleteAction2 = new DeleteAction(activationSymbol2);
var action1 = new TransformationAction();
action1.add(newItemSymbol1);
action1.add(newItemSymbol2);
action1.add(activationSymbol1);
action1.add(activationSymbol2);
action1.add(insertAction1);
action1.add(insertAction2);
action1.add(deleteAction1);
action1.add(deleteAction2);
action1.prepare(model);
var action2 = new TransformationAction();
action2.add(deleteAction1);
action2.add(newItemSymbol1);
action2.add(insertAction1);
action2.add(newItemSymbol2);
action2.add(deleteAction2);
action2.add(activationSymbol1);
action2.add(insertAction2);
action2.add(activationSymbol2);
action2.prepare(model);
assertTrue(action1.equalsWithSubstitution(action2));
}
@Test
void twoUnpreparedActionsTest() {
var newItemSymbol1 = new NewItemVariable();
var activationSymbol1 = new ActivationVariable();
var insertAction1 = new InsertAction<>(model.getInterpretation(relation1), true, newItemSymbol1,
activationSymbol1);
var deleteAction1 = new DeleteAction(newItemSymbol1);
var newItemSymbol2 = new NewItemVariable();
var activationSymbol2 = new ActivationVariable();
var insertAction2 = new InsertAction<>(model.getInterpretation(relation1), true, newItemSymbol2,
activationSymbol2);
var deleteAction2 = new DeleteAction(activationSymbol2);
var action1 = new TransformationAction();
action1.add(newItemSymbol1);
action1.add(newItemSymbol2);
action1.add(activationSymbol1);
action1.add(activationSymbol2);
action1.add(insertAction1);
action1.add(insertAction2);
action1.add(deleteAction1);
action1.add(deleteAction2);
var action2 = new TransformationAction();
action2.add(deleteAction1);
action2.add(newItemSymbol1);
action2.add(insertAction1);
action2.add(newItemSymbol2);
action2.add(deleteAction2);
action2.add(activationSymbol1);
action2.add(insertAction2);
action2.add(activationSymbol2);
assertTrue(action1.equalsWithSubstitution(action2));
}
@Test
void oneUnpreparedActionTest() {
var newItemSymbol1 = new NewItemVariable();
var activationSymbol1 = new ActivationVariable();
var insertAction1 = new InsertAction<>(model.getInterpretation(relation1), true, newItemSymbol1,
activationSymbol1);
var deleteAction1 = new DeleteAction(newItemSymbol1);
var newItemSymbol2 = new NewItemVariable();
var activationSymbol2 = new ActivationVariable();
var insertAction2 = new InsertAction<>(model.getInterpretation(relation1), true, newItemSymbol2,
activationSymbol2);
var deleteAction2 = new DeleteAction(activationSymbol2);
var action1 = new TransformationAction();
action1.add(newItemSymbol1);
action1.add(newItemSymbol2);
action1.add(activationSymbol1);
action1.add(activationSymbol2);
action1.add(insertAction1);
action1.add(insertAction2);
action1.add(deleteAction1);
action1.add(deleteAction2);
action1.prepare(model);
var action2 = new TransformationAction();
action2.add(deleteAction1);
action2.add(newItemSymbol1);
action2.add(insertAction1);
action2.add(newItemSymbol2);
action2.add(deleteAction2);
action2.add(activationSymbol1);
action2.add(insertAction2);
action2.add(activationSymbol2);
assertFalse(action1.equalsWithSubstitution(action2));
}
}