* The set of evaluator tests
* NOTE! Comment lines start with * instead of #, because # is used
* as the first character in a JSF EL delimiter
*######################################################
* testing mixture of strings and expressions
Expression: abc
ExpectedType: class java.lang.String
Evaluates to: abc
With type: class java.lang.String

Expression: #{ 3}
ExpectedType: int
Evaluates to: 3
With type: class java.lang.Long

Expression: a#{
ExpectedType: class java.lang.String
Evaluates to: a#{
With type: class java.lang.String

Expression: a#{ 5 }
ExpectedType: class java.lang.String
Evaluates to: a5
With type: class java.lang.String

Expression: #{ 3 }b
ExpectedType: class java.lang.String
Evaluates to: 3b
With type: class java.lang.String

Expression: #{ 1 }#{ 2 }
ExpectedType: class java.lang.String
Evaluates to: 12
With type: class java.lang.String

Expression: abc #{ 1} #{ 2} def
ExpectedType: class java.lang.String
Evaluates to: abc 1 2 def
With type: class java.lang.String


* testing values that end with or contain "#"
Expression: #
ExpectedType: class java.lang.String
Evaluates to: #
With type: class java.lang.String

Expression: \#
ExpectedType: class java.lang.String
Evaluates to: \#
With type: class java.lang.String

Expression:   #  
ExpectedType: class java.lang.String
Evaluates to:   #  
With type: class java.lang.String

Expression: test#
ExpectedType: class java.lang.String
Evaluates to: test#
With type: class java.lang.String

Expression: #test
ExpectedType: class java.lang.String
Evaluates to: #test
With type: class java.lang.String

Expression: test#test
ExpectedType: class java.lang.String
Evaluates to: test#test
With type: class java.lang.String

Expression: test###
ExpectedType: class java.lang.String
Evaluates to: test###
With type: class java.lang.String

Expression: test###{ 34 }
ExpectedType: class java.lang.String
Evaluates to: test##34
With type: class java.lang.String

Expression: test###{ 34 }##
ExpectedType: class java.lang.String
Evaluates to: test##34##
With type: class java.lang.String

Expression: test##{ 34 }
ExpectedType: class java.lang.String
Evaluates to: test#34
With type: class java.lang.String

Expression: ##{ 34 }
ExpectedType: class java.lang.String
Evaluates to: #34
With type: class java.lang.String

Expression: ##
ExpectedType: class java.lang.String
Evaluates to: ##
With type: class java.lang.String

Expression: test##
ExpectedType: class java.lang.String
Evaluates to: test##
With type: class java.lang.String

Expression: test##test
ExpectedType: class java.lang.String
Evaluates to: test##test
With type: class java.lang.String

Expression: #{ 34 }##{ 34 }
ExpectedType: class java.lang.String
Evaluates to: 34#34
With type: class java.lang.String



*######################################################
* basic literals
Expression: #{1}
ExpectedType: int
Evaluates to: 1
With type: class java.lang.Long

Expression: #{-12}
ExpectedType: int
Evaluates to: -12
With type: class java.lang.Long

Expression: #{true}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{false}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{null}
ExpectedType: null
Evaluates to: null

Expression: #{4.2}
ExpectedType: double
Evaluates to: 4.2
With type: class java.lang.Double

Expression: #{-21.3}
ExpectedType: double
Evaluates to: -21.3
With type: class java.lang.Double

Expression: #{4.}
ExpectedType: double
Evaluates to: 4.0
With type: class java.lang.Double

Expression: #{.21}
ExpectedType: double
Evaluates to: 0.21
With type: class java.lang.Double

Expression: #{3e-1}
ExpectedType: double
Evaluates to: 0.3
With type: class java.lang.Double

Expression: #{.2222222222}
ExpectedType: double
Evaluates to: 0.2222222222
With type: class java.lang.Double



*######################################################
* basic relationals between literals

Expression: #{1 < 2}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{1 > 2}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{1 >= 2}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{1 <= 2}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{1 == 2}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{1 != 2}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{3 >= 3}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{3 <= 3}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{3 == 3}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{3 < 3}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{3 > 3}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{3 != 3}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean



*######################################################
* relationals between booleans

Expression: #{false < true}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.EvaluationException: com.sun.faces.el.impl.ElException: Attempt to apply operator "<" to arguments of type "java.lang.Boolean" and "java.lang.Boolean"
Expression: #{false > true}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.EvaluationException: com.sun.faces.el.impl.ElException: Attempt to apply operator ">" to arguments of type "java.lang.Boolean" and "java.lang.Boolean"
Expression: #{true >= true}
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{true <= true}
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{true == true}
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{true != true}
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean


*######################################################
* looking up objects in scopes

* val1b - defined in request scope
Expression: #{requestScope.val1b}
ExpectedType: class java.lang.String
Evaluates to: request-scoped1
With type: class java.lang.String

