1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/addon-sdk/source/test/test-namespace.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,121 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 + 1.8 +"use strict"; 1.9 + 1.10 +const { ns } = require("sdk/core/namespace"); 1.11 +const { Cc, Ci, Cu } = require("chrome"); 1.12 +const { setTimeout } = require("sdk/timers") 1.13 + 1.14 +exports["test post GC references"] = function (assert, done) { 1.15 + var target = {}, local = ns() 1.16 + local(target).there = true 1.17 + 1.18 + assert.equal(local(target).there, true, "namespaced preserved"); 1.19 + 1.20 + Cu.schedulePreciseGC(function() { 1.21 + assert.equal(local(target).there, true, "namespace is preserved post GC"); 1.22 + done(); 1.23 + }); 1.24 +}; 1.25 + 1.26 +exports["test namsepace basics"] = function(assert) { 1.27 + var privates = ns(); 1.28 + var object = { foo: function foo() { return "hello foo"; } }; 1.29 + 1.30 + assert.notEqual(privates(object), object, 1.31 + "namespaced object is not the same"); 1.32 + assert.ok(!('foo' in privates(object)), 1.33 + "public properties are not in the namespace"); 1.34 + 1.35 + assert.equal(privates(object), privates(object), 1.36 + "same namespaced object is returned on each call"); 1.37 +}; 1.38 + 1.39 +exports["test namespace overlays"] = function(assert) { 1.40 + var _ = ns(); 1.41 + var object = { foo: 'foo' }; 1.42 + 1.43 + _(object).foo = 'bar'; 1.44 + 1.45 + assert.equal(_(object).foo, "bar", 1.46 + "namespaced property `foo` changed value"); 1.47 + 1.48 + assert.equal(object.foo, "foo", 1.49 + "public property `foo` has original value"); 1.50 + 1.51 + object.foo = "baz"; 1.52 + assert.equal(_(object).foo, "bar", 1.53 + "property changes do not affect namespaced properties"); 1.54 + 1.55 + object.bar = "foo"; 1.56 + assert.ok(!("bar" in _(object)), 1.57 + "new public properties are not reflected in namespace"); 1.58 +}; 1.59 + 1.60 +exports["test shared namespaces"] = function(assert) { 1.61 + var _ = ns(); 1.62 + 1.63 + var f1 = { hello: 1 }; 1.64 + var f2 = { foo: 'foo', hello: 2 }; 1.65 + _(f1).foo = _(f2).foo = 'bar'; 1.66 + 1.67 + assert.equal(_(f1).hello, _(f2).hello, "namespace can be shared"); 1.68 + assert.notEqual(f1.hello, _(f1).hello, "shared namespace can overlay"); 1.69 + assert.notEqual(f2.hello, _(f2).hello, "target is not affected"); 1.70 + 1.71 + _(f1).hello = 3; 1.72 + 1.73 + assert.notEqual(_(f1).hello, _(f2).hello, 1.74 + "namespaced property can be overided"); 1.75 + assert.equal(_(f2).hello, _({}).hello, "namespace does not change"); 1.76 +}; 1.77 + 1.78 +exports["test multi namespace"] = function(assert) { 1.79 + var n1 = ns(); 1.80 + var n2 = ns(); 1.81 + var object = { baz: 1 }; 1.82 + n1(object).foo = 1; 1.83 + n2(object).foo = 2; 1.84 + n1(object).bar = n2(object).bar = 3; 1.85 + 1.86 + assert.notEqual(n1(object).foo, n2(object).foo, 1.87 + "object can have multiple namespaces"); 1.88 + assert.equal(n1(object).bar, n2(object).bar, 1.89 + "object can have matching props in diff namespaces"); 1.90 +}; 1.91 + 1.92 +exports["test ns alias"] = function(assert) { 1.93 + assert.strictEqual(ns, require('sdk/core/namespace').Namespace, 1.94 + "ns is an alias of Namespace"); 1.95 +}; 1.96 + 1.97 +exports["test ns inheritance"] = function(assert) { 1.98 + let _ = ns(); 1.99 + 1.100 + let prototype = { level: 1 }; 1.101 + let object = Object.create(prototype); 1.102 + let delegee = Object.create(object); 1.103 + 1.104 + _(prototype).foo = {}; 1.105 + 1.106 + assert.ok(!Object.prototype.hasOwnProperty.call(_(delegee), "foo"), 1.107 + "namespaced property is not copied to descendants"); 1.108 + assert.equal(_(delegee).foo, _(prototype).foo, 1.109 + "namespaced properties are inherited by descendants"); 1.110 + 1.111 + _(object).foo = {}; 1.112 + assert.notEqual(_(object).foo, _(prototype).foo, 1.113 + "namespaced properties may be shadowed"); 1.114 + assert.equal(_(object).foo, _(delegee).foo, 1.115 + "shadwed properties are inherited by descendants"); 1.116 + 1.117 + _(object).bar = {}; 1.118 + assert.ok(!("bar" in _(prototype)), 1.119 + "descendants properties are not copied to ancestors"); 1.120 + assert.ok(_(object).bar, _(delegee).bar, 1.121 + "descendants properties are inherited"); 1.122 +}; 1.123 + 1.124 +require("test").run(exports);