Skip to content

Commit af475aa

Browse files
committed
test: add motion interconvert test
1 parent baff667 commit af475aa

File tree

4 files changed

+135
-40
lines changed

4 files changed

+135
-40
lines changed

test/helpers/ruby-helper.js

Lines changed: 42 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,42 @@
1-
const setRubyCode = function (driver, code) {
2-
code = code.replace(/\n/g, '\\n');
3-
return driver.executeScript(`ace.edit('ruby-editor').setValue('${code}');`);
4-
};
5-
6-
const getRubyCode = function (driver) {
7-
return driver.executeScript(`return ace.edit('ruby-editor').getValue();`);
8-
};
9-
10-
export {
11-
setRubyCode,
12-
getRubyCode
13-
};
1+
import bindAll from 'lodash.bindall';
2+
3+
class RubyHelper {
4+
constructor (seleniumHelper) {
5+
bindAll(this, [
6+
'fillInRubyProgram',
7+
'expectInterconvertBetweenCodeAndRuby',
8+
]);
9+
10+
this.seleniumHelper = seleniumHelper;
11+
this.clickText = seleniumHelper.clickText;
12+
this.clickXpath = seleniumHelper.clickXpath;
13+
}
14+
15+
get currentRubyProgram () {
16+
return this.driver.executeScript(`return ace.edit('ruby-editor').getValue();`);
17+
}
18+
19+
get driver () {
20+
return this.seleniumHelper.driver;
21+
}
22+
23+
fillInRubyProgram (code) {
24+
code = code.replace(/\n/g, '\\n').replace(/'/g, "\\'");
25+
return this.driver.executeScript(`ace.edit('ruby-editor').setValue('${code}');`);
26+
};
27+
28+
async expectInterconvertBetweenCodeAndRuby (code) {
29+
await this.clickText('Ruby', '*[@role="tab"]');
30+
await this.fillInRubyProgram(code);
31+
await this.clickText('Code', '*[@role="tab"]');
32+
await this.clickXpath(
33+
'//div[contains(@class, "menu-bar_menu-bar-item") and contains(@class, "menu-bar_hoverable")]' +
34+
'/*/span[text()="Edit"]'
35+
);
36+
await this.clickText('Generate Ruby from Code');
37+
await this.clickText('Ruby', '*[@role="tab"]');
38+
expect(await this.currentRubyProgram).toEqual(`${code}\n`);
39+
}
40+
}
41+
42+
export default RubyHelper;

test/helpers/selenium-helper.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ jest.setTimeout(30000); // eslint-disable-line no-undef
33
import bindAll from 'lodash.bindall';
44
import 'chromedriver'; // register path
55
import webdriver from 'selenium-webdriver';
6+
import pathModule from 'path';
67
const fs = require('fs');
78

89
const {By, until, Button} = webdriver;
@@ -53,7 +54,8 @@ class SeleniumHelper {
5354
soundsTab: "*[@id='react-tabs-5']",
5455
spriteTile: '*[starts-with(@class,"react-contextmenu-wrapper")]',
5556
monitors: '*[starts-with(@class,"stage_monitor-wrapper")]',
56-
contextMenu: '*[starts-with(@class,"react-contextmenu")]'
57+
contextMenu: '*[starts-with(@class,"react-contextmenu")]',
58+
spriteItems: '*[starts-with(@class,"sprite-selector_items-wrapper")]'
5759
};
5860
}
5961

@@ -219,6 +221,15 @@ class SeleniumHelper {
219221
fs.writeFileSync(path, image, 'base64');
220222
});
221223
}
224+
225+
urlFor (path) {
226+
switch (path) {
227+
case '/':
228+
return pathModule.resolve(__dirname, '../../build/index.html');
229+
default:
230+
throw new Error(`Invalid path: ${path}`);
231+
}
232+
}
222233
}
223234

224235
export default SeleniumHelper;
Lines changed: 12 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,22 @@
1-
import path from 'path';
21
import dedent from 'dedent';
32
import SeleniumHelper from '../../helpers/selenium-helper';
4-
import {
5-
setRubyCode,
6-
getRubyCode
7-
} from '../../helpers/ruby-helper';
3+
import RubyHelper from '../../helpers/ruby-helper';
84

