/*
* FurnitureTableTest.java 11 mai 2006
*
* Copyright (c) 2006 Emmanuel PUYBARET / eTeks <info@eteks.com>. All Rights
* Reserved.
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation; either version 2 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 General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
* Place, Suite 330, Boston, MA 02111-1307 USA
*/
package com.eteks.sweethome3d.junit;
import java.awt.Component;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import junit.framework.TestCase;
import com.eteks.sweethome3d.io.DefaultUserPreferences;
import com.eteks.sweethome3d.model.CatalogPieceOfFurniture;
import com.eteks.sweethome3d.model.FurnitureCatalog;
import com.eteks.sweethome3d.model.FurnitureCategory;
import com.eteks.sweethome3d.model.Home;
import com.eteks.sweethome3d.model.HomePieceOfFurniture;
import com.eteks.sweethome3d.model.LengthUnit;
import com.eteks.sweethome3d.model.UserPreferences;
import com.eteks.sweethome3d.swing.FurnitureTable;
import com.eteks.sweethome3d.swing.SwingViewFactory;
import com.eteks.sweethome3d.swing.FurnitureTable.FurnitureFilter;
import com.eteks.sweethome3d.viewcontroller.FurnitureController;
/**
* Tests furniture table component.
* @author Emmanuel Puybaret
*/
public class FurnitureTableTest extends TestCase {
/**
* Tests furniture table creation and localization.
*/
public void testFurnitureTableCreation() {
// 1. Choose a locale that displays furniture dimensions in inches
Locale.setDefault(Locale.US);
// Read default user preferences
UserPreferences preferences = new DefaultUserPreferences();
// Check the current unit isn't centimeter
LengthUnit currentUnit = preferences.getLengthUnit();
assertFalse("Unit is in centimeter", currentUnit == LengthUnit.CENTIMETER);
// Get furniture catalog
FurnitureCatalog catalog = preferences.getFurnitureCatalog();
// 2. Create a home that contains furniture matching catalog furniture
List<HomePieceOfFurniture> homeFurniture = createHomeFurnitureFromCatalog(catalog);
Home home = new Home(homeFurniture);
// Check catalog furniture count equals home furniture count
assertEquals("Different furniture count in list and home",
homeFurniture.size(), home.getFurniture().size());
// 3. Create a table that displays home furniture
JTable table = new FurnitureTable(home, preferences);
// Check home furniture count equals table row count
assertEquals("Different furniture count in home and table",
home.getFurniture().size(), table.getRowCount());
// 4. Check the displayed depth in table are different in French and US version
for (int row = 0, n = table.getRowCount(); row < n; row++) {
preferences.setUnit(LengthUnit.INCH);
String widthInInch = getRenderedDepth(table, row);
preferences.setUnit(LengthUnit.CENTIMETER);
String widthInMeter = getRenderedDepth(table, row);
assertFalse("Same depth in different units",
widthInInch.equals(widthInMeter));
}
}
private static List<HomePieceOfFurniture> createHomeFurnitureFromCatalog(
FurnitureCatalog catalog) {
List<HomePieceOfFurniture> homeFurniture = new ArrayList<HomePieceOfFurniture>();
for (FurnitureCategory category : catalog.getCategories()) {
for (CatalogPieceOfFurniture piece : category.getFurniture()) {
homeFurniture.add(new HomePieceOfFurniture(piece));
}
}
return homeFurniture;
}
private String getRenderedDepth(JTable table, int row) {
// Get index of detph column in model
TableColumn depthColumn = table.getColumn(HomePieceOfFurniture.SortableProperty.DEPTH);
// Get depth value at row
TableModel model = table.getModel();
Object cellValue = model.getValueAt(row, depthColumn.getModelIndex());
// Get component used to render the depth cell at row
int tableColumnIndex = table.getColumnModel().getColumnIndex(HomePieceOfFurniture.SortableProperty.DEPTH);
TableCellRenderer renderer = table.getCellRenderer(row, tableColumnIndex);
Component cellLabel = renderer.getTableCellRendererComponent(
table, cellValue, false, false, row, tableColumnIndex);
// Return rendered depth
return ((JLabel)cellLabel).getText();
}
/**
* Tests sort in furniture table.
*/
public void testFurnitureTableSort() {
// 1. Create a home that contains furniture matching catalog furniture
UserPreferences preferences = new DefaultUserPreferences();
List<HomePieceOfFurniture> homeFurniture =
createHomeFurnitureFromCatalog(preferences.getFurnitureCatalog());
Home home = new Home(homeFurniture);
// Check home furniture isn't empty
assertTrue("Home furniture is empty", homeFurniture.size() > 0);
// 2. Create a table that displays home furniture with its controller
FurnitureController furnitureController =
new FurnitureController(home, preferences, new SwingViewFactory());
FurnitureTable table = (FurnitureTable)furnitureController.getView();
// 3. Sort furniture table in alphabetical order of furniture name
furnitureController.sortFurniture(HomePieceOfFurniture.SortableProperty.NAME);
// Check the alphabetical order of table data
assertFurnitureIsSortedByName(table, true);
// 4. Sort in descending order and check order
furnitureController.sortFurniture(HomePieceOfFurniture.SortableProperty.NAME);
// Check table data is sorted in alphabetical descending order
assertFurnitureIsSortedByName(table, false);
// 5. Change first furniture name
HomePieceOfFurniture firstPiece = home.getFurniture().get(0);
firstPiece.setName("Aaaa");
// Check table data is sorted in alphabetical descending order
assertFurnitureIsSortedByName(table, false);
}
private void assertFurnitureIsSortedByName(JTable table,
boolean ascendingOrder) {
int modelColumnIndex = table.getColumn(HomePieceOfFurniture.SortableProperty.NAME).getModelIndex();
TableModel model = table.getModel();
Comparator<Object> comparator = Collator.getInstance();
if (!ascendingOrder)
comparator = Collections.reverseOrder(comparator);
// For each row
for (int row = 0, n = model.getRowCount() - 1; row < n; row++) {
Object value = model.getValueAt(row, modelColumnIndex);
Object nextValue = model.getValueAt(row + 1, modelColumnIndex);
// Check alphabetical order of values at a row and next row
assertTrue("Column not sorted",
comparator.compare(((HomePieceOfFurniture)value).getName(),
((HomePieceOfFurniture)nextValue).getName()) <= 0);
}
}
/**
* Tests filter in furniture table.
*/
public void testFurnitureTableFilter() {
// 1. Create a home that contains furniture matching catalog furniture
UserPreferences preferences = new DefaultUserPreferences();
List<HomePieceOfFurniture> homeFurniture =
createHomeFurnitureFromCatalog(preferences.getFurnitureCatalog());
Home home = new Home(homeFurniture);
// Check home furniture isn't empty
assertTrue("Home furniture is empty", homeFurniture.size() > 0);
// 2. Create a table that displays home furniture with its controller
FurnitureController furnitureController =
new FurnitureController(home, preferences, new SwingViewFactory());
FurnitureTable table = (FurnitureTable)furnitureController.getView();
assertEquals("Home furniture count and row count different", homeFurniture.size(), table.getRowCount());
// Apply a filter on furniture that refuses pieces that are windows
table.setFurnitureFilter(new FurnitureFilter() {
public boolean include(Home home, HomePieceOfFurniture piece) {
return !piece.isDoorOrWindow();
}
});
// Count how many doors and windows are in home
int doorsAndWindowsCount = 0;
HomePieceOfFurniture doorOrWindowPiece = null;
HomePieceOfFurniture otherPiece = null;
for (HomePieceOfFurniture piece : home.getFurniture()) {
if (piece.isDoorOrWindow()) {
doorsAndWindowsCount++;
doorOrWindowPiece = piece;
} else {
otherPiece = piece;
}
}
// Check there's no door or window in table
int homeFurnitureCount = homeFurniture.size();
int tableFilterRowCount = table.getRowCount();
assertEquals("Home furniture count and row count same",
homeFurnitureCount - doorsAndWindowsCount, tableFilterRowCount);
// 3. Add a door or window to home
home.addPieceOfFurniture(new HomePieceOfFurniture(doorOrWindowPiece));
// Check no row were added in table
assertEquals("Wrong furniture count in home", homeFurnitureCount + 1, home.getFurniture().size());
assertEquals("Wrong row count in table", tableFilterRowCount, table.getRowCount());
// 4. Add an other kind of piece to home
home.addPieceOfFurniture(new HomePieceOfFurniture(otherPiece));
// Check one row was added in table
assertEquals("Wrong furniture count in home", homeFurnitureCount + 2, home.getFurniture().size());
assertEquals("Wrong row count in table", tableFilterRowCount + 1, table.getRowCount());
// 5. Test sort and filter internal buffer of the table
furnitureController.sortFurniture(HomePieceOfFurniture.SortableProperty.NAME);
// Check the alphabetical order of table data
assertFurnitureIsSortedByName(table, true);
// Add a door or window and an other kind of piece to home
home.addPieceOfFurniture(new HomePieceOfFurniture(doorOrWindowPiece));
home.addPieceOfFurniture(new HomePieceOfFurniture(otherPiece));
// Check one row was added in sorted table
assertEquals("Wrong furniture count in home", homeFurnitureCount + 4, home.getFurniture().size());
assertEquals("Wrong row count in table", tableFilterRowCount + 2, table.getRowCount());
assertFurnitureIsSortedByName(table, true);
// 6. Remove filter
table.setFurnitureFilter(null);
// Check missing rows are back
assertEquals("Home furniture count and row count different",
home.getFurniture().size(), table.getRowCount());
assertFurnitureIsSortedByName(table, true);
}
public static void main(String [] args) {
UserPreferences preferences = new DefaultUserPreferences();
List<HomePieceOfFurniture> homeFurniture =
createHomeFurnitureFromCatalog(preferences.getFurnitureCatalog());
Home home = new Home(homeFurniture);
// Create a furniture table
JTable table = new FurnitureTable(home, preferences);
JFrame frame = new JFrame("Furniture table Test");
frame.add(new JScrollPane(table));
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}