/*******************************************************************************
 * 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.core.tests.builder;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Arrays;

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

import org.eclipse.core.runtime.IPath;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.tests.util.Util;

public class PackageInfoTest extends Tests {
	
public PackageInfoTest(String name) {
	super(name);
}
	// Static initializer to specify tests subset using TESTS_* static variables
	// All specified tests which does not belong to the class are skipped...
//	static {
//		TESTS_NAMES = new String[] { "test000" };
//		TESTS_NUMBERS = new int[] { 31 };
//		TESTS_RANGE = new int[] { 21, 50 };
//	}
	public static Test suite() {
        return new TestSuite(PackageInfoTest.class);
	}
public void test001() throws JavaModelException {
    IPath projectPath = env.addProject("Project", "1.5"); //$NON-NLS-1$
    env.addExternalJars(projectPath, Util.getJavaClassLibs());
    fullBuild(projectPath);
    
    // remove old package fragment root so that names don't collide
    env.removePackageFragmentRoot(projectPath, ""); //$NON-NLS-1$
    
    IPath root = env.addPackageFragmentRoot(projectPath, "src"); //$NON-NLS-1$
    env.setOutputFolder(projectPath, "bin"); //$NON-NLS-1$
    
    env.addClass(root, "pack", "Annot", //$NON-NLS-1$ //$NON-NLS-2$
        "package pack;\n"+ //$NON-NLS-1$
        "public @interface Annot {}" //$NON-NLS-1$
    );

    incrementalBuild(projectPath);
   
    IPath packageInfoPath = env.addFile(root, "pack/package-info.java", //$NON-NLS-1$ //$NON-NLS-2$
        "@Annot package p1" //$NON-NLS-1$
    );
        
    incrementalBuild(projectPath);
    expectingOnlyProblemsFor(packageInfoPath);
    final Problem[] problems = env.getProblems();
	Arrays.sort(problems);
    assertNotNull(problems);
    final StringWriter stringWriter = new StringWriter();
    final PrintWriter writer = new PrintWriter(stringWriter);
    final int problemsLength = problems.length;
    if (problemsLength == 1) {
        writer.print(problems[0].getMessage());    
    } else {
        for (int i = 0; i < problemsLength - 1; i++) {
            writer.println(problems[i].getMessage());
        }
        writer.print(problems[problemsLength - 1].getMessage());
    }
    writer.close();
    final String expectedOutput =
        "Syntax error on token \"p1\", ; expected after this token\n" + 
    	"The declared package does not match the expected package pack"; 
    assertSourceEquals("Different messages", expectedOutput, stringWriter.toString());
}
public void test002() throws JavaModelException {
    IPath projectPath = env.addProject("Project", "1.5"); //$NON-NLS-1$
    env.addExternalJars(projectPath, Util.getJavaClassLibs());
    fullBuild(projectPath);
    
    // remove old package fragment root so that names don't collide
    env.removePackageFragmentRoot(projectPath, ""); //$NON-NLS-1$
    
    IPath root = env.addPackageFragmentRoot(projectPath, "src"); //$NON-NLS-1$
    env.setOutputFolder(projectPath, "bin"); //$NON-NLS-1$
    
    env.addClass(root, "testcase", "Main", //$NON-NLS-1$ //$NON-NLS-2$
		"package testcase;\n" +
		"\n" +
		"public class Main {\n" +
		"    public static void main(String[] argv) throws Exception {\n" +
        "		Package pkg = Package.getPackage(\"testcase\");\n" +
        "		System.out.print(pkg.getAnnotation(TestAnnotation.class));\n" +
		"		pkg = Class.forName(\"testcase.package-info\").getPackage();\n" +
		"		System.out.print(pkg.getAnnotation(TestAnnotation.class));\n" +
		"    }\n" +
		"}"
    );

    env.addClass(root, "testcase", "TestAnnotation", //$NON-NLS-1$ //$NON-NLS-2$
		"package testcase;\n" +
		"\n" +
		"import static java.lang.annotation.ElementType.PACKAGE;\n" +
		"import static java.lang.annotation.RetentionPolicy.RUNTIME;\n" +
		"\n" +
		"import java.lang.annotation.Retention;\n" +
		"import java.lang.annotation.Target;\n" +
		"\n" +
		"@Target(PACKAGE)\n" +
		"@Retention(RUNTIME)\n" +
		"public @interface TestAnnotation {\n" +
		"}"
        );
   
    env.addFile(root, "testcase/package-info.java", //$NON-NLS-1$ //$NON-NLS-2$
        "@TestAnnotation package testcase;" //$NON-NLS-1$
    );
        
    incrementalBuild(projectPath);
	expectingNoProblems();
	executeClass(projectPath, "testcase.Main", "@testcase.TestAnnotation()@testcase.TestAnnotation()", ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
protected void assertSourceEquals(String message, String expected, String actual) {
    if (actual == null) {
        assertEquals(message, expected, null);
        return;
    }
    actual = org.eclipse.jdt.core.tests.util.Util.convertToIndependantLineDelimiter(actual);
    if (!actual.equals(expected)) {
        System.out.print(org.eclipse.jdt.core.tests.util.Util.displayString(actual.toString(), 0));
    }
    assertEquals(message, expected, actual);
}
public static Class testClass() {
	return PackageInfoTest.class;
}
}