Expression: #{sessionScope.val1b}
ExpectedType: class java.lang.String
Evaluates to: null

Expression: #{applicationScope.val1b}
ExpectedType: class java.lang.String
Evaluates to: null

Expression: #{val1b}
ExpectedType: class java.lang.String
Evaluates to: request-scoped1
With type: class java.lang.String


* val1c - defined in session scope
Expression: #{requestScope.val1c}
ExpectedType: class java.lang.String
Evaluates to: null

Expression: #{sessionScope.val1c}
ExpectedType: class java.lang.String
Evaluates to: session-scoped1
With type: class java.lang.String

Expression: #{applicationScope.val1c}
ExpectedType: class java.lang.String
Evaluates to: null

Expression: #{val1c}
ExpectedType: class java.lang.String
Evaluates to: session-scoped1
With type: class java.lang.String


* val1d - defined in application scope
Expression: #{requestScope.val1d}
ExpectedType: class java.lang.String
Evaluates to: null

Expression: #{sessionScope.val1d}
ExpectedType: class java.lang.String
Evaluates to: null

Expression: #{applicationScope.val1d}
ExpectedType: class java.lang.String
Evaluates to: app-scoped1
With type: class java.lang.String

Expression: #{val1d}
ExpectedType: class java.lang.String
Evaluates to: app-scoped1
With type: class java.lang.String


*######################################################
* accessing properties

Expression: #{bean1a.int1}
ExpectedType: int
Evaluates to: 4
With type: class java.lang.Integer

Expression: #{bean1a.boolean1}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{bean1a.string1}
ExpectedType: class java.lang.String
Evaluates to: hello
With type: class java.lang.String

Expression: #{bean1a.bean1.int2}
ExpectedType: class java.lang.Integer
Evaluates to: -224
With type: class java.lang.Integer

Expression: #{bean1a.bean1.bean2.string2}
ExpectedType: class java.lang.String
Evaluates to: bean3's string
With type: class java.lang.String

Expression: #{bean1a.byte1}
ExpectedType: byte
Evaluates to: 12
With type: class java.lang.Byte

Expression: #{bean1a.char1}
ExpectedType: char
Evaluates to: b
With type: class java.lang.Character

Expression: #{bean1a.short1}
ExpectedType: short
Evaluates to: 98
With type: class java.lang.Short

Expression: #{bean1a.long1}
ExpectedType: long
Evaluates to: 98
With type: class java.lang.Long

Expression: #{bean1a.float1}
ExpectedType: float
Evaluates to: 12.4
With type: class java.lang.Float

Expression: #{bean1a.double1}
ExpectedType: double
Evaluates to: 89.224
With type: class java.lang.Double


*######################################################
* test the entire relational comparison type promotion matrix

Expression: #{bean1a.byte1 < bean1a.byte1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a.byte1 < bean1a.char1}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{bean1a.byte1 < bean1a.short1}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{bean1a.byte1 < bean1a.int1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a.byte1 < bean1a.long1}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{bean1a.byte1 < bean1a.float1}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{bean1a.byte1 < bean1a.double1}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean


Expression: #{bean1a.char1 < bean1a.byte1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a.char1 < bean1a.char1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a.char1 < bean1a.short1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a.char1 < bean1a.int1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a.char1 < bean1a.long1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a.char1 < bean1a.float1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a.char1 < bean1a.double1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean


Expression: #{bean1a.short1 < bean1a.byte1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a.short1 < bean1a.char1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a.short1 < bean1a.short1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a.short1 < bean1a.int1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a.short1 < bean1a.long1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a.short1 < bean1a.float1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a.short1 < bean1a.double1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean


Expression: #{bean1a.int1 < bean1a.byte1}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{bean1a.int1 < bean1a.char1}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{bean1a.int1 < bean1a.short1}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{bean1a.int1 < bean1a.int1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a.int1 < bean1a.long1}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{bean1a.int1 < bean1a.float1}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{bean1a.int1 < bean1a.double1}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean


Expression: #{bean1a.long1 < bean1a.byte1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a.long1 < bean1a.char1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a.long1 < bean1a.short1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a.long1 < bean1a.int1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a.long1 < bean1a.long1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a.long1 < bean1a.float1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a.long1 < bean1a.double1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean


Expression: #{bean1a.float1 < bean1a.byte1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a.float1 < bean1a.char1}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{bean1a.float1 < bean1a.short1}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{bean1a.float1 < bean1a.int1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a.float1 < bean1a.long1}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{bean1a.float1 < bean1a.float1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a.float1 < bean1a.double1}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean


Expression: #{bean1a.double1 < bean1a.byte1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a.double1 < bean1a.char1}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{bean1a.double1 < bean1a.short1}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{bean1a.double1 < bean1a.int1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a.double1 < bean1a.long1}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{bean1a.double1 < bean1a.float1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a.double1 < bean1a.double1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean


*######################################################
* test other relational comparison rules

