Initial commit of 001code-html Scratch frontend project.

Includes scratch-gui, scratch-vm, scratch-blocks, scratch-render, scratch-l10n, and deployment config.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-16 15:37:45 +08:00
commit 6e0a1fbcbb
11350 changed files with 965674 additions and 0 deletions

View File

@@ -0,0 +1,121 @@
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();
});