diff --git a/jsf/tests/org.eclipse.jst.jsf.validation.el.tests/src/org/eclipse/jst/jsf/validation/el/tests/jsp/BuiltInSymbolsTestCase.java b/jsf/tests/org.eclipse.jst.jsf.validation.el.tests/src/org/eclipse/jst/jsf/validation/el/tests/jsp/BuiltInSymbolsTestCase.java
index 86905c7..5dc6086 100644
--- a/jsf/tests/org.eclipse.jst.jsf.validation.el.tests/src/org/eclipse/jst/jsf/validation/el/tests/jsp/BuiltInSymbolsTestCase.java
+++ b/jsf/tests/org.eclipse.jst.jsf.validation.el.tests/src/org/eclipse/jst/jsf/validation/el/tests/jsp/BuiltInSymbolsTestCase.java
@@ -1,201 +1,199 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.el.tests.jsp;
-
-import java.util.List;
-
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
-import org.eclipse.jst.jsf.core.JSFVersion;
-import org.eclipse.jst.jsf.core.tests.util.JSFCoreUtilHelper;
-import org.eclipse.jst.jsf.core.tests.validation.MockValidationReporter.ReportedProblem;
-import org.eclipse.jst.jsf.validation.el.tests.base.ELAssert;
-import org.eclipse.jst.jsf.validation.el.tests.base.SingleJSPTestCase;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Test cases for built-in (implicit) symbol resolution
- * 
- * @author cbateman
- *
- */
-public class BuiltInSymbolsTestCase extends SingleJSPTestCase
-{
-    public BuiltInSymbolsTestCase()
-    {
-        super("/testdata/jsps/builtinSymbols.jsp.data", "/builtinSymbols.jsp", JSFVersion.V1_1,FACES_CONFIG_FILE_NAME_1_1);
-    }
-
-    @Override
-    protected void setUp() throws Exception
-    {
-        super.setUp();
-        JSFCoreUtilHelper.injectTestTagRegistryFactoryProvider(JSFCoreUtilHelper.createSimpleRegistryFactory());
-    }
-
-    
-    @Override
-    protected void tearDown() throws Exception
-    {
-        super.tearDown();
-        JSFCoreUtilHelper.injectTestTagRegistryFactoryProvider(null);
-    }
-
-    @Override
-    public void testSanity()
-    {
-        assertEquals("applicationScope", ELAssert.getELText(_structuredDocument,975));
-        assertEquals("sessionScope", ELAssert.getELText(_structuredDocument,1024));
-        assertEquals("requestScope", ELAssert.getELText(_structuredDocument,1069));
-        assertEquals("cookie", ELAssert.getELText(_structuredDocument,1114));
-        assertEquals("facesContext", ELAssert.getELText(_structuredDocument,1153));
-        assertEquals("header", ELAssert.getELText(_structuredDocument,1198));
-        assertEquals("headerValues", ELAssert.getELText(_structuredDocument,1237));
-        assertEquals("initParam", ELAssert.getELText(_structuredDocument,1282));
-        assertEquals("param", ELAssert.getELText(_structuredDocument,1324));
-        assertEquals("paramValues", ELAssert.getELText(_structuredDocument,1362));
-        assertEquals("view", ELAssert.getELText(_structuredDocument,1406));
-        assertEquals("applicationScope.mapBean", ELAssert.getELText(_structuredDocument,1492));
-        assertEquals("sessionScope.myBean", ELAssert.getELText(_structuredDocument,1596));
-        assertEquals("sessionScope.mapBean1", ELAssert.getELText(_structuredDocument,1645));
-        assertEquals("sessionScope.myBeanSettable", ELAssert.getELText(_structuredDocument,1696));
-        assertEquals("requestScope.myBeanSubClass", ELAssert.getELText(_structuredDocument,1803));
-        assertEquals("requestScope.hiddenBean", ELAssert.getELText(_structuredDocument,1860));
-        assertEquals("requestScope.bundle", ELAssert.getELText(_structuredDocument,1913));
-        assertEquals("requestScope.bundle2", ELAssert.getELText(_structuredDocument,1962));
-        assertEquals("empty cookie", ELAssert.getELText(_structuredDocument,2096));
-        assertEquals("empty header", ELAssert.getELText(_structuredDocument,2138));
-        assertEquals("empty headerValues", ELAssert.getELText(_structuredDocument,2180));
-        assertEquals("empty param", ELAssert.getELText(_structuredDocument,2228));
-        assertEquals("empty paramValues", ELAssert.getELText(_structuredDocument,2269));
-        assertEquals("facesContext.application", ELAssert.getELText(_structuredDocument,2367));
-        assertEquals("facesContext.clientIdsWithMessages", ELAssert.getELText(_structuredDocument,2421));
-        assertEquals("facesContext.externalContext", ELAssert.getELText(_structuredDocument,2485));
-        assertEquals("facesContext.maximumSeverity", ELAssert.getELText(_structuredDocument,2543));
-        assertEquals("facesContext.messages", ELAssert.getELText(_structuredDocument,2601));
-        assertEquals("facesContext.renderKit", ELAssert.getELText(_structuredDocument,2652));
-        assertEquals("facesContext.renderResponse", ELAssert.getELText(_structuredDocument,2704));
-        assertEquals("facesContext.responseComplete", ELAssert.getELText(_structuredDocument,2761));
-        assertEquals("facesContext.responseStream", ELAssert.getELText(_structuredDocument,2820));
-        assertEquals("facesContext.responseWriter", ELAssert.getELText(_structuredDocument,2877));
-        assertEquals("facesContext.viewRoot", ELAssert.getELText(_structuredDocument,2934));
-        assertEquals("view.viewId", ELAssert.getELText(_structuredDocument,3030));
-        assertEquals("view.family", ELAssert.getELText(_structuredDocument,3071));
-        assertEquals("view.locale", ELAssert.getELText(_structuredDocument,3112));
-        assertEquals("view.renderKitId", ELAssert.getELText(_structuredDocument,3153));
-        assertEquals("view.viewId", ELAssert.getELText(_structuredDocument,3199));
-        assertEquals("sessionScope.myBean.integerProperty", ELAssert.getELText(_structuredDocument,3295));
-        assertEquals("requestScope.bundle.bundleProp2", ELAssert.getELText(_structuredDocument,3363));
-        assertEquals("3 + sessionScope.myBean.integerProperty", ELAssert.getELText(_structuredDocument,3478));
-
-        assertEquals("applicationScope.notAMember", ELAssert.getELText(_structuredDocument,3572));
-        assertEquals("sessionScope.notAMember", ELAssert.getELText(_structuredDocument,3632));
-        assertEquals("requestScope.notAMember", ELAssert.getELText(_structuredDocument,3688));
-        assertEquals("cookie.notAMember", ELAssert.getELText(_structuredDocument,3744));
-        assertEquals("facesContext.notAMember", ELAssert.getELText(_structuredDocument,3794));
-        assertEquals("header.notAMember", ELAssert.getELText(_structuredDocument,3850));
-        assertEquals("headerValues.notAMember", ELAssert.getELText(_structuredDocument,3900));
-        assertEquals("initParam.notAMember", ELAssert.getELText(_structuredDocument,3956));
-        assertEquals("param.notAMember", ELAssert.getELText(_structuredDocument,4009));
-        assertEquals("paramValues.notAMember", ELAssert.getELText(_structuredDocument,4058));
-        assertEquals("view.notAMember", ELAssert.getELText(_structuredDocument,4113));
-        assertEquals("applicationScope.myBean_none", ELAssert.getELText(_structuredDocument,4209));
-        assertEquals("sessionScope.myBean_none", ELAssert.getELText(_structuredDocument,4270));
-        assertEquals("requestScope.myBean_none", ELAssert.getELText(_structuredDocument,4327));
-
-        assertEquals("!initParam", ELAssert.getELText(_structuredDocument,4400));
-    }
-
-    @Override
-    public void testNoErrorExprs()
-    {
-        assertNoError(975, TypeConstants.TYPE_MAP);
-        assertNoError(1024, TypeConstants.TYPE_MAP);
-        assertNoError(1069, TypeConstants.TYPE_MAP);
-        assertNoError(1114, TypeConstants.TYPE_MAP);
-        assertNoError(1153, "Ljavax.faces.context.FacesContext;");
-        assertNoError(1198, TypeConstants.TYPE_MAP);
-        assertNoError(1237, TypeConstants.TYPE_MAP);
-        assertNoError(1282, TypeConstants.TYPE_MAP);
-        assertNoError(1324, TypeConstants.TYPE_MAP);
-        assertNoError(1362, TypeConstants.TYPE_MAP);
-        assertNoError(1406, "Ljavax.faces.component.UIViewRoot;");
-        assertNoError(1492, "Lbeans.MapBean;");
-        assertNoError(1596, "Lbeans.MyBean;");
-        assertNoError(1645, "Lbeans.MapBean;");
-        assertNoError(1696, "Lbeans.MyBeanSettable;");
-        assertNoError(1803, "Lbeans.MyBeanSubClass;");
-        assertNoError(1860, "Lbeans.MyBean;");
-
-        assertNoError(1913, TypeConstants.TYPE_MAP);
-        assertNoError(1962, TypeConstants.TYPE_MAP);
-
-        assertNoError(2096, Signature.SIG_BOOLEAN);
-        assertNoError(2138, Signature.SIG_BOOLEAN);
-        assertNoError(2180, Signature.SIG_BOOLEAN);
-        assertNoError(2228, Signature.SIG_BOOLEAN);
-        assertNoError(2269, Signature.SIG_BOOLEAN);
-        // TODO: can't check these until we can import the required API jars
-        // into the project
-        //        assertEquals("facesContext.application", getELText(_structuredDocument,2367));
-        //        assertEquals("facesContext.clientIdsWithMessages", getELText(_structuredDocument,2421));
-        //        assertEquals("facesContext.externalContext", getELText(_structuredDocument,2485));
-        //        assertEquals("facesContext.maximumSeverity", getELText(_structuredDocument,2543));
-        //        assertEquals("facesContext.messages", getELText(_structuredDocument,2601));
-        //        assertEquals("facesContext.renderKit", getELText(_structuredDocument,2652));
-        //        assertEquals("facesContext.renderResponse", getELText(_structuredDocument,2704));
-        //        assertEquals("facesContext.responseComplete", getELText(_structuredDocument,2761));
-        //        assertEquals("facesContext.responseStream", getELText(_structuredDocument,2820));
-        //        assertEquals("facesContext.responseWriter", getELText(_structuredDocument,2877));
-        //        assertEquals("facesContext.viewRoot", getELText(_structuredDocument,2934));
-        //        assertEquals("view.viewId", getELText(_structuredDocument,3030));
-        //        assertEquals("view.family", getELText(_structuredDocument,3071));
-        //        assertEquals("view.locale", getELText(_structuredDocument,3112));
-        //        assertEquals("view.renderKitId", getELText(_structuredDocument,3153));
-        //        assertEquals("view.viewId", getELText(_structuredDocument,3199));
-        assertNoError(3295, Signature.SIG_INT);
-        assertNoError(3363, TypeConstants.TYPE_STRING);
-        assertNoError(3478, Signature.SIG_LONG);
-        
-        // can't know what's actually in the scope map.  so anything unresolved is just
-        // no error Java object.
-        assertNoError(3572, TypeConstants.TYPE_JAVAOBJECT);
-        assertNoError(3632,TypeConstants.TYPE_JAVAOBJECT);
-        assertNoError(3688,TypeConstants.TYPE_JAVAOBJECT);
-        assertNoError(3744,TypeConstants.TYPE_JAVAOBJECT);
-        assertNoError(3794,TypeConstants.TYPE_JAVAOBJECT);
-        assertNoError(3850,TypeConstants.TYPE_JAVAOBJECT);
-        assertNoError(3900,TypeConstants.TYPE_JAVAOBJECT);
-        assertNoError(3956,TypeConstants.TYPE_JAVAOBJECT);
-        assertNoError(4009,TypeConstants.TYPE_JAVAOBJECT);
-        assertNoError(4058,TypeConstants.TYPE_JAVAOBJECT);
-        assertNoError(4113,TypeConstants.TYPE_JAVAOBJECT);
-        assertNoError(4209,TypeConstants.TYPE_JAVAOBJECT);
-        assertNoError(4270,TypeConstants.TYPE_JAVAOBJECT);
-        assertNoError(4327,TypeConstants.TYPE_JAVAOBJECT);
-    }
-    @Override
-    public void testWarningExprs()
-    {
-        // no warnings.  The issues marked warnings in the jsp test data
-        // are no longer, since we realized that maps can contain anything...
-        // the  only exceptino is FacesContext which is resovled to a map 
-        // at test time since the  API  is not in the classpath.  This
-        // should be changed if start using jsf api/impl in these tests TODO
-    }
-
-    @Override
-    public void testErrorExprs()
-    {
-        final List<ReportedProblem> list = assertSemanticError(4400,null,1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID);
-    }
-}
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 Oracle Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     Oracle Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.jsf.validation.el.tests.jsp;
+
+import org.eclipse.jdt.core.Signature;
+import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
+import org.eclipse.jst.jsf.core.JSFVersion;
+import org.eclipse.jst.jsf.core.tests.util.JSFCoreUtilHelper;
+import org.eclipse.jst.jsf.validation.el.tests.base.ELAssert;
+import org.eclipse.jst.jsf.validation.el.tests.base.SingleJSPTestCase;
+
+/**
+ * Test cases for built-in (implicit) symbol resolution
+ * 
+ * @author cbateman
+ *
+ */
+public class BuiltInSymbolsTestCase extends SingleJSPTestCase
+{
+    public BuiltInSymbolsTestCase()
+    {
+        super("/testdata/jsps/builtinSymbols.jsp.data", "/builtinSymbols.jsp", JSFVersion.V1_1,FACES_CONFIG_FILE_NAME_1_1);
+    }
+
+    @Override
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+        JSFCoreUtilHelper.injectTestTagRegistryFactoryProvider(JSFCoreUtilHelper.createSimpleRegistryFactory());
+    }
+
+    
+    @Override
+    protected void tearDown() throws Exception
+    {
+        super.tearDown();
+        JSFCoreUtilHelper.injectTestTagRegistryFactoryProvider(null);
+    }
+
+    @Override
+    public void testSanity()
+    {
+        assertEquals("applicationScope", ELAssert.getELText(_structuredDocument,975));
+        assertEquals("sessionScope", ELAssert.getELText(_structuredDocument,1024));
+        assertEquals("requestScope", ELAssert.getELText(_structuredDocument,1069));
+        assertEquals("cookie", ELAssert.getELText(_structuredDocument,1114));
+        assertEquals("facesContext", ELAssert.getELText(_structuredDocument,1153));
+        assertEquals("header", ELAssert.getELText(_structuredDocument,1198));
+        assertEquals("headerValues", ELAssert.getELText(_structuredDocument,1237));
+        assertEquals("initParam", ELAssert.getELText(_structuredDocument,1282));
+        assertEquals("param", ELAssert.getELText(_structuredDocument,1324));
+        assertEquals("paramValues", ELAssert.getELText(_structuredDocument,1362));
+        assertEquals("view", ELAssert.getELText(_structuredDocument,1406));
+        assertEquals("applicationScope.mapBean", ELAssert.getELText(_structuredDocument,1492));
+        assertEquals("sessionScope.myBean", ELAssert.getELText(_structuredDocument,1596));
+        assertEquals("sessionScope.mapBean1", ELAssert.getELText(_structuredDocument,1645));
+        assertEquals("sessionScope.myBeanSettable", ELAssert.getELText(_structuredDocument,1696));
+        assertEquals("requestScope.myBeanSubClass", ELAssert.getELText(_structuredDocument,1803));
+        assertEquals("requestScope.hiddenBean", ELAssert.getELText(_structuredDocument,1860));
+        assertEquals("requestScope.bundle", ELAssert.getELText(_structuredDocument,1913));
+        assertEquals("requestScope.bundle2", ELAssert.getELText(_structuredDocument,1962));
+        assertEquals("empty cookie", ELAssert.getELText(_structuredDocument,2096));
+        assertEquals("empty header", ELAssert.getELText(_structuredDocument,2138));
+        assertEquals("empty headerValues", ELAssert.getELText(_structuredDocument,2180));
+        assertEquals("empty param", ELAssert.getELText(_structuredDocument,2228));
+        assertEquals("empty paramValues", ELAssert.getELText(_structuredDocument,2269));
+        assertEquals("facesContext.application", ELAssert.getELText(_structuredDocument,2367));
+        assertEquals("facesContext.clientIdsWithMessages", ELAssert.getELText(_structuredDocument,2421));
+        assertEquals("facesContext.externalContext", ELAssert.getELText(_structuredDocument,2485));
+        assertEquals("facesContext.maximumSeverity", ELAssert.getELText(_structuredDocument,2543));
+        assertEquals("facesContext.messages", ELAssert.getELText(_structuredDocument,2601));
+        assertEquals("facesContext.renderKit", ELAssert.getELText(_structuredDocument,2652));
+        assertEquals("facesContext.renderResponse", ELAssert.getELText(_structuredDocument,2704));
+        assertEquals("facesContext.responseComplete", ELAssert.getELText(_structuredDocument,2761));
+        assertEquals("facesContext.responseStream", ELAssert.getELText(_structuredDocument,2820));
+        assertEquals("facesContext.responseWriter", ELAssert.getELText(_structuredDocument,2877));
+        assertEquals("facesContext.viewRoot", ELAssert.getELText(_structuredDocument,2934));
+        assertEquals("view.viewId", ELAssert.getELText(_structuredDocument,3030));
+        assertEquals("view.family", ELAssert.getELText(_structuredDocument,3071));
+        assertEquals("view.locale", ELAssert.getELText(_structuredDocument,3112));
+        assertEquals("view.renderKitId", ELAssert.getELText(_structuredDocument,3153));
+        assertEquals("view.viewId", ELAssert.getELText(_structuredDocument,3199));
+        assertEquals("sessionScope.myBean.integerProperty", ELAssert.getELText(_structuredDocument,3295));
+        assertEquals("requestScope.bundle.bundleProp2", ELAssert.getELText(_structuredDocument,3363));
+        assertEquals("3 + sessionScope.myBean.integerProperty", ELAssert.getELText(_structuredDocument,3478));
+
+        assertEquals("applicationScope.notAMember", ELAssert.getELText(_structuredDocument,3572));
+        assertEquals("sessionScope.notAMember", ELAssert.getELText(_structuredDocument,3632));
+        assertEquals("requestScope.notAMember", ELAssert.getELText(_structuredDocument,3688));
+        assertEquals("cookie.notAMember", ELAssert.getELText(_structuredDocument,3744));
+        assertEquals("facesContext.notAMember", ELAssert.getELText(_structuredDocument,3794));
+        assertEquals("header.notAMember", ELAssert.getELText(_structuredDocument,3850));
+        assertEquals("headerValues.notAMember", ELAssert.getELText(_structuredDocument,3900));
+        assertEquals("initParam.notAMember", ELAssert.getELText(_structuredDocument,3956));
+        assertEquals("param.notAMember", ELAssert.getELText(_structuredDocument,4009));
+        assertEquals("paramValues.notAMember", ELAssert.getELText(_structuredDocument,4058));
+        assertEquals("view.notAMember", ELAssert.getELText(_structuredDocument,4113));
+        assertEquals("applicationScope.myBean_none", ELAssert.getELText(_structuredDocument,4209));
+        assertEquals("sessionScope.myBean_none", ELAssert.getELText(_structuredDocument,4270));
+        assertEquals("requestScope.myBean_none", ELAssert.getELText(_structuredDocument,4327));
+
+        assertEquals("!initParam", ELAssert.getELText(_structuredDocument,4400));
+    }
+
+    @Override
+    public void testNoErrorExprs()
+    {
+        assertNoError(975, TypeConstants.TYPE_MAP);
+        assertNoError(1024, TypeConstants.TYPE_MAP);
+        assertNoError(1069, TypeConstants.TYPE_MAP);
+        assertNoError(1114, TypeConstants.TYPE_MAP);
+        assertNoError(1153, "Ljavax.faces.context.FacesContext;");
+        assertNoError(1198, TypeConstants.TYPE_MAP);
+        assertNoError(1237, TypeConstants.TYPE_MAP);
+        assertNoError(1282, TypeConstants.TYPE_MAP);
+        assertNoError(1324, TypeConstants.TYPE_MAP);
+        assertNoError(1362, TypeConstants.TYPE_MAP);
+        assertNoError(1406, "Ljavax.faces.component.UIViewRoot;");
+        assertNoError(1492, "Lbeans.MapBean;");
+        assertNoError(1596, "Lbeans.MyBean;");
+        assertNoError(1645, "Lbeans.MapBean;");
+        assertNoError(1696, "Lbeans.MyBeanSettable;");
+        assertNoError(1803, "Lbeans.MyBeanSubClass;");
+        assertNoError(1860, "Lbeans.MyBean;");
+
+        assertNoError(1913, TypeConstants.TYPE_MAP);
+        assertNoError(1962, TypeConstants.TYPE_MAP);
+
+        assertNoError(2096, Signature.SIG_BOOLEAN);
+        assertNoError(2138, Signature.SIG_BOOLEAN);
+        assertNoError(2180, Signature.SIG_BOOLEAN);
+        assertNoError(2228, Signature.SIG_BOOLEAN);
+        assertNoError(2269, Signature.SIG_BOOLEAN);
+        // TODO: can't check these until we can import the required API jars
+        // into the project
+        //        assertEquals("facesContext.application", getELText(_structuredDocument,2367));
+        //        assertEquals("facesContext.clientIdsWithMessages", getELText(_structuredDocument,2421));
+        //        assertEquals("facesContext.externalContext", getELText(_structuredDocument,2485));
+        //        assertEquals("facesContext.maximumSeverity", getELText(_structuredDocument,2543));
+        //        assertEquals("facesContext.messages", getELText(_structuredDocument,2601));
+        //        assertEquals("facesContext.renderKit", getELText(_structuredDocument,2652));
+        //        assertEquals("facesContext.renderResponse", getELText(_structuredDocument,2704));
+        //        assertEquals("facesContext.responseComplete", getELText(_structuredDocument,2761));
+        //        assertEquals("facesContext.responseStream", getELText(_structuredDocument,2820));
+        //        assertEquals("facesContext.responseWriter", getELText(_structuredDocument,2877));
+        //        assertEquals("facesContext.viewRoot", getELText(_structuredDocument,2934));
+        //        assertEquals("view.viewId", getELText(_structuredDocument,3030));
+        //        assertEquals("view.family", getELText(_structuredDocument,3071));
+        //        assertEquals("view.locale", getELText(_structuredDocument,3112));
+        //        assertEquals("view.renderKitId", getELText(_structuredDocument,3153));
+        //        assertEquals("view.viewId", getELText(_structuredDocument,3199));
+        assertNoError(3295, Signature.SIG_INT);
+        assertNoError(3363, TypeConstants.TYPE_STRING);
+        assertNoError(3478, Signature.SIG_LONG);
+        
+        // can't know what's actually in the scope map.  so anything unresolved is just
+        // no error Java object.
+        assertNoError(3572, TypeConstants.TYPE_JAVAOBJECT);
+        assertNoError(3632,TypeConstants.TYPE_JAVAOBJECT);
+        assertNoError(3688,TypeConstants.TYPE_JAVAOBJECT);
+        assertNoError(3744,TypeConstants.TYPE_JAVAOBJECT);
+        assertNoError(3794,TypeConstants.TYPE_JAVAOBJECT);
+        assertNoError(3850,TypeConstants.TYPE_JAVAOBJECT);
+        assertNoError(3900,TypeConstants.TYPE_JAVAOBJECT);
+        assertNoError(3956,TypeConstants.TYPE_JAVAOBJECT);
+        assertNoError(4009,TypeConstants.TYPE_JAVAOBJECT);
+        assertNoError(4058,TypeConstants.TYPE_JAVAOBJECT);
+        assertNoError(4113,TypeConstants.TYPE_JAVAOBJECT);
+        assertNoError(4209,TypeConstants.TYPE_JAVAOBJECT);
+        assertNoError(4270,TypeConstants.TYPE_JAVAOBJECT);
+        assertNoError(4327,TypeConstants.TYPE_JAVAOBJECT);
+    }
+    @Override
+    public void testWarningExprs()
+    {
+        // no warnings.  The issues marked warnings in the jsp test data
+        // are no longer, since we realized that maps can contain anything...
+        // the  only exceptino is FacesContext which is resovled to a map 
+        // at test time since the  API  is not in the classpath.  This
+        // should be changed if start using jsf api/impl in these tests TODO
+    }
+
+    @Override
+    public void testErrorExprs()
+    {
+    	/* reduced to warning for bug 243674
+        final List<ReportedProblem> list = assertSemanticError(4400,null,1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID);
+        */
+    }
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.validation.el.tests/src/org/eclipse/jst/jsf/validation/el/tests/jsp/LogicalNotTestCase.java b/jsf/tests/org.eclipse.jst.jsf.validation.el.tests/src/org/eclipse/jst/jsf/validation/el/tests/jsp/LogicalNotTestCase.java
index 647d825..24c2e78 100644
--- a/jsf/tests/org.eclipse.jst.jsf.validation.el.tests/src/org/eclipse/jst/jsf/validation/el/tests/jsp/LogicalNotTestCase.java
+++ b/jsf/tests/org.eclipse.jst.jsf.validation.el.tests/src/org/eclipse/jst/jsf/validation/el/tests/jsp/LogicalNotTestCase.java
@@ -1,140 +1,142 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.el.tests.jsp;
-
-import java.util.List;
-
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.core.JSFVersion;
-import org.eclipse.jst.jsf.core.tests.validation.MockValidationReporter.ReportedProblem;
-import org.eclipse.jst.jsf.validation.el.tests.base.ELAssert;
-import org.eclipse.jst.jsf.validation.el.tests.base.SingleJSPTestCase;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Test cases for logical not (not, !)
- * 
- * @author cbateman
- */
-public class LogicalNotTestCase extends SingleJSPTestCase {
-
-    public LogicalNotTestCase()
-    {
-        super("/testdata/jsps/logicalNOT.jsp.data", "/logicalNOT.jsp", JSFVersion.V1_1,FACES_CONFIG_FILE_NAME_1_1);
-    }
-
-    @Override
-    protected void setUp() throws Exception
-    {
-        super.setUp();
-    }
-
-    @Override
-    public void testSanity()
-    {
-        assertEquals("!myBean.booleanProperty", ELAssert.getELText(_structuredDocument,829));
-        assertEquals("not myBean.booleanProperty", ELAssert.getELText(_structuredDocument,885));
-        assertEquals("!myBean.stringProperty", ELAssert.getELText(_structuredDocument,941));
-        assertEquals("not myBean.stringProperty", ELAssert.getELText(_structuredDocument,993));
-
-        assertEquals("!true", ELAssert.getELText(_structuredDocument,1075));
-        assertEquals("not true", ELAssert.getELText(_structuredDocument,1113));
-        assertEquals("!false", ELAssert.getELText(_structuredDocument,1154));
-        assertEquals("not false", ELAssert.getELText(_structuredDocument,1193));
-        assertEquals("! 'true'", ELAssert.getELText(_structuredDocument,1235));
-        assertEquals("not 'true'", ELAssert.getELText(_structuredDocument,1276));
-        assertEquals("! 'notTrue'", ELAssert.getELText(_structuredDocument,1319));
-        assertEquals("not 'notTrue'", ELAssert.getELText(_structuredDocument,1363));
-
-        assertEquals("!5", ELAssert.getELText(_structuredDocument,1430));
-        assertEquals("not 5", ELAssert.getELText(_structuredDocument,1462));
-        assertEquals("!myBean.integerProperty", ELAssert.getELText(_structuredDocument,1497));
-        assertEquals("not myBean.integerProperty", ELAssert.getELText(_structuredDocument,1550));
-        assertEquals("!myBean.collectionProperty", ELAssert.getELText(_structuredDocument,1606));
-        assertEquals("not myBean.collectionProperty", ELAssert.getELText(_structuredDocument,1662));
-        assertEquals("!myBean.stringArrayProperty", ELAssert.getELText(_structuredDocument,1721));
-        assertEquals("not myBean.stringArrayProperty", ELAssert.getELText(_structuredDocument,1778));
-        assertEquals("!myBean.mapProperty", ELAssert.getELText(_structuredDocument,1838));
-        assertEquals("not myBean.mapProperty", ELAssert.getELText(_structuredDocument,1887));
-    }
-
-    @Override
-    public void testNoErrorExprs()
-    {
-        assertNoError(829, Signature.SIG_BOOLEAN);
-        assertNoError(885, Signature.SIG_BOOLEAN);
-        assertNoError(941, Signature.SIG_BOOLEAN);
-        assertNoError(993, Signature.SIG_BOOLEAN);
-    }
-
-    @Override
-    public void testWarningExprs()
-    {
-        List<ReportedProblem> list = assertSemanticWarning(1075, Signature.SIG_BOOLEAN, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID);
-
-        list = assertSemanticWarning(1113, Signature.SIG_BOOLEAN, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID);
-
-        list = assertSemanticWarning(1154, Signature.SIG_BOOLEAN, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID);
-
-        list = assertSemanticWarning(1193, Signature.SIG_BOOLEAN, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID);
-
-        list = assertSemanticWarning(1235, Signature.SIG_BOOLEAN, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID);
-
-        list = assertSemanticWarning(1276, Signature.SIG_BOOLEAN, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID);
-
-        list = assertSemanticWarning(1319, Signature.SIG_BOOLEAN, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID);
-
-        list = assertSemanticWarning(1363, Signature.SIG_BOOLEAN, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID);
-    }
-
-    @Override
-    public void testErrorExprs()
-    {
-        List<ReportedProblem> list = assertSemanticError(1430, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID);
-
-        list = assertSemanticError(1462, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID);
-
-        list = assertSemanticError(1497, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID);
-
-        list = assertSemanticError(1550, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID);
-
-        list = assertSemanticError(1606, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID);
-
-        list = assertSemanticError(1662, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID);
-
-        list = assertSemanticError(1721, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID);
-
-        list = assertSemanticError(1778, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID);
-
-        list = assertSemanticError(1838, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID);
-
-        list = assertSemanticError(1887, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID);
-    }
-
-}
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 Oracle Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     Oracle Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.jsf.validation.el.tests.jsp;
+
+import java.util.List;
+
+import org.eclipse.jdt.core.Signature;
+import org.eclipse.jst.jsf.core.JSFVersion;
+import org.eclipse.jst.jsf.core.tests.validation.MockValidationReporter.ReportedProblem;
+import org.eclipse.jst.jsf.validation.el.tests.base.ELAssert;
+import org.eclipse.jst.jsf.validation.el.tests.base.SingleJSPTestCase;
+import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
+
+/**
+ * Test cases for logical not (not, !)
+ * 
+ * @author cbateman
+ */
+public class LogicalNotTestCase extends SingleJSPTestCase {
+
+    public LogicalNotTestCase()
+    {
+        super("/testdata/jsps/logicalNOT.jsp.data", "/logicalNOT.jsp", JSFVersion.V1_1,FACES_CONFIG_FILE_NAME_1_1);
+    }
+
+    @Override
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+    }
+
+    @Override
+    public void testSanity()
+    {
+        assertEquals("!myBean.booleanProperty", ELAssert.getELText(_structuredDocument,829));
+        assertEquals("not myBean.booleanProperty", ELAssert.getELText(_structuredDocument,885));
+        assertEquals("!myBean.stringProperty", ELAssert.getELText(_structuredDocument,941));
+        assertEquals("not myBean.stringProperty", ELAssert.getELText(_structuredDocument,993));
+
+        assertEquals("!true", ELAssert.getELText(_structuredDocument,1075));
+        assertEquals("not true", ELAssert.getELText(_structuredDocument,1113));
+        assertEquals("!false", ELAssert.getELText(_structuredDocument,1154));
+        assertEquals("not false", ELAssert.getELText(_structuredDocument,1193));
+        assertEquals("! 'true'", ELAssert.getELText(_structuredDocument,1235));
+        assertEquals("not 'true'", ELAssert.getELText(_structuredDocument,1276));
+        assertEquals("! 'notTrue'", ELAssert.getELText(_structuredDocument,1319));
+        assertEquals("not 'notTrue'", ELAssert.getELText(_structuredDocument,1363));
+
+        assertEquals("!5", ELAssert.getELText(_structuredDocument,1430));
+        assertEquals("not 5", ELAssert.getELText(_structuredDocument,1462));
+        assertEquals("!myBean.integerProperty", ELAssert.getELText(_structuredDocument,1497));
+        assertEquals("not myBean.integerProperty", ELAssert.getELText(_structuredDocument,1550));
+        assertEquals("!myBean.collectionProperty", ELAssert.getELText(_structuredDocument,1606));
+        assertEquals("not myBean.collectionProperty", ELAssert.getELText(_structuredDocument,1662));
+        assertEquals("!myBean.stringArrayProperty", ELAssert.getELText(_structuredDocument,1721));
+        assertEquals("not myBean.stringArrayProperty", ELAssert.getELText(_structuredDocument,1778));
+        assertEquals("!myBean.mapProperty", ELAssert.getELText(_structuredDocument,1838));
+        assertEquals("not myBean.mapProperty", ELAssert.getELText(_structuredDocument,1887));
+    }
+
+    @Override
+    public void testNoErrorExprs()
+    {
+        assertNoError(829, Signature.SIG_BOOLEAN);
+        assertNoError(885, Signature.SIG_BOOLEAN);
+        assertNoError(941, Signature.SIG_BOOLEAN);
+        assertNoError(993, Signature.SIG_BOOLEAN);
+    }
+
+    @Override
+    public void testWarningExprs()
+    {
+        List<ReportedProblem> list = assertSemanticWarning(1075, Signature.SIG_BOOLEAN, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID);
+
+        list = assertSemanticWarning(1113, Signature.SIG_BOOLEAN, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID);
+
+        list = assertSemanticWarning(1154, Signature.SIG_BOOLEAN, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID);
+
+        list = assertSemanticWarning(1193, Signature.SIG_BOOLEAN, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID);
+
+        list = assertSemanticWarning(1235, Signature.SIG_BOOLEAN, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID);
+
+        list = assertSemanticWarning(1276, Signature.SIG_BOOLEAN, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID);
+
+        list = assertSemanticWarning(1319, Signature.SIG_BOOLEAN, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID);
+
+        list = assertSemanticWarning(1363, Signature.SIG_BOOLEAN, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID);
+    }
+
+    @Override
+    public void testErrorExprs()
+    {
+    	/* reduced to warning for bug 243674
+        List<ReportedProblem> list = assertSemanticError(1430, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID);
+
+    	list = assertSemanticError(1462, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID);
+
+        list = assertSemanticError(1497, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID);
+
+        list = assertSemanticError(1550, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID);
+
+        list = assertSemanticError(1606, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID);
+
+        list = assertSemanticError(1662, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID);
+
+        list = assertSemanticError(1721, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID);
+
+        list = assertSemanticError(1778, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID);
+
+        list = assertSemanticError(1838, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID);
+
+        list = assertSemanticError(1887, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID);
+        */
+    }
+
+}
diff --git a/jsf/tests/org.eclipse.jst.jsf.validation.el.tests/src/org/eclipse/jst/jsf/validation/el/tests/jsp/MarkerOffsetsTestCase.java b/jsf/tests/org.eclipse.jst.jsf.validation.el.tests/src/org/eclipse/jst/jsf/validation/el/tests/jsp/MarkerOffsetsTestCase.java
index ec3a76f..e2e831e 100644
--- a/jsf/tests/org.eclipse.jst.jsf.validation.el.tests/src/org/eclipse/jst/jsf/validation/el/tests/jsp/MarkerOffsetsTestCase.java
+++ b/jsf/tests/org.eclipse.jst.jsf.validation.el.tests/src/org/eclipse/jst/jsf/validation/el/tests/jsp/MarkerOffsetsTestCase.java
@@ -1,178 +1,180 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.validation.el.tests.jsp;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.JSFVersion;
-import org.eclipse.jst.jsf.core.tests.validation.MockValidationReporter.ReportedProblem;
-import org.eclipse.jst.jsf.validation.el.tests.base.ELAssert;
-import org.eclipse.jst.jsf.validation.el.tests.base.SingleJSPTestCase;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-/**
- * Used to verify that marker offset/lengths are calculated correctly
- * for each type error message.  This test case should aim for coverage
- * of all diagnostic creation for EL.  Note that we can't currently get coverage
- * on ternaries (parser bug), empty bracket or missing bracket because these things
- * are validated outside the EL validator.
- * 
- * @author cbateman
- *
- */
-public class MarkerOffsetsTestCase extends SingleJSPTestCase
-{
-    public MarkerOffsetsTestCase() {
-        super("/testdata/jsps/markerOffsets.jsp.data", "/markerOffsets.jsp", JSFVersion.V1_1,FACES_CONFIG_FILE_NAME_1_1);
-    }
-
-    @Override
-    protected void setUp() throws Exception
-    {
-        super.setUp();
-    }
-
-    @Override
-    public void testSanity()
-    {
-        assertEquals("5 + 3", ELAssert.getELText(_structuredDocument,880));
-        assertEquals("null / null", ELAssert.getELText(_structuredDocument,915));
-        assertEquals("myBean.integerProperty == null", ELAssert.getELText(_structuredDocument,956));
-        assertEquals("false && myBean.booleanProperty", ELAssert.getELText(_structuredDocument,1015));
-        assertEquals("myBean.booleanProperty && false", ELAssert.getELText(_structuredDocument,1075));
-        assertEquals("!false", ELAssert.getELText(_structuredDocument,1135));
-        assertEquals("empty 5", ELAssert.getELText(_structuredDocument,1171));
-        assertEquals("-null", ELAssert.getELText(_structuredDocument,1208));
-        assertEquals("-myBean.stringProperty", ELAssert.getELText(_structuredDocument,1243));
-        assertEquals("myBean.integerProperty - (5 + 3)", ELAssert.getELText(_structuredDocument,1376));
-        assertEquals("myBean.booleanProperty && myBean.integerProperty + 5 == null", ELAssert.getELText(_structuredDocument,1438));
-        assertEquals("notABean.stringProperty", ELAssert.getELText(_structuredDocument,1569));
-        assertEquals("myBean.notAProperty", ELAssert.getELText(_structuredDocument,1622));
-        assertEquals("myBean.integerProperty + 5 + myBean.notAProperty", ELAssert.getELText(_structuredDocument,1671));
-        assertEquals("myBean.integerProperty++", ELAssert.getELText(_structuredDocument,1769));
-        assertEquals("myBean.", ELAssert.getELText(_structuredDocument,1823));
-        assertEquals(" ", ELAssert.getELText(_structuredDocument,1860));
-
-        assertEquals("myBean.integerProperty / 0", ELAssert.getELText(_structuredDocument,1978));
-        assertEquals("myBean.integerProperty + myBean.booleanProperty", ELAssert.getELText(_structuredDocument,2034));
-        assertEquals("myBean.integerProperty && myBean.booleanProperty", ELAssert.getELText(_structuredDocument,2111));
-        assertEquals("myBean.booleanProperty >= myBean.collectionProperty", ELAssert.getELText(_structuredDocument,2189));
-        assertEquals("5 + 'noNumberConversion'", ELAssert.getELText(_structuredDocument,2270));
-        assertEquals("-true", ELAssert.getELText(_structuredDocument,2324));
-        assertEquals("!5", ELAssert.getELText(_structuredDocument,2359));
-        assertEquals("myBean.doubleProperty + myBean.getIntegerProperty", ELAssert.getELText(_structuredDocument,2418));
-
-    }
-
-    @Override
-    public void testNoErrorExprs()
-    {
-        // marker offset tests are only meaningful for validation warnings and errors
-        // since we are testing the length and offset values for their corresponding markers
-    }
-    @Override
-    public void testWarningExprs()
-    {
-        // UPDATE REMINDER!  The third argument in assertContainsProblem is the start
-        // offset (absolute) of the marker expected.  Before updating the assertSemanticWarning
-        // make a note to the difference
-        List<ReportedProblem> list = assertSemanticWarning(880, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME_ID, 880, 5);
-
-        list = assertSemanticWarning(915, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.BINARY_OP_BOTH_OPERANDS_NULL_ID, 915, 11);
-
-        // https://bugs.eclipse.org/bugs/show_bug.cgi?id=235637
-        // can only call comparison null always same if can verify both
-        // sides of the expression are null
-//        list = assertSemanticWarning(956, null, 1);
-//        assertContainsProblem(list, DiagnosticFactory.BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME_ID, 956, 30);
-
-        list = assertSemanticWarning(1015, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS_ID, 1015, 31);
-
-        list = assertSemanticWarning(1075, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME_ID, 1075, 31);
-
-        list = assertSemanticWarning(1135, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID, 1135, 6);
-
-        list = assertSemanticWarning(1171, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE_ID, 1171, 7);
-
-        list = assertSemanticWarning(1208, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO_ID, 1208, 5);
-
-        list = assertSemanticWarning(1243, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED_ID, 1243, 22);
-
-        list = assertSemanticWarning(1376, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME_ID, 1402, 5);
-
-//        list = assertSemanticWarning(1438, null, 2);
-        // https://bugs.eclipse.org/bugs/show_bug.cgi?id=235637
-        // can only call comparison null always same if can verify both
-        // sides of the expression are null
-//        assertContainsProblem(list, DiagnosticFactory.BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME_ID, 1464, 34);
-//        assertContainsProblem(list, DiagnosticFactory.BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME_ID, 1438, 60);
-
-        list = assertSemanticInfo(1569, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.VARIABLE_NOT_FOUND_ID, 1569, 8);
-
-        list = assertSemanticWarning(1622, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.MEMBER_NOT_FOUND_ID, 1629, 12);
-
-        list = assertSemanticWarning(1671, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.MEMBER_NOT_FOUND_ID, 1707, 12);
-
-        list = assertSyntaxWarning(1769, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.GENERAL_SYNTAX_ERROR_ID, 1792, 1);
-
-        // Is really correct to have the property offset start on the dot?
-        list = assertSemanticWarning(1823, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.MEMBER_NOT_FOUND_ID, 1829, 1);
-
-        list = assertSyntaxWarning(1860, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.GENERAL_SYNTAX_ERROR_ID, 1860, 1);
-    }
-
-    @Override
-    public void testErrorExprs()
-    {
-        // UPDATE REMINDER!  The third argument in assertContainsProblem is the start
-        // offset (absolute) of the marker expected.  Before updating the assertSemanticWarning
-        // make a note to the difference
-        List<ReportedProblem> list = assertSemanticError(1978, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.BINARY_OP_POSSIBLE_DIVISION_BY_ZERO_ID, 1978, 26);
-
-        list = assertSemanticError(2034, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID, 2034, 47);
-
-        list = assertSemanticError(2111, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID, 2111, 48);
-
-        list = assertSemanticError(2189, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.BINARY_OP_NO_AVAILABLE_TYPE_COERCION_ID, 2189, 51);
-
-        list = assertSemanticError(2270, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS_ID, 2270, 24);
-
-        list = assertSemanticError(2324, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID, 2324, 5);
-
-        list = assertSemanticError(2359, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID, 2359, 2);
-
-        list = assertSemanticError(2418, null, 1);
-        ELAssert.assertContainsProblem(list, DiagnosticFactory.CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING_ID, 2442, 25);
-    }
-
+/*******************************************************************************
+ * Copyright (c) 2001, 2008 Oracle Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     Oracle Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.jsf.validation.el.tests.jsp;
+
+import java.util.List;
+
+import org.eclipse.jst.jsf.core.JSFVersion;
+import org.eclipse.jst.jsf.core.tests.validation.MockValidationReporter.ReportedProblem;
+import org.eclipse.jst.jsf.validation.el.tests.base.ELAssert;
+import org.eclipse.jst.jsf.validation.el.tests.base.SingleJSPTestCase;
+import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
+
+/**
+ * Used to verify that marker offset/lengths are calculated correctly
+ * for each type error message.  This test case should aim for coverage
+ * of all diagnostic creation for EL.  Note that we can't currently get coverage
+ * on ternaries (parser bug), empty bracket or missing bracket because these things
+ * are validated outside the EL validator.
+ * 
+ * @author cbateman
+ *
+ */
+public class MarkerOffsetsTestCase extends SingleJSPTestCase
+{
+    public MarkerOffsetsTestCase() {
+        super("/testdata/jsps/markerOffsets.jsp.data", "/markerOffsets.jsp", JSFVersion.V1_1,FACES_CONFIG_FILE_NAME_1_1);
+    }
+
+    @Override
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+    }
+
+    @Override
+    public void testSanity()
+    {
+        assertEquals("5 + 3", ELAssert.getELText(_structuredDocument,880));
+        assertEquals("null / null", ELAssert.getELText(_structuredDocument,915));
+        assertEquals("myBean.integerProperty == null", ELAssert.getELText(_structuredDocument,956));
+        assertEquals("false && myBean.booleanProperty", ELAssert.getELText(_structuredDocument,1015));
+        assertEquals("myBean.booleanProperty && false", ELAssert.getELText(_structuredDocument,1075));
+        assertEquals("!false", ELAssert.getELText(_structuredDocument,1135));
+        assertEquals("empty 5", ELAssert.getELText(_structuredDocument,1171));
+        assertEquals("-null", ELAssert.getELText(_structuredDocument,1208));
+        assertEquals("-myBean.stringProperty", ELAssert.getELText(_structuredDocument,1243));
+        assertEquals("myBean.integerProperty - (5 + 3)", ELAssert.getELText(_structuredDocument,1376));
+        assertEquals("myBean.booleanProperty && myBean.integerProperty + 5 == null", ELAssert.getELText(_structuredDocument,1438));
+        assertEquals("notABean.stringProperty", ELAssert.getELText(_structuredDocument,1569));
+        assertEquals("myBean.notAProperty", ELAssert.getELText(_structuredDocument,1622));
+        assertEquals("myBean.integerProperty + 5 + myBean.notAProperty", ELAssert.getELText(_structuredDocument,1671));
+        assertEquals("myBean.integerProperty++", ELAssert.getELText(_structuredDocument,1769));
+        assertEquals("myBean.", ELAssert.getELText(_structuredDocument,1823));
+        assertEquals(" ", ELAssert.getELText(_structuredDocument,1860));
+
+        assertEquals("myBean.integerProperty / 0", ELAssert.getELText(_structuredDocument,1978));
+        assertEquals("myBean.integerProperty + myBean.booleanProperty", ELAssert.getELText(_structuredDocument,2034));
+        assertEquals("myBean.integerProperty && myBean.booleanProperty", ELAssert.getELText(_structuredDocument,2111));
+        assertEquals("myBean.booleanProperty >= myBean.collectionProperty", ELAssert.getELText(_structuredDocument,2189));
+        assertEquals("5 + 'noNumberConversion'", ELAssert.getELText(_structuredDocument,2270));
+        assertEquals("-true", ELAssert.getELText(_structuredDocument,2324));
+        assertEquals("!5", ELAssert.getELText(_structuredDocument,2359));
+        assertEquals("myBean.doubleProperty + myBean.getIntegerProperty", ELAssert.getELText(_structuredDocument,2418));
+
+    }
+
+    @Override
+    public void testNoErrorExprs()
+    {
+        // marker offset tests are only meaningful for validation warnings and errors
+        // since we are testing the length and offset values for their corresponding markers
+    }
+    @Override
+    public void testWarningExprs()
+    {
+        // UPDATE REMINDER!  The third argument in assertContainsProblem is the start
+        // offset (absolute) of the marker expected.  Before updating the assertSemanticWarning
+        // make a note to the difference
+        List<ReportedProblem> list = assertSemanticWarning(880, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME_ID, 880, 5);
+
+        list = assertSemanticWarning(915, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.BINARY_OP_BOTH_OPERANDS_NULL_ID, 915, 11);
+
+        // https://bugs.eclipse.org/bugs/show_bug.cgi?id=235637
+        // can only call comparison null always same if can verify both
+        // sides of the expression are null
+//        list = assertSemanticWarning(956, null, 1);
+//        assertContainsProblem(list, DiagnosticFactory.BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME_ID, 956, 30);
+
+        list = assertSemanticWarning(1015, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS_ID, 1015, 31);
+
+        list = assertSemanticWarning(1075, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME_ID, 1075, 31);
+
+        list = assertSemanticWarning(1135, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID, 1135, 6);
+
+        list = assertSemanticWarning(1171, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE_ID, 1171, 7);
+
+        list = assertSemanticWarning(1208, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO_ID, 1208, 5);
+
+        list = assertSemanticWarning(1243, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED_ID, 1243, 22);
+
+        list = assertSemanticWarning(1376, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME_ID, 1402, 5);
+
+//        list = assertSemanticWarning(1438, null, 2);
+        // https://bugs.eclipse.org/bugs/show_bug.cgi?id=235637
+        // can only call comparison null always same if can verify both
+        // sides of the expression are null
+//        assertContainsProblem(list, DiagnosticFactory.BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME_ID, 1464, 34);
+//        assertContainsProblem(list, DiagnosticFactory.BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME_ID, 1438, 60);
+
+        list = assertSemanticInfo(1569, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.VARIABLE_NOT_FOUND_ID, 1569, 8);
+
+        list = assertSemanticWarning(1622, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.MEMBER_NOT_FOUND_ID, 1629, 12);
+
+        list = assertSemanticWarning(1671, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.MEMBER_NOT_FOUND_ID, 1707, 12);
+
+        list = assertSyntaxWarning(1769, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.GENERAL_SYNTAX_ERROR_ID, 1792, 1);
+
+        // Is really correct to have the property offset start on the dot?
+        list = assertSemanticWarning(1823, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.MEMBER_NOT_FOUND_ID, 1829, 1);
+
+        list = assertSyntaxWarning(1860, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.GENERAL_SYNTAX_ERROR_ID, 1860, 1);
+    }
+
+    @Override
+    public void testErrorExprs()
+    {
+        // UPDATE REMINDER!  The third argument in assertContainsProblem is the start
+        // offset (absolute) of the marker expected.  Before updating the assertSemanticWarning
+        // make a note to the difference
+        List<ReportedProblem> list = assertSemanticError(1978, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.BINARY_OP_POSSIBLE_DIVISION_BY_ZERO_ID, 1978, 26);
+
+        list = assertSemanticError(2034, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID, 2034, 47);
+
+        list = assertSemanticError(2111, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID, 2111, 48);
+
+        list = assertSemanticError(2189, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.BINARY_OP_NO_AVAILABLE_TYPE_COERCION_ID, 2189, 51);
+
+        list = assertSemanticError(2270, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS_ID, 2270, 24);
+
+        list = assertSemanticError(2324, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID, 2324, 5);
+
+        /* reduced to warning for bug 243674 
+        list = assertSemanticError(2359, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID, 2359, 2);
+        */
+
+        list = assertSemanticError(2418, null, 1);
+        ELAssert.assertContainsProblem(list, DiagnosticFactory.CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING_ID, 2442, 25);
+    }
+
 }
