package org.reasm.m68k;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.sameInstance;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Nonnull;
import org.junit.Assert;
import org.junit.Test;
import ca.fragag.Consumer;
/**
* Test class for {@link ConfigurationOptions}.
*
* @author Francis Gagné
*/
public class ConfigurationOptionsTest {
private static final class InvalidEntriesConsumer implements Consumer<Map.Entry<String, Object>> {
private boolean gotExpectedEntry;
@Nonnull
private final String key;
InvalidEntriesConsumer(@Nonnull String key) {
this.key = key;
}
@Override
public void accept(Map.Entry<String, Object> entry) {
assertThat(this.gotExpectedEntry, is(false));
assertThat(entry.getKey(), is(this.key));
assertThat(entry.getValue(), is(sameInstance(AN_OBJECT)));
this.gotExpectedEntry = true;
}
void assertGotExpectedEntry() {
assertThat(this.gotExpectedEntry, is(true));
}
}
/**
* A {@link Consumer} of {@link ConfigurationOptions} map entries that {@linkplain Assert#fail(String) fails} when it is called.
*/
@Nonnull
public static final Consumer<Map.Entry<String, Object>> FAILING_CONSUMER = new Consumer<Map.Entry<String, Object>>() {
@Override
public void accept(Map.Entry<String, Object> entry) {
fail("Invalid configuration options entry: " + entry.getKey() + "=" + String.valueOf(entry.getValue()));
}
};
@Nonnull
static final Object AN_OBJECT = new Object();
private static void automaticEven(boolean value) {
final ConfigurationOptions configurationOptions = validOption(ConfigurationOptions.AUTOMATIC_EVEN, value);
assertThat(configurationOptions.automaticEven(), is(value));
}
private static ConfigurationOptions invalidOption(@Nonnull String option, @Nonnull InvalidEntriesConsumer invalidEntriesConsumer) {
final Map<String, Object> optionsMap = new HashMap<>();
optionsMap.put(option, AN_OBJECT);
final ConfigurationOptions configurationOptions = ConfigurationOptions.create(optionsMap, invalidEntriesConsumer);
return configurationOptions;
}
private static void optimizeCmpiToTst(boolean value) {
final ConfigurationOptions configurationOptions = validOption(ConfigurationOptions.OPTIMIZE_CMPI_TO_TST, value);
assertThat(configurationOptions.optimizeCmpiToTst(), is(value));
}
private static void optimizeMoveToMoveq(boolean value) {
final ConfigurationOptions configurationOptions = validOption(ConfigurationOptions.OPTIMIZE_MOVE_TO_MOVEQ, value);
assertThat(configurationOptions.optimizeMoveToMoveq(), is(value));
}
private static void optimizeToAddqSubq(boolean value) {
final ConfigurationOptions configurationOptions = validOption(ConfigurationOptions.OPTIMIZE_TO_ADDQ_SUBQ, value);
assertThat(configurationOptions.optimizeToAddqSubq(), is(value));
}
private static void optimizeUnsizedAbsoluteAddressingToPcRelative(boolean value) {
final ConfigurationOptions configurationOptions = validOption(
ConfigurationOptions.OPTIMIZE_UNSIZED_ABSOLUTE_ADDRESSING_TO_PC_RELATIVE, value);
assertThat(configurationOptions.optimizeUnsizedAbsoluteAddressingToPcRelative(), is(value));
}
private static void optimizeUnsizedBranches(boolean value) {
final ConfigurationOptions configurationOptions = validOption(ConfigurationOptions.OPTIMIZE_UNSIZED_BRANCHES, value);
assertThat(configurationOptions.optimizeUnsizedBranches(), is(value));
}
private static void optimizeZeroDisplacement(boolean value) {
final ConfigurationOptions configurationOptions = validOption(ConfigurationOptions.OPTIMIZE_ZERO_DISPLACEMENT, value);
assertThat(configurationOptions.optimizeZeroDisplacement(), is(value));
}
private static ConfigurationOptions validOption(@Nonnull String option, @Nonnull Object value) {
final Map<String, Object> optionsMap = new HashMap<>();
optionsMap.put(option, value);
return ConfigurationOptions.create(optionsMap, FAILING_CONSUMER);
}
/**
* Asserts that {@link ConfigurationOptions#create(Map, Consumer)} treats the {@link ConfigurationOptions#AUTOMATIC_EVEN} option
* set to an {@link Object} value as invalid.
*/
@Test
public void automaticEvenBad() {
final InvalidEntriesConsumer invalidEntriesConsumer = new InvalidEntriesConsumer(ConfigurationOptions.AUTOMATIC_EVEN);
final ConfigurationOptions configurationOptions = invalidOption(ConfigurationOptions.AUTOMATIC_EVEN, invalidEntriesConsumer);
invalidEntriesConsumer.assertGotExpectedEntry();
assertThat(configurationOptions.automaticEven(), is(false));
}
/**
* Asserts that {@link ConfigurationOptions#automaticEven()} returns <code>false</code> when the {@link ConfigurationOptions} is
* created with the {@link ConfigurationOptions#AUTOMATIC_EVEN} option set to <code>false</code>.
*/
@Test
public void automaticEvenFalse() {
automaticEven(false);
}
/**
* Asserts that {@link ConfigurationOptions#automaticEven()} returns <code>true</code> when the {@link ConfigurationOptions} is
* created with the {@link ConfigurationOptions#AUTOMATIC_EVEN} option set to <code>true</code>.
*/
@Test
public void automaticEvenTrue() {
automaticEven(true);
}
/**
* Asserts that {@link ConfigurationOptions#create(Map, Consumer)} initializes a {@link ConfigurationOptions} object with
* default attributes when the <code>options</code> argument is an empty {@link Map}.
*/
@Test
public void create() {
final Map<String, Object> optionsMap = new HashMap<>();
final ConfigurationOptions configurationOptions = ConfigurationOptions.create(optionsMap, FAILING_CONSUMER);
assertThat(configurationOptions.automaticEven(), is(false));
assertThat(configurationOptions.optimizeCmpiToTst(), is(false));
assertThat(configurationOptions.optimizeMoveToMoveq(), is(false));
assertThat(configurationOptions.optimizeToAddqSubq(), is(false));
assertThat(configurationOptions.optimizeUnsizedAbsoluteAddressingToPcRelative(), is(false));
assertThat(configurationOptions.optimizeUnsizedBranches(), is(false));
assertThat(configurationOptions.optimizeZeroDisplacement(), is(false));
}
/**
* Asserts that {@link ConfigurationOptions#create(Map, Consumer)} does not throw an exception when the option map contains an
* invalid entry and the <code>invalidEntriesConsumer</code> argument is <code>null</code>.
*/
@Test
public void createInvalidEntry() {
final InvalidEntriesConsumer invalidEntriesConsumer = new InvalidEntriesConsumer("invalidOption");
invalidOption("invalidOption", invalidEntriesConsumer);
invalidEntriesConsumer.assertGotExpectedEntry();
}
/**
* Asserts that {@link ConfigurationOptions#create(Map, Consumer)} does not throw an exception when the option map contains an
* invalid entry and the <code>invalidEntriesConsumer</code> argument is <code>null</code>.
*/
@Test
public void createInvalidEntryNoInvalidEntriesConsumer() {
final Map<String, Object> optionsMap = new HashMap<>();
optionsMap.put("invalidOption", AN_OBJECT);
ConfigurationOptions.create(optionsMap, null);
}
/**
* Asserts that {@link ConfigurationOptions#create(Map, Consumer)} throws a {@link NullPointerException} when the
* <code>options</code> argument is <code>null</code>.
*/
@Test(expected = NullPointerException.class)
public void createNullOptions() {
ConfigurationOptions.create(null, FAILING_CONSUMER);
}
/**
* Asserts that {@link ConfigurationOptions#create(Map, Consumer)} treats the {@link ConfigurationOptions#OPTIMIZE_CMPI_TO_TST}
* option set to an {@link Object} value as invalid.
*/
@Test
public void optimizeCmpiToTstBad() {
final InvalidEntriesConsumer invalidEntriesConsumer = new InvalidEntriesConsumer(ConfigurationOptions.OPTIMIZE_CMPI_TO_TST);
final ConfigurationOptions configurationOptions = invalidOption(ConfigurationOptions.OPTIMIZE_CMPI_TO_TST,
invalidEntriesConsumer);
invalidEntriesConsumer.assertGotExpectedEntry();
assertThat(configurationOptions.optimizeCmpiToTst(), is(false));
}
/**
* Asserts that {@link ConfigurationOptions#optimizeCmpiToTst()} returns <code>false</code> when the
* {@link ConfigurationOptions} is created with the {@link ConfigurationOptions#OPTIMIZE_CMPI_TO_TST} option set to
* <code>false</code>.
*/
@Test
public void optimizeCmpiToTstFalse() {
optimizeCmpiToTst(false);
}
/**
* Asserts that {@link ConfigurationOptions#optimizeCmpiToTst()} returns <code>true</code> when the {@link ConfigurationOptions}
* is created with the {@link ConfigurationOptions#OPTIMIZE_CMPI_TO_TST} option set to <code>true</code>.
*/
@Test
public void optimizeCmpiToTstTrue() {
optimizeCmpiToTst(true);
}
/**
* Asserts that {@link ConfigurationOptions#create(Map, Consumer)} treats the
* {@link ConfigurationOptions#OPTIMIZE_MOVE_TO_MOVEQ} option set to an {@link Object} value as invalid.
*/
@Test
public void optimizeMoveToMoveqBad() {
final InvalidEntriesConsumer invalidEntriesConsumer = new InvalidEntriesConsumer(
ConfigurationOptions.OPTIMIZE_MOVE_TO_MOVEQ);
final ConfigurationOptions configurationOptions = invalidOption(ConfigurationOptions.OPTIMIZE_MOVE_TO_MOVEQ,
invalidEntriesConsumer);
invalidEntriesConsumer.assertGotExpectedEntry();
assertThat(configurationOptions.optimizeMoveToMoveq(), is(false));
}
/**
* Asserts that {@link ConfigurationOptions#optimizeMoveToMoveq()} returns <code>false</code> when the
* {@link ConfigurationOptions} is created with the {@link ConfigurationOptions#OPTIMIZE_MOVE_TO_MOVEQ} option set to
* <code>false</code>.
*/
@Test
public void optimizeMoveToMoveqFalse() {
optimizeMoveToMoveq(false);
}
/**
* Asserts that {@link ConfigurationOptions#optimizeMoveToMoveq()} returns <code>true</code> when the
* {@link ConfigurationOptions} is created with the {@link ConfigurationOptions#OPTIMIZE_MOVE_TO_MOVEQ} option set to
* <code>true</code>.
*/
@Test
public void optimizeMoveToMoveqTrue() {
optimizeMoveToMoveq(true);
}
/**
* Asserts that {@link ConfigurationOptions#create(Map, Consumer)} treats the {@link ConfigurationOptions#OPTIMIZE_TO_ADDQ_SUBQ}
* option set to an {@link Object} value as invalid.
*/
@Test
public void optimizeToAddqSubqBad() {
final InvalidEntriesConsumer invalidEntriesConsumer = new InvalidEntriesConsumer(ConfigurationOptions.OPTIMIZE_TO_ADDQ_SUBQ);
final ConfigurationOptions configurationOptions = invalidOption(ConfigurationOptions.OPTIMIZE_TO_ADDQ_SUBQ,
invalidEntriesConsumer);
invalidEntriesConsumer.assertGotExpectedEntry();
assertThat(configurationOptions.optimizeToAddqSubq(), is(false));
}
/**
* Asserts that {@link ConfigurationOptions#optimizeToAddqSubq()} returns <code>false</code> when the
* {@link ConfigurationOptions} is created with the {@link ConfigurationOptions#OPTIMIZE_TO_ADDQ_SUBQ} option set to
* <code>false</code>.
*/
@Test
public void optimizeToAddqSubqFalse() {
optimizeToAddqSubq(false);
}
/**
* Asserts that {@link ConfigurationOptions#optimizeToAddqSubq()} returns <code>true</code> when the
* {@link ConfigurationOptions} is created with the {@link ConfigurationOptions#OPTIMIZE_TO_ADDQ_SUBQ} option set to
* <code>true</code>.
*/
@Test
public void optimizeToAddqSubqTrue() {
optimizeToAddqSubq(true);
}
/**
* Asserts that {@link ConfigurationOptions#create(Map, Consumer)} treats the
* {@link ConfigurationOptions#OPTIMIZE_UNSIZED_ABSOLUTE_ADDRESSING_TO_PC_RELATIVE} option set to an {@link Object} value as
* invalid.
*/
@Test
public void optimizeUnsizedAbsoluteAddressingToPcRelativeBad() {
final InvalidEntriesConsumer invalidEntriesConsumer = new InvalidEntriesConsumer(
ConfigurationOptions.OPTIMIZE_UNSIZED_ABSOLUTE_ADDRESSING_TO_PC_RELATIVE);
final ConfigurationOptions configurationOptions = invalidOption(
ConfigurationOptions.OPTIMIZE_UNSIZED_ABSOLUTE_ADDRESSING_TO_PC_RELATIVE, invalidEntriesConsumer);
invalidEntriesConsumer.assertGotExpectedEntry();
assertThat(configurationOptions.optimizeUnsizedAbsoluteAddressingToPcRelative(), is(false));
}
/**
* Asserts that {@link ConfigurationOptions#optimizeUnsizedAbsoluteAddressingToPcRelative()} returns <code>false</code> when the
* {@link ConfigurationOptions} is created with the
* {@link ConfigurationOptions#OPTIMIZE_UNSIZED_ABSOLUTE_ADDRESSING_TO_PC_RELATIVE} option set to <code>false</code>.
*/
@Test
public void optimizeUnsizedAbsoluteAddressingToPcRelativeFalse() {
optimizeUnsizedAbsoluteAddressingToPcRelative(false);
}
/**
* Asserts that {@link ConfigurationOptions#optimizeUnsizedAbsoluteAddressingToPcRelative()} returns <code>true</code> when the
* {@link ConfigurationOptions} is created with the
* {@link ConfigurationOptions#OPTIMIZE_UNSIZED_ABSOLUTE_ADDRESSING_TO_PC_RELATIVE} option set to <code>true</code>.
*/
@Test
public void optimizeUnsizedAbsoluteAddressingToPcRelativeTrue() {
optimizeUnsizedAbsoluteAddressingToPcRelative(true);
}
/**
* Asserts that {@link ConfigurationOptions#create(Map, Consumer)} treats the
* {@link ConfigurationOptions#OPTIMIZE_UNSIZED_BRANCHES} option set to an {@link Object} value as invalid.
*/
@Test
public void optimizeUnsizedBranchesBad() {
final InvalidEntriesConsumer invalidEntriesConsumer = new InvalidEntriesConsumer(
ConfigurationOptions.OPTIMIZE_UNSIZED_BRANCHES);
final ConfigurationOptions configurationOptions = invalidOption(ConfigurationOptions.OPTIMIZE_UNSIZED_BRANCHES,
invalidEntriesConsumer);
invalidEntriesConsumer.assertGotExpectedEntry();
assertThat(configurationOptions.optimizeUnsizedBranches(), is(false));
}
/**
* Asserts that {@link ConfigurationOptions#optimizeUnsizedBranches()} returns <code>false</code> when the
* {@link ConfigurationOptions} is created with the {@link ConfigurationOptions#OPTIMIZE_UNSIZED_BRANCHES} option set to
* <code>false</code>.
*/
@Test
public void optimizeUnsizedBranchesFalse() {
optimizeUnsizedBranches(false);
}
/**
* Asserts that {@link ConfigurationOptions#optimizeUnsizedBranches()} returns <code>true</code> when the
* {@link ConfigurationOptions} is created with the {@link ConfigurationOptions#OPTIMIZE_UNSIZED_BRANCHES} option set to
* <code>true</code>.
*/
@Test
public void optimizeUnsizedBranchesTrue() {
optimizeUnsizedBranches(true);
}
/**
* Asserts that {@link ConfigurationOptions#create(Map, Consumer)} treats the
* {@link ConfigurationOptions#OPTIMIZE_ZERO_DISPLACEMENT} option set to an {@link Object} value as invalid.
*/
@Test
public void optimizeZeroDisplacementBad() {
final InvalidEntriesConsumer invalidEntriesConsumer = new InvalidEntriesConsumer(
ConfigurationOptions.OPTIMIZE_ZERO_DISPLACEMENT);
final ConfigurationOptions configurationOptions = invalidOption(ConfigurationOptions.OPTIMIZE_ZERO_DISPLACEMENT,
invalidEntriesConsumer);
invalidEntriesConsumer.assertGotExpectedEntry();
assertThat(configurationOptions.optimizeZeroDisplacement(), is(false));
}
/**
* Asserts that {@link ConfigurationOptions#optimizeZeroDisplacement()} returns <code>false</code> when the
* {@link ConfigurationOptions} is created with the {@link ConfigurationOptions#OPTIMIZE_ZERO_DISPLACEMENT} option set to
* <code>false</code>.
*/
@Test
public void optimizeZeroDisplacementFalse() {
optimizeZeroDisplacement(false);
}
/**
* Asserts that {@link ConfigurationOptions#optimizeZeroDisplacement()} returns <code>true</code> when the
* {@link ConfigurationOptions} is created with the {@link ConfigurationOptions#OPTIMIZE_ZERO_DISPLACEMENT} option set to
* <code>true</code>.
*/
@Test
public void optimizeZeroDisplacementTrue() {
optimizeZeroDisplacement(true);
}
}