Initial ProtoField implementation
parent
afb0a09784
commit
bfb6e7068a
|
@ -0,0 +1,96 @@
|
||||||
|
/**
|
||||||
|
* Class prototype field
|
||||||
|
*
|
||||||
|
* Copyright (C) 2014 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* This file is part of GNU ease.js.
|
||||||
|
*
|
||||||
|
* ease.js is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes field with a datum
|
||||||
|
*
|
||||||
|
* The ProtoField itself is immutable in the sense that its value cannot be
|
||||||
|
* reassigned; but if DATUM references a mutable object, then that object is
|
||||||
|
* not prohibited from changing; doing so is, however, not recommended and
|
||||||
|
* such behavior is not defined, nor is it defined that DATUM's reference
|
||||||
|
* will be maintained (e.g. the referenced object may be at some point
|
||||||
|
* cloned).
|
||||||
|
*
|
||||||
|
* @type {*} datum field datum (value)
|
||||||
|
*/
|
||||||
|
function ProtoField( datum )
|
||||||
|
{
|
||||||
|
if ( !( this instanceof ProtoField ) ) {
|
||||||
|
return new ProtoField( datum );
|
||||||
|
}
|
||||||
|
|
||||||
|
this._datum = datum;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ProtoField.prototype = {
|
||||||
|
/**
|
||||||
|
* Retrieve the datum assigned to the field during construction
|
||||||
|
*
|
||||||
|
* It is not defined whether this datum will be strictly equal to the
|
||||||
|
* datum provided during construction (that is---reference the same
|
||||||
|
* object), but it will be guaranteed to be recursively (deep)
|
||||||
|
* equivalent.
|
||||||
|
*
|
||||||
|
* @return {*} field datum
|
||||||
|
*/
|
||||||
|
getDatum: function()
|
||||||
|
{
|
||||||
|
return this._datum;
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Produce a representation of the field suitable for use in a class
|
||||||
|
* prototype that contains, at a minimum, a datum that is recurisvely
|
||||||
|
* equivalent to the datum provided during construction
|
||||||
|
*
|
||||||
|
* The produced datum is not guaranteed to be strictly equal to the one
|
||||||
|
* provided during construction, or even to the one returned by the
|
||||||
|
* getValue method. Further, the datum may contain metadata that was not
|
||||||
|
* provided during construction.
|
||||||
|
*
|
||||||
|
* The produced datum should be treated as just that---a datum; opaque.
|
||||||
|
* To decompose it for processing, use ProtoField.parse.
|
||||||
|
*
|
||||||
|
* @return {*} datum suitable for use in a class prototype
|
||||||
|
*/
|
||||||
|
compile: function()
|
||||||
|
{
|
||||||
|
return this.getDatum();
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Consume a previously compiled ProtoField, producing a new ProtoField that
|
||||||
|
* is equivalent to the original ProtoField before compiling
|
||||||
|
*
|
||||||
|
* @param {*} compiled_field datum produced with ProtoField#compile
|
||||||
|
*/
|
||||||
|
ProtoField.parse = function( compiled_field )
|
||||||
|
{
|
||||||
|
return ProtoField( compiled_field );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = ProtoField;
|
||||||
|
|
|
@ -0,0 +1,79 @@
|
||||||
|
/**
|
||||||
|
* Tests class prototype field
|
||||||
|
*
|
||||||
|
* Copyright (C) 2014 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* This file is part of GNU ease.js.
|
||||||
|
*
|
||||||
|
* ease.js is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
require( 'common' ).testCase( 'proto/field/ProtoField',
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* This method is intended to provide a datum that is equivalent
|
||||||
|
* (recursively equal) to the datum provided during construction. As
|
||||||
|
* documented, there is no guarantee that the returned datum will be
|
||||||
|
* strictly equal to the one provided (it so happens that, at the time
|
||||||
|
* that this test case was written, it is; this API is intended not only
|
||||||
|
* for this prototype).
|
||||||
|
*/
|
||||||
|
'Field datum retrieved is equivalent to assigned datum':
|
||||||
|
function()
|
||||||
|
{
|
||||||
|
var val = { foo: { bar: 'baz' } };
|
||||||
|
|
||||||
|
this.assertDeepEqual(
|
||||||
|
val,
|
||||||
|
this.Sut( val ).getDatum()
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The purpose of the ProtoField family of prototypes is to produce
|
||||||
|
* fields suitable for a class prototype; this method will do so by
|
||||||
|
* producing both the datum assigned to it, as well as any other
|
||||||
|
* metadata that may be needed or desirable.
|
||||||
|
*
|
||||||
|
* At present, there is no additional metadata produced by ProtoField.
|
||||||
|
*/
|
||||||
|
'Compiling field produces its datum': function()
|
||||||
|
{
|
||||||
|
var field = this.Sut( [ [ {} ] ] );
|
||||||
|
|
||||||
|
this.assertDeepEqual(
|
||||||
|
field.getDatum(),
|
||||||
|
field.compile()
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* In addition to producing a compiled field, we also support consuming
|
||||||
|
* a compiled field back into our internal representation for further
|
||||||
|
* processing (for example, this could be useful for static analysis).
|
||||||
|
*/
|
||||||
|
'Parsing compiled field produces equivalent representation': function()
|
||||||
|
{
|
||||||
|
var value = { foo: [ 'bar', 'baz' ] },
|
||||||
|
field = this.Sut( value ),
|
||||||
|
compiled = field.compile(),
|
||||||
|
parsed = this.Sut.parse( compiled );
|
||||||
|
|
||||||
|
this.assertDeepEqual( field.getDatum(), parsed.getDatum() );
|
||||||
|
this.assertDeepEqual( compiled, parsed.compile() );
|
||||||
|
},
|
||||||
|
} );
|
||||||
|
|
Loading…
Reference in New Issue