/*
 * $Id: UIManagerExtTest.java,v 1.2 2008/10/11 20:42:32 rah003 Exp $
 * 
 * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
 * California 95054, U.S.A. All rights reserved.
 */
package org.jdesktop.swingx.plaf;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Insets;
import java.util.Locale;
import java.util.logging.Logger;

import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.UIManager;
import javax.swing.plaf.UIResource;

import org.jdesktop.swingx.icon.EmptyIcon;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.junit.Test;
import org.junit.Before;
import org.junit.After;


import junit.framework.TestCase;

/**
 * Tests the functionality of {@code UIManagerExt}.
 * 
 * @author Karl George Schaefer
 */
@RunWith(JUnit4.class)
public class UIManagerExtTest extends TestCase {
    private static final Logger LOG = Logger.getLogger(UIManagerExtTest.class
            .getName());

    /**
     * {@inheritDoc}
     */
    protected void setUp() {
        UIManagerExt.addResourceBundle("org.jdesktop.swingx.plaf.UIManagerExtTest");
    }
    
    /**
     * Ensure that the {@code getSafeXXX} methods always return
     * {@code UIResource}.
     */
    @Test
    public void testGetSafeMethodsReturnUIResource() {
        assertTrue(UIManagerExt.getSafeBorder("", BorderFactory
                .createEmptyBorder()) instanceof UIResource);
        assertTrue(UIManagerExt.getSafeColor("", Color.RED) instanceof UIResource);
        assertTrue(UIManagerExt.getSafeDimension("", new Dimension()) instanceof UIResource);
        assertTrue(UIManagerExt.getSafeFont("", new Font("Dialog", Font.BOLD,
                12)) instanceof UIResource);
        assertTrue(UIManagerExt.getSafeIcon("", new EmptyIcon()) instanceof UIResource);
        assertTrue(UIManagerExt.getSafeInsets("", new Insets(0, 0, 0, 0)) instanceof UIResource);
    }

    /**
     * test that we get a boolean from the localized resource.
     */
    @Test
    public void testGetBooleanFromResource() {
        String key = "goodBoolean";
        Locale locale = JComponent.getDefaultLocale();
        String columnString = UIManagerExt.getString(key, locale);
        if (columnString == null) {
            LOG.info("cant run test - no resource found for key: " + key);
            return;
        }
        Object value = UIManagerExt.getBoolean(key, locale);
        assertNotNull(value);
        assertEquals(Boolean.valueOf(columnString), value);
    }

    /**
     * test that a value in the UIManager is not overwritten.
     */
    @Test
    public void testGetBooleanUIManagerFirst() {
        String key = "goodBoolean";
        Locale locale = JComponent.getDefaultLocale();
        String columnString = UIManagerExt.getString(key, locale);
        if (columnString == null) {
            LOG.info("cant run test - no resource found for key: " + key);
            return;
        }
        
        try {
            Boolean temp = true;
            UIManager.put(key, temp);
            Object value = UIManagerExt.getBoolean(key, locale);
            assertNotNull(value);
            assertEquals(temp, value);
        } finally {
            // restore uimanager
            UIManager.put(key, null);
        }
    }

    /**
     * test that the getBoolean doesn't choke on non-Booleans
     */
    @Test
    public void testGetBooleanLenientWithUnparseable() {
        String key = "badBoolean";
        Locale locale = JComponent.getDefaultLocale();
        String columnString = UIManagerExt.getString(key, locale);
        if (columnString == null) {
            LOG.info("cant run test - no resource found for key: " + key);
            return;
        }
        
        UIManagerExt.getBoolean(key, locale);
    }
    
    /**
     * test that we get a boolean from the localized resource.
     */
    @Test
    public void testGetColorFromResource() {
        String key = "goodColor";
        Locale locale = JComponent.getDefaultLocale();
        String columnString = UIManagerExt.getString(key, locale);
        if (columnString == null) {
            LOG.info("cant run test - no resource found for key: " + key);
            return;
        }
        Object value = UIManagerExt.getColor(key, locale);
        assertNotNull(value);
        assertEquals(Color.decode(columnString), value);
    }
    
    /**
     * test that a value in the UIManager is not overwritten.
     */
    @Test
    public void testGetColorUIManagerFirst() {
        String key = "goodColor";
        Locale locale = JComponent.getDefaultLocale();
        String columnString = UIManagerExt.getString(key, locale);
        if (columnString == null) {
            LOG.info("cant run test - no resource found for key: " + key);
            return;
        }
        
        try {
            Color temp = Color.RED;
            UIManager.put(key, temp);
            Object value = UIManagerExt.getColor(key, locale);
            assertNotNull(value);
            assertEquals(temp, value);
        } finally {
            // restore uimanager
            UIManager.put(key, null);
        }
    }
    
