package org.jerlang.stdlib;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.IOException;
import org.jerlang.type.Atom;
import org.jerlang.type.Integer;
import org.jerlang.type.List;
import org.jerlang.type.Str;
import org.jerlang.type.Term;
import org.jerlang.type.Tuple;
import org.junit.Test;
public class BeamLibTest {
@Test
public void testInfo1() throws IOException {
File tempFile = File.createTempFile("junit", "temp");
Str tempFilename = Str.of(tempFile.getCanonicalPath());
Term result = BeamLib.info(tempFilename);
assertTrue(result instanceof Tuple);
Tuple resultTuple = (Tuple) result;
Tuple expectedTuple = Tuple.of(
Atom.of("error"),
Atom.of("beam_lib"),
Tuple.of(
Atom.of("invalid_beam_file"),
tempFilename,
Integer.of(0)
));
assertEquals(expectedTuple, resultTuple);
}
@Test
public void testInfo2() throws IOException {
File file = new File("src/test/resources/pid.beam");
Str filename = Str.of(file.getCanonicalPath());
Term result = BeamLib.info(filename);
assertTrue(result instanceof List);
List resultList = (List) result;
Tuple filenameTuple = Tuple.of(Atom.of("file"), filename);
assertEquals(filenameTuple, resultList.head());
resultList = resultList.tail();
assertTrue(resultList.head() instanceof Tuple);
Tuple chunksTuple = (Tuple) resultList.head();
assertEquals(2, chunksTuple.arity());
assertEquals(Atom.of("chunks"), chunksTuple.element(1));
assertTrue(chunksTuple.element(2) instanceof List);
List chunkList = chunksTuple.element(2).toList();
assertChunk(chunkList.head(), "Atom", 20, 75);
chunkList = chunkList.tail();
assertChunk(chunkList.head(), "Code", 104, 116);
chunkList = chunkList.tail();
assertChunk(chunkList.head(), "StrT", 228, 0);
chunkList = chunkList.tail();
assertChunk(chunkList.head(), "ImpT", 236, 52);
chunkList = chunkList.tail();
assertChunk(chunkList.head(), "ExpT", 296, 40);
chunkList = chunkList.tail();
assertChunk(chunkList.head(), "LitT", 344, 33);
chunkList = chunkList.tail();
assertChunk(chunkList.head(), "LocT", 388, 4);
chunkList = chunkList.tail();
assertChunk(chunkList.head(), "Attr", 400, 40);
chunkList = chunkList.tail();
assertChunk(chunkList.head(), "CInf", 448, 115);
chunkList = chunkList.tail();
assertChunk(chunkList.head(), "Abst", 572, 0);
chunkList = chunkList.tail();
assertChunk(chunkList.head(), "Line", 580, 23);
chunkList = chunkList.tail();
assertEquals(List.nil, chunkList);
}
private void assertChunk(Term term, String id, int offset, int length) {
assertTrue(term instanceof Tuple);
assertEquals(Term.of(id), ((Tuple) term).element(1));
assertEquals(Integer.of(offset), ((Tuple) term).element(2));
assertEquals(Integer.of(length), ((Tuple) term).element(3));
}
}