diff --git a/lib/MemberBuilder.js b/lib/MemberBuilder.js index 99c7cd0..ccb0a2e 100644 --- a/lib/MemberBuilder.js +++ b/lib/MemberBuilder.js @@ -210,11 +210,11 @@ exports.buildGetterSetter = function( ) { var prev_data = scanMembers( members, name, base ), - prev_keywords = {} + prev_keywords = null ; this._validate.validateGetterSetter( - name, keywords, prev_data, prev_keywords + name, {}, keywords, prev_data, prev_keywords ); Object.defineProperty( diff --git a/lib/MemberBuilderValidator.js b/lib/MemberBuilderValidator.js index 5f15d79..b33928a 100644 --- a/lib/MemberBuilderValidator.js +++ b/lib/MemberBuilderValidator.js @@ -242,7 +242,7 @@ exports.prototype.validateProperty = function( * @return {undefined} */ exports.prototype.validateGetterSetter = function( - name, keywords, prev_data, prev_keywords + name, value, keywords, prev_data, prev_keywords ) { var prev = ( prev_data ) ? prev_data.member : null, @@ -266,7 +266,7 @@ exports.prototype.validateGetterSetter = function( } // do not permit visibility de-escalation - if ( this._getVisibilityValue( prev_keywords ) + if ( this._getVisibilityValue( prev_keywords || {} ) < this._getVisibilityValue( keywords ) ) { diff --git a/test/MemberBuilder/GetterSetterTest.js b/test/MemberBuilder/GetterSetterTest.js new file mode 100644 index 0000000..aa9444c --- /dev/null +++ b/test/MemberBuilder/GetterSetterTest.js @@ -0,0 +1,146 @@ +/** + * Tests MemberBuilder getter/setter builder + * + * Copyright (C) 2010 Mike Gerwitz + * + * This file is part of ease.js. + * + * ease.js is free software: you can redistribute it and/or modify it under the + * terms of the GNU Lesser 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 Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + * + * @author Mike Gerwitz + * @package test + */ + +var shared = require( __dirname + '/inc-common' ), + es5 = ( typeof Object.defineProperty === 'function' ) ? true : false; + +require( 'common' ).testCase( +{ + caseSetUp: function() + { + var _self = this; + + this.testArgs = function( args, name, value, keywords ) + { + shared.testArgs( _self, args, name, value, keywords, function( + prev_default, pval_given, pkey_given + ) + { + var expected = _self.members[ 'public' ][ name ]; + + if ( !expected ) + { + return prev_default; + } + + return { + value: { + expected: expected, + given: pval_given.member, + }, + keywords: { + expected: null, // XXX + given: pkey_given, + }, + }; + } ); + }; + }, + + + setUp: function() + { + // stub factories used for testing + var stubFactory = this.require( 'MethodWrapperFactory' )( + function( func ) { return func; } + ); + + this.sut = this.require( 'MemberBuilder' )( + stubFactory, stubFactory, + this.mockValidate = this.getMock( 'MemberBuilderValidator' ) + ); + + this.members = this.sut.initMembers(); + }, + + + /** + * The validator can only do its job if we're providing it with the correct + * information + */ + 'Passes proper data to validator when not overriding': function() + { + es5 || this.skip(); + + var _self = this, + called = false, + + name = 'foo', + value_get = function get() {}, + value_set = function set() {}, + keywords = {} + ; + + this.mockValidate.validateGetterSetter = function() + { + called = true; + + // XXX: Currently no 'value' argument is passed + _self.testArgs( arguments, name, {}, keywords ); + }; + + this.sut.buildGetterSetter( this.members, {}, name, + value_get, value_set, keywords, {} + ); + + this.assertEqual( true, called, + 'validateGetterSetter() was not called' + ); + }, + + + 'Passes proper data to validator when overriding': function() + { + es5 || this.skip(); + + var _self = this, + called = false, + + name = 'foo', + value_get = function get() {}, + value_set = function set() {}, + keywords = {} + ; + + // since we're overriding (XXX) + this.members[ 'public' ][ name ] = {}; + + this.mockValidate.validateGetterSetter = function() + { + called = true; + + // XXX: Currently no 'value' argument is passed + _self.testArgs( arguments, name, {}, keywords ); + }; + + this.sut.buildGetterSetter( this.members, {}, name, + value_get, value_set, keywords, {} + ); + + this.assertEqual( true, called, + 'validateGetterSetter() was not called' + ); + }, +} ); + diff --git a/test/MemberBuilder/inc-common.js b/test/MemberBuilder/inc-common.js index 0a7250d..2a32d0b 100644 --- a/test/MemberBuilder/inc-common.js +++ b/test/MemberBuilder/inc-common.js @@ -47,7 +47,7 @@ exports.testArgs = function( testcase, args, name, value, keywords, prevLookup ) 'Incorrect name passed to validator' ); - testcase.assertStrictEqual( value, args[ 1 ], + testcase.assertDeepEqual( value, args[ 1 ], 'Incorrect value passed to validator' ); @@ -60,7 +60,7 @@ exports.testArgs = function( testcase, args, name, value, keywords, prevLookup ) 'otherwise null' ); - testcase.assertStrictEqual( prev.keywords.expected, prev.keywords.given, + testcase.assertDeepEqual( prev.keywords.expected, prev.keywords.given, 'Previous keywords should contain prev keyword if ' + 'overriding, otherwise null' ); diff --git a/test/MemberBuilderValidator/GetterSetterTest.js b/test/MemberBuilderValidator/GetterSetterTest.js index a57404b..072f4c6 100644 --- a/test/MemberBuilderValidator/GetterSetterTest.js +++ b/test/MemberBuilderValidator/GetterSetterTest.js @@ -41,7 +41,7 @@ require( 'common' ).testCase( function( name, startobj, overrideobj ) { _self.sut.validateGetterSetter( - name, overrideobj, + name, {}, overrideobj, { get: function() {}, set: function() {} }, startobj ); @@ -72,7 +72,7 @@ require( 'common' ).testCase( this.quickFailureTest( name, 'method', function() { _self.sut.validateGetterSetter( - name, {}, { member: function() {} } + name, {}, {}, { member: function() {} } ); } ); }, @@ -88,7 +88,7 @@ require( 'common' ).testCase( this.quickFailureTest( name, 'method', function() { _self.sut.validateGetterSetter( - name, {}, { member: 'foo' } + name, {}, {}, { member: 'foo' } ); } ); },