/*******************************************************************************
 * Copyright (c) 2000, 2005 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.jdt.ui.tests.nls;

import java.io.File;
import java.util.Properties;

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;

import org.eclipse.core.filebuffers.FileBuffers;
import org.eclipse.core.filebuffers.ITextFileBuffer;
import org.eclipse.core.filebuffers.ITextFileBufferManager;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;

import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.Region;

import org.eclipse.jdt.core.IClassFile;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.core.dom.TypeDeclaration;

import org.eclipse.jdt.internal.corext.dom.NodeFinder;
import org.eclipse.jdt.internal.corext.refactoring.nls.AccessorClassReference;
import org.eclipse.jdt.internal.corext.refactoring.nls.NLSHintHelper;

import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.javaeditor.ASTProvider;

import org.eclipse.jdt.testplugin.JavaProjectHelper;
import org.eclipse.jdt.testplugin.JavaTestPlugin;

import org.eclipse.jdt.ui.tests.core.ProjectTestSetup;


/**
 * Tests the NLSHintHelper.
 * 
 * @since 3.1
 */
public class NLSHintHelperTest extends TestCase {

	private IJavaProject fJProject;
	private IPackageFragmentRoot fLibrary;

	
	public static Test suite() {
		return new ProjectTestSetup(new TestSuite(NLSHintHelperTest.class));
	}


	protected void setUp() throws Exception {
		fJProject= ProjectTestSetup.getProject();
		File lib= JavaTestPlugin.getDefault().getFileInPlugin(JavaProjectHelper.NLS_LIB);
		assertTrue("lib does not exist",  lib != null && lib.exists());
		fLibrary= JavaProjectHelper.addLibrary(fJProject, Path.fromOSString(lib.getPath())); // add library to project
	}
	
	public void testFindInJAR() {
		try {
			assertNotNull(NLSHintHelper.getResourceBundle(fLibrary, "pkg", "Messages.properties"));
		} catch (JavaModelException e) {
			fail();
		}
		IPackageFragment pkg= fLibrary.getPackageFragment("pkg");
		IClassFile classFile= pkg.getClassFile("Client.class");
		IRegion region= new Region(648, 4);
		CompilationUnit ast= JavaPlugin.getDefault().getASTProvider().getAST(classFile, ASTProvider.WAIT_YES, null);
		AccessorClassReference accessor= NLSHintHelper.getAccessorClassReference(ast, region);
		assertNotNull(accessor);
		Properties properties= NLSHintHelper.getProperties(fJProject, accessor);
		assertNotNull(properties);
		assertEquals("Hello World", properties.get("test"));
		try {
			assertNotNull(NLSHintHelper.getResourceBundle(fJProject, accessor));
		} catch (JavaModelException e1) {
			fail();
		}
		
	}
	
	public void testDoNotFindInJAR() {
		try {
			assertNull(NLSHintHelper.getResourceBundle(fJProject, "pkg", "Messages.properties"));
		} catch (JavaModelException e) {
			fail();
		}
	}
	
	public void testFindInDirtyBuffer() {
		ITextFileBufferManager manager= FileBuffers.getTextFileBufferManager();
		assertNotNull(manager);
		
		IPath nonExistentPath= fJProject.getProject().getFullPath().append("" + System.currentTimeMillis());
		try {
			manager.connect(nonExistentPath, null);
		} catch (CoreException e) {
			fail();
		}
		try {
			ITextFileBuffer buffer= manager.getTextFileBuffer(nonExistentPath);
			buffer.getDocument().set("newKey= newValue");
			
			IFile nonExistentFile= ResourcesPlugin.getWorkspace().getRoot().getFile(nonExistentPath);
	
			Properties properties= NLSHintHelper.getProperties(nonExistentFile);
			String newValue= properties.getProperty("newKey");
			assertEquals("newValue", newValue);
		} finally {
			try {
				manager.disconnect(nonExistentPath, null);
			} catch (CoreException e1) {
				// ignore: test itself was already successful
			}
		}
	}
	
	public void testDoNotFindDirtyBuffer() {
		ITextFileBufferManager manager= FileBuffers.getTextFileBufferManager();
		assertNotNull(manager);
		
		IPath nonExistentPath= fJProject.getProject().getFullPath().append("" + System.currentTimeMillis());
		try {
			manager.connect(nonExistentPath, null);
		} catch (CoreException e) {
			fail();
		}
		try {
			ITextFileBuffer buffer= manager.getTextFileBuffer(nonExistentPath);
			buffer.getDocument().set("newKey= newValue");
			
			IFile nonExistentFile= ResourcesPlugin.getWorkspace().getRoot().getFile(nonExistentPath);
	
			Properties properties= NLSHintHelper.getProperties(nonExistentFile);
			String newValue= properties.getProperty("nonExistingValue");
			assertEquals(newValue, null);
		} finally {
			try {
				manager.disconnect(nonExistentPath, null);
			} catch (CoreException e1) {
				// ignore: test itself was already successful
			}
		}
	}
	
