/** * Copyright 2012 Tobias Gierke <tobias.gierke@code-sourcery.de> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package de.codesourcery.jasm16.parser; import java.io.IOException; import de.codesourcery.jasm16.Address; import de.codesourcery.jasm16.ast.ASTNode; import de.codesourcery.jasm16.ast.InitializedMemoryNode; import de.codesourcery.jasm16.compiler.CompilationUnit; import de.codesourcery.jasm16.compiler.ICompilationContext; import de.codesourcery.jasm16.compiler.ICompilationUnit; import de.codesourcery.jasm16.compiler.io.IObjectCodeWriter; import de.codesourcery.jasm16.exceptions.ParseException; public class InitializedMemoryNodeTest extends TestHelper { public void testParseInitializedMemory() throws ParseException, IOException { final String source = ".dat 0x01"; ICompilationUnit unit = CompilationUnit.createInstance("string",source); final IParseContext context = createParseContext( unit ); final ASTNode result = new InitializedMemoryNode().parse( context ); assertFalse( getErrors( source , result ) , result.hasErrors() ); assertEquals( InitializedMemoryNode.class , result.getClass() ); final InitializedMemoryNode node = (InitializedMemoryNode) result; resolveSymbols( unit , node ); final int size = node.getSizeInBytes( 0 ); assertEquals( 2 , size ); final byte[] data = node.getBytes(); assertEquals( 2 , data.length ); assertEquals( 0 , data[0] ); assertEquals( 1 , data[1] ); assertSourceCode( ".dat 0x01" , result ); } public void testParseInitializedMemoryWithSignedValue() throws ParseException, IOException { final String source = ".dat -2"; ICompilationUnit unit = CompilationUnit.createInstance("string",source); final IParseContext context = createParseContext( unit ); final ASTNode result = new InitializedMemoryNode().parse( context ); assertFalse( getErrors( source , result ) , result.hasErrors() ); assertEquals( InitializedMemoryNode.class , result.getClass() ); final InitializedMemoryNode node = (InitializedMemoryNode) result; resolveSymbols( unit , node ); final int size = node.getSizeInBytes( 0 ); assertEquals( 2 , size ); final byte[] data = node.getBytes(); assertEquals( 2 , data.length ); assertEquals( -1 , data[0] ); assertEquals( -2 , data[1] ); assertSourceCode( ".dat -2" , result ); } public void testParseInitializedMemory1() throws ParseException, IOException { final String source = ".dat (1+2)"; ICompilationUnit unit = CompilationUnit.createInstance("string",source); final IParseContext context = createParseContext( unit ); final ASTNode result = new InitializedMemoryNode().parse( context ); assertFalse( getErrors( source , result ) , result.hasErrors() ); assertEquals( InitializedMemoryNode.class , result.getClass() ); final InitializedMemoryNode node = (InitializedMemoryNode) result; resolveSymbols( unit, node ); final int size = node.getSizeInBytes( 0 ); assertEquals( 2 , size ); final byte[] data = node.getBytes(); assertEquals( 2 , data.length ); assertEquals( 0 , data[0] ); assertEquals( 3 , data[1] ); assertSourceCode( ".dat (1+2)" , result ); } public void testParseInitializedMemory2() throws ParseException, IOException { final String source = ".dat 0x12,0x34"; ICompilationUnit unit = CompilationUnit.createInstance("string",source); final IParseContext context = createParseContext( unit ); final ASTNode result = new InitializedMemoryNode().parse( context ); assertFalse( getErrors( source , result ) , result.hasErrors() ); assertEquals( InitializedMemoryNode.class , result.getClass() ); final InitializedMemoryNode node = (InitializedMemoryNode) result; resolveSymbols( unit , node ); final int size = node.getSizeInBytes( 0 ); assertEquals( 4 , size ); final byte[] data = node.getBytes(); assertEquals( 4 , data.length ); assertEquals( 0x0 , data[0] ); assertEquals( 0x12 , data[1] ); assertEquals( 0 , data[2] ); assertEquals( 0x34 , data[3] ); assertSourceCode( ".dat 0x12,0x34" , result ); } public void testParseInitializedMemoryWithExpressions() throws ParseException, IOException { final String source = ".dat 0x10+2,0x34"; ICompilationUnit unit = CompilationUnit.createInstance("string",source); final IParseContext context = createParseContext( unit ); final ASTNode result = new InitializedMemoryNode().parse( context ); assertFalse( getErrors( source , result ) , result.hasErrors() ); assertEquals( InitializedMemoryNode.class , result.getClass() ); final InitializedMemoryNode node = (InitializedMemoryNode) result; resolveSymbols( unit , node ); final int size = node.getSizeInBytes( 0 ); assertEquals( 4 , size ); final byte[] data = node.getBytes(); assertEquals( 4 , data.length ); assertEquals( 0x0 , data[0] ); assertEquals( 0x12 , data[1] ); assertEquals( 0 , data[2] ); assertEquals( 0x34 , data[3] ); assertSourceCode( ".dat 0x10+2,0x34" , result ); } public void testParseInitializedMemory3() throws ParseException, IOException { final String source = ".dat \"a\""; ICompilationUnit unit = CompilationUnit.createInstance("string",source); final IParseContext context = createParseContext( unit ); final ASTNode result = new InitializedMemoryNode().parse( context ); assertFalse( getErrors( source , result ) , result.hasErrors() ); assertEquals( InitializedMemoryNode.class , result.getClass() ); final InitializedMemoryNode node = (InitializedMemoryNode) result; resolveSymbols(unit, node ); final int size = node.getSizeInBytes( 0 ); assertEquals( 2 , size ); final byte[] data = node.getBytes(); assertEquals( 2 , data.length ); assertEquals( 0 , data[0] ); assertEquals( 97 , data[1] ); assertSourceCode( ".dat \"a\"" , result ); } public void testParseInitializedMemory4() throws ParseException, IOException { final String source = ".dat \"ab\""; ICompilationUnit unit = CompilationUnit.createInstance("string",source); final IParseContext context = createParseContext( unit ); final ASTNode result = new InitializedMemoryNode().parse( context ); assertFalse( getErrors( source , result ) , result.hasErrors() ); assertEquals( InitializedMemoryNode.class , result.getClass() ); final InitializedMemoryNode node = (InitializedMemoryNode) result; resolveSymbols( unit , node ); final int size = node.getSizeInBytes( 0 ); assertEquals( 4 , size ); final byte[] data = node.getBytes(); assertEquals( 4 , data.length ); assertEquals( 0 , data[0] ); assertEquals( 97 , data[1] ); assertEquals( 0 , data[2] ); assertEquals( 98 , data[3] ); assertSourceCode( ".dat \"ab\"" , result ); } public void testParseInitializedMemory6() { final String source = ".byte \"a\""; final IParseContext context = createParseContext( source ); final ASTNode result = new InitializedMemoryNode().parse( context ); assertTrue( result instanceof InitializedMemoryNode); assertFalse( result.hasErrors() ); final InitializedMemoryNode node = (InitializedMemoryNode) result; resolveSymbols( CompilationUnit.createInstance("dummy", source ) , node ); final int size = node.getSizeInBytes( 0 ); assertEquals( 2 , size ); final byte[] data = node.getBytes(); assertEquals( 2 , data.length ); assertEquals( (byte) 0 , data[0] ); assertEquals( (byte) 'a' , data[1] ); } public void testParseInitializedMemory7() { final String source = ".byte 256"; final IParseContext context = createParseContext( source ); new InitializedMemoryNode().parse( context ); assertTrue( context.getCompilationUnit().hasErrors() ); } public void testParseInitializedMemory8() throws ParseException, IOException { final String source = ".word 256,2"; ICompilationUnit unit = CompilationUnit.createInstance("string",source); final IParseContext context = createParseContext( unit ); final ASTNode result = new InitializedMemoryNode().parse( context ); assertFalse( result.hasErrors() ); final InitializedMemoryNode node = (InitializedMemoryNode) result; resolveSymbols( unit, node ); final int size = node.getSizeInBytes( 0 ); assertEquals( 4 , size ); final byte[] data = node.getBytes(); assertEquals( 1 , data[0] ); assertEquals( 0 , data[1] ); assertEquals( 0 , data[2] ); assertEquals( 2 , data[3] ); assertSourceCode( ".word 256,2" , result ); } public void testParseInitializedMemoryWithValueOutOfRange() throws Exception { final String source = "label: .dat label+0xffff+1"; ICompilationUnit unit = compile( source ); assertTrue( unit.hasErrors() ); assertSourceCode( source , unit.getAST() ); } public void testParseInitializedMemory9() throws ParseException, IOException { final String source = ".dat 256,2"; ICompilationUnit unit = CompilationUnit.createInstance("string",source); final IParseContext context = createParseContext( unit ); final ASTNode result = new InitializedMemoryNode().parse( context ); assertFalse( result.hasErrors() ); final InitializedMemoryNode node = (InitializedMemoryNode) result; resolveSymbols( unit , node ); final int size = node.getSizeInBytes( 0 ); assertEquals( 4 , size ); final byte[] data = node.getBytes(); assertEquals( 1 , data[0] ); assertEquals( 0 , data[1] ); assertEquals( 0 , data[2] ); assertEquals( 2 , data[3] ); assertSourceCode( ".dat 256,2" , result ); } // 1 public void testParseInitializedMemory10() throws IOException, ParseException { final String source = ".dat 0x170, \"Hello \", 0x2e1"; ICompilationUnit unit = CompilationUnit.createInstance("string",source); final IParseContext context = createParseContext( unit ); final ASTNode result = new InitializedMemoryNode().parse( context ); resolveSymbols(unit, result ); assertFalse( result.hasErrors() ); assertSourceCode( ".dat 0x170, \"Hello \", 0x2e1" , result ); final InitializedMemoryNode node = (InitializedMemoryNode) result; final int size = node.getSizeInBytes( 0 ); assertEquals( 16 ,size ); final byte[][] actual = new byte[1][]; IObjectCodeWriter writer = new IObjectCodeWriter() { @Override public void close() throws IOException { } @Override public void writeObjectCode(byte[] data, int offset, int length) throws IOException { } @Override public void writeObjectCode(byte[] values) throws IOException { actual[0] = values; } @Override public void deleteOutput() throws IOException { } @Override public Address getCurrentWriteOffset() { return Address.ZERO; } @Override public void advanceToWriteOffset(Address offset) throws IOException { throw new UnsupportedOperationException("Not implemented"); } @Override public Address getFirstWriteOffset() { return Address.ZERO; } }; ICompilationUnit instance = CompilationUnit.createInstance("dummy" , source ); ICompilationContext compContext = createCompilationContext(instance); node.writeObjectCode( writer, compContext ); final byte[] data = actual[0]; assertEquals( 16 , data.length ); final byte[] expected = {0x01,0x70,0x00,0x48,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x20,0x02,(byte) 0xe1}; assertEquals( expected.length , data.length ); for ( int i = 0 ; i < expected.length ; i++ ) { assertEquals( expected[i] , data[i] ); } } }