Expression: #{null == null}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{noSuchAttribute == noSuchAttribute}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{noSuchAttribute == null}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{null == noSuchAttribute}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{bean1a == null}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{null == bean1a}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a == bean1a}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{bean1a > "hello"}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a.bean1 < 14}
ExpectedType: boolean
Causes an error: javax.faces.el.EvaluationException: com.sun.faces.el.impl.ElException: Attempt to coerce a value of type "com.sun.faces.el.impl.Bean1" to type "java.lang.Long"
Expression: #{bean1a.bean1 == "hello"}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean


*######################################################
* test String comparisons

Expression: #{bean1a.string1 == "hello"}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{bean1a.string1 != "hello"}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a.string1 == "goodbye"}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{bean1a.string1 != "goodbye"}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{bean1a.string1 > "goodbye"}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{"hello" == bean1a.string1}
ExpectedType: boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{"goodbye" > bean1a.string1}
ExpectedType: boolean
Evaluates to: false
With type: class java.lang.Boolean


*######################################################
* test errors in property traversal

Expression: #{noSuchAttribute.abc}
ExpectedType: class java.lang.Object
Evaluates to: null

Expression: #{bean1a.bean2.byte1}
ExpectedType: class java.lang.Object
Evaluates to: null

Expression: #{bean1a.noProperty}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.PropertyNotFoundException: Error getting property 'noProperty' from bean of type com.sun.faces.el.impl.Bean1
Expression: #{bean1a.noGetter}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.PropertyNotFoundException: Error getting property 'noGetter' from bean of type com.sun.faces.el.impl.Bean1
Expression: #{bean1a.errorInGetter}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.EvaluationException: javax.faces.el.EvaluationException: Error getting property 'errorInGetter' from bean of type com.sun.faces.el.impl.Bean1: java.lang.NullPointerException: Error!
Expression: #{bean1a.bean2.string2}
ExpectedType: class java.lang.Object
Evaluates to: null


*######################################################
* test accessing public properties from private classes

Expression: #{pbean1.value}
ExpectedType: class java.lang.Object
Evaluates to: got the value
With type: class java.lang.String

Expression: #{pbean2.value}
ExpectedType: class java.lang.Object
Evaluates to: got the value
With type: class java.lang.String

Expression: #{pbean3.value}
ExpectedType: class java.lang.Object
Evaluates to: got the value
With type: class java.lang.String

Expression: #{pbean4.value}
ExpectedType: class java.lang.Object
Evaluates to: got the value
With type: class java.lang.String

Expression: #{pbean5.value}
ExpectedType: class java.lang.Object
Evaluates to: got the value
With type: class java.lang.String

Expression: #{pbean6.value}
ExpectedType: class java.lang.Object
Evaluates to: got the value
With type: class java.lang.String

Expression: #{pbean7.value}
ExpectedType: class java.lang.Object
Evaluates to: got the value
With type: class java.lang.String



*######################################################
* test reserved words as identifiers

Expression: #{and}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.ReferenceSyntaxException: and
Expression: #{or}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.ReferenceSyntaxException: or
Expression: #{not}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.ReferenceSyntaxException: not
Expression: #{eq}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.ReferenceSyntaxException: eq
Expression: #{ne}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.ReferenceSyntaxException: ne
Expression: #{lt}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.ReferenceSyntaxException: lt
Expression: #{gt}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.ReferenceSyntaxException: gt
Expression: #{le}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.ReferenceSyntaxException: le
Expression: #{ge}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.ReferenceSyntaxException: ge
Expression: #{instanceof}
ExpectedType: class java.lang.Object
Evaluates to: null

Expression: #{true}
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{false}
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{null}
ExpectedType: class java.lang.Object
Evaluates to: null



*######################################################
* test reserved words as property names

Expression: #{bean1a.and}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.ReferenceSyntaxException: bean1a.and
Expression: #{bean1a.or}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.ReferenceSyntaxException: bean1a.or
Expression: #{bean1a.not}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.ReferenceSyntaxException: bean1a.not
Expression: #{bean1a.eq}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.ReferenceSyntaxException: bean1a.eq
Expression: #{bean1a.ne}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.ReferenceSyntaxException: bean1a.ne
Expression: #{bean1a.lt}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.ReferenceSyntaxException: bean1a.lt
Expression: #{bean1a.gt}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.ReferenceSyntaxException: bean1a.gt
Expression: #{bean1a.le}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.ReferenceSyntaxException: bean1a.le
Expression: #{bean1a.ge}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.ReferenceSyntaxException: bean1a.ge
Expression: #{bean1a.instanceof}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.PropertyNotFoundException: Error getting property 'instanceof' from bean of type com.sun.faces.el.impl.Bean1
Expression: #{bean1a.page}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.PropertyNotFoundException: Error getting property 'page' from bean of type com.sun.faces.el.impl.Bean1
Expression: #{bean1a.request}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.PropertyNotFoundException: Error getting property 'request' from bean of type com.sun.faces.el.impl.Bean1
Expression: #{bean1a.session}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.PropertyNotFoundException: Error getting property 'session' from bean of type com.sun.faces.el.impl.Bean1
Expression: #{bean1a.application}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.PropertyNotFoundException: Error getting property 'application' from bean of type com.sun.faces.el.impl.Bean1
Expression: #{bean1a.true}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.ReferenceSyntaxException: bean1a.true
Expression: #{bean1a.false}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.ReferenceSyntaxException: bean1a.false
Expression: #{bean1a.null}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.ReferenceSyntaxException: bean1a.null

