Includes scratch-gui, scratch-vm, scratch-blocks, scratch-render, scratch-l10n, and deployment config. Co-authored-by: Cursor <cursoragent@cursor.com>
122 lines
3.4 KiB
JavaScript
122 lines
3.4 KiB
JavaScript
const {loadCostume} = require('../../src/import/load-costume');
|
|
const {loadSound} = require('../../src/import/load-sound');
|
|
const Runtime = require('../../src/engine/runtime');
|
|
const makeTestStorage = require('../fixtures/make-test-storage');
|
|
const FakeRenderer = require('../fixtures/fake-renderer');
|
|
const FakeBitmapAdapter = require('../fixtures/fake-bitmap-adapter');
|
|
const {test} = require('tap');
|
|
|
|
global.Image = function () {
|
|
const image = {
|
|
width: 10,
|
|
height: 10
|
|
};
|
|
setTimeout(() => {
|
|
if (image.onload) {
|
|
image.onload();
|
|
}
|
|
});
|
|
return image;
|
|
};
|
|
|
|
class FakeAudioEngine {
|
|
decodeSoundPlayer () {
|
|
return Promise.resolve({
|
|
id: 0,
|
|
buffer: {
|
|
sampleRate: 1,
|
|
length: 1
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
test('load bitmap in packaged runtime', async t => {
|
|
const rt = new Runtime();
|
|
rt.convertToPackagedRuntime();
|
|
rt.attachRenderer(new FakeRenderer());
|
|
rt.attachV2BitmapAdapter(new FakeBitmapAdapter());
|
|
const storage = makeTestStorage();
|
|
rt.attachStorage(storage);
|
|
const asset = storage.createAsset(
|
|
storage.AssetType.ImageBitmap,
|
|
storage.DataFormat.PNG,
|
|
new ArrayBuffer(10),
|
|
null,
|
|
true
|
|
);
|
|
const costume = await loadCostume(`${asset.assetId}.png`, {asset}, rt);
|
|
t.equal(costume.asset, null);
|
|
t.end();
|
|
});
|
|
|
|
test('load vector in packaged runtime', async t => {
|
|
const rt = new Runtime();
|
|
rt.convertToPackagedRuntime();
|
|
rt.attachRenderer(new FakeRenderer());
|
|
const storage = makeTestStorage();
|
|
rt.attachStorage(storage);
|
|
const asset = storage.createAsset(
|
|
storage.AssetType.ImageVector,
|
|
storage.DataFormat.SVG,
|
|
new ArrayBuffer(10),
|
|
null,
|
|
true
|
|
);
|
|
const costume = await loadCostume(`${asset.assetId}.svg`, {asset}, rt);
|
|
t.equal(costume.asset, null);
|
|
t.end();
|
|
});
|
|
|
|
test('load sound in packaged runtime', async t => {
|
|
const rt = new Runtime();
|
|
rt.convertToPackagedRuntime();
|
|
const storage = makeTestStorage();
|
|
rt.attachStorage(storage);
|
|
rt.attachAudioEngine(new FakeAudioEngine());
|
|
const asset = storage.createAsset(
|
|
storage.AssetType.Sound,
|
|
storage.DataFormat.MP3,
|
|
new ArrayBuffer(10),
|
|
null,
|
|
true
|
|
);
|
|
const costume = await loadSound({
|
|
asset,
|
|
md5: `${asset.assetId}.mp3`
|
|
}, rt, null);
|
|
t.equal(costume.asset, null);
|
|
t.end();
|
|
});
|
|
|
|
test('storage.createAsset never generates real asset IDs', t => {
|
|
const rt = new Runtime();
|
|
rt.convertToPackagedRuntime();
|
|
const storage = makeTestStorage();
|
|
rt.attachStorage(storage);
|
|
const shouldUseGivenID = storage.createAsset(
|
|
storage.AssetType.ImageBitmap,
|
|
storage.DataFormat.PNG,
|
|
new ArrayBuffer(10),
|
|
'a'.repeat(32)
|
|
);
|
|
t.equal(shouldUseGivenID.assetId, 'a'.repeat(32));
|
|
const shouldUseFakeID = storage.createAsset(
|
|
storage.AssetType.ImageBitmap,
|
|
storage.DataFormat.PNG,
|
|
new ArrayBuffer(11),
|
|
null,
|
|
true
|
|
);
|
|
t.equal(shouldUseFakeID.assetId, '1');
|
|
const shouldUseDifferentFakeID = storage.createAsset(
|
|
storage.AssetType.ImageBitmap,
|
|
storage.DataFormat.PNG,
|
|
new ArrayBuffer(12),
|
|
null,
|
|
true
|
|
);
|
|
t.equal(shouldUseDifferentFakeID.assetId, '2');
|
|
t.end();
|
|
});
|