Skip to content

Commit 00d802e

Browse files
committed
sensing_keypressed
1 parent 60a7792 commit 00d802e

File tree

4 files changed

+196
-45
lines changed

4 files changed

+196
-45
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
const KeyOptions = [
2+
'space',
3+
'left arrow',
4+
'right arrow',
5+
'down arrow',
6+
'up arrow',
7+
'any',
8+
'a',
9+
'b',
10+
'c',
11+
'd',
12+
'e',
13+
'f',
14+
'g',
15+
'h',
16+
'i',
17+
'j',
18+
'k',
19+
'l',
20+
'm',
21+
'n',
22+
'o',
23+
'p',
24+
'q',
25+
'r',
26+
's',
27+
't',
28+
'u',
29+
'v',
30+
'w',
31+
'x',
32+
'y',
33+
'z',
34+
'0',
35+
'1',
36+
'2',
37+
'3',
38+
'4',
39+
'5',
40+
'6',
41+
'7',
42+
'8',
43+
'9'
44+
];
45+
46+
export {
47+
KeyOptions
48+
};

src/lib/ruby-to-blocks-converter/event.js

Lines changed: 1 addition & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,7 @@
11
/* global Opal */
22
import _ from 'lodash';
33
import Variable from 'scratch-vm/src/engine/variable';
4-
5-
const KeyOptions = [
6-
'space',
7-
'left arrow',
8-
'right arrow',
9-
'down arrow',
10-
'up arrow',
11-
'any',
12-
'a',
13-
'b',
14-
'c',
15-
'd',
16-
'e',
17-
'f',
18-
'g',
19-
'h',
20-
'i',
21-
'j',
22-
'k',
23-
'l',
24-
'm',
25-
'n',
26-
'o',
27-
'p',
28-
'q',
29-
'r',
30-
's',
31-
't',
32-
'u',
33-
'v',
34-
'w',
35-
'x',
36-
'y',
37-
'z',
38-
'0',
39-
'1',
40-
'2',
41-
'3',
42-
'4',
43-
'5',
44-
'6',
45-
'7',
46-
'8',
47-
'9'
48-
];
4+
import {KeyOptions} from './constants';
495

506
const GreaterThanMenu = [
517
'LOUDNESS',

src/lib/ruby-to-blocks-converter/sensing.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/* global Opal */
22
import _ from 'lodash';
3+
import {KeyOptions} from './constants';
34

45
const ColorRegexp = /^#[0-9a-fA-F]{6}$/;
56

@@ -77,6 +78,14 @@ const SensingConverter = {
7778
}
7879
} else if (this._isConst(receiver)) {
7980
switch (receiver.toString()) {
81+
case '::Keyboard':
82+
if (name === 'pressed?' && args.length === 1 &&
83+
(this._isBlock(args[0]) ||
84+
(this._isString(args[0]) && KeyOptions.indexOf(args[0].toString()) >= 0))) {
85+
block = this._createBlock('sensing_keypressed', 'value_boolean');
86+
this._addFieldInput(block, 'KEY_OPTION', 'sensing_keyoptions', 'KEY_OPTION', args[0], 'space');
87+
}
88+
break;
8089
case '::Mouse':
8190
if (args.length === 0) {
8291
let opcode;

test/unit/lib/ruby-to-blocks-converter/sensing.test.js

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,18 @@ describe('RubyToBlocksConverter/Sensing', () => {
9393
convertAndExpectToEqualRubyStatement(converter, target, c, c);
9494
});
9595
});
96+
97+
test('error', () => {
98+
code = `
99+
forever do
100+
touching?("_edge_")
101+
end
102+
`;
103+
const res = converter.targetCodeToBlocks(target, code);
104+
expect(converter.errors).toHaveLength(1);
105+
expect(converter.errors[0].row).toEqual(2);
106+
expect(res).toBeFalsy();
107+
});
96108
});
97109

98110
describe('sensing_touchingcolor', () => {
@@ -173,6 +185,18 @@ describe('RubyToBlocksConverter/Sensing', () => {
173185
convertAndExpectToEqualRubyStatement(converter, target, c, c);
174186
});
175187
});
188+
189+
test('error', () => {
190+
code = `
191+
forever do
192+
touching_color?("#43066f")
193+
end
194+
`;
195+
const res = converter.targetCodeToBlocks(target, code);
196+
expect(converter.errors).toHaveLength(1);
197+
expect(converter.errors[0].row).toEqual(2);
198+
expect(res).toBeFalsy();
199+
});
176200
});
177201