*######################################################
* test arithmetic

Expression: #{3+5}
ExpectedType: class java.lang.Object
Evaluates to: 8
With type: class java.lang.Long

Expression: #{3-5}
ExpectedType: class java.lang.Object
Evaluates to: -2
With type: class java.lang.Long

Expression: #{3/5}
ExpectedType: class java.lang.Object
Evaluates to: 0.6
With type: class java.lang.Double

Expression: #{3*5}
ExpectedType: class java.lang.Object
Evaluates to: 15
With type: class java.lang.Long

Expression: #{3*5.0}
ExpectedType: class java.lang.Object
Evaluates to: 15.0
With type: class java.lang.Double

Expression: #{3.0*5}
ExpectedType: class java.lang.Object
Evaluates to: 15.0
With type: class java.lang.Double

Expression: #{3.0*5.0}
ExpectedType: class java.lang.Object
Evaluates to: 15.0
With type: class java.lang.Double

Expression: #{225 % 17}
ExpectedType: class java.lang.Object
Evaluates to: 4
With type: class java.lang.Long


Expression: #{ 1 + 2 + 3 * 5 + 6}
ExpectedType: class java.lang.Object
Evaluates to: 24
With type: class java.lang.Long

Expression: #{ 1 + (2 + 3) * 5 + 6}
ExpectedType: class java.lang.Object
Evaluates to: 32
With type: class java.lang.Long


*######################################################
* test logical operators

Expression: #{ true}
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{ not true}
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{ not false}
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{ not not true}
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{ not not false}
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{ true and false}
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{ true and true}
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{ false and true}
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{ false and false}
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{ true or false}
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{ true or true}
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{ false or true}
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{ false or false}
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean


Expression: #{ false or false or false or true and false}
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{ false or false or false or true and false or true}
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean


*######################################################
* test indexed access operator

* Test as equivalent to property accessor
Expression: #{ bean1a["double1"] }
ExpectedType: class java.lang.Object
Evaluates to: 89.224
With type: class java.lang.Double

Expression: #{ bean1a["double1"].class }
ExpectedType: class java.lang.Object
Evaluates to: class java.lang.Double
With type: class java.lang.Class


* Test as array accessor
Expression: #{ bean1a.stringArray1[-1]}
ExpectedType: class java.lang.Object
Evaluates to: null

Expression: #{ bean1a.stringArray1[0]}
ExpectedType: class java.lang.Object
Evaluates to: string1
With type: class java.lang.String

Expression: #{ bean1a.stringArray1[1]}
ExpectedType: class java.lang.Object
Evaluates to: string2
With type: class java.lang.String

Expression: #{ bean1a.stringArray1[2]}
ExpectedType: class java.lang.Object
Evaluates to: string3
With type: class java.lang.String

Expression: #{ bean1a.stringArray1[3]}
ExpectedType: class java.lang.Object
Evaluates to: string4
With type: class java.lang.String

Expression: #{ bean1a.stringArray1[4]}
ExpectedType: class java.lang.Object
Evaluates to: null


* Test as list accessor
Expression: #{ bean1a.list1 [0] }
ExpectedType: class java.lang.Object
Evaluates to: 14
With type: class java.lang.Integer

Expression: #{ bean1a.list1 [1] }
ExpectedType: class java.lang.Object
Evaluates to: another value
With type: class java.lang.String

Expression: #{ bean1a.list1 [2][2] }
ExpectedType: class java.lang.Object
Evaluates to: string3
With type: class java.lang.String


* Test as indexed property accessor
Expression: #{ bean1a.indexed1[-1]}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.PropertyNotFoundException: Error getting property 'indexed1' from bean of type com.sun.faces.el.impl.Bean1
Expression: #{ bean1a.indexed1[0]}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.PropertyNotFoundException: Error getting property 'indexed1' from bean of type com.sun.faces.el.impl.Bean1
Expression: #{ bean1a.indexed1[1]}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.PropertyNotFoundException: Error getting property 'indexed1' from bean of type com.sun.faces.el.impl.Bean1
Expression: #{ bean1a.indexed1[2]}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.PropertyNotFoundException: Error getting property 'indexed1' from bean of type com.sun.faces.el.impl.Bean1
Expression: #{ bean1a.indexed1[3]}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.PropertyNotFoundException: Error getting property 'indexed1' from bean of type com.sun.faces.el.impl.Bean1
Expression: #{ bean1a.indexed1[4]}
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.PropertyNotFoundException: Error getting property 'indexed1' from bean of type com.sun.faces.el.impl.Bean1

