Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(State): state.dat reading and writing #166

Merged
merged 13 commits into from
May 17, 2020
Merged
9 changes: 9 additions & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
module.exports = {
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaVersion: 2020,
sourceType: 'module',
},
extends: ['plugin:@typescript-eslint/recommended', 'prettier/@typescript-eslint', 'plugin:prettier/recommended'],
rules: {},
};
5 changes: 0 additions & 5 deletions .prettierrc

This file was deleted.

7 changes: 7 additions & 0 deletions .prettierrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
module.exports = {
semi: true,
trailingComma: "all",
singleQuote: true,
printWidth: 120,
tabWidth: 2
};
10 changes: 0 additions & 10 deletions .travis.yml

This file was deleted.

Binary file added __tests__/assets/state/state.dat
Binary file not shown.
Binary file added __tests__/assets/state/state_default.dat
Binary file not shown.
Binary file added __tests__/assets/state/state_skipped_max_tag.dat
Binary file not shown.
328 changes: 152 additions & 176 deletions __tests__/lev.int.test.ts
Original file line number Diff line number Diff line change
@@ -1,176 +1,152 @@
import { Clip, Gravity, Level, ObjectType, Version } from '../src';

describe('Level', () => {
test('parses valid level #1', async () => {
const level = await Level.load('__tests__/assets/levels/lev_valid_1.lev');
expect(level).toBeInstanceOf(Level);
expect(level.version).toBe(Version.Elma);
expect(level.link).toBe(1524269776);
expect(level.integrity).toEqual([
-1148375.210607791,
1164056.210607791,
1162467.210607791,
1162283.210607791,
]);
expect(level.name).toBe('Rust test');
expect(level.lgr).toBe('default');
expect(level.ground).toBe('ground');
expect(level.sky).toBe('sky');

expect(level.polygons.length).toBe(2);
expect(level.polygons[0].grass).toBeFalsy();
expect(level.polygons[0].vertices[0].x).toBe(-23.993693053024586);
expect(level.polygons[0].vertices[1].y).toBe(3.135779367971911);
expect(level.polygons[0].vertices[2].x).toBe(-15.989070625361132);
expect(level.polygons[0].vertices[3].y).toBe(-2);
expect(level.polygons[1].grass).toBeTruthy();
expect(level.polygons[1].vertices[0].y).toBe(-2.310222676563402);
expect(level.polygons[1].vertices[1].x).toBe(-17.60428907951465);
expect(level.polygons[1].vertices[2].y).toBe(-1.8956975865594021);
expect(level.polygons[1].vertices[3].y).toBe(-1.924285523801057);

expect(level.objects.length).toBe(8);
expect(level.objects[0].position.x).toBe(-23.221818747499896);
expect(level.objects[0].position.y).toBe(1.3204453531268072);
expect(level.objects[0].type).toBe(ObjectType.Killer);
expect(level.objects[0].animation).toBe(1);
expect(level.objects[1].position.y).toBe(0.3124543521844827);
expect(level.objects[1].type).toBe(ObjectType.Apple);
expect(level.objects[1].animation).toBe(9);
expect(level.objects[1].gravity).toBe(Gravity.None);
expect(level.objects[2].gravity).toBe(Gravity.Up);
expect(level.objects[3].gravity).toBe(Gravity.Right);
expect(level.objects[3].animation).toBe(5);
expect(level.objects[4].position.y).toBe(-0.38243398140588436);
expect(level.objects[4].gravity).toBe(Gravity.Left);
expect(level.objects[6].position.x).toBe(-20.075620321380434);
expect(level.objects[6].type).toBe(ObjectType.Exit);
expect(level.objects[7].type).toBe(ObjectType.Start);

expect(level.pictures.length).toBe(2);
expect(level.pictures[0].name).toBe('barrel');
expect(level.pictures[0].texture).toBe('');
expect(level.pictures[0].mask).toBe('');
expect(level.pictures[0].position.x).toBe(-19.37674118849727);
expect(level.pictures[0].position.y).toBe(-0.895119783101471);
expect(level.pictures[0].distance).toBe(380);
expect(level.pictures[0].clip).toBe(Clip.Sky);
expect(level.pictures[1].name).toBe('');
expect(level.pictures[1].texture).toBe('stone1');
expect(level.pictures[1].mask).toBe('maskbig');
expect(level.pictures[1].position.x).toBe(-24.465394017511894);
expect(level.pictures[1].position.y).toBe(3.964829547979911);
expect(level.pictures[1].distance).toBe(750);
expect(level.pictures[1].clip).toBe(Clip.Sky);

expect(level.top10.single.length).toBe(10);
expect(level.top10.single[0].name1).toBe('Rust');
expect(level.top10.single[0].name2).toBe('Cargo');
expect(level.top10.single[0].time).toBe(201);
expect(level.top10.single[2].name1).toBe('Cargo');
expect(level.top10.single[2].time).toBe(206);
expect(level.top10.single[9].time).toBe(308);
});

test('parses valid level #2', async () => {
const level = await Level.load('__tests__/assets/levels/lev_valid_2.lev');
expect(level).toBeInstanceOf(Level);
expect(level.version).toBe(Version.Elma);
expect(level.link).toBe(1505288190);
expect(level.name).toBe('');
expect(level.ground).toBe('brick');
expect(level.sky).toBe('ground');

expect(level.polygons.length).toBe(5);
expect(level.polygons[0].grass).toBeFalsy();
expect(level.polygons[0].vertices.length).toBe(4);
expect(level.polygons[0].vertices[0].x).toBe(18.507991950076164);
expect(level.polygons[0].vertices[1].y).toBe(-17.978810742022475);

expect(level.objects.length).toBe(17);

expect(level.pictures.length).toBe(3);

expect(level.top10.single.length).toBe(0);
});

test('across level throws', () => {
return expect(
Level.load('__tests__/assets/levels/lev_across.lev')
).rejects.toEqual(new Error('Across levels are not supported'));
});

test('identifies invalid level', () => {
return expect(
Level.load('__tests__/assets/levels/lev_invalid_1.lev')
).rejects.toEqual(new Error('Not valid Elma level'));
});

test('rejects invalid clip value', () => {
return expect(
Level.load('__tests__/assets/levels/invalid_clip.lev')
).rejects.toEqual(new Error('Invalid clip value=3 at offset=1884'));
});

test('rejects invalid gravity value', () => {
return expect(
Level.load('__tests__/assets/levels/invalid_grav.lev')
).rejects.toEqual(new Error('Invalid gravity value=6 at offset=1430'));
});

test('rejects invalid object value', () => {
return expect(
Level.load('__tests__/assets/levels/invalid_obj.lev')
).rejects.toEqual(new Error('Invalid object type value=6 at offset=1538'));
});

test('identifies missing EOD marker', () => {
return expect(
Level.load('__tests__/assets/levels/missing_EOD.lev')
).rejects.toEqual(new Error('End of data marker mismatch'));
});

test('identifies missing EOF marker', () => {
return expect(
Level.load('__tests__/assets/levels/missing_EOF.lev')
).rejects.toEqual(new Error('End of file marker mismatch'));
});

test('.toBuffer() of unmodified level matches original #1', async () => {
const levelOriginal = await Level.load(
'__tests__/assets/levels/lev_valid_1.lev'
);
const buffer = await levelOriginal.toBuffer();
const bufferLevel = await Level.load(buffer);
expect(levelOriginal).toEqual(bufferLevel);
});

test('.save() unmodified level matches original #1', async () => {
const levelOriginal = await Level.load(
'__tests__/assets/levels/lev_valid_1.lev'
);
const path = 'temp/save_lev_valid_1.lev';
await levelOriginal.save(path);
const savedLevel = await Level.load(path);
expect(levelOriginal).toEqual(savedLevel);
});

test('.toBuffer() of unmodified level matches original #2', async () => {
const levelOriginal = await Level.load(
'__tests__/assets/levels/lev_valid_2.lev'
);
const buffer = await levelOriginal.toBuffer();
const bufferLevel = await Level.load(buffer);
expect(levelOriginal).toEqual(bufferLevel);
});

test('.save() unmodified level matches original #2', async () => {
const levelOriginal = await Level.load(
'__tests__/assets/levels/lev_valid_2.lev'
);
const path = 'temp/save_lev_valid_2.lev';
await levelOriginal.save(path);
const savedLevel = await Level.load(path);
expect(levelOriginal).toEqual(savedLevel);
});
});
import { readFile, writeFile } from 'fs-extra';

