/*
* Copyright (C) 2011 The original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package com.zapta.apps.maniana.model;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.List;
import junit.framework.TestCase;
import com.zapta.apps.maniana.util.LogUtil;
/**
* Unit test for PageModel
*
* @author Tal Dayan
*/
public class PageModelTest extends TestCase {
private ItemModel[] items;
private PageModel pageModel;
private ItemModel extraItem;
@Override
protected void setUp() throws Exception {
super.setUp();
items = new ItemModel[5];
pageModel = new PageModel();
final long ts = 1234567;
for (int i = 0; i < 5; i++) {
items[i] = new ItemModel(ts, "id-" + i, "Item" + i, false, false, 0, ItemColor.NONE);
pageModel.appendItem(items[i]);
}
extraItem = new ItemModel(ts, "id-extra", "Extra1", false, false, 0, ItemColor.NONE);
pageModel.appendUndoItemForTesting(extraItem);
}
public void testOrganizePageWithUndo_withDeletion() {
items[0].setIsCompleted(true);
items[1].setIsLocked(true);
items[3].setIsCompleted(true);
items[3].setIsLocked(true);
OrganizePageSummary summary = new OrganizePageSummary();
pageModel.organizePageWithUndo(true, 1, summary);
dumpPageModel();
assertPageItems(2, 4, 1);
assertUndoItems(0, 3);
assertTrue(summary.orderChanged);
assertEquals(2, summary.completedItemsFound);
assertEquals(2, summary.completedItemsDeleted);
assertEquals(2, summary.itemOfInterestNewIndex);
}
public void testOrganizePageWithUndo_noDeletion() {
items[0].setIsCompleted(true);
items[1].setIsLocked(true);
items[3].setIsCompleted(true);
items[3].setIsLocked(true);
OrganizePageSummary summary = new OrganizePageSummary();
pageModel.organizePageWithUndo(false, 2, summary);
dumpPageModel();
assertPageItems(2, 4, 0, 3, 1);
// Since nothing was deleted, the undo buffer should be preserved
assertEquals(1, pageModel.getUndoItemsCloneForTesting().size());
assertEquals(extraItem, pageModel.getUndoItemsCloneForTesting().get(0));
assertTrue(summary.orderChanged);
assertEquals(2, summary.completedItemsFound);
assertEquals(0, summary.completedItemsDeleted);
assertEquals(0, summary.itemOfInterestNewIndex);
}
public void testOrganizePageWithUndo_noChange() {
items[2].setIsCompleted(true);
items[3].setIsCompleted(true);
items[3].setIsLocked(true);
items[4].setIsLocked(true);
OrganizePageSummary summary = new OrganizePageSummary();
pageModel.organizePageWithUndo(false, -1, summary);
dumpPageModel();
assertPageItems(0, 1, 2, 3, 4);
// Since nothing was deleted, the undo buffer should be preserved
assertEquals(1, pageModel.getUndoItemsCloneForTesting().size());
assertEquals(extraItem, pageModel.getUndoItemsCloneForTesting().get(0));
assertFalse(summary.orderChanged);
assertEquals(2, summary.completedItemsFound);
assertEquals(0, summary.completedItemsDeleted);
assertEquals(-1, summary.itemOfInterestNewIndex);
}
/**
* Assert that the page model contains given items in given order.
*
* @param expectedItemIndexes
* indexes in items[] of expected items.
*/
private void assertPageItems(int... expectedItemIndexes) {
assertEquals(expectedItemIndexes.length, pageModel.itemCount());
for (int i = 0; i < expectedItemIndexes.length; i++) {
final int expectedItemIndex = expectedItemIndexes[i];
assertEquals(items[expectedItemIndex], pageModel.getItem(i));
}
}
/**
* Assert that the page model undo buffer contains given items in given order.
*
* @param expectedItemIndexes
* indexes in items[] of expected items
*/
private void assertUndoItems(int... expectedItemIndexes) {
final List<ItemModel> undoItems = pageModel.getUndoItemsCloneForTesting();
assertEquals(expectedItemIndexes.length, undoItems.size());
for (int i = 0; i < expectedItemIndexes.length; i++) {
final int expectedItemIndex = expectedItemIndexes[i];
assertEquals(items[expectedItemIndex], undoItems.get(i));
}
}
private void dumpPageModel() {
final StringWriter buffer = new StringWriter();
final PrintWriter p = new PrintWriter(buffer);
p.printf("Page:\n");
p.print(" Items:\n");
for (int i = 0; i < pageModel.itemCount(); i++) {
p.printf(" %d: %s\n", i, pageModel.getItem(i).getText());
}
p.print(" Undo:\n");
final List<ItemModel> undoItems = pageModel.getUndoItemsCloneForTesting();
for (int i = 0; i < undoItems.size(); i++) {
p.printf(" %d: %s\n", i, undoItems.get(i).getText());
}
p.flush();
LogUtil.info(buffer.toString());
}
}