jsmf-check
Version:
Constraints language and verification for JSMF models
84 lines (56 loc) • 2.33 kB
JavaScript
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}))