178202
describe('sensing_coloristouchingcolor', () => {
@@ -283,6 +307,18 @@ describe('RubyToBlocksConverter/Sensing', () => {
283307
convertAndExpectToEqualRubyStatement(converter, target, c, c);
284308
});
285309
});
310+
311+
test('error', () => {
312+
code = `
313+
forever do
314+
color_is_touching_color?("#aad315", "#fca3bf")
315+
end
316+
`;
317+
const res = converter.targetCodeToBlocks(target, code);
318+
expect(converter.errors).toHaveLength(1);
319+
expect(converter.errors[0].row).toEqual(2);
320+
expect(res).toBeFalsy();
321+
});
286322
});
287323

288324
describe('sensing_distanceto', () => {
@@ -358,6 +394,18 @@ describe('RubyToBlocksConverter/Sensing', () => {
358394
convertAndExpectToEqualRubyStatement(converter, target, c, c);
359395
});
360396
});
397+
398+
test('error', () => {
399+
code = `
400+
forever do
401+
distance("_mouse_")
402+
end
403+
`;
404+
const res = converter.targetCodeToBlocks(target, code);
405+
expect(converter.errors).toHaveLength(1);
406+
expect(converter.errors[0].row).toEqual(2);
407+
expect(res).toBeFalsy();
408+
});
361409
});
362410

363411
describe('sensing_askandwait', () => {
@@ -418,6 +466,96 @@ describe('RubyToBlocksConverter/Sensing', () => {
418466
});
419467

420468
expectNoArgsMethod('sensing_answer', 'answer', 'value');
469+
470+
describe('sensing_keypressed', () => {
471+
test('normal', () => {
472+
code = 'Keyboard.pressed?("space")';
473+
expected = [
474+
{
475+
opcode: 'sensing_keypressed',
476+
inputs: [
477+
{
478+
name: 'KEY_OPTION',
479+
block: {
480+
opcode: 'sensing_keyoptions',
481+
fields: [
482+
{
483+
name: 'KEY_OPTION',
484+
value: 'space'
485+
}
486+
],
487+
shadow: true
488+
}
489+
}
490+
]
491+
}
492+
];
493+
convertAndExpectToEqualBlocks(converter, target, code, expected);
494+
495+
code = 'Keyboard.pressed?(x)';
496+
expected = [
497+
{
498+
opcode: 'sensing_keypressed',
499+
inputs: [
500+
{
501+
name: 'KEY_OPTION',
502+
block: rubyToExpected(converter, target, 'x')[0],
503+
shadow: {
504+
opcode: 'sensing_keyoptions',
505+
fields: [
506+
{
507+
name: 'KEY_OPTION',
508+
value: 'space'
509+
}
510+
],
511+
shadow: true
512+
}
513+
}
514+
]
515+
}
516+
];
517+
convertAndExpectToEqualBlocks(converter, target, code, expected);
518+
});
519+
520+
test('value_boolean', () => {
521+
code = `
522+
bounce_if_on_edge
523+
Keyboard.pressed?("space")
524+
bounce_if_on_edge
525+
`;
526+
expected = [
527+
rubyToExpected(converter, target, 'bounce_if_on_edge')[0],
528+
rubyToExpected(converter, target, 'Keyboard.pressed?("space")')[0],
529+
rubyToExpected(converter, target, 'bounce_if_on_edge')[0]
530+
];
531+
convertAndExpectToEqualBlocks(converter, target, code, expected);
532+
});
533+
534+
test('invalid', () => {
535+
[
536+
'Keyboard.pressed?',
537+
'Keyboard.pressed?()',
538+
'Keyboard.pressed?(1)',
539+
'Keyboard.pressed?("invalid")',
540+
'Keyboard.pressed?("space", 1)'
541+
].forEach(c => {
542+
convertAndExpectToEqualRubyStatement(converter, target, c, c);
543+
});
544+
});
545+
546+
test('error', () => {
547+
code = `
548+
forever do
549+
Keyboard.pressed?("space")
550+
end
551+
`;
552+
const res = converter.targetCodeToBlocks(target, code);
553+
expect(converter.errors).toHaveLength(1);
554+
expect(converter.errors[0].row).toEqual(2);
555+
expect(res).toBeFalsy();
556+
});
557+
});
558+
421559
expectNoArgsMethod('sensing_mousedown', 'Mouse.down?', 'value_boolean');
422560
expectNoArgsMethod('sensing_mousex', 'Mouse.x', 'value');
423561
expectNoArgsMethod('sensing_mousey', 'Mouse.y', 'value');

0 commit comments

Comments
 (0)