/*******************************************************************************
* Copyright (c) 2014 Arapiki Solutions Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* "Peter Smith <psmith@arapiki.com>" - initial API and
* implementation and/or initial documentation
*******************************************************************************/
package com.buildml.model.undo;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import com.buildml.model.CommonTestUtils;
import com.buildml.model.IActionTypeMgr;
import com.buildml.model.IBuildStore;
import com.buildml.model.ISlotTypes.SlotDetails;
import com.buildml.model.IPackageMgr;
import com.buildml.model.ISlotTypes;
import com.buildml.model.ISubPackageMgr;
/**
* Test cases for the SlotUndoOp class.
*
* @author "Peter Smith <psmith@arapiki.com>"
*/
public class TestSlotUndoOp {
/** Our BuildStore object, used in many test cases */
private IBuildStore buildStore;
/** The managers associated with this BuildStore */
IPackageMgr pkgMgr;
IActionTypeMgr actionTypeMgr;
ISubPackageMgr subPkgMgr;
/*-------------------------------------------------------------------------------------*/
/**
* Helper method for validating the content of a SlotDetails object.
*
* @param details The SlotDetails to validate.
* @param slotId The expected slotId.
* @param slotName The expected slotName
* @param slotDescr The expected description (or null to not check)
* @param slotType The expected slotType
* @param slotPos The expected slotPos
* @param slotCard The expected slotCard
*/
private void validateDetails(SlotDetails details, int slotId, String slotName, String slotDescr,
int slotType, int slotPos, int slotCard) {
assertEquals(slotId, details.slotId);
assertEquals(slotName, details.slotName);
if (slotDescr != null) {
assertEquals(slotDescr, details.slotDescr);
}
assertEquals(slotType, details.slotType);
assertEquals(slotPos, details.slotPos);
assertEquals(slotCard, details.slotCard);
}
/*-------------------------------------------------------------------------------------*/
/**
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {
/* get a new empty BuildStore */
buildStore = CommonTestUtils.getEmptyBuildStore();
/* fetch the associated manager objects */
pkgMgr = buildStore.getPackageMgr();
actionTypeMgr = buildStore.getActionTypeMgr();
subPkgMgr = buildStore.getSubPackageMgr();
}
/*-------------------------------------------------------------------------------------*/
/**
* Test undo/redo of creating new package slots
*/
@Test
public void testNewPackageSlot() {
/* create a new slot, and check it exists */
int pkgId = pkgMgr.addPackage("MyPkg");
assertTrue(pkgId > 0);
int slotId = pkgMgr.newSlot(pkgId, "mySlot", null, ISlotTypes.SLOT_TYPE_TEXT,
ISlotTypes.SLOT_POS_PARAMETER, ISlotTypes.SLOT_CARD_REQUIRED, "Hello", null);
assertTrue(slotId > 0);
/* validate its fields */
SlotDetails details = pkgMgr.getSlotByID(slotId);
validateDetails(details, slotId, "mySlot", null, ISlotTypes.SLOT_TYPE_TEXT,
ISlotTypes.SLOT_POS_PARAMETER, ISlotTypes.SLOT_CARD_REQUIRED);
/* record creation of the new slot. */
SlotUndoOp op = new SlotUndoOp(buildStore, ISlotTypes.SLOT_OWNER_PACKAGE);
op.recordNewSlot(slotId);
/* now undo creation and that it disappears */
op.undo();
assertNull(pkgMgr.getSlotByID(slotId));
/* redo creation and check that it's back again */
op.redo();
details = pkgMgr.getSlotByID(slotId);
validateDetails(details, slotId, "mySlot", null, ISlotTypes.SLOT_TYPE_TEXT,
ISlotTypes.SLOT_POS_PARAMETER, ISlotTypes.SLOT_CARD_REQUIRED);
/* an undo, one more time */
op.undo();
assertNull(pkgMgr.getSlotByID(slotId));
}
/*-------------------------------------------------------------------------------------*/
/**
* Test changing package slots
*/
@Test
public void testChangePackageSlot() {
/* create a new slot, and check it exists */
int pkgId = pkgMgr.addPackage("MyPkg");
assertTrue(pkgId > 0);
int slotId = pkgMgr.newSlot(pkgId, "mySlot", "oldDescr", ISlotTypes.SLOT_TYPE_TEXT,
ISlotTypes.SLOT_POS_PARAMETER, ISlotTypes.SLOT_CARD_REQUIRED, "Hello", null);
assertTrue(slotId > 0);
/* fetch the current slot details, and make up some new details that we'll change to */
SlotDetails oldDetails = pkgMgr.getSlotByID(slotId);
SlotDetails newDetails = new SlotDetails(slotId, ISlotTypes.SLOT_OWNER_PACKAGE, pkgId,
"yourSlot", "Description", ISlotTypes.SLOT_TYPE_TEXT, ISlotTypes.SLOT_POS_PARAMETER,
ISlotTypes.SLOT_CARD_OPTIONAL, "Goodbye", null);
/* schedule the slot details to be changed */
SlotUndoOp op = new SlotUndoOp(buildStore, ISlotTypes.SLOT_OWNER_PACKAGE);
op.recordChangeSlot(oldDetails, newDetails);
op.redo();
/* validate that it's changed to the new details */
SlotDetails details = pkgMgr.getSlotByID(slotId);
validateDetails(details, slotId, "yourSlot", "Description", ISlotTypes.SLOT_TYPE_TEXT,
ISlotTypes.SLOT_POS_PARAMETER, ISlotTypes.SLOT_CARD_OPTIONAL);
/* undo the change */
op.undo();
details = pkgMgr.getSlotByID(slotId);
validateDetails(details, slotId, "mySlot", "oldDescr", ISlotTypes.SLOT_TYPE_TEXT,
ISlotTypes.SLOT_POS_PARAMETER, ISlotTypes.SLOT_CARD_REQUIRED);
/* redo the change */
op.redo();
details = pkgMgr.getSlotByID(slotId);
validateDetails(details, slotId, "yourSlot", "Description", ISlotTypes.SLOT_TYPE_TEXT,
ISlotTypes.SLOT_POS_PARAMETER, ISlotTypes.SLOT_CARD_OPTIONAL);
}
/*-------------------------------------------------------------------------------------*/
/**
* Test removing package slots
*/
@Test
public void testRemovePackageSlot() {
/* create a new slot, and check it exists */
int pkgId = pkgMgr.addPackage("MyPkg");
assertTrue(pkgId > 0);
int slotId = pkgMgr.newSlot(pkgId, "mySlot", null, ISlotTypes.SLOT_TYPE_TEXT,
ISlotTypes.SLOT_POS_PARAMETER, ISlotTypes.SLOT_CARD_REQUIRED, "Hello", null);
assertTrue(slotId > 0);
/* schedule it to be trashed */
SlotUndoOp op = new SlotUndoOp(buildStore, ISlotTypes.SLOT_OWNER_PACKAGE);
op.recordRemoveSlot(slotId);
op.redo();
/* validate that it's gone */
assertNull(pkgMgr.getSlotByID(slotId));
/* undo the trashing, and validate that its back */
op.undo();
SlotDetails details = pkgMgr.getSlotByID(slotId);
validateDetails(details, slotId, "mySlot", null, ISlotTypes.SLOT_TYPE_TEXT,
ISlotTypes.SLOT_POS_PARAMETER, ISlotTypes.SLOT_CARD_REQUIRED);
/* redo the trashing and re-validate */
op.redo();
assertNull(pkgMgr.getSlotByID(slotId));
}
/*-------------------------------------------------------------------------------------*/
/**
* Test changing a slot's value.
*/
@Test
public void testChangeSlotValue() {
/* create a package */
int pkgId = pkgMgr.addPackage("NewPackage");
assertTrue(pkgId > 0);
/* add a text slot, an integer slot and a boolean slot */
int textSlotId = pkgMgr.newSlot(pkgId, "text", "text", ISlotTypes.SLOT_TYPE_TEXT,
ISlotTypes.SLOT_POS_PARAMETER, ISlotTypes.SLOT_CARD_REQUIRED, "Default", null);
int intSlotId = pkgMgr.newSlot(pkgId, "int", "int", ISlotTypes.SLOT_TYPE_INTEGER,
ISlotTypes.SLOT_POS_PARAMETER, ISlotTypes.SLOT_CARD_REQUIRED, 42, null);
int boolSlotId = pkgMgr.newSlot(pkgId, "bool", "bool", ISlotTypes.SLOT_TYPE_BOOLEAN,
ISlotTypes.SLOT_POS_PARAMETER, ISlotTypes.SLOT_CARD_REQUIRED, false, null);
assertTrue(textSlotId > 0 && intSlotId > 0 && boolSlotId > 0);
/* create two sub-packages (subPkg1 and subPkg2) */
int subPkg1Id = subPkgMgr.newSubPackage(pkgMgr.getMainPackage(), pkgId);
int subPkg2Id = subPkgMgr.newSubPackage(pkgMgr.getMainPackage(), pkgId);
assertTrue(subPkg1Id > 0 && subPkg2Id > 0);
/* change the value in the text slot for subPkg1 */
SlotUndoOp op1 = new SlotUndoOp(buildStore, ISlotTypes.SLOT_OWNER_PACKAGE);
op1.recordChangeSlotValue(subPkg1Id, textSlotId, false, null, true, "Value 1");
op1.redo();
/* change the value in the integer slot in subPkg2 */
SlotUndoOp op2 = new SlotUndoOp(buildStore, ISlotTypes.SLOT_OWNER_PACKAGE);
op2.recordChangeSlotValue(subPkg2Id, intSlotId, false, null, true, 1);
op2.redo();
/* test the status/values for all 6 slots */
assertTrue(subPkgMgr.isSlotSet(subPkg1Id, textSlotId));
assertEquals("Value 1", subPkgMgr.getSlotValue(subPkg1Id, textSlotId));
assertFalse(subPkgMgr.isSlotSet(subPkg1Id, intSlotId));
assertFalse(subPkgMgr.isSlotSet(subPkg1Id, boolSlotId));
assertFalse(subPkgMgr.isSlotSet(subPkg2Id, textSlotId));
assertTrue(subPkgMgr.isSlotSet(subPkg2Id, intSlotId));
assertEquals(1, subPkgMgr.getSlotValue(subPkg2Id, intSlotId));
assertFalse(subPkgMgr.isSlotSet(subPkg2Id, boolSlotId));
/* change the value in the text slot for subPkg1, again */
SlotUndoOp op3 = new SlotUndoOp(buildStore, ISlotTypes.SLOT_OWNER_PACKAGE);
op3.recordChangeSlotValue(subPkg1Id, textSlotId, true, "Value 1", true, "Value 2");
op3.redo();
/* clear the value in the integer slot in subPkg2 */
SlotUndoOp op4 = new SlotUndoOp(buildStore, ISlotTypes.SLOT_OWNER_PACKAGE);
op4.recordChangeSlotValue(subPkg2Id, intSlotId, true, 1, false, null);
op4.redo();
/* test status/values for all 6 slots, again */
assertTrue(subPkgMgr.isSlotSet(subPkg1Id, textSlotId));
assertEquals("Value 2", subPkgMgr.getSlotValue(subPkg1Id, textSlotId));
assertFalse(subPkgMgr.isSlotSet(subPkg1Id, intSlotId));
assertFalse(subPkgMgr.isSlotSet(subPkg1Id, boolSlotId));
assertFalse(subPkgMgr.isSlotSet(subPkg2Id, textSlotId));
assertFalse(subPkgMgr.isSlotSet(subPkg2Id, intSlotId));
assertFalse(subPkgMgr.isSlotSet(subPkg2Id, boolSlotId));
/* undo the change to the two sub-packages, and test again */
op3.undo();
op4.undo();
assertTrue(subPkgMgr.isSlotSet(subPkg1Id, textSlotId));
assertEquals("Value 1", subPkgMgr.getSlotValue(subPkg1Id, textSlotId));
assertFalse(subPkgMgr.isSlotSet(subPkg1Id, intSlotId));
assertFalse(subPkgMgr.isSlotSet(subPkg1Id, boolSlotId));
assertFalse(subPkgMgr.isSlotSet(subPkg2Id, textSlotId));
assertTrue(subPkgMgr.isSlotSet(subPkg2Id, intSlotId));
assertEquals(1, subPkgMgr.getSlotValue(subPkg2Id, intSlotId));
assertFalse(subPkgMgr.isSlotSet(subPkg2Id, boolSlotId));
/* undo the changes to the two sub-packages, again */
op1.undo();
op2.undo();
assertFalse(subPkgMgr.isSlotSet(subPkg1Id, textSlotId));
assertFalse(subPkgMgr.isSlotSet(subPkg1Id, intSlotId));
assertFalse(subPkgMgr.isSlotSet(subPkg1Id, boolSlotId));
assertFalse(subPkgMgr.isSlotSet(subPkg2Id, textSlotId));
assertFalse(subPkgMgr.isSlotSet(subPkg2Id, intSlotId));
assertFalse(subPkgMgr.isSlotSet(subPkg2Id, boolSlotId));
/* redo the changes */
op1.redo();
op2.redo();
assertTrue(subPkgMgr.isSlotSet(subPkg1Id, textSlotId));
assertEquals("Value 1", subPkgMgr.getSlotValue(subPkg1Id, textSlotId));
assertFalse(subPkgMgr.isSlotSet(subPkg1Id, intSlotId));
assertFalse(subPkgMgr.isSlotSet(subPkg1Id, boolSlotId));
assertFalse(subPkgMgr.isSlotSet(subPkg2Id, textSlotId));
assertTrue(subPkgMgr.isSlotSet(subPkg2Id, intSlotId));
assertEquals(1, subPkgMgr.getSlotValue(subPkg2Id, intSlotId));
assertFalse(subPkgMgr.isSlotSet(subPkg2Id, boolSlotId));
}
/*-------------------------------------------------------------------------------------*/
}