/*
* This file is part of LibrePlan
*
* Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e
* Desenvolvemento Tecnolóxico de Galicia
* Copyright (C) 2010-2011 Igalia, S.L.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.zkoss.ganttz.timetracker;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.createNiceMock;
import static org.easymock.EasyMock.createStrictMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.isA;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import java.util.ArrayList;
import java.util.List;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.joda.time.Period;
import org.junit.Test;
import org.zkoss.ganttz.timetracker.zoom.DetailItem;
import org.zkoss.zk.ui.Component;
import org.zkoss.zul.Row;
import org.zkoss.zul.Label;
public class OnColumnsRowRendererTest {
private static class Data {
}
private static class CellRenderer implements ICellForDetailItemRenderer<DetailItem, Data> {
@Override
public Component cellFor(DetailItem item, Data data) {
return null;
}
}
private static class CellRendererNotInferable<T> implements ICellForDetailItemRenderer<DetailItem, T> {
@Override
public Component cellFor(DetailItem item, T data) {
return null;
}
}
private List<DetailItem> detailItems;
private OnColumnsRowRenderer<DetailItem, Data> rowRenderer;
private List<Data> data;
private void givenOnDetailItemsRowRenderer(ICellForDetailItemRenderer<DetailItem, Data> cellRenderer) {
if ( detailItems == null ) {
givenDetailItems();
}
rowRenderer = OnColumnsRowRenderer.create(Data.class, cellRenderer, detailItems);
}
private void givenDetailItems() {
detailItems = new ArrayList<>();
DateTime current = new LocalDate(2010, 1, 1).toDateTimeAtStartOfDay().toDateTime();
Period period = Period.months(2);
for (int i = 1; i <= 10; i++) {
DateTime end = current.plus(period);
DetailItem detail = new DetailItem(200, i + "", current, end);
current = end;
detailItems.add(detail);
}
}
private void givenData() {
data = new ArrayList<>();
data.add(new Data());
data.add(new Data());
}
@Test(expected = NullPointerException.class)
public void itNeedsNotNullDetailItems() {
OnColumnsRowRenderer.create(Data.class, createStub(), null);
}
@Test(expected = NullPointerException.class)
public void itNeedsNotNullCellRenderer() {
OnColumnsRowRenderer.create(Data.class, null, new ArrayList<DetailItem>());
}
@Test(expected = NullPointerException.class)
public void itNeedsTheTypeAsClass() {
OnColumnsRowRenderer.create(null, createStub(), new ArrayList<>());
}
@Test
public void itCanHaveEmptyDetailItems() {
OnColumnsRowRenderer.create(Data.class, createStub(), new ArrayList<>());
}
@Test
public void itCanInferTheGenericType() {
OnColumnsRowRenderer.create(new CellRenderer(), new ArrayList<>());
}
@Test(expected = IllegalArgumentException.class)
public void ifComesFromRawTypeIsNotInferrable() {
OnColumnsRowRenderer.create(createStub(), new ArrayList<>());
}
@Test(expected = IllegalArgumentException.class)
public void ifItNotShowsTheActualTypeIsNotInferrable() {
OnColumnsRowRenderer.create(new CellRendererNotInferable<Data>(), new ArrayList<>());
}
@SuppressWarnings("serial")
@Test(expected = IllegalArgumentException.class)
public void noDetailItemCanBeNull() {
OnColumnsRowRenderer.create(Data.class, createStub(), new ArrayList<DetailItem>() {
{
add(new DetailItem(300, "bla"));
add(null);
}
});
}
@Test(expected = IllegalArgumentException.class)
public void cantRenderObjectsOfOtherType() throws Exception {
givenOnDetailItemsRowRenderer(createStub());
rowRenderer.render(new Row(), "", 0);
}
private ICellForDetailItemRenderer<DetailItem, Data> createStub() {
return createNiceMock(ICellForDetailItemRenderer.class);
}
@Test
public void theCellRendererIsUsedForEachCell() {
givenData();
givenDetailItems();
ICellForDetailItemRenderer<DetailItem, Data> mock = expectTheCellRendererIsCalledForEachCell();
givenOnDetailItemsRowRenderer(mock);
renderingTheData();
verify(mock);
}
private void renderingTheData() {
for (Data d : data) {
try {
rowRenderer.render(new Row(), d, 0);
} catch (Exception e) {
e.printStackTrace();
}
}
}
private ICellForDetailItemRenderer<DetailItem, Data> expectTheCellRendererIsCalledForEachCell() {
ICellForDetailItemRenderer<DetailItem, Data> mock = createStrictMock(ICellForDetailItemRenderer.class);
Label labelMock = createNiceMock(Label.class);
for (Data d : data) {
for (DetailItem item : detailItems) {
expect(mock.cellFor(item, d)).andReturn(labelMock);
}
}
replay(mock);
return mock;
}
@Test
public void theCreatedComponentsAreAddedToTheParents() {
givenData();
givenDetailItems();
ICellForDetailItemRenderer<DetailItem, Data> mock = createMock(ICellForDetailItemRenderer.class);
Label labelMock = expectTheCreatedLabelIsAddedToTheRow(mock);
givenOnDetailItemsRowRenderer(mock);
renderingTheData();
verify(labelMock);
}
private Label expectTheCreatedLabelIsAddedToTheRow(ICellForDetailItemRenderer<DetailItem, Data> mock) {
Label labelMock = createStrictMock(Label.class);
for (Data ignored : data) {
for (DetailItem ignored1 : detailItems) {
expect(mock.cellFor(isA(DetailItem.class), isA(Data.class))).andReturn(labelMock);
labelMock.setParent(isA(Row.class));
}
}
replay(mock, labelMock);
return labelMock;
}
}