automatic-assessments
Version:
Automatic assessment of Marty and Scratch 3.0 projects
60 lines (59 loc) • 2.43 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.REPEAT_UNTIL_BLOCK_OPCODE = exports.FOREVER_BLOCK_OPCODE = exports.REPEAT_BLOCK_OPCODE = void 0;
const Analyzer_1 = require("../Analyzer");
exports.REPEAT_BLOCK_OPCODE = 'control_repeat';
exports.FOREVER_BLOCK_OPCODE = 'control_forever';
exports.REPEAT_UNTIL_BLOCK_OPCODE = 'control_repeat_until';
class FlowControl extends Analyzer_1.default {
constructor(targets) {
super();
this.score = 0;
this.targets = targets;
}
execute() {
this.firstPointSequenceBlocks();
this.twoPointsRepeatOrForever();
this.threePointsRepeatUntil();
return this.score;
}
firstPointSequenceBlocks() {
// one point when there is a sequence of blocks (there is at least a block with a next)
for (const target of this.targets) {
for (const _blockKey of Object.keys(target.blocks._blocks)) {
const _block = target.blocks._blocks[_blockKey];
if (_block.next) {
this.score = 1;
break;
}
}
}
}
twoPointsRepeatOrForever() {
// two points when a repeat or a forever block is used (with at least an input)
for (const target of this.targets) {
for (const _blockKey of Object.keys(target.blocks._blocks)) {
const _block = target.blocks._blocks[_blockKey];
const inputsLength = Object.keys(_block.inputs).length;
if ((_block.opcode === exports.REPEAT_BLOCK_OPCODE || _block.opcode === exports.FOREVER_BLOCK_OPCODE) && inputsLength) {
this.score = 2;
break;
}
}
}
}
threePointsRepeatUntil() {
// three points when a repeat until block is used
for (const target of this.targets) {
for (const _blockKey of Object.keys(target.blocks._blocks)) {
const _block = target.blocks._blocks[_blockKey];
const inputsLength = Object.keys(_block.inputs).length;
if (_block.opcode === exports.REPEAT_UNTIL_BLOCK_OPCODE && inputsLength) {
this.score = 3;
break;
}
}
}
}
}
exports.default = FlowControl;