Skip to content

Commit

Permalink
adds additional spec tests for subrealm define|require interaction
Browse files Browse the repository at this point in the history
  • Loading branch information
Ewan Taylor committed Oct 10, 2014
1 parent 0b46988 commit 95f046d
Showing 1 changed file with 110 additions and 0 deletions.
110 changes: 110 additions & 0 deletions spec/realm-spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,116 @@ describe("a realm", function() {
expect((new ClassB()) instanceof ClassA).toBeTruthy();
});

it("a simple object required from a subrealm is unique to the subrealm.", function() {
testRealm.define("my/classes/ClassA", function(require, exports, module) {
function test() {}
test.prototype.foo = function() {};
module.exports = test;
});

var ClassA = testRealm.require('my/classes/ClassA');

var subrealm = testRealm.subrealm();

var SubrealmClassA = subrealm.require('my/classes/ClassA');
expect(SubrealmClassA).not.toBe(ClassA);
});

it("a complex object (with single dependency) required from a subrealm is unique to the subrealm (including its dependency)", function() {
testRealm.define('my/classes/Dependency', function(require, exports, module) {
function Dependency() {}
module.exports = Dependency;
});

testRealm.define('my/classes/ClassA', function(require, exports, module) {
var Dependency = require('my/classes/Dependency');

function test() {
this.dependency = Dependency;
}
module.exports = test;
});

var ClassA = testRealm.require('my/classes/ClassA');

var subrealm = testRealm.subrealm();

var SubrealmClassA = subrealm.require('my/classes/ClassA');

expect(SubrealmClassA).not.toBe(ClassA);

var classA = new ClassA();
var otherClassA = new ClassA();

expect(classA.dependency).toEqual(otherClassA.dependency);
var subrealmClassA = new SubrealmClassA();

expect(classA.dependency).not.toEqual(subrealmClassA.dependency);
});

it("a complex object (with dependencies) required from a subrealm is unique to the subrealm (including its dependency chain)", function() {

testRealm.define('my/classes/SubDependency', function(require, exports, module) {
function SubDependency() {}
SubDependency.prototype.baz = function() { return 'sub-dep'; };
module.exports = SubDependency;
});

testRealm.define('my/classes/Dependency', function(require, exports, module) {
var SubDependency = require('my/classes/SubDependency');
function Dependency() {
this.subDependency = new SubDependency();
}
Dependency.prototype.bar = function() { return 'dep'; };
module.exports = Dependency;
});

testRealm.define('my/classes/ClassA', function(require, exports, module) {
var Dependency = require('my/classes/Dependency');
function ClassA() {
this.dependency = new Dependency();
}
module.exports = ClassA;
});

var ClassA = testRealm.require('my/classes/ClassA');

var classA = new ClassA();
var otherClassA = new ClassA();

expect(classA).toEqual(otherClassA);
expect(classA.dependency).toEqual(otherClassA.dependency);
expect(classA.dependency.subDependency).toEqual(otherClassA.dependency.subDependency);
expect(classA.dependency.subDependency.baz()).toBe('sub-dep');

// start subrealm
var subrealm = testRealm.subrealm();

subrealm.define('my/classes/SubDependency', function(require, exports, module) {
function SubDependency() {
}

SubDependency.prototype.baz = function() { return 'sub-dep-changed'; };
module.exports = SubDependency;
});

var SubrealmClassA = subrealm.require('my/classes/ClassA');

expect(SubrealmClassA).not.toBe(ClassA);

var subrealmClassA = new SubrealmClassA();

// verify non-equality
expect(classA).not.toEqual(subrealmClassA);

// test dependency
expect(classA.dependency.bar()).toBe('dep');
expect(classA.dependency).not.toEqual(subrealmClassA.dependency);

// test redined sub-dependency
expect(subrealmClassA.dependency.subDependency.baz()).toBe('sub-dep-changed');
});

it("allows the redefinition of a class in a subrealm.", function() {
var CLASSA = function() {};
testRealm.define("my/classes/derived/ClassB", function(require, exports, module) {
Expand Down

0 comments on commit 95f046d

Please sign in to comment.