	public void testFindInFile() {
		ITextFileBufferManager manager= FileBuffers.getTextFileBufferManager();
		assertNotNull(manager);
		
		String fileName= "" + System.currentTimeMillis();
		IPath nonExistentPath= fJProject.getProject().getFullPath().append(fileName);
		IPath nonExistentLocation= fJProject.getProject().getLocation().append(fileName);
		
		try {
			manager.connect(nonExistentLocation, null);
		} catch (CoreException e) {
			fail();
		}
		try {
			ITextFileBuffer buffer= manager.getTextFileBuffer(nonExistentLocation);
			buffer.getDocument().set("newKey= newValue");
			buffer.commit(null, false);
			
			fJProject.getProject().refreshLocal(IResource.DEPTH_ONE, null);
			
			IFile existentFile= ResourcesPlugin.getWorkspace().getRoot().getFile(nonExistentPath);
			assertEquals(true, existentFile.exists());
	
			Properties properties= NLSHintHelper.getProperties(existentFile);
			String newValue= properties.getProperty("newKey");
			assertEquals("newValue", newValue);
		} catch (CoreException ex) {
			fail();
		} finally {
			try {
				manager.disconnect(nonExistentPath, null);
			} catch (CoreException e1) {
				// ignore: test itself was already successful
			}
		}
	}
	
	public void testDoNotFindInFile() {
		ITextFileBufferManager manager= FileBuffers.getTextFileBufferManager();
		assertNotNull(manager);
		
		String fileName= "" + System.currentTimeMillis();
		IPath nonExistentPath= fJProject.getProject().getFullPath().append(fileName);
		IPath nonExistentLocation= fJProject.getProject().getLocation().append(fileName);
		try {
			manager.connect(nonExistentLocation, null);
		} catch (CoreException e) {
			fail();
		}
		try {
			ITextFileBuffer buffer= manager.getTextFileBuffer(nonExistentLocation);
			buffer.getDocument().set("newKey= newValue");
			buffer.commit(null, false);
			
			fJProject.getProject().refreshLocal(IResource.DEPTH_ONE, null);
			
			IFile existentFile= ResourcesPlugin.getWorkspace().getRoot().getFile(nonExistentPath);
			assertEquals(true, existentFile.exists());
	
			Properties properties= NLSHintHelper.getProperties(existentFile);
			String newValue= properties.getProperty("nonExistingValue");
			assertEquals(newValue, null);
		} catch (CoreException ex) {
			fail();
		} finally {
			try {
				manager.disconnect(nonExistentPath, null);
			} catch (CoreException e1) {
				// ignore: test itself was already successful
			}
		}
	}
	
	public void testFindResourceBundleName1f() throws Exception {
	    String source=
			"package test;\n" +
			"public class TestMessages {\n" +
			"	private static final String BUNDLE_NAME = \"test.test\";\n" +
			"	public static String getString(String s) {" +
			"		return \"\";\n" +
			"	}\n" +
			"}\n";
	    
	    
	    assertEquals("test.test", getResourceBundleName(source, "TestMessages", "test"));
	}
	
	public void testFindResourceBundleName1s() throws Exception {
	    String source=
			"package test;\n" +
			"public class TestMessages {\n" +
			"	private static String BUNDLE_NAME;\n" +
			"   static {\n" +
			"		BUNDLE_NAME= \"test.test\";\n" +
			"   }\n" +
			"	public static String getString(String s) {" +
			"		return \"\";\n" +
			"	}\n" +
			"}\n";
	    
	    
	    assertEquals("test.test", getResourceBundleName(source, "TestMessages", "test"));
	}
	
	public void testFindResourceBundleName2f() throws Exception {
	    String source=
			"package test;\n" +
			"public class TestMessages {\n" +
			"	private static final String BUNDLE_NAME = TestMessages.class.getName();\n" +
			"	public static String getString(String s) {\n" +
			"		return \"\";\n" +
			"	}\n" +
			"}\n";
	    
	    assertEquals("test.TestMessages", getResourceBundleName(source, "TestMessages", "test"));
	}
	
	public void testFindResourceBundleName2s() throws Exception {
	    String source=
			"package test;\n" +
			"public class TestMessages {\n" +
			"	private static String BUNDLE_NAME;\n" +
			"   static {\n" +
			"		BUNDLE_NAME = TestMessages.class.getName();\n" +
			"   }\n" +
			"	public static String getString(String s) {\n" +
			"		return \"\";\n" +
			"	}\n" +
			"}\n";
	    
	    assertEquals("test.TestMessages", getResourceBundleName(source, "TestMessages", "test"));
	}
	
