UNPKG

jsmf-check

Version:

Constraints language and verification for JSMF models

84 lines (56 loc) 2.33 kB
'use strict' const _ = require('lodash') const jsmf = require('jsmf-core') const Class = jsmf.Class const Model = jsmf.Model require('../../src/index') const Person = Class.newInstance('Person', [], { firstname: {type: String, mandatory: true} , age: jsmf.Positive}) const Family = Class.newInstance('Family', [], { lastname: {type: String, mandatory: true}}, { members: {target: Person, errorCallback: jsmf.onError.silent}}) const DomesticPet = jsmf.Class.newInstance('DomesticPet', [], { name: String , race: String}) Person.setFlexible(true) const FamilyModel = new Model('FamilyModel', {}, [Family, Person]) const kennedy = Family.newInstance({name: 'Kennedy'}) const john = new Person({firstname: 'John', birthdate: new Date('1917-05-29')}) const jackie = Person.newInstance({firstname: 'Jacqueline', nickname: 'Jackie', age: new Date('1917-05-29')}) const charlie = DomesticPet.newInstance({name:'Charlie', race: 'Welsh Terrier'}) kennedy.members = [john, jackie, charlie] const Families = new Model('Families', FamilyModel, [kennedy, jackie, john, charlie]) function myInspect() { return _.reduce(this, function(o, v, k) {o[k] = v; return o}, {}) } Person.prototype.inspect = myInspect Family.prototype.inspect = myInspect DomesticPet.prototype.inspect = myInspect console.log('Initial test:') let err = Families.check().errors console.log(require('util').inspect(err, {depth: 3})) console.log('Modify name into lastname') kennedy.lastname = kennedy.name delete kennedy['name'] err = Families.check().errors console.log(require('util').inspect(err, {depth: 3})) console.log('Remove age, add birhtdate:') Person.addAttribute('birthdate', Date) delete Person.attributes.age delete john.age delete jackie.age err = Families.check().errors console.log(require('util').inspect(err, {depth: 3})) console.log('Add nickname:') Person.addAttribute('nickname', String) err = Families.check().errors console.log(require('util').inspect(err, {depth: 3})) Family.addReference('pets', DomesticPet) console.log('Move pets elsewhere:') _.forEach(Families.modellingElements.Family, f => { f.pets = _.filter(f.members, m => m.conformsTo() == DomesticPet) f.members = _.filter(f.members, m => m.conformsTo() == Person) }) err = Families.check() console.log(require('util').inspect(err, {depth: 3}))