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 static org.reasm.m68k.source.BlockParserTestsCommon.parseBasicBlock; 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 ObjBlockParser}. * * @author Francis Gagné */ public class ObjBlockParserTest { private static void parseObjBlock(@Nonnull String code, @Nonnull Matcher<? super ParseError> blockParseErrorMatcher, @CheckForNull Matcher<? super SourceNode> thirdChildNodeMatcher) { parseBasicBlock(code, ObjBlock.class, SimpleCompositeSourceNode.class, blockParseErrorMatcher, thirdChildNodeMatcher); } /** * Asserts that {@link ObjBlockParser} correctly parses a complete <code>OBJ</code> block. */ @Test public void parseCompleteObjBlock() { parseObjBlock(" OBJ\n NOP\n OBJEND", COMPLETE_BLOCK, hasType(M68KBlockDirectiveLine.class)); } /** * Asserts that {@link ObjBlockParser} correctly parses a complete <code>PHASE</code> block. */ @Test public void parseCompletePhaseBlock() { parseObjBlock(" PHASE\n NOP\n DEPHASE", COMPLETE_BLOCK, hasType(M68KBlockDirectiveLine.class)); } /** * Asserts that {@link ObjBlockParser} correctly parses an incomplete <code>OBJ</code> block. */ @Test public void parseIncompleteObjBlock() { parseObjBlock(" OBJ\n NOP", INCOMPLETE_BLOCK, null); } /** * Asserts that {@link ObjBlockParser} correctly parses an incomplete <code>PHASE</code> block. */ @Test public void parseIncompletePhaseBlock() { parseObjBlock(" PHASE\n NOP", INCOMPLETE_BLOCK, null); } /** * Asserts that an <code>OBJ</code> block cannot be closed with the <code>DEPHASE</code> directive. */ @Test public void parseObjDephaseBlock() { parseObjBlock(" OBJ\n NOP\n DEPHASE", INCOMPLETE_BLOCK, null); } /** * Asserts that a <code>PHASE</code> block cannot be closed with the <code>OBJEND</code> directive. */ @Test public void parsePhaseObjendBlock() { parseObjBlock(" PHASE\n NOP\n OBJEND", INCOMPLETE_BLOCK, null); } }