* Test as map accessor
Expression: #{ bean1a.map1.noKey }
ExpectedType: class java.lang.Object
Evaluates to: null

Expression: #{ bean1a.map1.key1 }
ExpectedType: class java.lang.Object
Evaluates to: value1
With type: class java.lang.String

Expression: #{ bean1a.map1 ["key1"] }
ExpectedType: class java.lang.Object
Evaluates to: value1
With type: class java.lang.String

Expression: #{ bean1a.map1 [14] }
ExpectedType: class java.lang.Object
Evaluates to: value3
With type: class java.lang.String

Expression: #{ bean1a.map1 [2 * 7] }
ExpectedType: class java.lang.Object
Evaluates to: value3
With type: class java.lang.String

Expression: #{ bean1a.map1.recurse.list1[0] }
ExpectedType: class java.lang.Object
Evaluates to: 14
With type: class java.lang.Integer


* Test UIComponent as bean
Expression: #{view.rendered}
ExpectedType: class java.lang.Boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{view.attributes.rendered}
ExpectedType: class java.lang.Boolean
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{view.children[0].value}
ExpectedType: class java.lang.String
Evaluates to: inputValue
With type: class java.lang.String

Expression: #{view.children[0].rendered}
ExpectedType: class java.lang.Boolean
Evaluates to: true
With type: class java.lang.Boolean


*######################################################
* test String concatenation

Expression: #{ "a" + "bcd" }
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.EvaluationException: com.sun.faces.el.impl.ElException: An exception occured trying to convert String "a" to type "java.lang.Long"
Expression: #{ "a" + (4*3) }
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.EvaluationException: com.sun.faces.el.impl.ElException: An exception occured trying to convert String "a" to type "java.lang.Long"
Expression: #{ bean1a.map1 ["key" + (5-4)] }
ExpectedType: class java.lang.Object
Causes an error: javax.faces.el.EvaluationException: com.sun.faces.el.impl.ElException: An exception occured trying to convert String "key" to type "java.lang.Double"

*######################################################
* test String comparisons

Expression: #{ "30" < "4" }
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{ 30 < "4" }
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{ 30 > "4" }
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{ "0004" == "4" }
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean


*######################################################
* test relational comparison with alternate symbols

Expression: #{ 4 eq 3}
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{ 4 ne 3}
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{ 4 eq 4}
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{ 4 ne 4}
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{ 4 lt 3}
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{ 4 gt 3}
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{ 4 le 3}
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{ 4 ge 3}
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{ 4 le 4}
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{ 4 ge 4}
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean


*######################################################
* test expressions on the left side of a value suffix

Expression: #{(3).class}
ExpectedType: class java.lang.Object
Evaluates to: class java.lang.Long
With type: class java.lang.Class

Expression: #{(bean1a.map1)["key1"]}
ExpectedType: class java.lang.Object
Evaluates to: value1
With type: class java.lang.String



*######################################################
* test String/boolean logical operators

Expression: #{'true' and false}
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{'true' or true}
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{false and 'true'}
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{false or 'true'}
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean


*######################################################
* test empty operator

Expression: #{ empty "A"}
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{ empty "" }
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{ empty null }
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{ empty false}
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{ empty 0}
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{ not empty 0}
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{ not empty empty 0}
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{ empty emptyTests.emptyArray }
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{ empty emptyTests.nonemptyArray }
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{ empty emptyTests.emptyList }
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{ empty emptyTests.nonemptyList }
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{ empty emptyTests.emptyMap }
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{ empty emptyTests.nonemptyMap }
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{ empty emptyTests.emptySet }
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{ empty emptyTests.nonemptySet }
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean


*######################################################
* test String arithmetic

Expression: #{ "6" / "3" }
ExpectedType: class java.lang.Object
Evaluates to: 2.0
With type: class java.lang.Double

Expression: #{ 3 + "4" }
ExpectedType: class java.lang.Object
Evaluates to: 7
With type: class java.lang.Long

Expression: #{ "4" + 3 }
ExpectedType: class java.lang.Object
Evaluates to: 7
With type: class java.lang.Long

Expression: #{ 3 + "4.5" }
ExpectedType: class java.lang.Object
Evaluates to: 7.5
With type: class java.lang.Double

Expression: #{ "4.5" + 3 }
ExpectedType: class java.lang.Object
Evaluates to: 7.5
With type: class java.lang.Double

Expression: #{ 3.0 + 6.0}
ExpectedType: class java.lang.Object
Evaluates to: 9.0
With type: class java.lang.Double

Expression: #{ 31121.0 * 61553.0 }
ExpectedType: class java.lang.Object
Evaluates to: 1.915590913E9
With type: class java.lang.Double

