/*******************************************************************************
 * Copyright (c) 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.xml.tests.encoding.properties;

import junit.framework.TestCase;

import org.eclipse.wst.sse.core.internal.encoding.CommonCharsetNames;

public class TestCommonNames extends TestCase {

	private static final boolean DEBUG = false;

	public void testCommonNames() {
		String[] names = CommonCharsetNames.getCommonCharsetNames();
		assertTrue("common charset names could not be loaded", names != null && names.length > 0);
		if (DEBUG) {
			for (int i = 0; i < names.length; i++) {
				String name = names[i];
				String displayName = CommonCharsetNames.getDisplayString(name);
				System.out.println( name + "    " + displayName);
			}
		}
	}
	
	public void doTestDefaultIanaNames(String stringToCheck, String defaultName, String expected) {
		String actual = CommonCharsetNames.getPreferredDefaultIanaName(stringToCheck, defaultName);
		assertEquals("default IANA name test failed for " + stringToCheck, expected, actual);
	}

	public void testASCII() {
		doTestDefaultIanaNames("ASCII", "UTF-8", "US-ASCII");
	}
	
	public void testCp1252() {
		doTestDefaultIanaNames("Cp1252", "UTF-8", "ISO-8859-1");
	}
	
	public void testMS950() {
		doTestDefaultIanaNames("MS950", "UTF-8", "BIG5");
	}
	
	public void testCp1256() {
		doTestDefaultIanaNames("Cp1256", "UTF-8", "windows-1256");
	}
	
	public void testMS949() {
		doTestDefaultIanaNames("MS949", "UTF-8", "EUC-KR");
	}
	
	public void testEUC_JP() {
		doTestDefaultIanaNames("EUC-JP", "UTF-8", "EUC-JP");
	}
	
	public void testTotallyFake() {
		doTestDefaultIanaNames("totallyFake", "UTF-8", "UTF-8");
	}
	
	public void testSystemEncoding() {
		String systemEnc = System.getProperty("file.encoding");
		if (systemEnc != null) {
			String actual = CommonCharsetNames.getPreferredDefaultIanaName(systemEnc, "UTF-8");
			assertNotNull("default IANA name test failed for system encoding " + systemEnc, actual);
		}
	}
}