package org.reasm.m68k.source; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.nullValue; import static org.junit.Assert.assertThat; import java.util.List; import org.junit.Test; import org.reasm.commons.source.Block; import org.reasm.commons.source.Parser; import org.reasm.commons.source.Syntax; import org.reasm.source.SourceNode; import ca.fragag.text.Document; /** * Test class for {@link M68KParser}. * * @author Francis Gagné */ public class M68KParserTest { /** * Asserts that {@link Syntax#isValidIdentifierCodePoint(int)} returns <code>true</code> for code points that are valid as part * of an identifier and <code>false</code> for other code points. */ @Test public void isValidIdentifierCodePoint() { assertThat(M68KParser.SYNTAX.isValidIdentifierCodePoint(0), is(true)); assertThat(M68KParser.SYNTAX.isValidIdentifierCodePoint('\t'), is(false)); assertThat(M68KParser.SYNTAX.isValidIdentifierCodePoint('\n'), is(false)); assertThat(M68KParser.SYNTAX.isValidIdentifierCodePoint(0xB), is(true)); // LINE TABULATION assertThat(M68KParser.SYNTAX.isValidIdentifierCodePoint('\f'), is(false)); assertThat(M68KParser.SYNTAX.isValidIdentifierCodePoint('\r'), is(false)); assertThat(M68KParser.SYNTAX.isValidIdentifierCodePoint(' '), is(false)); assertThat(M68KParser.SYNTAX.isValidIdentifierCodePoint('!'), is(false)); assertThat(M68KParser.SYNTAX.isValidIdentifierCodePoint('"'), is(true)); assertThat(M68KParser.SYNTAX.isValidIdentifierCodePoint('#'), is(true)); assertThat(M68KParser.SYNTAX.isValidIdentifierCodePoint('$'), is(true)); assertThat(M68KParser.SYNTAX.isValidIdentifierCodePoint('\''), is(true)); assertThat(M68KParser.SYNTAX.isValidIdentifierCodePoint('.'), is(true)); assertThat(M68KParser.SYNTAX.isValidIdentifierCodePoint('0'), is(true)); assertThat(M68KParser.SYNTAX.isValidIdentifierCodePoint('@'), is(true)); assertThat(M68KParser.SYNTAX.isValidIdentifierCodePoint('A'), is(true)); assertThat(M68KParser.SYNTAX.isValidIdentifierCodePoint('\\'), is(false)); assertThat(M68KParser.SYNTAX.isValidIdentifierCodePoint('`'), is(true)); assertThat(M68KParser.SYNTAX.isValidIdentifierCodePoint('a'), is(true)); assertThat(M68KParser.SYNTAX.isValidIdentifierCodePoint(-1), is(false)); } /** * Asserts that {@link Syntax#isValidIdentifierInitialCodePoint(int)} returns <code>true</code> for code points that are valid * as the first code point of an identifier and <code>false</code> for other code points. */ @Test public void isValidIdentifierInitialCodePoint() { assertThat(M68KParser.SYNTAX.isValidIdentifierInitialCodePoint(0), is(true)); assertThat(M68KParser.SYNTAX.isValidIdentifierInitialCodePoint('\t'), is(false)); assertThat(M68KParser.SYNTAX.isValidIdentifierInitialCodePoint('\n'), is(false)); assertThat(M68KParser.SYNTAX.isValidIdentifierInitialCodePoint(0xB), is(true)); // LINE TABULATION assertThat(M68KParser.SYNTAX.isValidIdentifierInitialCodePoint('\f'), is(false)); assertThat(M68KParser.SYNTAX.isValidIdentifierInitialCodePoint('\r'), is(false)); assertThat(M68KParser.SYNTAX.isValidIdentifierInitialCodePoint(' '), is(false)); assertThat(M68KParser.SYNTAX.isValidIdentifierInitialCodePoint('!'), is(false)); assertThat(M68KParser.SYNTAX.isValidIdentifierInitialCodePoint('"'), is(false)); assertThat(M68KParser.SYNTAX.isValidIdentifierInitialCodePoint('#'), is(false)); assertThat(M68KParser.SYNTAX.isValidIdentifierInitialCodePoint('$'), is(false)); assertThat(M68KParser.SYNTAX.isValidIdentifierInitialCodePoint('\''), is(false)); assertThat(M68KParser.SYNTAX.isValidIdentifierInitialCodePoint('.'), is(false)); assertThat(M68KParser.SYNTAX.isValidIdentifierInitialCodePoint('0'), is(false)); assertThat(M68KParser.SYNTAX.isValidIdentifierInitialCodePoint('@'), is(true)); assertThat(M68KParser.SYNTAX.isValidIdentifierInitialCodePoint('A'), is(true)); assertThat(M68KParser.SYNTAX.isValidIdentifierInitialCodePoint('\\'), is(false)); assertThat(M68KParser.SYNTAX.isValidIdentifierInitialCodePoint('`'), is(true)); assertThat(M68KParser.SYNTAX.isValidIdentifierInitialCodePoint('a'), is(true)); assertThat(M68KParser.SYNTAX.isValidIdentifierInitialCodePoint(-1), is(false)); } /** * Asserts that {@link Parser#parse(Document)} on {@link M68KParser#INSTANCE} returns a {@link Block} with a single * {@link WhileBlock} child node when the document contains a <code>WHILE</code> block, even if the <code>WHILE</code> directive * has a size attribute. */ @Test public void parseBlockSizeAttribute() { final SourceNode block = M68KParser.INSTANCE.parse(new Document(" WHILE.W 1\n NOP\n ENDW")); assertThat(block.getLength(), is(21)); assertThat(block.getParseError(), is(nullValue())); assertThat(block, is(instanceOf(Block.class))); final List<SourceNode> childNodes = ((Block) block).getChildNodes(); assertThat(childNodes.size(), is(1)); final SourceNode node = childNodes.get(0); assertThat(node.getLength(), is(21)); assertThat(node.getParseError(), is(nullValue())); assertThat(node, is(instanceOf(WhileBlock.class))); } }