var should= require(‘chai’).should(),

assert= require('chai').assert,
_= require('underscore'),
traverse=  require('../index.js');

var cir= function () {

var a= { nome: 'Andrea' },
    e= { nome: 'Elena' };

a.figlia= e;
a.figlia2= e;
e.papa= a;

return [a,3,[e,a]];

};

describe(‘traverse’,function () {

describe('isNode',function ()
{
    it('returns true for an object {}', function (done)
    {
        traverse.isNode({}).should.equal(true);
        done();
    });

    it('returns true for an array []', function (done)
    {
        traverse.isNode([]).should.equal(true);
        done();
    });

    it('returns false for a number', function (done)
    {
        traverse.isNode(1).should.equal(false);
        done();
    });

    it('returns false for a string', function (done)
    {
        traverse.isNode('a').should.equal(false);
        done();
    });

    it('returns false for a Date', function (done)
    {
        traverse.isNode(new Date()).should.equal(false);
        done();
    });

    it('returns false for a RegExp', function (done)
    {
        traverse.isNode(/^/).should.equal(false);
        done();
    });
});

it('exits a circular structure', function (done)
{
   process.nextTick(function ()
   {
       traverse(cir(),function ()
       {
       });

       done();
   });
});

it('calls the callback for every node (object or array) in the graph including the root node', function (done)
{
   var cnt= 0;

   traverse(cir(),function (node)
   {
     traverse.isNode(node).should.equal(true);
     cnt++;
   });

   cnt.should.equal(4);

   done();
});

});