1

I'm creating a binary tree class in javascript and my test is failing but I don't see anything wrong with my method and I'm not receiving any diff. Any insight would be awesome.

Here's my class:

    function binaryTree() {
      this.root = null;
    };
    binaryTree.prototype = {
    constructor: binaryTree,
    add: function(val) {
        var root = this.root;
        if(!root) {
          this.root = new Node(val);
          return;
        }
        var currentNode = root;
        var newNode = new Node(val);
        while(currentNode) {
          if(val < currentNode.value) {
            if(!currentNode.left) {
              currentNode.left = newNode;
              break;
            }
            else {
              currentNode = currentNode.left;
            }
          }
          else {
            if(!currentNode.right) {
              currentNode.right = newNode;
              break;
            }
            else {
              currentNode = currentNode.right;
            }
          }
        }
      }

Here's my test:

it('adds values to the binary tree', function () {
  var test = new binaryTree();
  test.add(7);
  test.add(43);
  test.add(13);
  test.add(27);
  test.add(82);
  test.add(2);
  test.add(19);
  test.add(8);
  test.add(1);
  test.add(92);

  expect(test).to.equal({
    root:
     { value: 7,
       left:
        { value: 2,
          left: { value: 1, left: null, right: null },
          right: null },
       right:
        { value: 43,
          left:
           { value: 13,
             left: { value: 8, left: null, right: null },
             right:
              { value: 27,
                left: { value: 19, left: null, right: null },
                right: null } },
          right:
           { value: 82,
             left: null,
             right: { value: 92, left: null, right: null } } } }
  });
});

And here is the error I'm getting:

1) binary tree tests adds values to the binary tree:

    AssertionError: expected { Object (root) } to equal { Object (root) }
    + expected - actual

If I mess around with the values in the test object I see a diff appear so it looks to me like everything is equal and I'm stumped. I'd really appreciate it if I could get a second pair of eyes on this.

lepp
  • 13
  • 4

2 Answers2

2

You are using Mocha's to.equal expectation, but that tests for strict equality. http://chaijs.com/api/bdd/#method_equal

Two objects, even if they have all the same key-value pairs, will not return true to a triple-equals (===) comparator. This is because they really are two separate objects stored in memory that happen to look alike.

Use to.deep.equal instead!

Make sense?

CJ Apel
  • 99
  • 4
  • I get where you were coming from and I tried that but this isn't the answer. You simply can't compare two objects in javascript perfectly even with coercion but you can easily stringify those objects and compare the strings. – lepp Mar 30 '16 at 11:21
0

In case anyone comes across this I found the issue. Two objects cannot be perfectly compared in JavaScript even if all of the properties are equal. This post has two methods to work around this limitation, one of which was very easy to implement in this case:

Changing expect(test).to.equal({ to expect(JSON.stringify(test)).to.equal(JSON.stringify({ will allow this test to pass. Stringifying the objects is a very easy way to compare two objects but this will only work if the properties are in the exact same order.

Community
  • 1
  • 1
lepp
  • 13
  • 4