AssertJUnitPlugin.java

/*******************************************************************************
 * Copyright (c) 2021 Carsten Hammer.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Carsten Hammer
 *******************************************************************************/
package org.sandbox.jdt.internal.corext.fix.helper;

import static org.sandbox.jdt.internal.corext.fix.helper.lib.JUnitConstants.*;

import java.util.Set;

import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.Expression;
import org.eclipse.jdt.core.dom.MethodInvocation;
import org.eclipse.jdt.core.dom.SimpleName;
import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
import org.eclipse.jdt.core.dom.rewrite.ImportRewrite;
import org.eclipse.text.edits.TextEditGroup;
import org.sandbox.jdt.internal.corext.fix.helper.lib.AbstractMethodMigrationPlugin;

/**
 * Migrates JUnit 4 Assert calls to JUnit 5 Assertions.
 * 
 * <p>
 * Special handling:
 * </p>
 * <ul>
 * <li>assertThat → Hamcrest MatcherAssert.assertThat</li>
 * <li>Other assertions → JUnit 5 Assertions with parameter reordering</li>
 * </ul>
 */
public class AssertJUnitPlugin extends AbstractMethodMigrationPlugin {

	@Override
	protected String getSourceClass() {
		return ORG_JUNIT_ASSERT;
	}

	@Override
	protected String getTargetClass() {
		return ORG_JUNIT_JUPITER_API_ASSERTIONS;
	}

	@Override
	protected String getTargetSimpleName() {
		return ASSERTIONS;
	}

	@Override
	protected Set<String> getMethodNames() {
		return ALL_ASSERTION_METHODS;
	}

	@Override
	protected void processMethodInvocation(TextEditGroup group, ASTRewrite rewriter, AST ast,
			ImportRewrite importRewriter, MethodInvocation node) {

		Expression assertexpression = node.getExpression();

		// Special handling for assertThat - delegate to Hamcrest
		if (METHOD_ASSERT_THAT.equals(node.getName().getIdentifier()) && assertexpression instanceof SimpleName
				&& "Assert".equals(((SimpleName) assertexpression).getIdentifier())) {
			rewriter.set(node, MethodInvocation.EXPRESSION_PROPERTY, null, group);
			importRewriter.addStaticImport(ORG_HAMCREST_MATCHER_ASSERT, METHOD_ASSERT_THAT, false);
			importRewriter.removeImport(ORG_JUNIT_ASSERT);
		} else {
			// Standard assertion handling - use base class behavior
			super.processMethodInvocation(group, rewriter, ast, importRewriter, node);
		}
	}

	@Override
	public String getPreview(boolean afterRefactoring) {
		if (afterRefactoring) {
			return """
					Assertions.assertNotEquals(5,result, "failuremessage");  // expected = 5, actual = result
					Assertions.assertTrue(false,"failuremessage");
					"""; //$NON-NLS-1$
		}
		return """
				Assert.assertNotEquals("failuremessage",5, result);  // expected = 5, actual = result
				Assert.assertTrue("failuremessage",false);
				"""; //$NON-NLS-1$
	}

	@Override
	public String toString() {
		return "Assert"; //$NON-NLS-1$
	}
}