diff --git a/test/ChunkColumn.test.js b/test/ChunkColumn.test.js index 6b125e3c..fc23b776 100644 --- a/test/ChunkColumn.test.js +++ b/test/ChunkColumn.test.js @@ -1,26 +1,32 @@ /* eslint-env mocha */ -const versions = ['bedrock_1.16.220', 'bedrock_1.17.40', 'bedrock_1.18.0', '1.8', '1.9', '1.10', '1.11', '1.12', '1.13.2', '1.14.4', '1.15.2', '1.16.1', '1.17', '1.18'] +const { allVersions } = require('./versions') const constants = require('../src/pc/common/constants') const { Vec3 } = require('vec3') const assert = require('assert') const expect = require('expect').default -for (const version of versions) { +for (const version of allVersions) { const registry = require('prismarine-registry')(version) const Block = require('prismarine-block')(registry) const ChunkColumn = require('prismarine-chunk')(registry) + // TODO: fix 2 bugs: node-mc-data feature checks fail on bedrock 0.14, is missing some functions and bedrock v1.0 chunk impl fails here + // let chunkHeight + const chunkHeight = constants.CHUNK_HEIGHT + if (version === 'bedrock_0.14' || version === 'bedrock_1.0') continue + describe('ChunkColumn on ' + version, () => { it('use function to initialize the chunk column', () => { const stateId = 20 const block = Block.fromStateId(stateId, 1) + assert(block.stateId === stateId) const column = new ChunkColumn() column.initialize(() => { return block }) const p = new Vec3(0, 0, 0) for (p.x = 0; p.x < constants.SECTION_WIDTH; p.x++) { - for (p.y = 0; p.y < constants.CHUNK_HEIGHT; p.y++) { + for (p.y = 0; p.y < chunkHeight; p.y++) { for (p.z = 0; p.z < constants.SECTION_WIDTH; p.z++) { if (column.getBlock(p).stateId !== stateId) { throw new Error('id mismatch: expected ' + stateId + ' got ' + column.getBlock(p).stateId) @@ -35,7 +41,7 @@ for (const version of versions) { let different = 0 const p = new Vec3(0, 0, 0) - for (p.y = 0; p.y < constants.CHUNK_HEIGHT; p.y++) { + for (p.y = 0; p.y < chunkHeight; p.y++) { for (p.z = 0; p.z < constants.SECTION_WIDTH; p.z++) { for (p.x = 0; p.x < constants.SECTION_WIDTH; p.x++) { // 0 cannot be assumed as air, bedrock assigns stateIds alphabetically @@ -61,7 +67,7 @@ for (const version of versions) { it('Defaults to all blocks being air', function () { const chunk = new ChunkColumn() assert.strictEqual(registry.blocksByName.air.id, chunk.getBlock(new Vec3(0, 0, 0)).type) - assert.strictEqual(registry.blocksByName.air.id, chunk.getBlock(new Vec3(15, constants.CHUNK_HEIGHT - 1, 15)).type) + assert.strictEqual(registry.blocksByName.air.id, chunk.getBlock(new Vec3(15, chunkHeight - 1, 15)).type) }) it('Out of bounds blocks being air', function () { @@ -97,11 +103,11 @@ for (const version of versions) { // Everything should have a stateId { - const birchPlanksId = registry.blocksByName.planks?.defaultState || registry.blocksByName.birch_planks.defaultState + const birchPlanksId = registry.blocksByName.planks?.defaultState || registry.blocksByName.wood_planks?.defaultState || registry.blocksByName.birch_planks.defaultState chunk.setBlock(new Vec3(0, 0, 0), Block.fromStateId(birchPlanksId)) assert.strictEqual(birchPlanksId, chunk.getBlock(new Vec3(0, 0, 0)).stateId) - const ironBlockId = registry.blocksByName.iron_block.defaultState + const ironBlockId = registry.blocksByName.iron_block?.defaultState || registry.blocksByName.block_of_iron.defaultState chunk.setBlock(new Vec3(0, 37, 0), Block.fromStateId(ironBlockId)) assert.strictEqual(ironBlockId, chunk.getBlock(new Vec3(0, 37, 0)).stateId) } diff --git a/test/ChunkSection.test.js b/test/ChunkSection.test.js index c7e0ace5..f4893995 100644 --- a/test/ChunkSection.test.js +++ b/test/ChunkSection.test.js @@ -5,7 +5,7 @@ const ChunkSection = require('../src/pc/1.13/ChunkSection') const constants = require('../src/pc/common/constants') const assert = require('assert') -describe('ChunkSection', () => { +describe('pc 1.13 ChunkSection', () => { it('insert into middle of palette', () => { const section = new ChunkSection() section.setBlock(new Vec3(0, 0, 0), 14) diff --git a/test/pc.test.js b/test/pc.test.js index 9846e532..996de119 100644 --- a/test/pc.test.js +++ b/test/pc.test.js @@ -1,18 +1,18 @@ /* eslint-env mocha */ const { Vec3 } = require('vec3') const assert = require('assert') +const { pcVersions } = require('./versions') -const versions = ['1.8', '1.9', '1.10', '1.11', '1.12', '1.13.2', '1.14.4', '1.15.2', '1.16.1', '1.17', '1.18', '1.19', '1.20'] +for (const version of pcVersions) { + const registry = require('prismarine-registry')(version) + if (!registry.supportFeature('usesPalettedChunks')) { + continue + } + if (version === 'bedrock_0.14') continue // todo: remove after https://github.com/PrismarineJS/minecraft-data/pull/769 -for (const version of versions) { describe('pc section tests ' + version, () => { - const registry = require('prismarine-registry')(version) const ChunkColumn = require('prismarine-chunk')(registry) - if (registry.version['<']('1.9')) { - return - } - it('compaction works', () => { const column = new ChunkColumn() const fakeBlocks = [1, 2, 3] diff --git a/test/test.js b/test/test.js index 9125bd38..0ca86088 100644 --- a/test/test.js +++ b/test/test.js @@ -9,32 +9,21 @@ const chunkLoader = require('../index') const SingleValueContainer = require('../src/pc/common/PaletteContainer').SingleValueContainer const constants = require('../src/pc/common/constants') const { performance } = require('perf_hooks') +const { pcVersions, pcCycleTests } = require('./versions') const expect = require('expect').default -const versions = ['bedrock_0.14', 'bedrock_1.0', '1.8', '1.9', '1.10', '1.11', '1.12', '1.13.2', '1.14.4', '1.15.2', '1.16.1', '1.17', '1.18', '1.19', '1.20'] -const cycleTests = ['1.8', '1.9', '1.10', '1.11', '1.12', '1.13.2', '1.14.4', '1.15.2', '1.16.1', '1.17', '1.18', '1.19', '1.20'] - -versions.forEach((version) => describe(`Chunk implementation for minecraft ${version}`, () => { +pcVersions.forEach((version) => describe(`Chunk implementation for minecraft ${version}`, () => { const registry = require('prismarine-registry')(version) const Chunk = chunkLoader(registry) const Block = prismarineBlockLoader(registry) - const isPostFlattening = version.startsWith('1.13') || version.startsWith('1.14') || - version.startsWith('1.15') || version.startsWith('1.16') || version.startsWith('1.17') || - version.startsWith('1.18') || version.startsWith('1.19') || version.startsWith('1.20') - - const serializesLightingDataSeparately = version.startsWith('1.14') || version.startsWith('1.15') || - version.startsWith('1.16') || version.startsWith('1.17') || version.startsWith('1.18') || - version.startsWith('1.19') || version.startsWith('1.20') - - const newLightingDataFormat = version.startsWith('1.17') || version.startsWith('1.18') || version.startsWith('1.19') || - version.startsWith('1.20') - - const serializesBiomesSeparately = version.startsWith('1.15') || version.startsWith('1.16') || - version.startsWith('1.17') - - const unifiedPaletteFormat = version.startsWith('1.18') || version.startsWith('1.19') || version.startsWith('1.20') - const tallWorld = version.startsWith('1.18') || version.startsWith('1.19') || version.startsWith('1.20') + // TODO: remove these in favor of direct registry.feature calls + const isPostFlattening = registry.supportFeature('usesBlockStates') + const serializesLightingDataSeparately = registry.supportFeature('lightSentSeparately') + const newLightingDataFormat = registry.supportFeature('newLightingDataFormat') + const serializesBiomesSeparately = registry.supportFeature('biomesSentSeparately') + const tallWorld = registry.supportFeature('tallWorld') + const unifiedPaletteFormat = tallWorld if (version === '1.8') { it('Handles {skylightSent: false}', () => { @@ -220,7 +209,7 @@ versions.forEach((version) => describe(`Chunk implementation for minecraft ${ver } } - if (cycleTests.includes(version)) { + if (pcCycleTests.includes(version)) { const folder = path.join(__dirname, version) const files = fs.readdirSync(folder) const chunkFiles = files.filter(file => file.includes('.dump') && !file.includes('light')) diff --git a/test/versions.js b/test/versions.js new file mode 100644 index 00000000..dbb1ff0c --- /dev/null +++ b/test/versions.js @@ -0,0 +1,8 @@ +const fs = require('fs') +const pcVersions = ['bedrock_0.14', 'bedrock_1.0', '1.8', '1.9', '1.10', '1.11', '1.12', '1.13.2', '1.14.4', '1.15.2', '1.16.1', '1.17', '1.18', '1.19', '1.20'] +const bedrockVersions = ['bedrock_1.16.220', 'bedrock_1.17.40', 'bedrock_1.18.0'] +const allVersions = [...bedrockVersions, ...pcVersions] + +const pcCycleTests = pcVersions.filter(v => fs.existsSync(v)) +const bedrockCycleTests = bedrockVersions.filter(v => fs.existsSync(v)) +module.exports = { pcVersions, pcCycleTests, bedrockVersions, bedrockCycleTests, allVersions }