From 89fe5e0420ae13c85a579133e9c29d4abf91f48c Mon Sep 17 00:00:00 2001 From: Huan LI Date: Mon, 23 Apr 2018 00:43:03 +0800 Subject: [PATCH] add puppet helper class for store static puppet instance (#518) --- src/puppet-accessory.spec.ts | 44 ++++++++++++++++++++++++++++++++++++ src/puppet-accessory.ts | 33 +++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100755 src/puppet-accessory.spec.ts create mode 100644 src/puppet-accessory.ts diff --git a/src/puppet-accessory.spec.ts b/src/puppet-accessory.spec.ts new file mode 100755 index 00000000..1d97679b --- /dev/null +++ b/src/puppet-accessory.spec.ts @@ -0,0 +1,44 @@ +#!/usr/bin/env ts-node +/** + * Wechaty - https://github.com/chatie/wechaty + * + * @copyright 2016-2018 Huan LI + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +// tslint:disable:no-shadowed-variable +import * as test from 'blue-tape' +// import * as sinon from 'sinon' + +import Puppet from './puppet' +import PuppetAccessory from './puppet-accessory' + +const EXPECTED_PUPPET1 = {p: 1} as any as Puppet +const EXPECTED_PUPPET2 = {p: 2} as any as Puppet + +test('PuppetAccessory smoke testing', async t => { + class FixtureClass extends PuppetAccessory {} + t.ok(FixtureClass.puppet === undefined, 'should be undefined initialy for static puppet') + + const c = new FixtureClass() + t.throws(() => c.puppet, 'should throw if read instance puppet before initialization') + + FixtureClass.puppet = EXPECTED_PUPPET1 + t.equal(FixtureClass.puppet, EXPECTED_PUPPET1, 'should get EXPECTED_PUPPET1 from static puppet after set static puppet') + t.equal(c.puppet, EXPECTED_PUPPET1, 'should get EXPECTED_PUPPET1 from instance puppet after set static puppet') + + c.puppet = EXPECTED_PUPPET2 + t.equal(FixtureClass.puppet, EXPECTED_PUPPET1, 'should get EXPECTED_PUPPET1 from static puppet after set instance puppet to EXPECTED_PUPPET2') + t.equal(c.puppet, EXPECTED_PUPPET2, 'should get EXPECTED_PUPPET2 from instance puppet after set instance puppet to EXPECTED_PUPPET2') +}) diff --git a/src/puppet-accessory.ts b/src/puppet-accessory.ts new file mode 100644 index 00000000..073e8382 --- /dev/null +++ b/src/puppet-accessory.ts @@ -0,0 +1,33 @@ + +import { log } from './config' +import { Puppet } from './puppet' + +export abstract class PuppetAccessory { + public static puppet?: Puppet + + private _puppet?: Puppet + + public set puppet(puppet: Puppet) { + log.verbose('PuppetAssessory', 'set puppet()') + this._puppet = puppet + } + public get puppet() { + log.silly('PuppetAssessory', 'get puppet()') + + if (this._puppet) { + log.silly('PuppetAssessory', 'get puppet() from instance properties') + return this._puppet + } + + const staticPuppet = (this.constructor as any).puppet + if (staticPuppet) { + log.silly('PuppetAssessory', 'get puppet() from static properties') + return staticPuppet + } + + throw new Error('puppet not found') + } + +} + +export default PuppetAccessory -- GitLab