File Parser for levels #18

Merged
tonitch merged 29 commits from MapParser into master 2023-04-21 20:00:16 +02:00
6 changed files with 94 additions and 63 deletions
Showing only changes of commit 035fe5cb9e - Show all commits

View File

@ -19,7 +19,9 @@ repositories {
dependencies {
// Use JUnit Jupiter for testing.
testImplementation 'org.junit.jupiter:junit-jupiter:5.9.1'
testImplementation 'org.junit.jupiter:junit-jupiter:5.9.2'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.2'
testImplementation 'org.junit.jupiter:junit-jupiter-params:5.9.2'
// This dependency is used by the application.
implementation 'com.google.guava:guava:31.1-jre'

View File

@ -102,7 +102,7 @@ public class BinaryParser implements FileParser {
byte piece_count = levelData[2 + map_width * map_height / 8 + (map_height * map_width % 8 != 0 ? 1 : 0)];
Piece[] ret = new Piece[piece_count];
byte[] pieces_data = Arrays.copyOfRange(levelData, 3 + map_width * map_height / 8 + (map_height * map_width % 8 != 0 ? 1 : 0), levelData.length);
byte[] pieces_positions = saved_data ? Arrays.copyOfRange(levelData, levelData.length - 1 - piece_count,levelData.length - 1): null;
byte[] pieces_positions = saved_data ? Arrays.copyOfRange(levelData, levelData.length - piece_count*2,levelData.length ): null;
int piece_offset = 0;
for (int piece_index = 0; piece_index < piece_count; piece_index++) {
Vec2 _piece_size = Bitwise.ByteToNible(pieces_data[piece_index + piece_offset]);
@ -140,21 +140,22 @@ public class BinaryParser implements FileParser {
* @return byte array with each element compiled for file format
*/
static byte[] BuildByteFromMatrix(boolean[][] shape){
// TODO: 3/27/23 Problem with this function to investigate
int width = shape[0].length , height = shape.length;
boolean[] list = new boolean[width * height];
boolean[] b_list = new boolean[width * height];
for (int x = 0; x < shape.length; x++) {
for (int y = 0; y < shape[x].length; y++) {
list[x * shape[x].length + y] = shape[x][y];
b_list[x * shape[x].length + y] = shape[x][y];
}
}
byte[] ret = new byte[width * height / 8 + width * height % 8 == 0 ? 0 : 1 ];
byte[] ret = new byte[width * height / 8 + (width * height % 8 == 0 ? 0 : 1)];
for (int i = 0; i < ret.length; i++) {
byte b = 0;
for (int b_count = i * 8; b_count < (i * 8 + 8) % (i * 8 - ret.length); b_count++) {
b = (byte) ((b << 1) | (list[b_count] ? 1 : 0));
byte current_byte = 0;
boolean[] current_byte_data = Arrays.copyOfRange(b_list, i * 8, i * 8 + 8);
for (boolean curr_data: current_byte_data) {
current_byte = (byte) (current_byte << 1);
current_byte = (byte) (current_byte | (curr_data ? 1 : 0));
}
ret[i] = b;
ret[i] = current_byte;
}
return ret;
}

View File

@ -24,10 +24,6 @@ public class Piece extends Shape{
}
public void setPosition(Vec2 position){
if (linked_map == null) {
return;
}
this.Position = position;
}

View File

@ -1,10 +1,12 @@
package school_project;
import java.io.Serializable;
/**
* This is used to represent a position/vector/... any ensemble of 2 elements that have to work together in
* a plan. This way we can use some basic operations over them.
*/
public class Vec2 {
public class Vec2 implements Serializable {
public int x, y;
public Vec2() {
@ -16,4 +18,12 @@ public class Vec2 {
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Vec2 vec) {
return this.x == vec.x && this.y == vec.y;
}
return false;
}
}

View File

@ -57,6 +57,19 @@ class BinaryParserTest {
}
@Test
void BuildByteFromMatrix(){
byte[] map_data = Arrays.copyOfRange(file_data, 5, 9);
boolean[][] map_shape = {
{false, false, true, true, false, false},
{false, true, true, true, true, false},
{true, true, false, false, true, true},
{true, true, false, false, true, true},
{true, true, true, true, true, true},
};
assertArrayEquals(map_data, BinaryParser.BuildByteFromMatrix(map_shape));
}
@Test
void BuildMatrixFromByte_map(){
byte[] map_data = Arrays.copyOfRange(file_data, 5, 9);

View File

@ -1,94 +1,103 @@
package school_project.Parsers;
import org.junit.jupiter.api.*;
import org.junit.jupiter.api.io.TempDir;
import school_project.Map;
import school_project.Piece;
import school_project.Vec2;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import static org.junit.jupiter.api.Assertions.*;
@TestMethodOrder(value = MethodOrderer.OrderAnnotation.class)
class FileParserFactoryTest {
static Map generateMapTest(){
boolean[][] map_shape = {
{true, true, true, true},
{true, false, true, true},
{true, true, false, true},
{true, true, false, false},
{false, false, true, true, false, false},
{false, true, true, true, true, false},
{true, true, false, false, true, true},
{true, true, false, false, true, true},
{true, true, true, true, true, true},
};
boolean[][] piece1_shape = {
{true, true},
{true, false},
{true, true},
{false, true},
{true, true},
};
boolean[][] piece2_shape = {
{true, true},
{true, false, false},
{true, true, false},
{false, true, true},
};
boolean[][] piece3_shape = {
{true, true},
{false, true},
{false, true, true},
{true, true, true},
};
Piece[] pieces = { new Piece(piece1_shape), new Piece(piece2_shape), new Piece(piece3_shape) };
boolean[][] piece4_shape = {
{true, true, false},
{true, true, false},
{true, true, true},
};
Piece[] pieces = { new Piece(piece1_shape), new Piece(piece2_shape), new Piece(piece3_shape), new Piece(piece4_shape) };
Map map = new Map(map_shape);
map.addPiece(pieces);
pieces[0].setPosition(new Vec2(1, 0));
pieces[1].setPosition(new Vec2(3, 0));
pieces[2].setPosition(new Vec2(3, 3));
pieces[3].setPosition(new Vec2(0, 2));
return map;
}
@Test
void saveFileFromMap_Binary() throws IOException {
void saveLoadFileFromMap_Binary(@TempDir Path tmpFolder) throws IOException {
Map map = generateMapTest();
FileParserFactory.saveFileFromMap(new File("TestBinaryLevel.level"), map);
}
FileParserFactory.saveFileFromMap(tmpFolder.resolve("TestBinaryLevel.level").toFile(), map);
@Test
void saveFileFromMap_save_Binary() throws IOException {
Map map = generateMapTest();
FileParserFactory.saveFileFromMap(new File("TestBinarySave.slevel"), map);
}
@Test
void saveFileFromMap_Serialized() throws IOException {
Map map = generateMapTest();
FileParserFactory.saveFileFromMap(new File("TestSerializedLevel.serialized"), map);
}
@Test
void saveFileFromMap_save_Serialized() throws IOException{
Map map = generateMapTest();
FileParserFactory.saveFileFromMap(new File("TestSerializedSave.sserialized"), map);
}
@Test
void loadMapFromFile_Binary() throws IOException {
Map map = generateMapTest();
Map testMap = FileParserFactory.loadMapFromFile(new File("src/test/resources/saveFileExamples/TestBinaryLevel.level"));
Map testMap = FileParserFactory.loadMapFromFile(tmpFolder.resolve("TestBinaryLevel.level").toFile());
assertArrayEquals(map.getCleanedMap().getShape(), testMap.getShape());
assertTrue(map.getCleanedMap().getPieces().equals(testMap.getPieces()));
for (int i = 0; i < map.getPieces().size(); i++) {
assertArrayEquals(map.getPieces().get(i).getShape(), testMap.getPieces().get(i).getShape());
}
}
@Test
void loadMapFromFile_saved_Binary() throws IOException {
void saveLoadFileFromMap_save_Binary(@TempDir Path tmpFolder) throws IOException {
Map map = generateMapTest();
Map testMap = FileParserFactory.loadMapFromFile(new File("src/test/resources/saveFileExamples/TestBinarySave.slevel"));
FileParserFactory.saveFileFromMap(tmpFolder.resolve("TestBinarySave.slevel").toFile(), map);
Map testMap = FileParserFactory.loadMapFromFile(tmpFolder.resolve("TestBinarySave.slevel").toFile());
assertArrayEquals(map.getShape(), testMap.getShape());
assert(map.getPieces().equals(testMap.getPieces()));
for (int i = 0; i < map.getPieces().size(); i++) {
assertArrayEquals(map.getPieces().get(i).getShape(), testMap.getPieces().get(i).getShape());
assertEquals(map.getPieces().get(i).getPosition(), testMap.getPieces().get(i).getPosition());
}
}
@Test
void loadMapFromFile_Serialized() throws IOException {
void saveLoadFileFromMap_Serialized(@TempDir Path tmpFolder) throws IOException {
Map map = generateMapTest();
Map testMap = FileParserFactory.loadMapFromFile(new File("src/test/resources/saveFileExamples/TestSerializedLevel.serialized"));
assertArrayEquals(map.getCleanedMap().getShape(), testMap.getShape());
assert(map.getCleanedMap().getPieces().equals(testMap.getPieces()));
FileParserFactory.saveFileFromMap( tmpFolder.resolve("TestSerializedLevel.serialized").toFile(), map);
Map testMap = FileParserFactory.loadMapFromFile( tmpFolder.resolve("TestSerializedLevel.serialized").toFile());
assertArrayEquals(map.getShape(), testMap.getShape());
for (int i = 0; i < map.getPieces().size(); i++) {
assertArrayEquals(map.getPieces().get(i).getShape(), testMap.getPieces().get(i).getShape());
}
}
@Test
void loadMapFromFile_saved_Serialized() throws IOException {
void saveLoadFileFromMap_save_Serialized(@TempDir Path tmpFolder) throws IOException{
Map map = generateMapTest();
Map testMap = FileParserFactory.loadMapFromFile(new File("src/test/resources/saveFileExamples/TestSerializedSave.sserialized"));
FileParserFactory.saveFileFromMap(tmpFolder.resolve("TestSerializedSave.sserialized").toFile(), map);
Map testMap = FileParserFactory.loadMapFromFile(tmpFolder.resolve("TestSerializedSave.sserialized").toFile());
assertArrayEquals(map.getShape(), testMap.getShape());
assertTrue(map.getPieces().equals(testMap.getPieces()));
for (int i = 0; i < map.getPieces().size(); i++) {
assertArrayEquals(map.getPieces().get(i).getShape(), testMap.getPieces().get(i).getShape());
assertEquals(map.getPieces().get(i).getPosition(), testMap.getPieces().get(i).getPosition());
}
}
}
}