package org.eclipse.jface.tests.preferences;

import org.eclipse.core.runtime.Platform;
import org.eclipse.jdt.junit.util.UITestCase;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.jface.resource.FontRegistry;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.plugin.AbstractUIPlugin;

/**
 * The FontPreferenceTestCase tests adding fonts to
 * the preference store and what occurs if the values
 * are bogus
 */

public class FontPreferenceTestCase extends UITestCase {

	public String BAD_FONT_DEFINITION = "BadFont-regular-10";
	public String TEST_FONT_ID = "org.eclipse.jface.tests.preference.testfont";
	public String MISSING_FONT_ID =
		"org.eclipse.jface.tests.preference.missingfont";

	private IPreferenceStore preferenceStore;

	/**
	 * Constructor for FontPreferenceTestCase.
	 * @param testName
	 */
	public FontPreferenceTestCase(String testName) {
		super(testName);
	}

	/*
	 * @see TestCase#setUp
	 */
	protected void setUp() throws Exception {
		super.setUp();
		AbstractUIPlugin plugin =
			(AbstractUIPlugin) Platform.getPlugin(PlatformUI.PLUGIN_ID);
		preferenceStore = plugin.getPreferenceStore();

		FontRegistry registry = JFaceResources.getFontRegistry();
		//Set up the bogus entry for the bad first test
		FontData bogusData = new FontData();
		bogusData.setName("BadData");
		bogusData.setHeight(11);
		FontData[] storedValue = new FontData[2];

		//We assume here that the text font is OK
		storedValue[0] = bogusData;
		storedValue[1] =
			(PreferenceConverter
				.getDefaultFontDataArray(preferenceStore, JFaceResources.TEXT_FONT))[0];
		PreferenceConverter.setValue(preferenceStore,TEST_FONT_ID,storedValue);
		PreferenceConverter.setDefault(preferenceStore,TEST_FONT_ID,storedValue);

	}
	
	
	/**
	 * Test for a valid font like the test font. The first good one
	 * we should find should be the first one in the list.
	 */
	
	public void testGoodFontDefinition(){
		
		FontRegistry fontRegistry = JFaceResources.getFontRegistry();
		FontData[] currentTextFonts = 
			PreferenceConverter.getFontDataArray(preferenceStore, JFaceResources.TEXT_FONT);
		FontData bestFont = fontRegistry.bestData(currentTextFonts,Display.getCurrent());
		
		//Assert that it is the first font that we get as the
		//valid one
		assertEquals(bestFont.getName(),currentTextFonts[0].getName());
		assertEquals(bestFont.getHeight(),currentTextFonts[0].getHeight());
	}
	
	/**
	 * Test that if the first font in the list is bad that the 
	 * second one comes back as valid.
	 */
	
	public void testBadFirstFontDefinition(){
		
		FontRegistry fontRegistry = JFaceResources.getFontRegistry();
		FontData[] currentTestFonts = 
			PreferenceConverter.getFontDataArray(preferenceStore, TEST_FONT_ID);
		FontData bestFont = fontRegistry.bestData(currentTestFonts,Display.getCurrent());
		
		//Assert that it is the second font that we get as the
		//valid one
		assertEquals(bestFont.getName(),currentTestFonts[1].getName());
		assertEquals(bestFont.getHeight(),currentTestFonts[1].getHeight());
	}
	
	/**
	 * Test that the no valid font is returned when the entry
	 * is missing.
	 */
	
	public void testNoFontDefinition(){
		
		FontRegistry fontRegistry = JFaceResources.getFontRegistry();
		FontData[] currentTestFonts = 
			PreferenceConverter.getFontDataArray(preferenceStore, MISSING_FONT_ID);
		FontData bestFont = fontRegistry.bestData(currentTestFonts,Display.getCurrent());
		
		FontData[] systemFontData = Display.getCurrent().getSystemFont().getFontData();
		
		//Assert that the first font is the system font
		assertEquals(bestFont.getName(),systemFontData[0].getName());
		assertEquals(bestFont.getHeight(),systemFontData[0].getHeight());
	}
}