Expression: #{ 31121 * 61553 }
ExpectedType: class java.lang.Object
Evaluates to: 1915590913
With type: class java.lang.Long

Expression: #{ 65536 * 65536 * 65536 * 32759 }
ExpectedType: class java.lang.Object
Evaluates to: 9220838762064379904
With type: class java.lang.Long

Expression: #{ 9220838762064379904.0 - 9220838762064379900.0 }
ExpectedType: class java.lang.Object
Evaluates to: 0.0
With type: class java.lang.Double

Expression: #{ 9220838762064379904 - 9220838762064379900 }
ExpectedType: class java.lang.Object
Evaluates to: 4
With type: class java.lang.Long


*######################################################
* test relational operators involving null

Expression: #{ null == null }
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{ null != null }
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{ null > null }
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{ null < null }
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{ null >= null }
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{ null <= null }
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean


Expression: #{ null == 3 }
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{ null != 3 }
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{ null > 3 }
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{ null < 3 }
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{ null >= 3 }
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{ null <= 3 }
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean


Expression: #{ 3 == null }
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{ 3 != null }
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{ 3 > null }
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{ 3 < null }
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{ 3 >= null }
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{ 3 <= null }
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean


Expression: #{ null == "" }
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{ null != "" }
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean

Expression: #{ "" == null }
ExpectedType: class java.lang.Object
Evaluates to: false
With type: class java.lang.Boolean

Expression: #{ "" != null }
ExpectedType: class java.lang.Object
Evaluates to: true
With type: class java.lang.Boolean


*######################################################
* arithmetic operators involving Strings

Expression: #{ 4 + 3 }
ExpectedType: class java.lang.Object
Evaluates to: 7
With type: class java.lang.Long

Expression: #{ 4.0 + 3 }
ExpectedType: class java.lang.Object
Evaluates to: 7.0
With type: class java.lang.Double

Expression: #{ 4 + 3.0 }
ExpectedType: class java.lang.Object
Evaluates to: 7.0
With type: class java.lang.Double

Expression: #{ 4.0 + 3.0 }
ExpectedType: class java.lang.Object
Evaluates to: 7.0
With type: class java.lang.Double

Expression: #{ "4" + 3 }
ExpectedType: class java.lang.Object
Evaluates to: 7
With type: class java.lang.Long

Expression: #{ "4.0" + 3 }
ExpectedType: class java.lang.Object
Evaluates to: 7.0
With type: class java.lang.Double

Expression: #{ "4" + 3.0 }
ExpectedType: class java.lang.Object
Evaluates to: 7.0
With type: class java.lang.Double

Expression: #{ "4.0" + 3.0 }
ExpectedType: class java.lang.Object
Evaluates to: 7.0
With type: class java.lang.Double

Expression: #{ 4 + "3" }
ExpectedType: class java.lang.Object
Evaluates to: 7
With type: class java.lang.Long

Expression: #{ 4.0 + "3" }
ExpectedType: class java.lang.Object
Evaluates to: 7.0
With type: class java.lang.Double

Expression: #{ 4 + "3.0" }
ExpectedType: class java.lang.Object
Evaluates to: 7.0
With type: class java.lang.Double

Expression: #{ 4.0 + "3.0" }
ExpectedType: class java.lang.Object
Evaluates to: 7.0
With type: class java.lang.Double

Expression: #{ "4" + "3" }
ExpectedType: class java.lang.Object
Evaluates to: 7
With type: class java.lang.Long

Expression: #{ "4.0" + "3" }
ExpectedType: class java.lang.Object
Evaluates to: 7.0
With type: class java.lang.Double

Expression: #{ "4" + "3.0" }
ExpectedType: class java.lang.Object
Evaluates to: 7.0
With type: class java.lang.Double

Expression: #{ "4.0" + "3.0" }
ExpectedType: class java.lang.Object
Evaluates to: 7.0
With type: class java.lang.Double



Expression: #{ 4 - 3 }
ExpectedType: class java.lang.Object
Evaluates to: 1
With type: class java.lang.Long

Expression: #{ 4.0 - 3 }
ExpectedType: class java.lang.Object
Evaluates to: 1.0
With type: class java.lang.Double

Expression: #{ 4 - 3.0 }
ExpectedType: class java.lang.Object
Evaluates to: 1.0
With type: class java.lang.Double

Expression: #{ 4.0 - 3.0 }
ExpectedType: class java.lang.Object
Evaluates to: 1.0
With type: class java.lang.Double

Expression: #{ "4" - 3 }
ExpectedType: class java.lang.Object
Evaluates to: 1
With type: class java.lang.Long

Expression: #{ "4.0" - 3 }
ExpectedType: class java.lang.Object
Evaluates to: 1.0
With type: class java.lang.Double

Expression: #{ "4" - 3.0 }
ExpectedType: class java.lang.Object
Evaluates to: 1.0
With type: class java.lang.Double

