From c9ced48de227f6fa3ccf9060fefd559a7656f42d Mon Sep 17 00:00:00 2001 From: Beka Westberg Date: Tue, 25 Oct 2022 08:56:13 -0700 Subject: [PATCH] feat: trigger updates to IProcedureBlock blocks (#6570) * feat: add interface and method for updating procedure blocks * chore: remove module ID declarations * feat: add actually triggering updates * chore: format * chore: clean up tests --- core/interfaces/i_procedure_block.ts | 19 ++++++++++++++++ core/procedures/observable_parameter_model.ts | 4 +++- core/procedures/observable_procedure_map.ts | 6 ++++- core/procedures/observable_procedure_model.ts | 8 ++++++- core/procedures/update_procedures.ts | 22 +++++++++++++++++++ tests/mocha/procedure_map_test.js | 7 +++--- 6 files changed, 60 insertions(+), 6 deletions(-) create mode 100644 core/interfaces/i_procedure_block.ts create mode 100644 core/procedures/update_procedures.ts diff --git a/core/interfaces/i_procedure_block.ts b/core/interfaces/i_procedure_block.ts new file mode 100644 index 000000000..57318ba85 --- /dev/null +++ b/core/interfaces/i_procedure_block.ts @@ -0,0 +1,19 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import type {Block} from '../block.js'; + + +/** The interface for a block which models a procedure. */ +export interface IProcedureBlock { + doProcedureUpdate(): void; +} + +/** A type guard which checks if the given block is a procedure block. */ +export function isProcedureBlock(block: Block| + IProcedureBlock): block is IProcedureBlock { + return (block as IProcedureBlock).doProcedureUpdate !== undefined; +} diff --git a/core/procedures/observable_parameter_model.ts b/core/procedures/observable_parameter_model.ts index 407b0ad6d..fe0f5bdb1 100644 --- a/core/procedures/observable_parameter_model.ts +++ b/core/procedures/observable_parameter_model.ts @@ -4,8 +4,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -import type {IParameterModel} from '../interfaces/i_parameter_model.js'; import {genUid} from '../utils/idgenerator.js'; +import type {IParameterModel} from '../interfaces/i_parameter_model.js'; +import {triggerProceduresUpdate} from './update_procedures.js'; import type {VariableModel} from '../variable_model.js'; import type {Workspace} from '../workspace.js'; @@ -29,6 +30,7 @@ export class ObservableParameterModel implements IParameterModel { if (name == this.variable.name) return this; this.variable = this.workspace.getVariable(name) ?? this.workspace.createVariable(name); + triggerProceduresUpdate(this.workspace); return this; } diff --git a/core/procedures/observable_procedure_map.ts b/core/procedures/observable_procedure_map.ts index 35ee4a5e7..781cb4682 100644 --- a/core/procedures/observable_procedure_map.ts +++ b/core/procedures/observable_procedure_map.ts @@ -5,6 +5,7 @@ */ import type {IProcedureModel} from '../interfaces/i_procedure_model.js'; +import {triggerProceduresUpdate} from './update_procedures.js'; import type {Workspace} from '../workspace.js'; @@ -28,7 +29,9 @@ export class ObservableProcedureMap extends Map { */ override delete(id: string): boolean { // TODO(#6516): Fire events. - return super.delete(id); + const existed = super.delete(id); + triggerProceduresUpdate(this.workspace); + return existed; } /** @@ -37,6 +40,7 @@ export class ObservableProcedureMap extends Map { override clear() { // TODO(#6516): Fire events. super.clear(); + triggerProceduresUpdate(this.workspace); } /** diff --git a/core/procedures/observable_procedure_model.ts b/core/procedures/observable_procedure_model.ts index aa51bb7f9..e338d5161 100644 --- a/core/procedures/observable_procedure_model.ts +++ b/core/procedures/observable_procedure_model.ts @@ -4,10 +4,11 @@ * SPDX-License-Identifier: Apache-2.0 */ +import {genUid} from '../utils/idgenerator.js'; import type {IParameterModel} from '../interfaces/i_parameter_model.js'; import type {IProcedureModel} from '../interfaces/i_procedure_model.js'; +import {triggerProceduresUpdate} from './update_procedures.js'; import type {Workspace} from '../workspace.js'; -import {genUid} from '../utils/idgenerator.js'; export class ObservableProcedureModel implements IProcedureModel { @@ -25,6 +26,7 @@ export class ObservableProcedureModel implements IProcedureModel { setName(name: string): this { // TODO(#6516): Fire events. this.name = name; + triggerProceduresUpdate(this.workspace); return this; } @@ -36,6 +38,7 @@ export class ObservableProcedureModel implements IProcedureModel { insertParameter(parameterModel: IParameterModel, index: number): this { // TODO(#6516): Fire events. this.parameters.splice(index, 0, parameterModel); + triggerProceduresUpdate(this.workspace); return this; } @@ -43,6 +46,7 @@ export class ObservableProcedureModel implements IProcedureModel { deleteParameter(index: number): this { // TODO(#6516): Fire events. this.parameters.splice(index, 1); + triggerProceduresUpdate(this.workspace); return this; } @@ -54,6 +58,7 @@ export class ObservableProcedureModel implements IProcedureModel { setReturnTypes(types: string[]|null): this { // TODO(#6516): Fire events. this.returnTypes = types; + triggerProceduresUpdate(this.workspace); return this; } @@ -64,6 +69,7 @@ export class ObservableProcedureModel implements IProcedureModel { setEnabled(enabled: boolean): this { // TODO(#6516): Fire events. this.enabled = enabled; + triggerProceduresUpdate(this.workspace); return this; } diff --git a/core/procedures/update_procedures.ts b/core/procedures/update_procedures.ts new file mode 100644 index 000000000..53d06caa5 --- /dev/null +++ b/core/procedures/update_procedures.ts @@ -0,0 +1,22 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import {isProcedureBlock} from '../interfaces/i_procedure_block.js'; +import {Workspace} from '../workspace.js'; + + +/** + * Calls the `doProcedureUpdate` method on all blocks which implement it. + * + * @internal + */ +export function triggerProceduresUpdate(workspace: Workspace) { + for (const block of workspace.getAllBlocks(false)) { + if (isProcedureBlock(block)) { + block.doProcedureUpdate(); + } + } +} diff --git a/tests/mocha/procedure_map_test.js b/tests/mocha/procedure_map_test.js index 60a84ad37..34426eff4 100644 --- a/tests/mocha/procedure_map_test.js +++ b/tests/mocha/procedure_map_test.js @@ -13,18 +13,19 @@ suite('Procedure Map', function() { sharedTestSetup.call(this); this.workspace = new Blockly.Workspace(); // this.procedureMap = this.workspace.getProcedureMap(); + this.procedureMap = + new Blockly.procedures.ObservableProcedureMap(this.workspace); }); teardown(function() { sharedTestTeardown.call(this); }); - // TODO (#6515): Unskip tests. - suite.skip('triggering block updates', function() { + suite('triggering block updates', function() { setup(function() { Blockly.Blocks['procedure_mock'] = { init: function() { }, - doProcedureUpdate: function() {}, + doProcedureUpdate: function() { }, }; this.procedureBlock = this.workspace.newBlock('procedure_mock');