5+
const seleniumHelper = new SeleniumHelper();
96
const {
10-
clickText,
11-
clickXpath,
127
getDriver,
13-
loadUri
14-
} = new SeleniumHelper();
8+
loadUri,
9+
urlFor
10+
} = seleniumHelper;
1511

16-
const uri = path.resolve(__dirname, '../../../build/index.html');
12+
const rubyHelper = new RubyHelper(seleniumHelper);
13+
const {
14+
expectInterconvertBetweenCodeAndRuby
15+
} = rubyHelper;
1716

1817
let driver;
1918

20-
describe('Ruby Tab: event', () => {
19+
describe('Ruby Tab: event category blocks', () => {
2120
beforeAll(() => {
2221
driver = getDriver();
2322
});
@@ -27,9 +26,8 @@ describe('Ruby Tab: event', () => {
2726
});
2827

2928
test('Ruby -> Code -> Ruby', async () => {
30-
await loadUri(uri);
29+
await loadUri(urlFor('/'));
3130

32-
await clickText('Ruby', '*[@role="tab"]');
3331
const code = dedent`
3432
self.when(:flag_clicked) do
3533
end
@@ -61,18 +59,6 @@ describe('Ruby Tab: event', () => {
6159
broadcast("message1")
6260
broadcast_and_wait("message1")
6361
`;
64-
await setRubyCode(driver, code);
65-
66-
await clickText('Code', '*[@role="tab"]');
67-
68-
await clickXpath(
69-
'//div[contains(@class, "menu-bar_menu-bar-item") and contains(@class, "menu-bar_hoverable")]' +
70-
'/*/span[text()="Edit"]'
71-
);
72-
await clickText('Generate Ruby from Code');
73-
74-
await clickText('Ruby', '*[@role="tab"]');
75-
76-
expect(await getRubyCode(driver)).toEqual(`${code}\n`);
62+
await expectInterconvertBetweenCodeAndRuby(code);
7763
});
7864
});
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import dedent from 'dedent';
2+
import SeleniumHelper from '../../helpers/selenium-helper';
3+
import RubyHelper from '../../helpers/ruby-helper';
4+
5+
const seleniumHelper = new SeleniumHelper();
6+
const {
7+
clickText,
8+
clickXpath,
9+
scope,
10+
getDriver,
11+
loadUri,
12+
urlFor
13+
} = seleniumHelper;
14+
15+
const rubyHelper = new RubyHelper(seleniumHelper);
16+
const {
17+
expectInterconvertBetweenCodeAndRuby
18+
} = rubyHelper;
19+
20+
let driver;
21+
22+
describe('Ruby Tab: motion category blocks', () => {
23+
beforeAll(() => {
24+
driver = getDriver();
25+
});
26+
27+
afterAll(async () => {
28+
await driver.quit();
29+
});
30+
31+
test('Ruby -> Code -> Ruby', async () => {
32+
await loadUri(urlFor('/'));
33+
await clickXpath('//button[@aria-label="Choose a Sprite"]');
34+
await clickText('Abby', scope.modal);
35+
await clickText('Sprite1', scope.spriteItems);
36+
37+
const code = dedent`
38+
move(10)
39+
turn_right(15)
40+
turn_left(15)
41+
go_to("_random_")
42+
go_to("_mouse_")
43+
go_to("Abby")
44+
go_to([0, 0])
45+
glide("_random_", secs: 1)
46+
glide("_mouse_", secs: 1)
47+
glide("Abby", secs: 1)
48+
glide([0, 0], secs: 1)
49+
self.direction = 90
50+
point_towards("_mouse_")
51+
point_towards("Abby")
52+
self.x += 10
53+
self.x = 0
54+
self.y += 10
55+
self.y = 0
56+
bounce_if_on_edge
57+
self.rotation_style = "left-right"
58+
self.rotation_style = "don't rotate"
59+
self.rotation_style = "all around"
60+
61+
x
62+
63+
y
64+
65+
direction
66+
`;
67+
await expectInterconvertBetweenCodeAndRuby(code);
68+
});
69+
});

0 commit comments

Comments
 (0)