Expression: #{ "4.0" - 3.0 }
ExpectedType: class java.lang.Object
Evaluates to: 1.0
With type: class java.lang.Double

Expression: #{ 4 - "3" }
ExpectedType: class java.lang.Object
Evaluates to: 1
With type: class java.lang.Long

Expression: #{ 4.0 - "3" }
ExpectedType: class java.lang.Object
Evaluates to: 1.0
With type: class java.lang.Double

Expression: #{ 4 - "3.0" }
ExpectedType: class java.lang.Object
Evaluates to: 1.0
With type: class java.lang.Double

Expression: #{ 4.0 - "3.0" }
ExpectedType: class java.lang.Object
Evaluates to: 1.0
With type: class java.lang.Double

Expression: #{ "4" - "3" }
ExpectedType: class java.lang.Object
Evaluates to: 1
With type: class java.lang.Long

Expression: #{ "4.0" - "3" }
ExpectedType: class java.lang.Object
Evaluates to: 1.0
With type: class java.lang.Double

Expression: #{ "4" - "3.0" }
ExpectedType: class java.lang.Object
Evaluates to: 1.0
With type: class java.lang.Double

Expression: #{ "4.0" - "3.0" }
ExpectedType: class java.lang.Object
Evaluates to: 1.0
With type: class java.lang.Double



Expression: #{ 4 * 3 }
ExpectedType: class java.lang.Object
Evaluates to: 12
With type: class java.lang.Long

Expression: #{ 4.0 * 3 }
ExpectedType: class java.lang.Object
Evaluates to: 12.0
With type: class java.lang.Double

Expression: #{ 4 * 3.0 }
ExpectedType: class java.lang.Object
Evaluates to: 12.0
With type: class java.lang.Double

Expression: #{ 4.0 * 3.0 }
ExpectedType: class java.lang.Object
Evaluates to: 12.0
With type: class java.lang.Double

Expression: #{ "4" * 3 }
ExpectedType: class java.lang.Object
Evaluates to: 12
With type: class java.lang.Long

Expression: #{ "4.0" * 3 }
ExpectedType: class java.lang.Object
Evaluates to: 12.0
With type: class java.lang.Double

Expression: #{ "4" * 3.0 }
ExpectedType: class java.lang.Object
Evaluates to: 12.0
With type: class java.lang.Double

Expression: #{ "4.0" * 3.0 }
ExpectedType: class java.lang.Object
Evaluates to: 12.0
With type: class java.lang.Double

Expression: #{ 4 * "3" }
ExpectedType: class java.lang.Object
Evaluates to: 12
With type: class java.lang.Long

Expression: #{ 4.0 * "3" }
ExpectedType: class java.lang.Object
Evaluates to: 12.0
With type: class java.lang.Double

Expression: #{ 4 * "3.0" }
ExpectedType: class java.lang.Object
Evaluates to: 12.0
With type: class java.lang.Double

Expression: #{ 4.0 * "3.0" }
ExpectedType: class java.lang.Object
Evaluates to: 12.0
With type: class java.lang.Double

Expression: #{ "4" * "3" }
ExpectedType: class java.lang.Object
Evaluates to: 12
With type: class java.lang.Long

Expression: #{ "4.0" * "3" }
ExpectedType: class java.lang.Object
Evaluates to: 12.0
With type: class java.lang.Double

Expression: #{ "4" * "3.0" }
ExpectedType: class java.lang.Object
Evaluates to: 12.0
With type: class java.lang.Double

Expression: #{ "4.0" * "3.0" }
ExpectedType: class java.lang.Object
Evaluates to: 12.0
With type: class java.lang.Double



Expression: #{ 4 / 3 }
ExpectedType: class java.lang.Object
Evaluates to: 1.3333333333333333
With type: class java.lang.Double

Expression: #{ 4.0 / 3 }
ExpectedType: class java.lang.Object
Evaluates to: 1.3333333333333333
With type: class java.lang.Double

Expression: #{ 4 / 3.0 }
ExpectedType: class java.lang.Object
Evaluates to: 1.3333333333333333
With type: class java.lang.Double

Expression: #{ 4.0 / 3.0 }
ExpectedType: class java.lang.Object
Evaluates to: 1.3333333333333333
With type: class java.lang.Double

Expression: #{ "4" / 3 }
ExpectedType: class java.lang.Object
Evaluates to: 1.3333333333333333
With type: class java.lang.Double

Expression: #{ "4.0" / 3 }
ExpectedType: class java.lang.Object
Evaluates to: 1.3333333333333333
With type: class java.lang.Double

Expression: #{ "4" / 3.0 }
ExpectedType: class java.lang.Object
Evaluates to: 1.3333333333333333
With type: class java.lang.Double

Expression: #{ "4.0" / 3.0 }
ExpectedType: class java.lang.Object
Evaluates to: 1.3333333333333333
With type: class java.lang.Double

