You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@myfaces.apache.org by Mert Çalışkan <mc...@gmail.com> on 2006/11/13 11:37:35 UTC

Problem with float binding..Spec issue or something else?

I have a domain object called Total that contains property named amount.
*
package* domain;

*public* *class* Total {

    *private* *float* amount;

    *public* *float* getAmount() {
        *return* amount;
    }

    *public* *void* setAmount(*float* amount) {
        this.amount = amount;
    }
}

The amount proerty is binded to the inputText on the page. When the user
enters value greater then 2^14(16777216) the updated model value becomes
inconsistent. For example the value: 16777217 is converted and updated to
the model as 16777216. Here is the shale test case i wrote to test the
situation. There is an assertNotSame() method at the end of the testCase
which should be an assertSame().



*package* dev;

 *import* javax.faces.component.UIForm;*import*
javax.faces.component.UIInput;*import*
javax.faces.component.html.HtmlForm;*import*
javax.faces.component.html.HtmlInputText;*import*
javax.faces.convert.NumberConverter;*import*
javax.faces.el.ValueBinding;
 *import* junit.framework.Test;*import*
junit.framework.TestSuite;*import*
org.apache.shale.test.base.AbstractJsfTestCase;*import*
com.sun.faces.renderkit.html_basic.TextRenderer;*import* domain.Total;
 *public* *class* NumberConverterTester *extends* AbstractJsfTestCase {

	*private* UIInput inputText;
	
	NumberConverter converter;
	
	*private* TextRenderer inputTextRenderer;
	
	*public* NumberConverterTester(String testName) {
		*super*(testName);
	}

	*public* *static* Test suite() {
		*return* *new* TestSuite(NumberConverterTester.class);
	}
	
	*public* *void* setUp() {
		super.setUp();
		
		// view
		UIForm form = *new* HtmlForm();
		form.setId("form1");
		form.setParent(facesContext.getViewRoot());
		
		// the component
		inputText = *new* HtmlInputText();
		inputText.setId("text1");
		inputText.setParent(form);
	
		// the converter
		converter = *new* NumberConverter();
		converter.setType("number");
		inputText.setConverter(converter);
		
		Total myTotal = *new* Total();
		ValueBinding valueBinding =
facesContext.getApplication().createValueBinding("#{myTotal.amount}");
		inputText.setValueBinding("value", valueBinding);
		facesContext.getExternalContext().getRequestMap().put("myTotal", myTotal);
	}
	
	*public* *void* tearDown() {
		super.tearDown();
	}
	
	*public* *void* testConvertWorksFineWithPrimitiveFloatValueEquals2over24() {
		facesContext.getExternalContext().getRequestParameterMap().put("form1:text1",
"16777216");
		
		inputTextRenderer = *new* TextRenderer();
		inputTextRenderer.decode(facesContext, inputText);
		inputText.processValidators(facesContext);
		inputText.processUpdates(facesContext);
		
		Total amountFromModel = (Total)
facesContext.getApplication().getVariableResolver().resolveVariable(facesContext,
"myTotal");
		String amount =
inputText.getConverter().getAsString(facesContext,inputText, *new*
Float(amountFromModel.getAmount()));
		
		assertEquals(amount, "16.777.216");
	}
	
	*public* *void*
testConvertDoesntWorkRightWithPrimitiveFloatValueAbove2over24() {
		facesContext.getExternalContext().getRequestParameterMap().put("form1:text1",
"16777217");
		
		inputTextRenderer = *new* TextRenderer();
		inputTextRenderer.decode(facesContext, inputText);
		inputText.processValidators(facesContext);
		inputText.processUpdates(facesContext);
		
		Total amountFromModel = (Total)
facesContext.getApplication().getVariableResolver().resolveVariable(facesContext,
"myTotal");
		String amount =
inputText.getConverter().getAsString(facesContext,inputText, *new*
Float(amountFromModel.getAmount()));
		
		assertNotSame(amount, "16.777.217");
	}}


I tested this with jsf 1.1_02. Any ideas? Is there a problem with the spec.
or something else?


Regards,

Mert..