	public void testFindResourceBundleName3f() throws Exception {
	    String source=
			"package test;\n" +
			"import java.util.ResourceBundle;\n" +
			"public class TestMessages {\n" +
			"	private static final ResourceBundle b= ResourceBundle.getBundle(TestMessages.class.getName());\n" +
			"	public static String getString(String s) {\n" +
			"		return \"\";\n" +
			"	}\n" +
			"}\n";
	    
	    assertEquals("test.TestMessages", getResourceBundleName(source, "TestMessages", "test"));
	}
	
	public void testFindResourceBundleName3s() throws Exception {
	    String source=
			"package test;\n" +
			"import java.util.ResourceBundle;\n" +
			"public class TestMessages {\n" +
			"	private static ResourceBundle b;\n" +
			"   static {\n" +
			"		b= ResourceBundle.getBundle(TestMessages.class.getName());\n" +
			"   }\n" +
			"	public static String getString(String s) {\n" +
			"		return \"\";\n" +
			"	}\n" +
			"}\n";
	    
	    assertEquals("test.TestMessages", getResourceBundleName(source, "TestMessages", "test"));
	}
	
	public void testFindResourceBundleName4f() throws Exception {
	    String source=
			"package test;\n" +
			"import java.util.ResourceBundle;\n" +
			"public class TestMessages {\n" +
			"	private static final ResourceBundle b= ResourceBundle.getBundle(\"test.test\");\n" +
			"	public static String getString(String s) {\n" +
			"		return \"\";\n" +
			"	}\n" +
			"}\n";
	    
	    assertEquals("test.test", getResourceBundleName(source, "TestMessages", "test"));
	}
	
	public void testFindResourceBundleName4s() throws Exception {
	    String source=
			"package test;\n" +
			"import java.util.ResourceBundle;\n" +
			"public class TestMessages {\n" +
			"	private static ResourceBundle b;\n" +
			"   static {\n" +
			"		b= ResourceBundle.getBundle(\"test.test\");\n" +
			"   }\n" +
			"	public static String getString(String s) {\n" +
			"		return \"\";\n" +
			"	}\n" +
			"}\n";
	    
	    assertEquals("test.test", getResourceBundleName(source, "TestMessages", "test"));
	}
	
	public void testFindResourceBundleName5f() throws Exception {
	    String source=
			"package test;\n" +
			"import java.util.ResourceBundle;\n" +
			"public class TestMessages {\n" +
			"	private static final String RESOURCE_BUNDLE= TestMessages.class.getName();\n" +
			"	private static final ResourceBundle b= ResourceBundle.getBundle(RESOURCE_BUNDLE);\n" +
			"	public static String getString(String s) {\n" +
			"		return \"\";\n" +
			"	}\n" +
			"}\n";
	    
	    assertEquals("test.TestMessages", getResourceBundleName(source, "TestMessages", "test"));
	}
	
	public void testFindResourceBundleName5s() throws Exception {
	    String source=
			"package test;\n" +
			"import java.util.ResourceBundle;\n" +
			"public class TestMessages {\n" +
			"	private static final String RESOURCE_BUNDLE= TestMessages.class.getName();\n" +
			"	private static ResourceBundle b;\n" +
			"   static {\n" +
			"		b= ResourceBundle.getBundle(RESOURCE_BUNDLE);\n" +
			"   }\n" +
			"	public static String getString(String s) {\n" +
			"		return \"\";\n" +
			"	}\n" +
			"}\n";
	    
	    assertEquals("test.TestMessages", getResourceBundleName(source, "TestMessages", "test"));
	}
	
	public void testFindResourceBundleName6() throws Exception {
	    String source=
			"package test;\n" +
			"import java.util.ResourceBundle;\n" +
			"public class TestMessages {\n" +
			"	private static final String RESOURCE_BUNDLE= TestMessages.class.getName();\n" +
			"	private static ResourceBundle fgResourceBundle= ResourceBundle.getBundle(RESOURCE_BUNDLE);\n" + 
			"	public static String getString(String s) {\n" +
			"		return \"\";\n" +
			"	}\n" +
			"}\n";
	    
	    assertEquals("test.TestMessages", getResourceBundleName(source, "TestMessages", "test"));
	}
	
	private String getResourceBundleName(String source, String className, String packageName) throws Exception {
		// Create CU
	    IPackageFragmentRoot sourceFolder = JavaProjectHelper.addSourceContainer(fJProject, "src");
        IPackageFragment pack = sourceFolder.createPackageFragment(packageName, false, null);
        ICompilationUnit  cu= pack.createCompilationUnit(className + ".java", source, false, null);

        // Get type binding
        CompilationUnit ast= JavaPlugin.getDefault().getASTProvider().getAST(cu, ASTProvider.WAIT_YES, null);
        ASTNode node= NodeFinder.perform(ast, cu.getType(className).getSourceRange());
        ITypeBinding typeBinding= ((TypeDeclaration)node).resolveBinding();
        
        return  NLSHintHelper.getResourceBundleName(typeBinding);
	}

	protected void tearDown() throws Exception {
		JavaProjectHelper.clear(fJProject, ProjectTestSetup.getDefaultClasspath());
	}
}
