132 lines
4.3 KiB
JavaScript
132 lines
4.3 KiB
JavaScript
|
/* eslint-env mocha */
|
||
|
|
||
|
const flatMap = require('flatmap')
|
||
|
const range = require('range').range
|
||
|
const bufferEqual = require('buffer-equal')
|
||
|
const World = require('../')('1.8')
|
||
|
const Chunk = require('prismarine-chunk')('1.8')
|
||
|
const Vec3 = require('vec3').Vec3
|
||
|
const assert = require('assert')
|
||
|
const mkdirp = require('mkdirp')
|
||
|
const rimraf = require('rimraf')
|
||
|
const Anvil = require('prismarine-provider-anvil').Anvil('1.8')
|
||
|
|
||
|
describe('saving and loading works', function () {
|
||
|
function generateRandomChunk (chunkX, chunkZ) {
|
||
|
const chunk = new Chunk()
|
||
|
|
||
|
for (let x = 0; x < 16; x++) {
|
||
|
for (let z = 0; z < 16; z++) {
|
||
|
chunk.setBlockType(new Vec3(x, 50, z), Math.floor(Math.random() * 50))
|
||
|
for (let y = 0; y < 256; y++) {
|
||
|
chunk.setSkyLight(new Vec3(x, y, z), 15)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return chunk
|
||
|
}
|
||
|
|
||
|
const regionPath = 'world/testRegion'
|
||
|
before((cb) => {
|
||
|
mkdirp(regionPath, cb)
|
||
|
})
|
||
|
|
||
|
after(cb => {
|
||
|
rimraf(regionPath, cb)
|
||
|
})
|
||
|
|
||
|
let originalWorld
|
||
|
const size = 3
|
||
|
|
||
|
it('save the world', async () => {
|
||
|
originalWorld = new World(generateRandomChunk, new Anvil(regionPath))
|
||
|
await Promise.all(
|
||
|
flatMap(range(0, size), (chunkX) => range(0, size).map(chunkZ => ({ chunkX, chunkZ })))
|
||
|
.map(({ chunkX, chunkZ }) => originalWorld.getColumn(chunkX, chunkZ))
|
||
|
)
|
||
|
await originalWorld.waitSaving()
|
||
|
})
|
||
|
|
||
|
it('load the world correctly', async () => {
|
||
|
const loadedWorld = new World(null, new Anvil(regionPath))
|
||
|
await Promise.all(
|
||
|
flatMap(range(0, size), (chunkX) => range(0, size).map(chunkZ => ({ chunkX, chunkZ })))
|
||
|
.map(async ({ chunkX, chunkZ }) => {
|
||
|
const originalChunk = await originalWorld.getColumn(chunkX, chunkZ)
|
||
|
const loadedChunk = await loadedWorld.getColumn(chunkX, chunkZ)
|
||
|
assert.strictEqual(originalChunk.getBlockType(new Vec3(0, 50, 0)), loadedChunk.getBlockType(new Vec3(0, 50, 0)), 'wrong block type at 0,50,0 of chunk ' + chunkX + ',' + chunkZ)
|
||
|
assert(bufferEqual(originalChunk.dump(), loadedChunk.dump()))
|
||
|
})
|
||
|
)
|
||
|
})
|
||
|
|
||
|
it('setBlocks', async () => {
|
||
|
const world = new World(null, new Anvil(regionPath))
|
||
|
for (let i = 0; i < 10000; i++) {
|
||
|
await world.setBlockType(new Vec3(Math.random() * (16 * size - 1), Math.random() * 255, Math.random() * (16 * size - 1)), 0)
|
||
|
}
|
||
|
await world.waitSaving()
|
||
|
})
|
||
|
})
|
||
|
|
||
|
describe('Synchronous saving and loading works', function () {
|
||
|
function generateRandomChunk (chunkX, chunkZ) {
|
||
|
const chunk = new Chunk()
|
||
|
|
||
|
for (let x = 0; x < 16; x++) {
|
||
|
for (let z = 0; z < 16; z++) {
|
||
|
chunk.setBlockType(new Vec3(x, 50, z), Math.floor(Math.random() * 50))
|
||
|
for (let y = 0; y < 256; y++) {
|
||
|
chunk.setSkyLight(new Vec3(x, y, z), 15)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return chunk
|
||
|
}
|
||
|
|
||
|
const regionPath = 'world/testRegionSync'
|
||
|
before((cb) => {
|
||
|
mkdirp(regionPath, cb)
|
||
|
})
|
||
|
|
||
|
after(cb => {
|
||
|
rimraf(regionPath, cb)
|
||
|
})
|
||
|
|
||
|
let originalWorld
|
||
|
const size = 3
|
||
|
|
||
|
it('saving the world', async () => {
|
||
|
originalWorld = new World(generateRandomChunk, new Anvil(regionPath))
|
||
|
await Promise.all(
|
||
|
flatMap(range(0, size), (chunkX) => range(0, size).map(chunkZ => ({ chunkX, chunkZ })))
|
||
|
.map(({ chunkX, chunkZ }) => originalWorld.getColumn(chunkX, chunkZ))
|
||
|
)
|
||
|
await originalWorld.waitSaving()
|
||
|
})
|
||
|
|
||
|
it('load the world correctly', async () => {
|
||
|
const loadedWorld = new World(null, new Anvil(regionPath))
|
||
|
await Promise.all(
|
||
|
flatMap(range(0, size), (chunkX) => range(0, size).map(chunkZ => ({ chunkX, chunkZ })))
|
||
|
.map(async ({ chunkX, chunkZ }) => {
|
||
|
await loadedWorld.getColumn(chunkX, chunkZ)
|
||
|
const originalChunk = originalWorld.sync.getColumn(chunkX, chunkZ)
|
||
|
const loadedChunk = loadedWorld.sync.getColumn(chunkX, chunkZ)
|
||
|
assert.strictEqual(originalChunk.getBlockType(new Vec3(0, 50, 0)), loadedChunk.getBlockType(new Vec3(0, 50, 0)), 'wrong block type at 0,50,0 of chunk ' + chunkX + ',' + chunkZ)
|
||
|
assert(bufferEqual(originalChunk.dump(), loadedChunk.dump()))
|
||
|
})
|
||
|
)
|
||
|
})
|
||
|
|
||
|
it('setBlocks', async () => {
|
||
|
const world = new World(null, new Anvil(regionPath))
|
||
|
for (let i = 0; i < 10000; i++) {
|
||
|
world.sync.setBlockType(new Vec3(Math.random() * (16 * size - 1), Math.random() * 255, Math.random() * (16 * size - 1)), 0)
|
||
|
}
|
||
|
await world.waitSaving()
|
||
|
})
|
||
|
})
|