Skip to content

Commit 5bd5e6b

Browse files
authored
Merge pull request #155 from smalruby/issues/134_looks_say
looks_say refs #134
2 parents 000f484 + 15b40be commit 5bd5e6b

File tree

4 files changed

+118
-4
lines changed

4 files changed

+118
-4
lines changed

src/lib/ruby-generator/looks.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,23 @@ export default function (Generator) {
77
Generator.looks_sayforsecs = function (block) {
88
const message = Generator.valueToCode(block, 'MESSAGE', Generator.ORDER_NONE) || Generator.quote_('');
99
const secs = Generator.valueToCode(block, 'SECS', Generator.ORDER_NONE) || '0';
10-
return `say(message: ${message}, second: ${secs})\n`;
10+
return `say(${message}, ${secs})\n`;
1111
};
1212

1313
Generator.looks_say = function (block) {
1414
const message = Generator.valueToCode(block, 'MESSAGE', Generator.ORDER_NONE) || Generator.quote_('');
15-
return `say(message: ${message})\n`;
15+
return `say(${message})\n`;
1616
};
1717

1818
Generator.looks_thinkforsecs = function (block) {
1919
const message = Generator.valueToCode(block, 'MESSAGE', Generator.ORDER_NONE) || Generator.quote_('');
2020
const secs = Generator.valueToCode(block, 'SECS', Generator.ORDER_NONE) || '0';
21-
return `think(message: ${message}, second: ${secs})\n`;
21+
return `think(${message}, ${secs})\n`;
2222
};
2323

2424
Generator.looks_think = function (block) {
2525
const message = Generator.valueToCode(block, 'MESSAGE', Generator.ORDER_NONE) || Generator.quote_('');
26-
return `think(message: ${message})\n`;
26+
return `think(${message})\n`;
2727
};
2828

2929
Generator.looks_switchcostumeto = function (block) {

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import Blockly from 'scratch-blocks';
55
import RubyParser from '../ruby-parser';
66
import Variable from 'scratch-vm/src/engine/variable';
77

8+
import LooksConverter from './looks';
89
import ControlConverter from './control';
910

1011
/**
@@ -29,6 +30,7 @@ class RubyToBlocksConverter {
2930
constructor (vm) {
3031
this.vm = vm;
3132
this._converters = [
33+
LooksConverter,
3234
ControlConverter
3335
];
3436
this.reset();
@@ -534,6 +536,10 @@ class RubyToBlocksConverter {
534536
return _.isString(stringOrBlock) || this._isValueBlock(stringOrBlock);
535537
}
536538

539+
_isNumberOrStringOrBlock (block) {
540+
return _.isNumber(block) || _.isString(block) || this._isValueBlock(block);
541+
}
542+
537543
_changeToBooleanArgument (varName) {
538544
varName = varName.toString();
539545
const variable = this._context.localVariables[varName];
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/* global Opal */
2+
import _ from 'lodash';
3+
4+
/**
5+
* Looks converter
6+
*/
7+
const LooksConverter = {
8+
// eslint-disable-next-line no-unused-vars
9+
onSend: function (receiver, name, args, rubyBlockArgs, rubyBlock) {
10+
let block;
11+
if (this._isSelf(receiver) || receiver === Opal.nil) {
12+
switch (name) {
13+
case 'say':
14+
if (args.length === 1 && this._isNumberOrStringOrBlock(args[0])) {
15+
block = this._createBlock('looks_say', 'statement');
16+
this._addTextInput(block, 'MESSAGE', _.isNumber(args[0]) ? args[0].toString() : args[0], 'Hello!');
17+
}
18+
break;
19+
}
20+
}
21+
return block;
22+
}
23+
};
24+
25+
export default LooksConverter;
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import RubyToBlocksConverter from '../../../../src/lib/ruby-to-blocks-converter';
2+
import {
3+
convertAndExpectToEqualBlocks,
4+
convertAndExpectToEqualRubyStatement,
5+
rubyToExpected,
6+
expectedInfo
7+
} from '../../../helpers/expect-to-equal-blocks';
8+
9+
describe('RubyToBlocksConverter/Looks', () => {
10+
let converter;
11+
let target;
12+
let code;
13+
let expected;
14+
15+
beforeEach(() => {
16+
converter = new RubyToBlocksConverter(null);
17+
target = null;
18+
code = null;
19+
expected = null;
20+
});
21+
22+
describe('looks_say', () => {
23+
test('string', () => {
24+
code = 'say("Hello!")';
25+
expected = [
26+
{
27+
opcode: 'looks_say',
28+
inputs: [
29+
{
30+
name: 'MESSAGE',
31+
block: expectedInfo.makeText('Hello!')
32+
}
33+
]
34+
}
35+
];
36+
convertAndExpectToEqualBlocks(converter, target, code, expected);
37+
});
38+
39+
test('number', () => {
40+
code = 'say(1)';
41+
expected = [
42+
{
43+
opcode: 'looks_say',
44+
inputs: [
45+
{
46+
name: 'MESSAGE',
47+
block: expectedInfo.makeText('1')
48+
}
49+
]
50+
}
51+
];
52+
convertAndExpectToEqualBlocks(converter, target, code, expected);
53+
});
54+
55+
test('block', () => {
56+
code = 'say(x)';
57+
expected = [
58+
{
59+
opcode: 'looks_say',
60+
inputs: [
61+
{
62+
name: 'MESSAGE',
63+
block: rubyToExpected(converter, target, 'x')[0],
64+
shadow: expectedInfo.makeText('Hello!')
65+
}
66+
]
67+
}
68+
];
69+
convertAndExpectToEqualBlocks(converter, target, code, expected);
70+
});
71+
72+
test('invalid', () => {
73+
[
74+
'say',
75+
'say(false)',
76+
'say(true)',
77+
'say(1, 2, 1)'
78+
].forEach(c => {
79+
convertAndExpectToEqualRubyStatement(converter, target, c, c);
80+
});
81+
});
82+
});
83+
});

0 commit comments

Comments
 (0)