Files
001code-html--cocos/scratch-vm/test/integration/tw_import_sbx.js
刘宇飞 6e0a1fbcbb 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>
2026-06-16 15:37:45 +08:00

80 lines
3.0 KiB
JavaScript

const Runtime = require('../../src/engine/runtime');
const sb2 = require('../../src/serialization/sb2');
const {test} = require('tap');
test('importing ScratchX/.sbx project', async t => {
const rt = new Runtime();
const deserialized = await sb2.deserialize(
{
objName: 'Stage',
scripts: [
[0, 0, [['Text to Speech.speak_text', 'Hello!']]],
[788, 33, [['Spotify\u001feveryBar']]],
[100, 10, [['Weather extension\u001fgetWeather', 'temperature', 'Cambridge, MA']]],
[60, 40, [['Synth Extension.setEffect', 'glide', 10]]]
],
sounds: [],
costumes: [],
children: [],
info: {
savedExtensions: [
{
menus: {
// not important for this test
},
extensionName: 'Spotify',
javascriptURL: 'https://ericrosenbaum.github.io/spotify-extension/extension.js',
blockSpecs: [
// not important for this test
]
},
{
extensionName: 'Weather extension',
javascriptURL: 'http://khanning.github.io/scratch-weather-extension/weather_extension.js'
}
]
}
},
rt
);
const extensionIDs = deserialized.extensions.extensionIDs;
t.equal(extensionIDs.size, 4);
t.ok(extensionIDs.has('sbxtexttospeech'));
t.ok(extensionIDs.has('sbxspotify'));
t.ok(extensionIDs.has('sbxweatherextension'));
t.ok(extensionIDs.has('sbxsynthextension'));
const extensionURLs = deserialized.extensions.extensionURLs;
t.equal(extensionURLs.size, 2);
t.equal(extensionURLs.get('sbxspotify'), 'https://ericrosenbaum.github.io/spotify-extension/extension.js');
t.equal(extensionURLs.get('sbxweatherextension'), 'http://khanning.github.io/scratch-weather-extension/weather_extension.js');
const stage = deserialized.targets[0];
const blocks = Object.values(stage.blocks._blocks);
const textToSpeech = blocks.find(i => i.opcode === 'sbxtexttospeech_speak_text');
t.type(textToSpeech, 'object');
t.type(textToSpeech.inputs['0'], 'object');
t.type(textToSpeech.inputs['1'], 'undefined');
const spotify = blocks.find(i => i.opcode === 'sbxspotify_everyBar');
t.type(spotify, 'object');
t.type(spotify.inputs['0'], 'undefined');
const weather = blocks.find(i => i.opcode === 'sbxweatherextension_getWeather');
t.type(weather, 'object');
t.type(weather.inputs['0'], 'object');
t.type(weather.inputs['1'], 'object');
t.type(weather.inputs['2'], 'undefined');
const synth = blocks.find(i => i.opcode === 'sbxsynthextension_setEffect');
t.type(synth, 'object');
t.type(synth.inputs['0'], 'object');
t.type(synth.inputs['1'], 'object');
t.type(synth.inputs['2'], 'undefined');
t.end();
});