/*******************************************************************************
 * Copyright (c) 2009, 2010 Nokia 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:
 *     Ed Swartz (Nokia) - initial API and implementation, based on GCCErrorParserTests
 *******************************************************************************/
package org.eclipse.cdt.core.internal.errorparsers.tests;


import java.io.IOException;

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


/**
 * This test is designed to exercise the error parser capabilities for GNU ld.
 */
public class GLDErrorParserTests extends GenericErrorParserTests {

	public GLDErrorParserTests() {
		super();
	}

	public static Test suite() {
		TestSuite suite = new TestSuite(GLDErrorParserTests.class);
		return suite;
	}

	public void testLinkerMessages0() throws IOException {
		runParserTest(
				// old style: no colons before sections
				new String[] {
						"make -k all",
						"gcc -o hallo.o main.c libfoo.a",
						"main.c(.text+0x14): undefined reference to `foo()'",
						"main.o(.rodata+0x14): undefined reference to `something'",
						"make: Target `all' not remade because of errors.",
				},
				2, // errors
				0, // warnings
				0, // Infos
				new String[] {"main.c","main.o"},
				new String[] {
						"undefined reference to `foo()'",
						"undefined reference to `something'"
					},
				new String[]{GLD_ERROR_PARSER_ID}
			);
	}
	
	public void testLinkerMessages1() throws IOException {
		runParserTest(
				// new style: colons before sections
				new String[] {
						"make -k all",
						"gcc -o hallo.o main.c libfoo.a",
						"main.c:(.text+0x14): undefined reference to `foo()'",
						"main.o:(.rodata+0x14): undefined reference to `something'",
						"make: Target `all' not remade because of errors.",
				},
				2, // errors
				0, // warnings
				0, // Infos
				new String[] {"main.c","main.o"},
				new String[] {
						"undefined reference to `foo()'",
						"undefined reference to `something'"
					},
				new String[]{GLD_ERROR_PARSER_ID}
			);
	}

	public void testLinkerMessages2() throws IOException {
		runParserTest(
				new String[] {
						"make -k all",
						"gcc -o hallo.o main.c libfoo.a",
						"libfoo.a(foo.o): In function `foo':",
						"foo.c:(.text+0x7): undefined reference to `bar'",
						"make: Target `all' not remade because of errors.",
				},
				1, // errors
				0, // warnings
				0, // Infos
				new String[] {"foo.c"},
				new String[] {"undefined reference to `bar'"},
				new String[] {GLD_ERROR_PARSER_ID}
		);
	}

	public void testLinkerMessages_DangerousFunction_bug248669() throws IOException {
		runParserTest(
				new String[] {
						"mktemp.o(.text+0x19): In function 'main':",
						"mktemp.c:15: the use of 'mktemp' is dangerous, better use 'mkstemp'",
						"1.o: In function `main':",
						"1.c:(.text+0x19): warning: the use of `mktemp' is dangerous, better use `mkstemp'",
				},
				0, // errors
				2, // warnings
				0, // Infos
				new String[] {"1.c", "mktemp.c"},
				new String[] {
						"the use of 'mktemp' is dangerous, better use 'mkstemp'",
						"the use of `mktemp' is dangerous, better use `mkstemp'",
					},
				new String[] {GLD_ERROR_PARSER_ID}
		);
	}
	
	public void testLinkerMessages_PrecedingPath_bug314253() throws IOException {
		runParserTest(
				new String[] {
						"ld: warning: libstdc++.so.5, needed by testlib_1.so, may conflict with libstdc++.so.6",
						"/usr/bin/ld: warning: libstdc++.so.5, needed by testlib_2.so, may conflict with libstdc++.so.6",
						"C:\\bin\\ld.exe: warning: libstdc++.so.5, needed by testlib_3.so, may conflict with libstdc++.so.6",
						"c:/bin/ld.exe: warning: libstdc++.so.5, needed by testlib_4.so, may conflict with libstdc++.so.6",
						"D:\\mingw\\bin\\..\\lib\\gcc-lib\\mingw32\\3.2.3\\..\\..\\..\\..\\mingw32\\bin\\ld.exe: cannot find -ljpeg",
						"notld: warning: ld error parser has no business parsing this message",
				},
				1, // errors
				4, // warnings
				0, // Infos
				null,
				new String[] {
						"libstdc++.so.5, needed by testlib_1.so, may conflict with libstdc++.so.6",
						"libstdc++.so.5, needed by testlib_2.so, may conflict with libstdc++.so.6",
						"libstdc++.so.5, needed by testlib_3.so, may conflict with libstdc++.so.6",
						"libstdc++.so.5, needed by testlib_4.so, may conflict with libstdc++.so.6",
						"cannot find -ljpeg",
					},
				new String[] {GLD_ERROR_PARSER_ID}
		);
	}
}