\ No newline at end of file
diff --git a/jsf/tests/org.eclipse.jst.jsf.validation.el.tests/src/org/eclipse/jst/jsf/validation/el/tests/preferences/PrefTestUtil.java b/jsf/tests/org.eclipse.jst.jsf.validation.el.tests/src/org/eclipse/jst/jsf/validation/el/tests/preferences/PrefTestUtil.java
index 8f93e18..ccd2e70 100644
--- a/jsf/tests/org.eclipse.jst.jsf.validation.el.tests/src/org/eclipse/jst/jsf/validation/el/tests/preferences/PrefTestUtil.java
+++ b/jsf/tests/org.eclipse.jst.jsf.validation.el.tests/src/org/eclipse/jst/jsf/validation/el/tests/preferences/PrefTestUtil.java
@@ -1,130 +1,130 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.validation.el.tests.preferences;
-
-import junit.framework.Assert;
-
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.jst.jsf.validation.internal.ELValidationPreferences;
-import org.eclipse.jst.jsf.validation.internal.Severity;
-import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
-
-final class PrefTestUtil extends Assert
-{
-
-    static void assertSeverityLevel(ELValidationPreferences prefs, int diagnosticId, int value)
-    {
-        final String key = ELValidationPreferences.getKeyById(diagnosticId);
-        final Severity sev = prefs.getSeverity(key);
-        final int diagnosticSeverity = 
-            ELValidationPreferences.mapSeverityToDiag(sev.toString());
-        assertEquals(value, diagnosticSeverity);
-    }
-
-    static void setByKey(Severity severity, ELValidationPreferences prefs)
-    {
-        prefs.setSeverity(ELValidationPreferences.BINARY_OP_BOTH_OPERANDS_NULL, severity);
-        prefs.setSeverity(ELValidationPreferences.BINARY_OP_POSSIBLE_DIVISION_BY_ZERO, severity);
-        prefs.setSeverity(ELValidationPreferences.BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION, severity);
-        prefs.setSeverity(ELValidationPreferences.BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME, severity);
-        prefs.setSeverity(ELValidationPreferences.BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME, severity);
-        prefs.setSeverity(ELValidationPreferences.BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN, severity);
-        prefs.setSeverity(ELValidationPreferences.BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS, severity);
-        prefs.setSeverity(ELValidationPreferences.BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME, severity);
-        prefs.setSeverity(ELValidationPreferences.BINARY_OP_NO_AVAILABLE_TYPE_COERCION, severity);
-        prefs.setSeverity(ELValidationPreferences.BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS, severity);
-        prefs.setSeverity(ELValidationPreferences.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME, severity);
-        prefs.setSeverity(ELValidationPreferences.UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE, severity);
-        prefs.setSeverity(ELValidationPreferences.UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO, severity);
-        prefs.setSeverity(ELValidationPreferences.UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION, severity);
-        prefs.setSeverity(ELValidationPreferences.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN, severity);
-        prefs.setSeverity(ELValidationPreferences.TERNARY_OP_CHOICE_IS_ALWAYS_SAME, severity);
-        prefs.setSeverity(ELValidationPreferences.TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN, severity);
-        prefs.setSeverity(ELValidationPreferences.UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED, severity);
-        prefs.setSeverity(ELValidationPreferences.CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING, severity);
-        prefs.setSeverity(ELValidationPreferences.MEMBER_NOT_FOUND, severity);
-        prefs.setSeverity(ELValidationPreferences.VARIABLE_NOT_FOUND, severity);
-        prefs.setSeverity(ELValidationPreferences.MISSING_CLOSING_EXPR_BRACKET, severity);
-        prefs.setSeverity(ELValidationPreferences.GENERAL_SYNTAX_ERROR, severity);
-        prefs.setSeverity(ELValidationPreferences.EMPTY_EL_EXPRESSION, severity);
-        prefs.setSeverity(ELValidationPreferences.BINARY_OP_DOT_WITH_VALUEB_NULL, severity);
-        prefs.setSeverity(ELValidationPreferences.BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY, severity);
-        prefs.setSeverity(ELValidationPreferences.POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS, severity);
-        prefs.setSeverity(ELValidationPreferences.BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME, severity);
-        prefs.setSeverity(ELValidationPreferences.BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE, severity);
-    }
-    static void assertSetByKey(Severity severity, ELValidationPreferences prefs)
-    {
-        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.BINARY_OP_BOTH_OPERANDS_NULL));
-        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.BINARY_OP_POSSIBLE_DIVISION_BY_ZERO));
-        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION));
-        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME));
-        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME));
-        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN));
-        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS));
-        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME));
-        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.BINARY_OP_NO_AVAILABLE_TYPE_COERCION));
-        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS));
-        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME));
-        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE));
-        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO));
-        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION));
-        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN));
-        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.TERNARY_OP_CHOICE_IS_ALWAYS_SAME));
-        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN));
-        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED));
-        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING));
-        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.MEMBER_NOT_FOUND));
-        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.VARIABLE_NOT_FOUND));
-        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.MISSING_CLOSING_EXPR_BRACKET));
-        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.GENERAL_SYNTAX_ERROR));
-        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.EMPTY_EL_EXPRESSION));
-        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.BINARY_OP_DOT_WITH_VALUEB_NULL));
-        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY));
-        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS));
-        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME));
-        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE));
-    }
-
-    static void assertExpectedDefaults(ELValidationPreferences prefs)
-    {
-        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.BINARY_OP_BOTH_OPERANDS_NULL_ID, Diagnostic.WARNING);
-        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.BINARY_OP_POSSIBLE_DIVISION_BY_ZERO_ID,Diagnostic.ERROR);
-        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID, Diagnostic.ERROR);
-        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME_ID,Diagnostic.WARNING);
-        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME_ID,Diagnostic.WARNING);
-        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID,Diagnostic.ERROR);
-        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS_ID,Diagnostic.WARNING);
-        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME_ID, Diagnostic.WARNING);
-        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.BINARY_OP_NO_AVAILABLE_TYPE_COERCION_ID,Diagnostic.ERROR);
-        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS_ID,Diagnostic.ERROR);
-        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID,Diagnostic.WARNING);
-        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE_ID,Diagnostic.WARNING);
-        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO_ID,Diagnostic.WARNING);
-        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID,Diagnostic.ERROR);
-        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID,Diagnostic.ERROR);
-        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.TERNARY_OP_CHOICE_IS_ALWAYS_SAME_ID,Diagnostic.WARNING);
-        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN_ID,Diagnostic.ERROR);
-        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED_ID,Diagnostic.WARNING);
-        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING_ID,Diagnostic.ERROR);
-        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.MEMBER_NOT_FOUND_ID,Diagnostic.WARNING);
-        // everything below warning is mapped to ok for Severity enum
-        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.VARIABLE_NOT_FOUND_ID,Diagnostic.OK);
-        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.MISSING_CLOSING_EXPR_BRACKET_ID,Diagnostic.ERROR);
-        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.GENERAL_SYNTAX_ERROR_ID,Diagnostic.WARNING);
-        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.EMPTY_EL_EXPRESSION_ID,Diagnostic.WARNING);
-        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.BINARY_OP_DOT_WITH_VALUEB_NULL_ID, Diagnostic.WARNING);
-        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY_ID, Diagnostic.WARNING);
-        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS_ID,Diagnostic.WARNING);
-        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME_ID,Diagnostic.WARNING);
-        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE_ID,Diagnostic.ERROR);
-    }
-}
+/*******************************************************************************
+ * Copyright (c) 2007 Oracle Corporation.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Cameron Bateman - initial implementation
+ *******************************************************************************/ 
+package org.eclipse.jst.jsf.validation.el.tests.preferences;
+
+import junit.framework.Assert;
+
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.jst.jsf.validation.internal.ELValidationPreferences;
+import org.eclipse.jst.jsf.validation.internal.Severity;
+import org.eclipse.jst.jsf.validation.internal.el.diagnostics.DiagnosticFactory;
+
+final class PrefTestUtil extends Assert
+{
+
+    static void assertSeverityLevel(ELValidationPreferences prefs, int diagnosticId, int value)
+    {
+        final String key = ELValidationPreferences.getKeyById(diagnosticId);
+        final Severity sev = prefs.getSeverity(key);
+        final int diagnosticSeverity = 
+            ELValidationPreferences.mapSeverityToDiag(sev.toString());
+        assertEquals(value, diagnosticSeverity);
+    }
+
+    static void setByKey(Severity severity, ELValidationPreferences prefs)
+    {
+        prefs.setSeverity(ELValidationPreferences.BINARY_OP_BOTH_OPERANDS_NULL, severity);
+        prefs.setSeverity(ELValidationPreferences.BINARY_OP_POSSIBLE_DIVISION_BY_ZERO, severity);
+        prefs.setSeverity(ELValidationPreferences.BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION, severity);
+        prefs.setSeverity(ELValidationPreferences.BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME, severity);
+        prefs.setSeverity(ELValidationPreferences.BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME, severity);
+        prefs.setSeverity(ELValidationPreferences.BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN, severity);
+        prefs.setSeverity(ELValidationPreferences.BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS, severity);
+        prefs.setSeverity(ELValidationPreferences.BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME, severity);
+        prefs.setSeverity(ELValidationPreferences.BINARY_OP_NO_AVAILABLE_TYPE_COERCION, severity);
+        prefs.setSeverity(ELValidationPreferences.BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS, severity);
+        prefs.setSeverity(ELValidationPreferences.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME, severity);
+        prefs.setSeverity(ELValidationPreferences.UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE, severity);
+        prefs.setSeverity(ELValidationPreferences.UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO, severity);
+        prefs.setSeverity(ELValidationPreferences.UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION, severity);
+        prefs.setSeverity(ELValidationPreferences.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN, severity);
+        prefs.setSeverity(ELValidationPreferences.TERNARY_OP_CHOICE_IS_ALWAYS_SAME, severity);
+        prefs.setSeverity(ELValidationPreferences.TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN, severity);
+        prefs.setSeverity(ELValidationPreferences.UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED, severity);
+        prefs.setSeverity(ELValidationPreferences.CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING, severity);
+        prefs.setSeverity(ELValidationPreferences.MEMBER_NOT_FOUND, severity);
+        prefs.setSeverity(ELValidationPreferences.VARIABLE_NOT_FOUND, severity);
+        prefs.setSeverity(ELValidationPreferences.MISSING_CLOSING_EXPR_BRACKET, severity);
+        prefs.setSeverity(ELValidationPreferences.GENERAL_SYNTAX_ERROR, severity);
+        prefs.setSeverity(ELValidationPreferences.EMPTY_EL_EXPRESSION, severity);
+        prefs.setSeverity(ELValidationPreferences.BINARY_OP_DOT_WITH_VALUEB_NULL, severity);
+        prefs.setSeverity(ELValidationPreferences.BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY, severity);
+        prefs.setSeverity(ELValidationPreferences.POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS, severity);
+        prefs.setSeverity(ELValidationPreferences.BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME, severity);
+        prefs.setSeverity(ELValidationPreferences.BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE, severity);
+    }
+    static void assertSetByKey(Severity severity, ELValidationPreferences prefs)
+    {
+        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.BINARY_OP_BOTH_OPERANDS_NULL));
+        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.BINARY_OP_POSSIBLE_DIVISION_BY_ZERO));
+        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION));
+        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME));
+        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME));
+        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN));
+        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS));
+        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME));
+        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.BINARY_OP_NO_AVAILABLE_TYPE_COERCION));
+        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS));
+        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME));
+        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE));
+        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO));
+        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION));
+        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN));
+        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.TERNARY_OP_CHOICE_IS_ALWAYS_SAME));
+        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN));
+        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED));
+        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING));
+        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.MEMBER_NOT_FOUND));
+        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.VARIABLE_NOT_FOUND));
+        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.MISSING_CLOSING_EXPR_BRACKET));
+        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.GENERAL_SYNTAX_ERROR));
+        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.EMPTY_EL_EXPRESSION));
+        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.BINARY_OP_DOT_WITH_VALUEB_NULL));
+        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY));
+        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS));
+        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME));
+        assertEquals(severity, prefs.getSeverity(ELValidationPreferences.BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE));
+    }
+
+    static void assertExpectedDefaults(ELValidationPreferences prefs)
+    {
+        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.BINARY_OP_BOTH_OPERANDS_NULL_ID, Diagnostic.WARNING);
+        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.BINARY_OP_POSSIBLE_DIVISION_BY_ZERO_ID,Diagnostic.ERROR);
+        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID, Diagnostic.ERROR);
+        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME_ID,Diagnostic.WARNING);
+        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME_ID,Diagnostic.WARNING);
+        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID,Diagnostic.ERROR);
+        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS_ID,Diagnostic.WARNING);
+        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME_ID, Diagnostic.WARNING);
+        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.BINARY_OP_NO_AVAILABLE_TYPE_COERCION_ID,Diagnostic.ERROR);
+        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS_ID,Diagnostic.ERROR);
+        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME_ID,Diagnostic.WARNING);
+        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE_ID,Diagnostic.WARNING);
+        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO_ID,Diagnostic.WARNING);
+        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION_ID,Diagnostic.ERROR);
+        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN_ID,Diagnostic.WARNING); /* Bug 243674 */
+        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.TERNARY_OP_CHOICE_IS_ALWAYS_SAME_ID,Diagnostic.WARNING);
+        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN_ID,Diagnostic.ERROR);
+        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED_ID,Diagnostic.WARNING);
+        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING_ID,Diagnostic.ERROR);
+        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.MEMBER_NOT_FOUND_ID,Diagnostic.WARNING);
+        // everything below warning is mapped to ok for Severity enum
+        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.VARIABLE_NOT_FOUND_ID,Diagnostic.OK);
+        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.MISSING_CLOSING_EXPR_BRACKET_ID,Diagnostic.ERROR);
+        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.GENERAL_SYNTAX_ERROR_ID,Diagnostic.WARNING);
+        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.EMPTY_EL_EXPRESSION_ID,Diagnostic.WARNING);
+        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.BINARY_OP_DOT_WITH_VALUEB_NULL_ID, Diagnostic.WARNING);
+        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY_ID, Diagnostic.WARNING);
+        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS_ID,Diagnostic.WARNING);
+        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME_ID,Diagnostic.WARNING);
+        PrefTestUtil.assertSeverityLevel(prefs, DiagnosticFactory.BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE_ID,Diagnostic.ERROR);
+    }
+}
