Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Testing setup.
- mocha.setup('bdd');
- var expect = chai.expect;
- // The implementation.
- function Obj() {
- this.links = [];
- };
- Obj.prototype.linkTo = function(to) {
- if (this.links.indexOf(to) === -1) {
- this.links.push(to);
- }
- };
- Obj.prototype.isLinkedTo = function(to) {
- for (var i = 0; i < this.links.length; i++) {
- var link = this.links[i];
- if (link !== to && link === this) {
- continue;
- }
- if (link === to || link.isLinkedTo(to)) {
- return true;
- }
- }
- return false;
- };
- // The tests.
- describe("Obj", function() {
- it("can link to itself", function() {
- var foo = new Obj;
- foo.linkTo(foo);
- expect(foo.isLinkedTo(foo)).to.equal(true);
- });
- it("does not link to itself", function() {
- var foo = new Obj;
- expect(foo.isLinkedTo(foo)).to.equal(false);
- });
- it("has unidirectional link to neighbour", function() {
- var foo = new Obj;
- var bar = new Obj;
- bar.linkTo(foo);
- expect(bar.isLinkedTo(foo)).to.equal(true);
- expect(foo.isLinkedTo(bar)).to.equal(false);
- });
- it("has neighbours with connections to themselves", function() {
- var foo = new Obj;
- var bar = new Obj;
- var baz = new Obj;
- // Connect the Objs to themselves.
- foo.linkTo(foo);
- bar.linkTo(bar);
- baz.linkTo(baz);
- // Connect baz => bar => foo.
- baz.linkTo(bar);
- bar.linkTo(foo);
- expect(baz.isLinkedTo(foo)).to.equal(true);
- expect(baz.isLinkedTo(bar)).to.equal(true);
- expect(bar.isLinkedTo(foo)).to.equal(true);
- });
- it("can be a cyclic graph", function() {
- var foo = new Obj;
- var bar = new Obj;
- var baz = new Obj;
- // Connect the nodes baz => bar => foo => baz.
- baz.linkTo(bar);
- bar.linkTo(foo);
- foo.linkTo(baz);
- expect(baz.isLinkedTo(foo)).to.equal(true);
- expect(baz.isLinkedTo(bar)).to.equal(true);
- expect(baz.isLinkedTo(baz)).to.equal(true);
- });
- it("can have neighbours in cyclic graph", function() {
- var foo = new Obj;
- var bar = new Obj;
- var baz = new Obj;
- // Connect the nodes baz => bar <=> foo.
- baz.linkTo(bar);
- bar.linkTo(foo);
- foo.linkTo(bar);
- expect(baz.isLinkedTo(foo)).to.equal(true);
- expect(baz.isLinkedTo(bar)).to.equal(true);
- expect(baz.isLinkedTo(baz)).to.equal(false);
- });
- it("can have a cycle of more than 2 Objs", function() {
- var foo = new Obj;
- var bar = new Obj;
- var baz = new Obj;
- var qux = new Obj;
- // Connect the nodes baz => bar => foo => qux => bar.
- baz.linkTo(bar);
- bar.linkTo(foo);
- foo.linkTo(qux);
- qux.linkTo(bar);
- expect(qux.isLinkedTo(baz)).to.equal(false);
- expect(baz.isLinkedTo(foo)).to.equal(true);
- expect(baz.isLinkedTo(bar)).to.equal(true);
- expect(baz.isLinkedTo(qux)).to.equal(true);
- expect(baz.isLinkedTo(baz)).to.equal(false);
- });
- it("can have a cycle of more than 5 Objs", function() {
- var foo = new Obj;
- var bar = new Obj;
- var baz = new Obj;
- var qux = new Obj;
- var quux = new Obj;
- var quuz = new Obj;
- var corge = new Obj;
- // Connect the nodes baz => bar => foo => qux => bar.
- baz.linkTo(bar);
- bar.linkTo(foo);
- foo.linkTo(qux);
- qux.linkTo(bar);
- bar.linkTo(quux);
- quux.linkTo(quuz);
- quuz.linkTo(corge);
- expect(qux.isLinkedTo(baz)).to.equal(false);
- expect(baz.isLinkedTo(foo)).to.equal(true);
- expect(baz.isLinkedTo(bar)).to.equal(true);
- expect(baz.isLinkedTo(qux)).to.equal(true);
- expect(baz.isLinkedTo(baz)).to.equal(false);
- expect(baz.isLinkedTo(quux)).to.equal(true);
- expect(baz.isLinkedTo(quuz)).to.equal(true);
- expect(baz.isLinkedTo(corge)).to.equal(true);
- });
- });
- // Run the suite.
- mocha.run();
- passes: 5failures: 3duration: 0.04s
- Obj
- can link to itself‣
- does not link to itself‣
- has unidirectional link to neighbour‣
- has neighbours with connections to themselves‣
- can be a cyclic graph‣
- can have neighbours in cyclic graph‣
- RangeError: Maximum call stack size exceeded
- at Obj.isLinkedTo (:50:36)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- can have neighbours in cyclic graph‣
- RangeError: Maximum call stack size exceeded
- at Obj.isLinkedTo (:50:36)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- can have a cycle of more than 2 Objs‣
- RangeError: Maximum call stack size exceeded
- at Obj.isLinkedTo (:50:36)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- can have a cycle of more than 2 Objs‣
- RangeError: Maximum call stack size exceeded
- at Obj.isLinkedTo (:50:36)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- can have a cycle of more than 5 Objs‣
- RangeError: Maximum call stack size exceeded
- at Obj.isLinkedTo (:50:36)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- can have a cycle of more than 5 Objs‣
- RangeError: Maximum call stack size exceeded
- at Obj.isLinkedTo (:50:36)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
- at Obj.isLinkedTo (:56:29)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement