You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by "Niall Pemberton (JIRA)" <ji...@apache.org> on 2006/07/19 15:22:31 UTC

[jira] Updated: (VALIDATOR-168) [validator] Extension to provide test cases for client-side validation

     [ http://issues.apache.org/jira/browse/VALIDATOR-168?page=all ]

Niall Pemberton updated VALIDATOR-168:
--------------------------------------

    Component/s: Framework

> [validator] Extension to provide test cases for client-side validation
> ----------------------------------------------------------------------
>
>                 Key: VALIDATOR-168
>                 URL: http://issues.apache.org/jira/browse/VALIDATOR-168
>             Project: Commons Validator
>          Issue Type: Improvement
>          Components: Framework
>         Environment: Operating System: All
> Platform: All
>            Reporter: Nacho G. Mac Dowell
>            Priority: Minor
>
> ABSTRACT: There is a general problem with client side validation in validator.
> It is almost impossible to provide test cases for functions working on forms.
> Instead, if the validator functions focused on what they (should) do best:
> validation, then it would be much simpler to provide tests for all validators. I
> propose making two functions in between forms and validator. One would act as a
> sort of controller (validateField) and another would grab all values from the
> field (grabValuesFromSingleField). Most validators would have the same
> signature: a single parameter of type Array. The most obviest enhancements would
> be easier maintainability, greater clarity and reusability. Another enhancement
> this would provide is conforming to the nature of http: being able to send
> multiple values for any type of single field. 
> NOTE: Some discussion about this went on in #32343 with Niall's Javascript
> Rendering Extension. I beleive it would help stop bugs like #32351 and many others.
> PROPOSAL: First of all I want to look at a couple of transformed validator
> functions so we can inmediately get a grasp of the benefits we'll encounter
> (note that the parameter is an array of values and that isAllDigits and trim are
> omitted for clarity):
> function validateRequired(values) {
> 	var isValid = values.length > 0;
> 	for (i=0; i<values.length; i++) {
> 		if (trim(values[i]).length == 0) {
> 			isValid = false;
> 			break;
> 		}
> 	}
> 	return isValid;
> }
> function validateInteger(values) {
> 	var isValid = true;
> 	for (i=0; i<values.length; i++) {
> 		 if (!isAllDigits(values[i])) {
> 		 	isValid = false;
> 			break;
> 		 } else {
> 		 	var iValue = parseInt(values[i]);
> 			if (isNaN(iValue) || !(iValue >= -2147483648 && iValue <= 2147483647)) {
> 			 	isValid = false;
> 				break;			
>                         }
> 		 }
> 		 
> 	}
> 	return isValid;
> }
>  ***** Providing test-cases for this would be fairly simple:
>  A html page with this use of these tests can be found at:
> http://www.visual-ma.com/validator/tests.html
> function testInteger() {
> 	assertFalse("validateInteger(new Array(\"1\", \"a\", \"b\"))");
> 	assertTrue("validateInteger(new Array(\"1\", \"-2\", \"44\"))");
> }
> function assertTrue(evalMe) {
> 	if (eval(evalMe)) {
> 		log("[assertTrue] Test ok for: " + evalMe);
> 	} else {
> 		log("[assertTrue] Test failed for: " + evalMe, true);
> 	}
> }
> function assertFalse(evalMe) {
> 	if (eval(evalMe)) {
> 		log("[assertFalse] Test failed for: " + evalMe, true);
> 	} else {
> 		log("[assertFalse] Test ok for: " + evalMe);
> 	}
> }
>  ***** So to the point now. The "controller" would be:
> function validateField(oField, validatorFunction) {	
> 	if (!oField.type && oField.length && oField[0]) {
> 		//if it has no type it means there are multiple fields with the same name. We
> shall put the type
> 		//for the field for easier handling
> 		oField.type = oField[0].type;
> 		oField.name = oField[0].name
> 	}
> 	var bValid = true;
> 	var focusField = oField;
> 	if (oField.type == 'radio' || oField.type == 'checkbox') {
> 		var virtualField = oField;
> 		if (!oField.length) {
> 			virtualField = new Array();
> 			virtualField.type = oField.type;
> 			virtualField.name = oField.name;
> 			virtualField[0] = oField;
> 		}
> 		eval("bValid = " + validatorFunction +
> "(grabValuesFromSingleField(virtualField))");
> 		//no need to focus on these
> 		focusField = null;
> 	} else if (oField.length && !oField.options) {
> 		for (n=oField.length - 1; n>=0; n--) {//reverse so we can focus on the first
> 			eval("var auxValid = " + validatorFunction +
> "(grabValuesFromSingleField(oField[n]))");
> 			if (!auxValid) {
> 				//if it's not valid for a single element it won't be valid
> 				bValid = auxValid;
> 				focusField = oField[n];
> 			}
> 		}
> 	} else {
> 		eval("bValid = " + validatorFunction + "(grabValuesFromSingleField(oField))");
> 	}
> 	if (!bValid && focusField && focusField.focus && focusField.style.visibility !=
> 'hidden'
> 		&& focusField.disabled == false && focusField.type != 'hidden') {
> 		focusField.focus();
> 	}
> }
>  ***** and the "grabber":
> function grabValuesFromSingleField(oSingleField) {
> 	var singleValues = new Array();
> 	if (oSingleField.type == 'select-multiple') {
> 		for (s=0; s<oSingleField.options.length; s++) {
> 			if (oSingleField.options[s].selected) {
> 				singleValues[singleValues.length] = oSingleField.options[s].value;
> 			}
> 		}
> 	} else if (oSingleField.type == 'select-one') {
> 		singleValues[0] = oSingleField.options[oSingleField.selectedIndex].value;
> 	} else if (oSingleField.type == 'radio' || oSingleField.type == 'checkbox') {
> 		for (s=0; s<oSingleField.length; s++) {
> 			if (oSingleField[s].checked) {
> 				singleValues[singleValues.length] = oSingleField[s].value;
> 			}
> 		}
> 	} else {
> 		singleValues[0] = oSingleField.value;
> 	}
> 	return singleValues;
> }
> A html page with this use of the "grabber" can be found at:
> http://www.visual-ma.com/validator/grab.html
> Feedback would be very appreciated. I don't know if this is the way to go but
> IMHO, this should be the direction. We need a way to provide test cases for
> client side validation or we could never assure validator is production ready
> (at least for client-side validation).
> Nacho G. Mac Dowell

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org