    /**
     * test that the getBoolean doesn't choke on non-Booleans
     */
    @Test
    public void testGetColorLenientWithUnparseable() {
        String key = "badColor";
        Locale locale = JComponent.getDefaultLocale();
        String columnString = UIManagerExt.getString(key, locale);
        if (columnString == null) {
            LOG.info("cant run test - no resource found for key: " + key);
            return;
        }
        
        try {
            Color.decode(columnString);
            LOG.info("cant run test - valid integer: " + columnString);
        } catch (Exception ex) {
            // must not bark
            UIManagerExt.getColor(key, locale);
        }
    }

    //TODO remove or reenable after getFont is finalized
//    /**
//     * test that we get a font from the localized resource.
//     */
//    public void testGetFontFromResource() {
//        String key = "goodFont";
//        Locale locale = JComponent.getDefaultLocale();
//        String columnString = UIManagerExt.getString(key, locale);
//        if (columnString == null) {
//            LOG.info("cant run test - no resource found for key: " + key);
//            return;
//        }
//        Object value = UIManagerExt.getFont(key, locale);
//        assertNotNull(value);
//        assertEquals(Font.decode(columnString), value);
//    }
//    
//    /**
//     * test that a value in the UIManager is not overwritten.
//     */
//    public void testGetFontUIManagerFirst() {
//        String key = "goodFont";
//        Locale locale = JComponent.getDefaultLocale();
//        String columnString = UIManagerExt.getString(key, locale);
//        if (columnString == null) {
//            LOG.info("cant run test - no resource found for key: " + key);
//            return;
//        }
//        
//        try {
//            Font temp = new Font("Dialog", Font.ITALIC, 11);
//            UIManager.put(key, temp);
//            Object value = UIManagerExt.getFont(key, locale);
//            assertNotNull(value);
//            assertEquals(temp, value);
//        } finally {
//            // restore uimanager
//            UIManager.put(key, null);
//        }
//    }
//    
//    /**
//     * test that the getFont doesn't choke on non-Fonts
//     */
//    public void testGetFontLenientWithUnparseable() {
//        String key = "badFont";
//        Locale locale = JComponent.getDefaultLocale();
//        String columnString = UIManagerExt.getString(key, locale);
//        if (columnString == null) {
//            LOG.info("cant run test - no resource found for key: " + key);
//            return;
//        }
//        
//        try {
//            System.err.println(Font.decode(columnString));
//            Font.decode(columnString);
//            LOG.info("cant run test - valid integer: " + columnString);
//        } catch (Exception ex) {
//            // must not bark
//            UIManagerExt.getFont(key, locale);
//        }
//    }
    
    /**
     * test that we get an int from the localized resource.
     */
    @Test
    public void testGetIntFromResource() {
        String key = "goodInt";
        Locale locale = JComponent.getDefaultLocale();
        String columnString = UIManagerExt.getString(key, locale);
        if (columnString == null) {
            LOG.info("cant run test - no resource found for key: " + key);
            return;
        }
        Object value = UIManagerExt.getInt(key, locale);
        assertNotNull(value);
        assertEquals(Integer.decode(columnString), value);
    }

    /**
     * test that a value in the UIManager is not overwritten.
     */
    @Test
    public void testGetIntUIManagerFirst() {
        String key = "goodInt";
        Locale locale = JComponent.getDefaultLocale();
        String columnString = UIManagerExt.getString(key, locale);
        if (columnString == null) {
            LOG.info("cant run test - no resource found for key: " + key);
            return;
        }
        
        try {
            Integer temp = 150;
            UIManager.put(key, temp);
            Object value = UIManagerExt.getInt(key, locale);
            assertNotNull(value);
            assertEquals(temp, value);
        } finally {
            // restore uimanager
            UIManager.put(key, null);
        }
    }

    /**
     * test that the getInt doesn't choke on non-numbers
     */
    @Test
    public void testGetIntLenientWithUnparseable() {
        String key = "badInt";
        Locale locale = JComponent.getDefaultLocale();
        String columnString = UIManagerExt.getString(key, locale);
        if (columnString == null) {
            LOG.info("cant run test - no resource found for key: " + key);
            return;
        }
        try {
            Integer.decode(columnString);
            LOG.info("cant run test - valid integer: " + columnString);
        } catch (Exception ex) {
            // must not bark
            UIManagerExt.getInt(key, locale);
        }
    }
}
