/*******************************************************************************
 * Copyright (c) 2012 NumberFour AG
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 * 
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     NumberFour AG - initial API and Implementation (Alex Panchenko)
 *******************************************************************************/
package org.eclipse.dltk.javascript.core.tests.validation;

import java.util.List;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.dltk.compiler.problem.IProblem;
import org.eclipse.dltk.core.builder.IBuildParticipant;
import org.eclipse.dltk.core.tests.util.StringList;
import org.eclipse.dltk.internal.javascript.validation.FlowValidationFactory;
import org.eclipse.dltk.javascript.core.JavaScriptProblems;
import org.eclipse.dltk.javascript.core.tests.AbstractValidationTest;

@SuppressWarnings("restriction")
public class FlowTypeInfoValidationTests extends AbstractValidationTest {

	@Override
	protected IBuildParticipant createValidator() {
		try {
			return new CompoundBuildParticipant(
					new FlowValidationFactory().createBuildParticipant(null),
					new TestTypeInfoValidator());
		} catch (CoreException e) {
			throw new IllegalStateException(e);
		}
	}

	public void testFunctionAlwaysReturnValue1() {
		StringList code = new StringList();
		code.add("/** @return {Number|undefined} */");
		code.add("function q(a) {");
		code.add("  if (a ==1) return 1");
		code.add("}");
		final List<IProblem> problems = validate(code.toString());
		assertEquals(problems.toString(), 0, problems.size());
	}

	public void testFunctionAlwaysReturnValue2() {
		StringList code = new StringList();
		code.add("/** @return {Number|undefined} */");
		code.add("function q(a) {");
		code.add("  if (a ==1) return 1");
		code.add("  return");
		code.add("}");
		// TODO (alex) do we want to suppress this too?
		final List<IProblem> problems = validate(code.toString());
		assertEquals(1, problems.size());
		assertEquals(JavaScriptProblems.RETURN_INCONSISTENT, problems.get(0)
				.getID());
	}

	public void testFunctionWithIfThenNotAllReturningValues() {
		StringList code = new StringList();
		code.add("/** @return {Number|undefined} */");
		code.add("function q(a) {");
		code.add("  if (a ==1) return 1");
		code.add("  else if (a == 2) a = 1");
		code.add("  else if (a == 3) a = 1");
		code.add("  else return 2");
		code.add("}");
		final List<IProblem> problems = validate(code.toString());
		assertEquals(problems.toString(), 0, problems.size());
	}
}
