manyfest
Version:
JSON Object Manifest for Data Description and Parsing
218 lines (212 loc) • 6.7 kB
JavaScript
/**
* Unit tests for Manyfest
*
* @license MIT
*
* @author Steven Velozo <steven@velozo.com>
*/
var Chai = require("chai");
var Expect = Chai.expect;
let libManyfest = require('../source/Manyfest.js');
suite
(
'Manyfest Object Write',
function()
{
setup (()=> {} );
suite
(
'Basic Write',
()=>
{
test
(
'Properties should be settable without a schema.',
(fTestComplete)=>
{
let _Manyfest = new libManyfest({});
let _SimpleObject = {Name:'Bob',Age:31,Pets:{Fido:'Dog',Spot:'Cat'}};
Expect(_Manyfest.getValueAtAddress(_SimpleObject,'Name'))
.to.equal('Bob');
_Manyfest.setValueAtAddress(_SimpleObject,'Name','Jim');
Expect(_Manyfest.getValueAtAddress(_SimpleObject,'Name'))
.to.equal('Jim');
Expect(_SimpleObject.Name)
.to.equal('Jim');
fTestComplete();
}
);
test
(
'Properties should be settable with a schema by hash.',
(fTestComplete)=>
{
let _Manyfest = new libManyfest({ Scope:'BobsPets', Descriptors: {'Pets.Fido': {Name:'Favorite Pet', Hash:'Favorite'}}});
let _SimpleObject = {Name:'Bob',Age:31,Pets:{Fido:'Dog',Spot:'Cat'}};
Expect(_Manyfest.getValueAtAddress(_SimpleObject,'Pets.Fido'))
.to.equal('Dog');
// Set the favorite pet to be a Monkey because Monkeys rule
_Manyfest.setValueByHash(_SimpleObject,'Favorite','Monkey');
Expect(_Manyfest.getValueAtAddress(_SimpleObject,'Pets.Fido'))
.to.equal('Monkey');
Expect(_SimpleObject.Pets.Fido)
.to.equal('Monkey');
fTestComplete();
}
);
test
(
'Properties should be settable with a schema by address.',
(fTestComplete)=>
{
let _Manyfest = new libManyfest({ Scope:'BobsPets', Descriptors: {'Pets.Fido': {Name:'Favorite Pet', Hash:'Favorite'}}});
let _SimpleObject = {Name:'Bob',Age:31,Pets:{Fido:'Dog',Spot:'Cat'}};
Expect(_Manyfest.getValueAtAddress(_SimpleObject,'Pets.Fido'))
.to.equal('Dog');
// Set fido to be a Lemur
_Manyfest.setValueAtAddress(_SimpleObject,'Pets.Fido','Lemur');
Expect(_Manyfest.getValueAtAddress(_SimpleObject,'Pets.Fido'))
.to.equal('Lemur');
Expect(_SimpleObject.Pets.Fido)
.to.equal('Lemur');
fTestComplete();
}
);
}
);
suite
(
'Advanced Write (with Arrays and Boxed Property addresses)',
()=>
{
test
(
'Write specific array elements.',
(fTestComplete)=>
{
let _Manyfest = new libManyfest();
let _Object = {Dogs:['Fido','Spot','Trinity']};
_Manyfest.setValueAtAddress(_Object, 'Dogs[1]', 'Spotty')
Expect(_Object.Dogs[1])
.to.equal('Spotty');
fTestComplete();
}
);
test
(
'Write specific boxed properties.',
(fTestComplete)=>
{
let _Manyfest = new libManyfest();
let _Object = {Dogs:{RunnerUp:'Fido',Loser:'Spot',Winner:'Trinity'}};
_Manyfest.setValueAtAddress(_Object, 'Dogs["Loser"]', 'Jimbo');
Expect(_Object.Dogs.Loser)
.to.equal('Jimbo');
fTestComplete();
}
);
test
(
'Write to specific boxed properties that do not exist.',
(fTestComplete)=>
{
let _Manyfest = new libManyfest();
let _Object = {Dogs:{RunnerUp:'Fido',Loser:'Spot',Winner:'Trinity'}};
Expect(_Object.Dogs.Judge)
.to.be.an('undefined');
_Manyfest.setValueAtAddress(_Object, 'Dogs.Judge', 'Judgy Judy');
Expect(_Object.Dogs.Judge)
.to.equal('Judgy Judy');
fTestComplete();
}
);
test
(
'Write to nested box properties.',
(fTestComplete)=>
{
let _Manyfest = new libManyfest();
let _Object = {RaceHeats: [
{HeatNumber:1, Dogs:{RunnerUp:'Fido',Loser:'Spot',Winner:'Trinity'}},
{HeatNumber:2, Dogs:{RunnerUp:'Rex',Loser:'Max',Winner:'Buddy'}}
], Dogs:{RunnerUp:{Name:'Fido',Speed:100},Loser:{Name:'Spot'},Winner:{Name:'Trinity'}}};
_Manyfest.setValueAtAddress(_Object, 'Dogs[`RunnerUp`].Speed', 300);
Expect(_Object.Dogs.RunnerUp.Speed)
.to.equal(300);
// Set a value for an address that doesn't exist.
_Manyfest.setValueAtAddress(_Object, 'Dogs[`Loser`].Speed', 10);
Expect(_Object.Dogs.Loser.Speed)
.to.equal(10);
// Set a value for an address and boxed object property that doesn't exist.
_Manyfest.setValueAtAddress(_Object, 'Dogs[`CriterionCollection`].MovieRating', 10000);
Expect(_Object.Dogs.CriterionCollection.MovieRating)
.to.equal(10000);
_Manyfest.setValueAtAddress(_Object, 'RaceHeats[2].HeatNumber', 10001);
Expect(_Object.RaceHeats[2].HeatNumber)
.to.equal(10001);
fTestComplete();
}
);
test
(
'Write nested array properties',
(fTestComplete)=>
{
let _Manyfest = new libManyfest();
let _Object = {Kennel:[{Name:'Fido',Speed:100},{Name:'Spot'},{Name:'Trinity'}]};
_Manyfest.setValueAtAddress(_Object, 'Kennel[1].Name', 'Billy');
Expect(_Object.Kennel[1].Name)
.to.equal('Billy');
fTestComplete();
}
);
test
(
'Indexed subobject are settable',
(fTestComplete)=>
{
let _Manyfest = new libManyfest({});
let _SimpleObject = {};
_Manyfest.setValueAtAddress(_SimpleObject, `_Object['SubObject'].Property`, '123');
Expect(_Manyfest.getValueAtAddress(_SimpleObject, `_Object.SubObject.Property`))
.to.equal('123');
Expect(_SimpleObject._Object.SubObject.Property)
.to.equal('123');
fTestComplete();
}
);
test
(
'Indexed subobject are settable unquoted',
(fTestComplete)=>
{
let _Manyfest = new libManyfest({});
let _SimpleObject = {};
_Manyfest.setValueAtAddress(_SimpleObject, `_Object[SubObject].Property`, '123');
Expect(_Manyfest.getValueAtAddress(_SimpleObject, `_Object.SubObject.Property`))
.to.equal('123');
Expect(_SimpleObject._Object.SubObject.Property)
.to.equal('123');
fTestComplete();
}
);
//TODO: known broken case for multiple bracketed properties
test.skip
(
'Indexed subobject are settable double brackets',
(fTestComplete)=>
{
let _Manyfest = new libManyfest({});
let _SimpleObject = {};
_Manyfest.setValueAtAddress(_SimpleObject, `_Object[SubObject]['Property']`, '123');
Expect(_Manyfest.getValueAtAddress(_SimpleObject, `_Object.SubObject.Property`))
.to.equal('123');
Expect(_SimpleObject._Object.SubObject.Property)
.to.equal('123');
fTestComplete();
}
);
}
);
}
);