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:
133
scratch-vm/test/unit/io_mouse.js
Normal file
133
scratch-vm/test/unit/io_mouse.js
Normal file
@@ -0,0 +1,133 @@
|
||||
const test = require('tap').test;
|
||||
const Mouse = require('../../src/io/mouse');
|
||||
const Runtime = require('../../src/engine/runtime');
|
||||
|
||||
test('spec', t => {
|
||||
const rt = new Runtime();
|
||||
const m = new Mouse(rt);
|
||||
|
||||
t.type(m, 'object');
|
||||
t.type(m.postData, 'function');
|
||||
t.type(m.getClientX, 'function');
|
||||
t.type(m.getClientY, 'function');
|
||||
t.type(m.getScratchX, 'function');
|
||||
t.type(m.getScratchY, 'function');
|
||||
t.type(m.getIsDown, 'function');
|
||||
t.end();
|
||||
});
|
||||
|
||||
test('mouseUp', t => {
|
||||
const rt = new Runtime();
|
||||
const m = new Mouse(rt);
|
||||
|
||||
m.postData({
|
||||
x: -20,
|
||||
y: 10,
|
||||
isDown: false,
|
||||
canvasWidth: 480,
|
||||
canvasHeight: 360
|
||||
});
|
||||
t.strictEquals(m.getClientX(), -20);
|
||||
t.strictEquals(m.getClientY(), 10);
|
||||
t.strictEquals(m.getScratchX(), -240);
|
||||
t.strictEquals(m.getScratchY(), 170);
|
||||
t.strictEquals(m.getIsDown(), false);
|
||||
t.end();
|
||||
});
|
||||
|
||||
test('mouseDown', t => {
|
||||
const rt = new Runtime();
|
||||
const m = new Mouse(rt);
|
||||
|
||||
m.postData({
|
||||
x: 9.9,
|
||||
y: 400.1,
|
||||
isDown: true,
|
||||
canvasWidth: 480,
|
||||
canvasHeight: 360
|
||||
});
|
||||
t.strictEquals(m.getClientX(), 9.9);
|
||||
t.strictEquals(m.getClientY(), 400.1);
|
||||
t.strictEquals(m.getScratchX(), -230);
|
||||
t.strictEquals(m.getScratchY(), -180);
|
||||
t.strictEquals(m.getIsDown(), true);
|
||||
t.end();
|
||||
});
|
||||
|
||||
test('at zoomed scale', t => {
|
||||
const rt = new Runtime();
|
||||
const m = new Mouse(rt);
|
||||
|
||||
m.postData({
|
||||
x: 240,
|
||||
y: 540,
|
||||
canvasWidth: 960,
|
||||
canvasHeight: 720
|
||||
});
|
||||
t.strictEquals(m.getClientX(), 240);
|
||||
t.strictEquals(m.getClientY(), 540);
|
||||
t.strictEquals(m.getScratchX(), -120);
|
||||
t.strictEquals(m.getScratchY(), -90);
|
||||
t.end();
|
||||
});
|
||||
|
||||
test('mousedown activating click hats', t => {
|
||||
const rt = new Runtime();
|
||||
const m = new Mouse(rt);
|
||||
|
||||
const mouseMoveEvent = {
|
||||
x: 10,
|
||||
y: 100,
|
||||
canvasWidth: 480,
|
||||
canvasHeight: 360
|
||||
};
|
||||
|
||||
const dummyTarget = {
|
||||
draggable: false
|
||||
};
|
||||
|
||||
const mouseDownEvent = Object.assign({}, mouseMoveEvent, {
|
||||
isDown: true
|
||||
});
|
||||
|
||||
const mouseUpEvent = Object.assign({}, mouseMoveEvent, {
|
||||
isDown: false
|
||||
});
|
||||
|
||||
// Stub activateClickHats and pick function for testing
|
||||
let ranClickHats = false;
|
||||
m._activateClickHats = () => {
|
||||
ranClickHats = true;
|
||||
};
|
||||
m._pickTarget = () => dummyTarget;
|
||||
|
||||
// Mouse move without mousedown
|
||||
m.postData(mouseMoveEvent);
|
||||
t.strictEquals(ranClickHats, false);
|
||||
|
||||
// Mouse down event triggers the hats if target is not draggable
|
||||
dummyTarget.draggable = false;
|
||||
m.postData(mouseDownEvent);
|
||||
t.strictEquals(ranClickHats, true);
|
||||
|
||||
// But another mouse move while down doesn't trigger
|
||||
ranClickHats = false;
|
||||
m.postData(mouseDownEvent);
|
||||
t.strictEquals(ranClickHats, false);
|
||||
|
||||
// And it does trigger on mouse up if target is draggable
|
||||
ranClickHats = false;
|
||||
dummyTarget.draggable = true;
|
||||
m.postData(mouseUpEvent);
|
||||
t.strictEquals(ranClickHats, true);
|
||||
|
||||
// And hats don't trigger if mouse down is outside canvas
|
||||
ranClickHats = false;
|
||||
m.postData(Object.assign({}, mouseDownEvent, {
|
||||
x: 50000,
|
||||
y: 50
|
||||
}));
|
||||
t.strictEquals(ranClickHats, false);
|
||||
|
||||
t.end();
|
||||
});
|
||||
Reference in New Issue
Block a user