Skip to content

Commit ef78ed1

Browse files
authored
Merge pull request #43 from kchadha/comment-validation
Comment validation
2 parents 1f05cb4 + 328b5a3 commit ef78ed1

File tree

5 files changed

+79
-3
lines changed

5 files changed

+79
-3
lines changed

lib/sb3_definitions.json

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,9 @@
220220
"opcode": {
221221
"type": "string"
222222
},
223+
"comment": {
224+
"type": "string"
225+
},
223226
"inputs": {
224227
"type": "object",
225228
"additionalProperties": {
@@ -281,6 +284,24 @@
281284
"opcode"
282285
]
283286
},
287+
"comment": {
288+
"type": "object",
289+
"properties": {
290+
"blockId": {"$ref": "#/definitions/optionalString"},
291+
"text": {
292+
"type": "string",
293+
"maxLength": 8000
294+
},
295+
"minimized": {"type": "boolean"},
296+
"x": {"type": "number"},
297+
"y": {"type": "number"},
298+
"width": {"type": "number"},
299+
"height": {"type": "number"}
300+
},
301+
"required": [
302+
"text"
303+
]
304+
},
284305
"stage": {
285306
"type": "object",
286307
"description": "Description of property (and/or property/value pairs) that are unique to the stage.",
@@ -378,6 +399,10 @@
378399
"type": "object",
379400
"additionalProperties": {"$ref":"#/definitions/broadcast_message"}
380401
},
402+
"comments": {
403+
"type": "object",
404+
"additionalProperties": {"$ref": "#/definitions/comment"}
405+
},
381406
"costumes": {
382407
"type": "array",
383408
"items": {"$ref":"#/definitions/costume"},

test/fixtures/data.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ var path = require('path');
55
// Build file listings
66
var sb = glob.sync(path.resolve(__dirname, './data/*.sb'));
77
var sb2 = glob.sync(path.resolve(__dirname, './data/*.sb2'));
8+
var sb3 = glob.sync(path.resolve(__dirname, './data/*.sb3'));
89
var sprite2 = glob.sync(path.resolve(__dirname, './data/*.sprite2'));
910
// Sprite2 and Sprite3 jsons have modified file extensions
1011
// so that they don't get caught here but can still be used by the
@@ -15,9 +16,10 @@ var gzipJson = glob.sync(path.resolve(__dirname, './data/*.json.gz'));
1516
// Read files and convert to buffers
1617
for (var a in sb) sb[a] = fs.readFileSync(sb[a]);
1718
for (var b in sb2) sb2[b] = fs.readFileSync(sb2[b]);
18-
for (var c in json) json[c] = fs.readFileSync(json[c]);
19-
for (var d in gzipJson) gzipJson[d] = fs.readFileSync(gzipJson[d]);
20-
for (var e in sprite2) sprite2[e] = fs.readFileSync(sprite2[e]);
19+
for (var c in sb3) sb3[c] = fs.readFileSync(sb3[c]);
20+
for (var d in json) json[d] = fs.readFileSync(json[d]);
21+
for (var e in gzipJson) gzipJson[e] = fs.readFileSync(gzipJson[e]);
22+
for (var f in sprite2) sprite2[f] = fs.readFileSync(sprite2[f]);
2123

2224
// Return listings
2325
module.exports = {
@@ -40,8 +42,13 @@ module.exports = {
4042
example_sprite2_json: fs.readFileSync(path.resolve(__dirname, './data/_example_sprite.sprite2json')),
4143
bananas_sprite2: fs.readFileSync(path.resolve(__dirname, './data/_bananas.sprite2'))
4244
},
45+
sb3_comments: {
46+
comments: fs.readFileSync(path.resolve(__dirname, './data/_comments.sb3')),
47+
invalid_comments: fs.readFileSync(path.resolve(__dirname, './data/_invalid_comments.sb3'))
48+
},
4349
sb: sb,
4450
sb2: sb2,
51+
sb3: sb3,
4552
json: json,
4653
gzipJson: gzipJson,
4754
sprite2: sprite2

test/fixtures/data/_comments.sb3

42.7 KB
Binary file not shown.
44.6 KB
Binary file not shown.

test/integration/comments_sb3.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
var test = require('tap').test;
2+
var JSZip = require('jszip');
3+
var data = require('../fixtures/data');
4+
var parser = require('../../index');
5+
6+
test('comments sb3', function (t) {
7+
parser(data.sb3_comments.comments, false, function (err, result) {
8+
t.equal(err, null);
9+
t.equal(Array.isArray(result), true);
10+
var res = result[0];
11+
var possibleZip = result[1];
12+
t.type(res, 'object');
13+
t.equal(res.projectVersion, 3);
14+
t.equal(possibleZip instanceof JSZip, true);
15+
16+
t.type(res.targets[0].comments, 'object');
17+
t.equal(Object.values(res.targets[0].comments).length, 1);
18+
19+
t.type(res.targets[1].comments, 'object');
20+
t.equal(Object.values(res.targets[1].comments).length, 6);
21+
22+
t.end();
23+
});
24+
});
25+
26+
test('invalid comments sb3', function (t) {
27+
parser(data.sb3_comments.invalid_comments, false, function (err, result) {
28+
t.type(err, 'object');
29+
t.type(err.validationError, 'string');
30+
31+
var sb3Errors = err.sb3Errors;
32+
t.type(sb3Errors, 'object');
33+
t.type(sb3Errors[0].keyword, 'string');
34+
t.type(sb3Errors[0].dataPath, 'string');
35+
t.match(sb3Errors[0].dataPath, /^\.targets\[1\]\.comments\[.*\]\.width$/);
36+
t.type(sb3Errors[0].schemaPath, 'string');
37+
t.type(sb3Errors[0].message, 'string');
38+
t.equal(sb3Errors[0].message, 'should be number');
39+
t.type(sb3Errors[0].params, 'object');
40+
t.type(result, 'undefined');
41+
42+
t.end();
43+
});
44+
});

0 commit comments

Comments
 (0)