Expression: #{ 4 / "3" }
ExpectedType: class java.lang.Object
Evaluates to: 1.3333333333333333
With type: class java.lang.Double

Expression: #{ 4.0 / "3" }
ExpectedType: class java.lang.Object
Evaluates to: 1.3333333333333333
With type: class java.lang.Double

Expression: #{ 4 / "3.0" }
ExpectedType: class java.lang.Object
Evaluates to: 1.3333333333333333
With type: class java.lang.Double

Expression: #{ 4.0 / "3.0" }
ExpectedType: class java.lang.Object
Evaluates to: 1.3333333333333333
With type: class java.lang.Double

Expression: #{ "4" / "3" }
ExpectedType: class java.lang.Object
Evaluates to: 1.3333333333333333
With type: class java.lang.Double

Expression: #{ "4.0" / "3" }
ExpectedType: class java.lang.Object
Evaluates to: 1.3333333333333333
With type: class java.lang.Double

Expression: #{ "4" / "3.0" }
ExpectedType: class java.lang.Object
Evaluates to: 1.3333333333333333
With type: class java.lang.Double

Expression: #{ "4.0" / "3.0" }
ExpectedType: class java.lang.Object
Evaluates to: 1.3333333333333333
With type: class java.lang.Double



Expression: #{ 4 % 3 }
ExpectedType: class java.lang.Object
Evaluates to: 1
With type: class java.lang.Long

Expression: #{ 4.0 % 3 }
ExpectedType: class java.lang.Object
Evaluates to: 1.0
With type: class java.lang.Double

Expression: #{ 4 % 3.0 }
ExpectedType: class java.lang.Object
Evaluates to: 1.0
With type: class java.lang.Double

Expression: #{ 4.0 % 3.0 }
ExpectedType: class java.lang.Object
Evaluates to: 1.0
With type: class java.lang.Double

Expression: #{ "4" % 3 }
ExpectedType: class java.lang.Object
Evaluates to: 1
With type: class java.lang.Long

Expression: #{ "4.0" % 3 }
ExpectedType: class java.lang.Object
Evaluates to: 1.0
With type: class java.lang.Double

Expression: #{ "4" % 3.0 }
ExpectedType: class java.lang.Object
Evaluates to: 1.0
With type: class java.lang.Double

Expression: #{ "4.0" % 3.0 }
ExpectedType: class java.lang.Object
Evaluates to: 1.0
With type: class java.lang.Double

Expression: #{ 4 % "3" }
ExpectedType: class java.lang.Object
Evaluates to: 1
With type: class java.lang.Long

Expression: #{ 4.0 % "3" }
ExpectedType: class java.lang.Object
Evaluates to: 1.0
With type: class java.lang.Double

Expression: #{ 4 % "3.0" }
ExpectedType: class java.lang.Object
Evaluates to: 1.0
With type: class java.lang.Double

Expression: #{ 4.0 % "3.0" }
ExpectedType: class java.lang.Object
Evaluates to: 1.0
With type: class java.lang.Double

Expression: #{ "4" % "3" }
ExpectedType: class java.lang.Object
Evaluates to: 1
With type: class java.lang.Long

Expression: #{ "4.0" % "3" }
ExpectedType: class java.lang.Object
Evaluates to: 1.0
With type: class java.lang.Double

Expression: #{ "4" % "3.0" }
ExpectedType: class java.lang.Object
Evaluates to: 1.0
With type: class java.lang.Double

Expression: #{ "4.0" % "3.0" }
ExpectedType: class java.lang.Object
Evaluates to: 1.0
With type: class java.lang.Double



Expression: #{ "8" / "2" }
ExpectedType: class java.lang.Object
Evaluates to: 4.0
With type: class java.lang.Double

Expression: #{ "4e2" + "3" }
ExpectedType: class java.lang.Object
Evaluates to: 403.0
With type: class java.lang.Double

Expression: #{ "4" + "3e2" }
ExpectedType: class java.lang.Object
Evaluates to: 304.0
With type: class java.lang.Double

Expression: #{ "4e2" + "3e2" }
ExpectedType: class java.lang.Object
Evaluates to: 700.0
With type: class java.lang.Double



*######################################################
* unary minus operator involving Strings

Expression: #{ -3 }
ExpectedType: class java.lang.Object
Evaluates to: -3
With type: class java.lang.Long

Expression: #{ -3.0 }
ExpectedType: class java.lang.Object
Evaluates to: -3.0
With type: class java.lang.Double

Expression: #{ -"3" }
ExpectedType: class java.lang.Object
Evaluates to: -3
With type: class java.lang.Long

Expression: #{ -"3.0" }
ExpectedType: class java.lang.Object
Evaluates to: -3.0
With type: class java.lang.Double

Expression: #{ -"3e2" }
ExpectedType: class java.lang.Object
Evaluates to: -300.0
With type: class java.lang.Double

