|
1 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
4 "use strict"; |
|
5 |
|
6 const { isWeak, WeakReference } = require("sdk/core/reference"); |
|
7 const { Class } = require("sdk/core/heritage"); |
|
8 |
|
9 exports["test non WeakReferences"] = assert => { |
|
10 assert.equal(isWeak({}), false, |
|
11 "regular objects aren't weak"); |
|
12 |
|
13 assert.equal(isWeak([]), false, |
|
14 "arrays aren't weak"); |
|
15 }; |
|
16 |
|
17 exports["test a WeakReference"] = assert => { |
|
18 assert.equal(isWeak(new WeakReference()), true, |
|
19 "instances of WeakReferences are weak"); |
|
20 }; |
|
21 |
|
22 exports["test a subclass"] = assert => { |
|
23 const SubType = Class({ |
|
24 extends: WeakReference, |
|
25 foo: function() { |
|
26 } |
|
27 }); |
|
28 |
|
29 const x = new SubType(); |
|
30 assert.equal(isWeak(x), true, |
|
31 "subtypes of WeakReferences are weak"); |
|
32 |
|
33 const SubSubType = Class({ |
|
34 extends: SubType |
|
35 }); |
|
36 |
|
37 const y = new SubSubType(); |
|
38 assert.equal(isWeak(y), true, |
|
39 "sub subtypes of WeakReferences are weak"); |
|
40 }; |
|
41 |
|
42 exports["test a mixin"] = assert => { |
|
43 const Mixer = Class({ |
|
44 implements: [WeakReference] |
|
45 }); |
|
46 |
|
47 assert.equal(isWeak(new Mixer()), true, |
|
48 "instances with mixed WeakReference are weak"); |
|
49 |
|
50 const Mux = Class({}); |
|
51 const MixMux = Class({ |
|
52 extends: Mux, |
|
53 implements: [WeakReference] |
|
54 }); |
|
55 |
|
56 assert.equal(isWeak(new MixMux()), true, |
|
57 "instances with mixed WeakReference that " + |
|
58 "inheret from other are weak"); |
|
59 |
|
60 |
|
61 const Base = Class({}); |
|
62 const ReMix = Class({ |
|
63 extends: Base, |
|
64 implements: [MixMux] |
|
65 }); |
|
66 |
|
67 assert.equal(isWeak(new ReMix()), true, |
|
68 "subtime of mix is still weak"); |
|
69 }; |
|
70 |
|
71 exports["test an override"] = assert => { |
|
72 const SubType = Class({ extends: WeakReference }); |
|
73 isWeak.define(SubType, x => false); |
|
74 |
|
75 assert.equal(isWeak(new SubType()), false, |
|
76 "behavior of isWeak can still be overrided on subtype"); |
|
77 |
|
78 const Mixer = Class({ implements: [WeakReference] }); |
|
79 const SubMixer = Class({ extends: Mixer }); |
|
80 isWeak.define(SubMixer, x => false); |
|
81 assert.equal(isWeak(new SubMixer()), false, |
|
82 "behavior of isWeak can still be overrided on mixed type"); |
|
83 }; |
|
84 |
|
85 exports["test an opt-in"] = assert => { |
|
86 var BaseType = Class({}); |
|
87 var SubType = Class({ extends: BaseType }); |
|
88 |
|
89 isWeak.define(SubType, x => true); |
|
90 assert.equal(isWeak(new SubType()), true, |
|
91 "isWeak can be just implemented"); |
|
92 |
|
93 var x = {}; |
|
94 isWeak.implement(x, x => true); |
|
95 assert.equal(isWeak(x), true, |
|
96 "isWeak can be implemented per instance"); |
|
97 }; |
|
98 |
|
99 require("sdk/test").run(exports); |