/*
 * $Id$
 *
 * Copyright 2009 Sun Microsystems, Inc., 4150 Network Circle,
 * Santa Clara, California 95054, U.S.A. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * 
 * This library 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
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 */
package org.jdesktop.swingx.sort;

import java.awt.Color;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;

import javax.swing.RowFilter;
import javax.swing.SortOrder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

import org.jdesktop.test.AncientSwingTeam;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

/**
 * Unit test of TableSortController.
 * 
 * @author Jeanette Winzenburg
 */
@RunWith(JUnit4.class)
public class TableSortControllerTest extends AbstractTestSortController<TableSortController<TableModel>, TableModel> {
    @SuppressWarnings("unused")
    private static final Logger LOG = Logger
            .getLogger(TableSortControllerTest.class.getName());
    


    public static void main(String[] args) {
        TableSortControllerTest test = new TableSortControllerTest();
        try {
            test.runInteractiveTests();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

//--------------- start of #1291-swingx related tests
//--------------- PENDING JW: uncomment if the change is uncommented    
//    /**
//     * Core Issue http://forums.sun.com/thread.jspa?messageID=10939199#10939199
//     * 
//     * Table looses selection of last row if deleted before last.
//     * 
//     * Here: DefaultRowSorter conversion throws too much if not sorted.
//     */
//    @Test
//    public void testViewRowCountAfterRemoveNotSorted() {
//        int rows = controller.getModelRowCount();
//        ((AncientSwingTeam) controller.getModel()).removeRows(0, 1);
//        assertEquals(rows, controller.getViewRowCount());
//    }
//    
//    /**
//     * Core Issue http://forums.sun.com/thread.jspa?messageID=10939199#10939199
//     * 
//     * Table looses selection of last row if deleted before last.
//     * 
//     * Here: DefaultRowSorter conversion throws too much if not sorted.
//     */
//    @Test
//    public void testViewRowCountAfterInsertNotSorted() {
//        int rows = controller.getModelRowCount();
//        ((AncientSwingTeam) controller.getModel()).insertRows(0, 1);
//        assertEquals(rows, controller.getViewRowCount());
//    }
//    
//    
//    /**
//     * Core Issue http://forums.sun.com/thread.jspa?messageID=10939199#10939199
//     * 
//     * Table looses selection of last row if deleted before last.
//     * 
//     * Here: DefaultRowSorter conversion throws too much if not sorted.
//     */
//    @Test
//    public void testModelRowCountAfterRemoveNotSorted() {
//        int rows = controller.getModelRowCount();
//        ((AncientSwingTeam) controller.getModel()).removeRows(0, 1);
//        assertEquals(rows, controller.getModelRowCount());
//    }
//    
//    /**
//     * Core Issue http://forums.sun.com/thread.jspa?messageID=10939199#10939199
//     * 
//     * Table looses selection of last row if deleted before last.
//     * 
//     * Here: DefaultRowSorter conversion throws too much if not sorted.
//     */
//    @Test
//    public void testModelRowCountAfterInsertNotSorted() {
//        int rows = controller.getModelRowCount();
//        ((AncientSwingTeam) controller.getModel()).insertRows(0, 1);
//        assertEquals(rows, controller.getModelRowCount());
//    }
//    
//--------------- end of #1291 related tests    

    /**
     * Issue #1156-swingx: sorter must use comparable if available
     * TableSortController
     */
    @Test
    public void testComparableComparatorTable() {
        TableModel model = new DefaultTableModel(2, 1) {
            
            @Override
            public Class<?> getColumnClass(int columnIndex) {
                return Integer.class;
            }
            
        };
        model.setValueAt(10, 0, 0);
        model.setValueAt(2, 1, 0);
        TableSortController<TableModel> sorter = new TableSortController<TableModel>(model);
        sorter.setSortOrder(0, SortOrder.ASCENDING);
        assertEquals(0, sorter.convertRowIndexToModel(1));
    }
    
    /**
     * Issue #1156-swingx: sorter must use comparable if available
     * fix for that (comparator update falls back to collator) introduced a 
     * ClassCastException - useString must be implemented the same way
     */
    @Test
    public void testUseString() {
        controller.setSortOrder(2, SortOrder.ASCENDING);
    }
    /**
     * 
      */
    @Test
    public void testUseStringValueProvider() {
        registry.setStringValue(sv, Color.class);
        controller.setStringValueProvider(registry);
        RowFilter<Object, Object> filter = RowFilter.regexFilter("R/G/B: -2", 2);
        controller.setRowFilter(filter);
        assertTrue("view row count: " + controller.getViewRowCount(), controller.getViewRowCount() > 0);
    }

    @Override
    protected int getColumnCount() {
        return ((TableModel) controller.getModel()).getColumnCount();
    }
    

//-------------------- utility methods and setup
    
    /**
     * @param registry2
     * @param teamModel2
     */
    private void initColumnClasses(StringValueRegistry registry,
            TableModel model) {
        Map<Integer, Class<?>> classPerColumn = new HashMap<Integer, Class<?>>();
        for (int i = 0; i < model.getColumnCount(); i++) {
            if (!Object.class.equals(model.getColumnClass(i))) {
                classPerColumn.put(i, model.getColumnClass(i));
            }
        }
        registry.setColumnClasses(classPerColumn);
    }

    /**
     * @param registry2
     * @param class1
     */
    @SuppressWarnings("unused")
    private void installPerClass(StringValueRegistry registry,
            Class<?>... clazz ) {
        Map<Integer, Class<?>> classPerColumn = new HashMap<Integer, Class<?>>();
        for (int i = 0; i < clazz.length; i++) {
            classPerColumn.put(i, clazz[i]);
        }
        registry.setColumnClasses(classPerColumn);
    }

    @Override
    protected TableSortController<TableModel> createDefaultSortController(
            TableModel model) {
        return new TableSortController<TableModel>(model);
    }


    @Override
    protected TableModel createModel() {
        return new AncientSwingTeam();
    }


    @Override
    protected void setupModelDependentState(TableModel model) {
      initColumnClasses(registry,  model);

    }

    
}