import { Clip, Gravity, Level, ObjectType, Version } from '../src';

describe('Level', () => {
test('parses valid level #1', async () => {
const filePath = '__tests__/assets/levels/lev_valid_1.lev';
const file = await readFile(filePath);
const level = await Level.from(file);

expect(level).toBeInstanceOf(Level);
expect(level.version).toBe(Version.Elma);
expect(level.link).toBe(1524269776);
expect(level.integrity).toEqual([-1148375.210607791, 1164056.210607791, 1162467.210607791, 1162283.210607791]);
expect(level.name).toBe('Rust test');
expect(level.lgr).toBe('default');
expect(level.ground).toBe('ground');
expect(level.sky).toBe('sky');

expect(level.polygons.length).toBe(2);
expect(level.polygons[0].grass).toBeFalsy();
expect(level.polygons[0].vertices[0].x).toBe(-23.993693053024586);
expect(level.polygons[0].vertices[1].y).toBe(3.135779367971911);
expect(level.polygons[0].vertices[2].x).toBe(-15.989070625361132);
expect(level.polygons[0].vertices[3].y).toBe(-2);
expect(level.polygons[1].grass).toBeTruthy();
expect(level.polygons[1].vertices[0].y).toBe(-2.310222676563402);
expect(level.polygons[1].vertices[1].x).toBe(-17.60428907951465);
expect(level.polygons[1].vertices[2].y).toBe(-1.8956975865594021);
expect(level.polygons[1].vertices[3].y).toBe(-1.924285523801057);

expect(level.objects.length).toBe(8);
expect(level.objects[0].position.x).toBe(-23.221818747499896);
expect(level.objects[0].position.y).toBe(1.3204453531268072);
expect(level.objects[0].type).toBe(ObjectType.Killer);
expect(level.objects[0].animation).toBe(1);
expect(level.objects[1].position.y).toBe(0.3124543521844827);
expect(level.objects[1].type).toBe(ObjectType.Apple);
expect(level.objects[1].animation).toBe(9);
expect(level.objects[1].gravity).toBe(Gravity.None);
expect(level.objects[2].gravity).toBe(Gravity.Up);
expect(level.objects[3].gravity).toBe(Gravity.Right);
expect(level.objects[3].animation).toBe(5);
expect(level.objects[4].position.y).toBe(-0.38243398140588436);
expect(level.objects[4].gravity).toBe(Gravity.Left);
expect(level.objects[6].position.x).toBe(-20.075620321380434);
expect(level.objects[6].type).toBe(ObjectType.Exit);
expect(level.objects[7].type).toBe(ObjectType.Start);

expect(level.pictures.length).toBe(2);
expect(level.pictures[0].name).toBe('barrel');
expect(level.pictures[0].texture).toBe('');
expect(level.pictures[0].mask).toBe('');
expect(level.pictures[0].position.x).toBe(-19.37674118849727);
expect(level.pictures[0].position.y).toBe(-0.895119783101471);
expect(level.pictures[0].distance).toBe(380);
expect(level.pictures[0].clip).toBe(Clip.Sky);
expect(level.pictures[1].name).toBe('');
expect(level.pictures[1].texture).toBe('stone1');
expect(level.pictures[1].mask).toBe('maskbig');
expect(level.pictures[1].position.x).toBe(-24.465394017511894);
expect(level.pictures[1].position.y).toBe(3.964829547979911);
expect(level.pictures[1].distance).toBe(750);
expect(level.pictures[1].clip).toBe(Clip.Sky);

expect(level.top10.single.length).toBe(10);
expect(level.top10.single[0].name1).toBe('Rust');
expect(level.top10.single[0].name2).toBe('Cargo');
expect(level.top10.single[0].time).toBe(201);
expect(level.top10.single[2].name1).toBe('Cargo');
expect(level.top10.single[2].time).toBe(206);
expect(level.top10.single[9].time).toBe(308);
});

test('parses valid level #2', async () => {
const filePath = '__tests__/assets/levels/lev_valid_2.lev';
const file = await readFile(filePath);
const level = await Level.from(file);
expect(level).toBeInstanceOf(Level);
expect(level.version).toBe(Version.Elma);
expect(level.link).toBe(1505288190);
expect(level.name).toBe('');
expect(level.ground).toBe('brick');
expect(level.sky).toBe('ground');

expect(level.polygons.length).toBe(5);
expect(level.polygons[0].grass).toBeFalsy();
expect(level.polygons[0].vertices.length).toBe(4);
expect(level.polygons[0].vertices[0].x).toBe(18.507991950076164);
expect(level.polygons[0].vertices[1].y).toBe(-17.978810742022475);

expect(level.objects.length).toBe(17);

expect(level.pictures.length).toBe(3);

expect(level.top10.single.length).toBe(0);
});

test('across level throws', async () => {
const filePath = '__tests__/assets/levels/lev_across.lev';
const file = await readFile(filePath);
return expect(Level.from(file)).rejects.toEqual(new Error('Across levels are not supported'));
});

test('identifies invalid level', async () => {
const filePath = '__tests__/assets/levels/lev_invalid_1.lev';
const file = await readFile(filePath);
return expect(Level.from(file)).rejects.toEqual(new Error('Not valid Elma level'));
});

test('rejects invalid clip value', async () => {
const filePath = '__tests__/assets/levels/invalid_clip.lev';
const file = await readFile(filePath);
return expect(Level.from(file)).rejects.toEqual(new Error('Invalid clip value=3 at offset=1884'));
});

test('rejects invalid gravity value', async () => {
const filePath = '__tests__/assets/levels/invalid_grav.lev';
const file = await readFile(filePath);
return expect(Level.from(file)).rejects.toEqual(new Error('Invalid gravity value=6 at offset=1430'));
});

test('rejects invalid object value', async () => {
const filePath = '__tests__/assets/levels/invalid_obj.lev';
const file = await readFile(filePath);
return expect(Level.from(file)).rejects.toEqual(new Error('Invalid object type value=6 at offset=1538'));
});

test('identifies missing EOD marker', async () => {
const filePath = '__tests__/assets/levels/missing_EOD.lev';
const file = await readFile(filePath);
return expect(Level.from(file)).rejects.toEqual(new Error('End of data marker mismatch'));
});

test('identifies missing EOF marker', async () => {
const filePath = '__tests__/assets/levels/missing_EOF.lev';
const file = await readFile(filePath);
return expect(Level.from(file)).rejects.toEqual(new Error('End of file marker mismatch'));
});

test('.toBuffer() of unmodified level matches original', async () => {
const filePaths = ['__tests__/assets/levels/lev_valid_1.lev', '__tests__/assets/levels/lev_valid_2.lev'];

for (const filePath of filePaths) {
const file = await readFile(filePath);
const levelOriginal = await Level.from(file);
const buffer = await levelOriginal.toBuffer();
const bufferLevel = await Level.from(buffer);
expect(levelOriginal).toEqual(bufferLevel);
}
});
});
10 changes: 5 additions & 5 deletions __tests__/lev.unit.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
describe('Level.something()', () => {
test('does something', () => {
expect(false).toBe(false)
})
})
describe('Level.something()', () => {
test('does something', () => {
expect(false).toBe(false);
});
});
Loading