package org.reasm.m68k.assembly.internal; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; import org.reasm.AssemblyMessage; import org.reasm.Environment; import org.reasm.IdentityTransformation; import org.reasm.OutputTransformation; import org.reasm.OutputTransformationFactory; import org.reasm.m68k.M68KArchitecture; import org.reasm.messages.InvalidTransformationArgumentsErrorMessage; import org.reasm.messages.UnknownTransformationMethodErrorMessage; import org.reasm.testhelpers.ReverseTransformation; import ca.fragag.Consumer; /** * Test class for the <code>TRANSFORM</code> directive. * * @author Francis Gagné */ @RunWith(Parameterized.class) public class TransformTest extends BaseProgramsTest { @Nonnull private static final ArrayList<Object[]> TEST_DATA = new ArrayList<>(); static { // TRANSFORM addDataItem(" TRANSFORM\n ENDTRANSFORM", 5, NO_DATA, WRONG_NUMBER_OF_OPERANDS); addDataItem(" TRANSFORM UNKNOWN\n ENDTRANSFORM", 5, NO_DATA, new UnknownTransformationMethodErrorMessage("UNKNOWN")); addDataItem(" TRANSFORM REVERSE\n ENDTRANSFORM", 5, NO_DATA); addDataItem(" TRANSFORM TEST1\n ENDTRANSFORM", 5, NO_DATA, new InvalidTransformationArgumentsErrorMessage("TEST1", new String[0])); addDataItem(" TRANSFORM TEST1,0,0\n ENDTRANSFORM", 5, NO_DATA); } /** * Gets the test data for this parameterized test. * * @return the test data */ @Nonnull @Parameters public static List<Object[]> data() { return TEST_DATA; } private static void addDataItem(@Nonnull String code, int steps, @Nonnull byte[] output) { addDataItem(code, steps, output, null); } private static void addDataItem(@Nonnull String code, int steps, @Nonnull byte[] output, @CheckForNull AssemblyMessage expectedMessage) { TEST_DATA.add(new Object[] { code, steps, output, expectedMessage }); } /** * Initializes a new TransformTest. * * @param code * assembly code to assemble * @param steps * the number of steps the program is expected to take to assemble completely * @param output * the program's output * @param expectedMessage * an {@link AssemblyMessage} that is expected to be generated while assembling the code */ public TransformTest(@Nonnull String code, int steps, @Nonnull byte[] output, @CheckForNull AssemblyMessage expectedMessage) { super(code, steps, output, M68KArchitecture.MC68000, expectedMessage, null, null); } @Override protected Environment getEnvironment() { final OutputTransformationFactory reverseOutputTransformationFactory = new OutputTransformationFactory( Collections.singleton("REVERSE")) { @Override public OutputTransformation create(String[] arguments, Consumer<AssemblyMessage> assemblyMessageConsumer) { return ReverseTransformation.INSTANCE; } }; final OutputTransformationFactory test1OutputTransformationFactory = new OutputTransformationFactory( Collections.singleton("TEST1")) { @Override public OutputTransformation create(String[] arguments, Consumer<AssemblyMessage> assemblyMessageConsumer) { if (arguments.length == 2 && "0".equals(arguments[0]) && "0".equals(arguments[1])) { return IdentityTransformation.INSTANCE; } return null; } }; return super.getEnvironment().addOutputTransformationFactory(reverseOutputTransformationFactory) .addOutputTransformationFactory(test1OutputTransformationFactory); } }