michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: "use strict"; michael@0: michael@0: const { isWeak, WeakReference } = require("sdk/core/reference"); michael@0: const { Class } = require("sdk/core/heritage"); michael@0: michael@0: exports["test non WeakReferences"] = assert => { michael@0: assert.equal(isWeak({}), false, michael@0: "regular objects aren't weak"); michael@0: michael@0: assert.equal(isWeak([]), false, michael@0: "arrays aren't weak"); michael@0: }; michael@0: michael@0: exports["test a WeakReference"] = assert => { michael@0: assert.equal(isWeak(new WeakReference()), true, michael@0: "instances of WeakReferences are weak"); michael@0: }; michael@0: michael@0: exports["test a subclass"] = assert => { michael@0: const SubType = Class({ michael@0: extends: WeakReference, michael@0: foo: function() { michael@0: } michael@0: }); michael@0: michael@0: const x = new SubType(); michael@0: assert.equal(isWeak(x), true, michael@0: "subtypes of WeakReferences are weak"); michael@0: michael@0: const SubSubType = Class({ michael@0: extends: SubType michael@0: }); michael@0: michael@0: const y = new SubSubType(); michael@0: assert.equal(isWeak(y), true, michael@0: "sub subtypes of WeakReferences are weak"); michael@0: }; michael@0: michael@0: exports["test a mixin"] = assert => { michael@0: const Mixer = Class({ michael@0: implements: [WeakReference] michael@0: }); michael@0: michael@0: assert.equal(isWeak(new Mixer()), true, michael@0: "instances with mixed WeakReference are weak"); michael@0: michael@0: const Mux = Class({}); michael@0: const MixMux = Class({ michael@0: extends: Mux, michael@0: implements: [WeakReference] michael@0: }); michael@0: michael@0: assert.equal(isWeak(new MixMux()), true, michael@0: "instances with mixed WeakReference that " + michael@0: "inheret from other are weak"); michael@0: michael@0: michael@0: const Base = Class({}); michael@0: const ReMix = Class({ michael@0: extends: Base, michael@0: implements: [MixMux] michael@0: }); michael@0: michael@0: assert.equal(isWeak(new ReMix()), true, michael@0: "subtime of mix is still weak"); michael@0: }; michael@0: michael@0: exports["test an override"] = assert => { michael@0: const SubType = Class({ extends: WeakReference }); michael@0: isWeak.define(SubType, x => false); michael@0: michael@0: assert.equal(isWeak(new SubType()), false, michael@0: "behavior of isWeak can still be overrided on subtype"); michael@0: michael@0: const Mixer = Class({ implements: [WeakReference] }); michael@0: const SubMixer = Class({ extends: Mixer }); michael@0: isWeak.define(SubMixer, x => false); michael@0: assert.equal(isWeak(new SubMixer()), false, michael@0: "behavior of isWeak can still be overrided on mixed type"); michael@0: }; michael@0: michael@0: exports["test an opt-in"] = assert => { michael@0: var BaseType = Class({}); michael@0: var SubType = Class({ extends: BaseType }); michael@0: michael@0: isWeak.define(SubType, x => true); michael@0: assert.equal(isWeak(new SubType()), true, michael@0: "isWeak can be just implemented"); michael@0: michael@0: var x = {}; michael@0: isWeak.implement(x, x => true); michael@0: assert.equal(isWeak(x), true, michael@0: "isWeak can be implemented per instance"); michael@0: }; michael@0: michael@0: require("sdk/test").run(exports);