package org.reasm.m68k.source;
import static ca.fragag.testhelpers.HasType.hasType;
import static org.reasm.m68k.source.BlockParserTestsCommon.COMPLETE_BLOCK;
import static org.reasm.m68k.source.BlockParserTestsCommon.INCOMPLETE_BLOCK;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import org.hamcrest.Matcher;
import org.junit.Test;
import org.reasm.source.ParseError;
import org.reasm.source.SimpleCompositeSourceNode;
import org.reasm.source.SourceNode;
/**
* Test class for {@link BlockParsers}.
*
* @author Francis Gagné
*/
public class BlockParsersTest {
private static void parseBasicBlock(@Nonnull String code, @Nonnull Class<?> blockType, @Nonnull Class<?> bodyType,
@Nonnull Matcher<? super ParseError> blockParseErrorMatcher,
@CheckForNull Matcher<? super SourceNode> thirdChildNodeMatcher) {
BlockParserTestsCommon.parseBasicBlock(code, blockType, bodyType, blockParseErrorMatcher, thirdChildNodeMatcher);
}
private static void parseDoBlock(@Nonnull String code, @Nonnull Matcher<? super ParseError> blockParseErrorMatcher,
@CheckForNull Matcher<? super SourceNode> thirdChildNodeMatcher) {
parseBasicBlock(code, DoBlock.class, SimpleCompositeSourceNode.class, blockParseErrorMatcher, thirdChildNodeMatcher);
}
private static void parseForBlock(@Nonnull String code, @Nonnull Matcher<? super ParseError> blockParseErrorMatcher,
@CheckForNull Matcher<? super SourceNode> thirdChildNodeMatcher) {
parseBasicBlock(code, ForBlock.class, SimpleCompositeSourceNode.class, blockParseErrorMatcher, thirdChildNodeMatcher);
}
private static void parseMacroBlock(@Nonnull String code, @Nonnull Matcher<? super ParseError> blockParseErrorMatcher,
@CheckForNull Matcher<? super SourceNode> thirdChildNodeMatcher) {
parseBasicBlock(code, MacroBlock.class, MacroBody.class, blockParseErrorMatcher, thirdChildNodeMatcher);
}
private static void parseNamespaceBlock(@Nonnull String code, @Nonnull Matcher<? super ParseError> blockParseErrorMatcher,
@CheckForNull Matcher<? super SourceNode> thirdChildNodeMatcher) {
parseBasicBlock(code, NamespaceBlock.class, SimpleCompositeSourceNode.class, blockParseErrorMatcher, thirdChildNodeMatcher);
}
private static void parseReptBlock(@Nonnull String code, @Nonnull Matcher<? super ParseError> blockParseErrorMatcher,
@CheckForNull Matcher<? super SourceNode> thirdChildNodeMatcher) {
parseBasicBlock(code, ReptBlock.class, ReptBody.class, blockParseErrorMatcher, thirdChildNodeMatcher);
}
private static void parseTransformBlock(@Nonnull String code, @Nonnull Matcher<? super ParseError> blockParseErrorMatcher,
@CheckForNull Matcher<? super SourceNode> thirdChildNodeMatcher) {
parseBasicBlock(code, TransformBlock.class, SimpleCompositeSourceNode.class, blockParseErrorMatcher, thirdChildNodeMatcher);
}
private static void parseWhileBlock(@Nonnull String code, @Nonnull Matcher<? super ParseError> blockParseErrorMatcher,
@CheckForNull Matcher<? super SourceNode> thirdChildNodeMatcher) {
parseBasicBlock(code, WhileBlock.class, SimpleCompositeSourceNode.class, blockParseErrorMatcher, thirdChildNodeMatcher);
}
/**
* Asserts that {@link M68KParser} correctly parses a complete <code>DO</code> block.
*/
@Test
public void parseCompleteDoBlock() {
parseDoBlock(" DO\n NOP\n UNTIL", COMPLETE_BLOCK, hasType(M68KBlockDirectiveLine.class));
}
/**
* Asserts that {@link M68KParser} correctly parses a complete <code>FOR</code> block.
*/
@Test
public void parseCompleteForBlock() {
parseForBlock(" FOR\n NOP\n NEXT", COMPLETE_BLOCK, hasType(M68KBlockDirectiveLine.class));
}
/**
* Asserts that {@link M68KParser} correctly parses a complete <code>MACRO</code> block.
*/
@Test
public void parseCompleteMacroBlock() {
parseMacroBlock(" MACRO\n NOP\n ENDM", COMPLETE_BLOCK, hasType(M68KBlockDirectiveLine.class));
}
/**
* Asserts that {@link M68KParser} correctly parses a complete <code>NAMESPACE</code> block.
*/
@Test
public void parseCompleteNamespaceBlock() {
parseNamespaceBlock(" NAMESPACE\n NOP\n ENDNS", COMPLETE_BLOCK, hasType(M68KBlockDirectiveLine.class));
}
/**
* Asserts that {@link M68KParser} correctly parses a complete <code>REPT</code> block.
*/
@Test
public void parseCompleteReptBlock() {
parseReptBlock(" REPT\n NOP\n ENDR", COMPLETE_BLOCK, hasType(M68KBlockDirectiveLine.class));
}
/**
* Asserts that {@link M68KParser} correctly parses a complete <code>TRANSFORM</code> block.
*/
@Test
public void parseCompleteTransformBlock() {
parseTransformBlock(" TRANSFORM\n NOP\n ENDTRANSFORM", COMPLETE_BLOCK, hasType(M68KBlockDirectiveLine.class));
}
/**
* Asserts that {@link M68KParser} correctly parses a complete <code>WHILE</code> block.
*/
@Test
public void parseCompleteWhileBlock() {
parseWhileBlock(" WHILE\n NOP\n ENDW", COMPLETE_BLOCK, hasType(M68KBlockDirectiveLine.class));
}
/**
* Asserts that {@link M68KParser} correctly parses an incomplete <code>DO</code> block.
*/
@Test
public void parseIncompleteDOBlock() {
parseDoBlock(" DO\n NOP", INCOMPLETE_BLOCK, null);
}
/**
* Asserts that {@link M68KParser} correctly parses an incomplete <code>FOR</code> block.
*/
@Test
public void parseIncompleteForBlock() {
parseForBlock(" FOR\n NOP", INCOMPLETE_BLOCK, null);
}
/**
* Asserts that {@link M68KParser} correctly parses an incomplete <code>MACRO</code> block.
*/
@Test
public void parseIncompleteMacroBlock() {
parseMacroBlock(" MACRO\n NOP", INCOMPLETE_BLOCK, null);
}
/**
* Asserts that {@link M68KParser} correctly parses an incomplete <code>NAMESPACE</code> block.
*/
@Test
public void parseIncompleteNamespaceBlock() {
parseNamespaceBlock(" NAMESPACE\n NOP", INCOMPLETE_BLOCK, null);
}
/**
* Asserts that {@link M68KParser} correctly parses an incomplete <code>REPT</code> block.
*/
@Test
public void parseIncompleteReptBlock() {
parseReptBlock(" REPT\n NOP", INCOMPLETE_BLOCK, null);
}
/**
* Asserts that {@link M68KParser} correctly parses an incomplete <code>TRANSFORM</code> block.
*/
@Test
public void parseIncompleteTransformBlock() {
parseTransformBlock(" TRANSFORM\n NOP", INCOMPLETE_BLOCK, null);
}
/**
* Asserts that {@link M68KParser} correctly parses an incomplete <code>WHILE</code> block.
*/
@Test
public void parseIncompleteWhileBlock() {
parseWhileBlock(" WHILE\n NOP", INCOMPLETE_BLOCK, null);
}
}