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

assert= require('chai').assert,
GSON=  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]];
},
clone= function (o,fn)
{
    return GSON.parse(GSON.stringify(o),fn);
};

describe(‘GSON’,function () {

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

it('should clone nodes', function (done)
{
   var orig= cir(), _clone= clone(orig);

   _clone.should.not.equal(orig);
   _clone[0].should.not.equal(orig[0]);
   _clone[0].figlia.should.not.equal(orig[0].figlia);
   _clone[2].should.not.equal(orig[2]);
   done();
});

it('should leave scalars equal', function (done)
{
   var orig= cir(), _clone= clone(orig);

   _clone[1].should.equal(orig[1]);
   _clone[0].nome.should.equal(orig[0].nome);
   _clone[0].figlia.nome.should.equal(orig[0].figlia.nome);
   done();
});

it('should replicate the same structure', function (done)
{
   var orig= cir(), _clone= clone(orig);

   _clone.length.should.equal(orig.length);
   _clone[2].length.should.equal(orig[2].length);
   _clone[0].should.equal(_clone[2][1]);
   _clone[2][0].should.equal(_clone[0].figlia);
   _clone[2][0].should.equal(_clone[0].figlia2);
   _clone[2][0].papa.should.equal(_clone[0]);
   done();
});

it('should call eachNode callback for each node', function (done)
{
   var n= 0, orig= cir(), _clone= clone(orig,function (node) { should.exist(node); n++; });

   n.should.equal(4);
   done();
});

});