| <?xml version = "1.0" encoding = "US-ASCII"?> |
| <!DOCTYPE spec SYSTEM "https://raw.githubusercontent.com/eclipse-ee4j/jakartaee-tck/master/internal/docs/dtd/spec_assertions.dtd"> |
| <!-- |
| |
| Copyright (c) 2018, 2022 Oracle and/or its affiliates and others. |
| All rights reserved. |
| |
| This program and the accompanying materials are made available under the |
| terms of the Eclipse Public License v. 2.0, which is available at |
| http://www.eclipse.org/legal/epl-2.0. |
| |
| This Source Code may also be made available under the following Secondary |
| Licenses when the conditions for such availability set forth in the |
| Eclipse Public License v. 2.0 are satisfied: GNU General Public License, |
| version 2 with the GNU Classpath Exception, which is available at |
| https://www.gnu.org/software/classpath/license.html. |
| |
| SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 |
| |
| --> |
| |
| <?xml-stylesheet href = 'file:///files/workspaces/tools/docs/xsl/assertions/spec_assertions_comments.xsl' type = 'text/xsl'?> |
| <spec> |
| <!-- @(#)ELSpecAssertions.xml 1.0 03/23/06 --> |
| <next-available-id>82</next-available-id> |
| <previous-id>48</previous-id> |
| <technology>EL</technology> |
| <id>EL</id> |
| <name>Expression Language</name> |
| <version>5.0</version> |
| <location-names> |
| <chapters> |
| <chapter id="1" name="Language Syntax and Semantics"> |
| <sections> |
| <section id="1" name="Overview" /> |
| <section id="1.1" name="EL in a nutshell" /> |
| <section id="2" name="EL Expressions" /> |
| <section id="2.1" name="Eval-expression" /> |
| <section id="2.1.1" name="Eval-expressions as value expressions" /> |
| <section id="2.1.2" name="Eval-expressions as method expressions" /> |
| <section id="2.2" name="Literal-expression" /> |
| <section id="2.3" name="Composite expressions" /> |
| <section id="2.4" name="Syntax restrictions" /> |
| <section id="3" name="Literals" /> |
| <section id="4" name="Errors, Warnings, Default Values" /> |
| <section id="5" name="Resolution of Model Objects and their Properties" /> |
| <section id="6" name="Operators [] and ." /> |
| <section id="7" name="Arithmetic Operators" /> |
| <section id="7.1" name="Binary operators - A {+,-,*} B" /> |
| <section id="7.2" name="Binary operator - A {/,div} B" /> |
| <section id="7.3" name="Binary operator - A {%,mod} B" /> |
| <section id="7.4" name="Unary minus operator - -A" /> |
| <section id="8" name="String Concatenation Operator - A {+,cat} B" /> |
| <section id="9" name="Relational Operators" /> |
| <section id="9.1" name="A {<,>,<=,>=,lt,gt,le,ge} B" /> |
| <section id="9.2" name="A {==,!=,eq,ne} B" /> |
| <section id="10" name="Logical Operators" /> |
| <section id="10.1" name="Binary operator - A {&&,||,and,or} B" /> |
| <section id="11" name="Empty Operator - empty A" /> |
| <section id="12" name="Conditional Operator - A ? B : C" /> |
| <section id="13" name="Assignment Operator - A = B" /> |
| <section id="14" name="Semicolon Operator - A ; B" /> |
| <section id="15" name="Parentheses" /> |
| <section id="16" name="Operator Precedence" /> |
| <section id="17" name="Reserved Words" /> |
| <section id="18" name="Functions" /> |
| <section id="19" name="Variables" /> |
| <section id="20" name="Lambda Expressions" /> |
| <section id="21" name="Enums" /> |
| <section id="22" name="Static Field and Method Reference" /> |
| <section id="22.1" name="Access Restrictions and Imports" /> |
| <section id="22.2" name="Imports of Classes and Packages" /> |
| <section id="22.3" name="Special Fields and Methods" /> |
| <section id="23" name="Type Conversion" /> |
| <section id="23.1" name="To Coerce a Value X to Type Y" /> |
| <section id="23.2" name="Coerce A to String" /> |
| <section id="23.3" name="Coerce A to Number type N" /> |
| <section id="23.4" name="Coerce A to Character" /> |
| <section id="23.5" name="Coerce A to Boolean or boolean" /> |
| <section id="23.6" name="Coerce A to an Enum Type T" /> |
| <section id="23.7" name="Coerce A to an array of Type T" /> |
| <section id="23.8" name="Coerce A to functional interface method invocation" /> |
| <section id="23.9" name="Coerce A to Any Other Type T" /> |
| <section id="24" name="Collected Syntax " /> |
| </sections> |
| </chapter> |
| <chapter id="2" name="Operations on Collection Objects"> |
| <sections> |
| <section id="2" name="Construction of Collection Objects" /> |
| <section id="2.1" name="Set Construction" /> |
| <section id="2.2" name="List Construction" /> |
| <section id="2.3" name="Map Construction" /> |
| <section id="3" name="Collection Operations" /> |
| <section id="3.1" name="Stream and Pipeline" /> |
| <section id="3.2" name="Operator Syntax Description" /> |
| <section id="3.3" name="Implementation Classes" /> |
| <section id="3.4" name="Functions" /> |
| <section id="3.5" name="filter" /> |
| <section id="3.6" name="map" /> |
| <section id="3.7" name="flatMap" /> |
| <section id="3.8" name="distinct" /> |
| <section id="3.9" name="sorted" /> |
| <section id="3.10" name="forEach" /> |
| <section id="3.11" name="peek" /> |
| <section id="3.12" name="iterator" /> |
| <section id="3.13" name="limit" /> |
| <section id="3.14" name="substream" /> |
| <section id="3.15" name="toArray" /> |
| <section id="3.16" name="toList" /> |
| <section id="3.17" name="reduce" /> |
| <section id="3.18" name="max" /> |
| <section id="3.19" name="min" /> |
| <section id="3.20" name="average" /> |
| <section id="3.21" name="sum" /> |
| <section id="3.22" name="count" /> |
| <section id="3.23" name="anyMatch" /> |
| <section id="3.24" name="allMatch" /> |
| <section id="3.25" name="noneMatch" /> |
| <section id="3.26" name="findFirst" /> |
| </sections> |
| </chapter> |
| </chapters> |
| </location-names> |
| <assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:45</id> |
| <description>Once parsed, an expression can optionally be evaluated |
| one or |
| more times. [ExprParsedEvalMany]</description> |
| <location chapter="1" section="2" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:1</id> |
| <description>An eval-expression is formed by using the constructs |
| ${expr} or |
| #{expr}. Both constructs are parsed and evaluated in |
| exactly the same way by |
| the EL, even though they might carry |
| different meanings in the technology |
| that is using the EL. |
| [PoundDollarSameMeaning]</description> |
| <location chapter="1" section="2.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:2</id> |
| <description>Nested eval-expressions, such as ${item[${i}]}, are |
| illegal. |
| [NestedEvalExprIllegal]</description> |
| <location chapter="1" section="2.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:3</id> |
| <description>When parsing a value expression, an expected type is |
| provided. In |
| the case of an rvalue, the expected type is what the |
| result of the expression |
| evaluation is coerced to. [RValueCoercion]</description> |
| <location chapter="1" section="2.1.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:4</id> |
| <description>When parsing lvalues, the expected type is ignored and |
| the |
| provided value is coerced to the actual type of the property the |
| expression |
| points to, before that property is set. [LValueCoercion]</description> |
| <location chapter="1" section="2.1.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:5</id> |
| <description>There is no coercion performed by method expressions. |
| [MethodExprSignature]</description> |
| <location chapter="1" section="2.1.2" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:80</id> |
| <description>Identification of methods in method expressions from |
| parameter types follows the rules of the JLS with the addition |
| that coercion resolution is less specific than overload |
| resolution. [MethodExpressionMatch]</description> |
| <location chapter="1" section="2.1.2" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:6</id> |
| <description>A literal-expression does not use the ${expr} or #{expr} |
| constructs, and simply evaluates to the text of the expression, of |
| type |
| String. Upon evaluation, an expected type of something other |
| than String can |
| be provided. [LiteralExprEval]</description> |
| <location chapter="1" section="2.2" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:7</id> |
| <description>To generate literal values that include the character |
| sequence |
| "${" or ?#{?, the developer can choose to use a composite |
| expression as shown |
| in the example: [ELSyntaxAsLiteral]</description> |
| <location chapter="1" section="2.2" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:8</id> |
| <description>The escape characters \$ and \# can be used to escape |
| what would |
| otherwise be treated as an eval-expression. |
| [ELSyntaxEscape]</description> |
| <location chapter="1" section="2.2" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:9</id> |
| <description>A literal-expression can be used anywhere a value |
| expression can |
| be used. [LiteralExprAnywhereValueExprUsed]</description> |
| <location chapter="1" section="2.2" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:10</id> |
| <description>A literal-expression can also be used as a method |
| expression that |
| returns a non-void return value. The standard EL |
| coercion rules then apply if |
| the return type of the method |
| expression is not java.lang.String. |
| [LiteralExprAsMethodExpr]</description> |
| <location chapter="1" section="2.2" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:11</id> |
| <description>With composite expressions, eval-expressions are |
| evaluated from |
| left to right, coerced to Strings (according to the |
| EL type conversion |
| rules), and concatenated with any intervening |
| literal-expressions. |
| [CompositeExprEval]</description> |
| <location chapter="1" section="2.3" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:12</id> |
| <description>It is illegal to mix ${} and #{} constructs in a |
| composite |
| expression. [CannotMixTwoSyntax]</description> |
| <location chapter="1" section="2.3" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:13</id> |
| <description>There are literals for boolean, integer, floating point, |
| string, |
| and null in an eval-expression. [EvalExpressionLiterals]</description> |
| <location chapter="1" section="3" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:13.1</id> |
| <description>The boolean literal has values true and false</description> |
| <location chapter="1" section="3" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:13.2</id> |
| <description>The integer literal is defined by the IntegerLiteral |
| construct.</description> |
| <location chapter="1" section="3" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:13.3</id> |
| <description>The floating point literal is defined by the |
| FloatingPointLiteral construct</description> |
| <location chapter="3" section="1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:13.4</id> |
| <description>The string literal is defined with single and double |
| quotes</description> |
| <location chapter="3" section="1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:13.5</id> |
| <description>In a string literal, " is escaped as \", ' is escaped |
| as \', |
| and \ is escaped as \\. Quotes only need to be escaped in a |
| string value |
| enclosed in the same type of quote</description> |
| <location chapter="3" section="1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:13.6</id> |
| <description>The null literal has a null value.</description> |
| <location chapter="3" section="1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:14</id> |
| <description>The EL does not provide warnings, just default values |
| and errors. |
| Default values are type-correct values that are assigned |
| to a subexpression |
| when there is some problem. An error is an |
| exception thrown (to be handled by |
| the environment where the EL is |
| used). [DefaultValuesAndErrors]</description> |
| <location chapter="1" section="4" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:15</id> |
| <description>The dot and index operators have equivalent |
| functionality. |
| [DotAndIndexOperatorsSame]</description> |
| <location chapter="1" section="6" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:16</id> |
| <description>To evaluate expr-a[expr-b]:</description> |
| <location chapter="1" section="6" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:16.1</id> |
| <description>Evaluate expr-a into value-a</description> |
| <location chapter="1" section="6" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:16.2</id> |
| <description>If value-a is null:</description> |
| <location chapter="1" section="6" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:16.2.1</id> |
| <description>If expr-a[expr-b] is the last property being |
| resolved:</description> |
| <location chapter="1" section="6" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:16.2.1.1</id> |
| <description>If the expression is a value expression and |
| ValueExpression.getValue(context) was called to initiate this |
| expression evaluation, return null.</description> |
| <location chapter="1" section="6" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:16.2.1.2</id> |
| <description>Otherwise, throw PropertyNotFoundException</description> |
| <location chapter="1" section="6" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:16.2.2</id> |
| <description>Otherwise, return null.</description> |
| <location chapter="1" section="6" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:16.3</id> |
| <description>Evaluate expr-b into value-b </description> |
| <location chapter="1" section="6" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:16.4</id> |
| <description>If value-b is null</description> |
| <location chapter="1" section="6" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:16.4.1</id> |
| <description>If expr-a[expr-b] is the last property being |
| resolved:</description> |
| <location chapter="1" section="6" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:16.4.1.1</id> |
| <description>If the expression is a value expression and |
| ValueExpression.getValue(context) was called to initiate this |
| expression evaluation, return null.</description> |
| <location chapter="1" section="6" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:16.4.1.2</id> |
| <description>Otherwise, throw PropertyNotFoundException</description> |
| <location chapter="1" section="6" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:16.4.2</id> |
| <description>Otherwise, return null.</description> |
| <location chapter="1" section="6" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:16.5</id> |
| <description>If the expression is a value expression:</description> |
| <location chapter="1" section="6" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:16.5.1</id> |
| <description>If expr-a[expr-b] is the last property being |
| resolved:</description> |
| <location chapter="1" section="6" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:16.5.1.1</id> |
| <description>If ValueExpression.getValue(context) was called to |
| initiate this expression evaluation, invoke |
| elResolver.getValue(context, value-a, value-b)</description> |
| <location chapter="1" section="6" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:16.5.1.2</id> |
| <description>If ValueExpression.getType(context) was called, |
| invoke |
| elResolver.getType(context, value-a, value-b).</description> |
| <location chapter="1" section="6" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:16.5.1.3</id> |
| <description>If ValueExpression.isReadOnly(context) was called, |
| invoke |
| elResolver.isReadOnly(context, value-a, value-b).</description> |
| <location chapter="1" section="6" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:16.5.1.4</id> |
| <description>If ValueExpression.setValue(context, val) was |
| called, |
| invoke elResolver.setValue(context, value-a, value-b, |
| val).</description> |
| <location chapter="1" section="6" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:16.5.2</id> |
| <description>Otherwise, invoke elResolver.getValue(value-a, |
| value-b)</description> |
| <location chapter="1" section="6" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:16.6</id> |
| <description>Otherwise, the expression is a method expression</description> |
| <location chapter="1" section="6" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:16.6.1</id> |
| <description>If expr-a[expr-b] is the last property being |
| resolved:</description> |
| <location chapter="1" section="6" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:16.6.1.1</id> |
| <description>Coerce value-b to String</description> |
| <location chapter="1" section="6" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:16.6.1.2</id> |
| <description>Find the method on object value-a with name |
| value-b and |
| with the set of expected parameter types provided |
| at parse time. If the |
| method does not exist, or the return |
| type does not match the expected |
| return type provided at parse |
| time, throw MethodNotFoundException.</description> |
| <location chapter="1" section="6" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:16.6.1.3</id> |
| <description>If MethodExpression.invoke(context, params) was |
| called, |
| invoke the found method with the parameters passed to |
| the invoke method</description> |
| <location chapter="1" section="6" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:16.6.1.4</id> |
| <description>If MethodExpression.getMethodInfo(context) was |
| called, |
| construct and return a new MethodInfo object.</description> |
| <location chapter="1" section="6" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:16.6.2</id> |
| <description>Otherwise invoke elResolver.getValue(value-a, |
| value-b).</description> |
| <location chapter="1" section="6" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:17</id> |
| <description>Binary operators - A { +,-,* } B</description> |
| <location chapter="1" section="7.1" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:46</id> |
| <description>If the operator is a +, and either A or B is a |
| String, |
| then + is |
| a string concatenation operator.</description> |
| <location chapter="1" section="7.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:17.1</id> |
| <description>If A and B are null, return (Long) 0</description> |
| <location chapter="1" section="7.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:17.2</id> |
| <description>If A or B is a BigDecimal, coerce both to BigDecimal |
| and then:</description> |
| <location chapter="1" section="7.1" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:17.2.1</id> |
| <description>If operator is +, return A.add(B)</description> |
| <location chapter="1" section="7.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:17.2.2</id> |
| <description>If operator is -, return A.subtract(B)</description> |
| <location chapter="1" section="7.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:17.2.3</id> |
| <description>If operator is *, return A.multiply(B)</description> |
| <location chapter="1" section="7.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:17.3</id> |
| <description>If A or B is Float, Double, or a String containing |
| ".", "e", or |
| "E":</description> |
| <location chapter="1" section="7.1" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:17.3.1</id> |
| <description>If A or B is BigInteger, coerce both A and B to |
| BigDecimal |
| and apply operator.</description> |
| <location chapter="1" section="7.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:17.3.2</id> |
| <description>Otherwise, coerce both A and B to Double and apply |
| operator</description> |
| <location chapter="1" section="7.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:17.4</id> |
| <description>If A or B is BigInteger, coerce both to BigInteger and |
| then:</description> |
| <location chapter="1" section="7.1" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:17.4.1</id> |
| <description>If operator is +, return A.add(B)</description> |
| <location chapter="1" section="7.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:17.4.2</id> |
| <description>If operator is -, return A.subtract(B)</description> |
| <location chapter="1" section="7.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:17.4.3</id> |
| <description>If operator is *, return A.multiply(B)</description> |
| <location chapter="1" section="7.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:17.5</id> |
| <description>Otherwise coerce both A and B to Long and apply |
| operator.</description> |
| <location chapter="1" section="7.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:17.6</id> |
| <description>If application of operator against A and B results in |
| an |
| exception, error.</description> |
| <location chapter="1" section="7.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:18</id> |
| <description>Binary operator - A { / or div } B</description> |
| <location chapter="1" section="7.2" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:18.1</id> |
| <description>If A and B are null, return (Long) 0</description> |
| <location chapter="1" section="7.2" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:18.2</id> |
| <description>If A or B is a BigDecimal or a BigInteger, coerce both |
| to |
| BigDecimal and return A.divide(B, BigDecimal.ROUND_HALF_UP)</description> |
| <location chapter="1" section="7.2" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:18.3</id> |
| <description>Otherwise, coerce both A and B to Double and apply |
| operator.</description> |
| <location chapter="1" section="7.2" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:23.4</id> |
| <description>If application of operator against A and B results in |
| an |
| exception, error.</description> |
| <location chapter="1" section="7.2" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:19</id> |
| <description>Binary Operator - A { % or mod } B</description> |
| <location chapter="1" section="7.3" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:19.1</id> |
| <description>If A and B are null, return (Long)0</description> |
| <location chapter="1" section="7.3" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:19.2</id> |
| <description>If A or B is a BigDecimal, Float, Double, or String |
| containing |
| ., e, or E, coerce both A and B to Double and apply |
| operator</description> |
| <location chapter="1" section="7.3" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:19.3</id> |
| <description>If A or B is a BigInteger, coerce both to BigInteger |
| and return |
| A.remainder(B).</description> |
| <location chapter="1" section="7.3" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:19.4</id> |
| <description>Otherwise coerce both A and B to Long and apply |
| operator.</description> |
| <location chapter="1" section="7.3" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:19.5</id> |
| <description>If operator results in exception, error</description> |
| <location chapter="1" section="7.3" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:20</id> |
| <description>Unary minus operator - -A</description> |
| <location chapter="1" section="7.4" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:20.1</id> |
| <description>If A is null, return (Long) 0</description> |
| <location chapter="1" section="7.4" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:20.2</id> |
| <description>If A is a BigDecimal or BigInteger, return A.negate()</description> |
| <location chapter="1" section="7.4" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:20.3</id> |
| <description>If A is a String:</description> |
| <location chapter="1" section="7.4" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:20.3.1</id> |
| <description>If A contains ".", "e", or "E", coerce to a Double |
| and apply |
| operator.</description> |
| <location chapter="1" section="7.4" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:20.3.2</id> |
| <description>Otherwise, coerce to a Long and apply operator</description> |
| <location chapter="1" section="7.4" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:20.3.3</id> |
| <description>If operation results in exception, error.</description> |
| <location chapter="1" section="7.4" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:20.4</id> |
| <description>If A is Byte, Short, Integer, Long, Float, Double:</description> |
| <location chapter="1" section="7.4" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:20.4.1</id> |
| <description>retain the type and apply the operator.</description> |
| <location chapter="1" section="7.4" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:20.4.2</id> |
| <description>If application of operator results in exception, |
| error.</description> |
| <location chapter="1" section="7.4" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:20.5</id> |
| <description>Otherwise, error</description> |
| <location chapter="1" section="7.4" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:47</id> |
| <description>String Concatenation Operator - A {+, cat} B</description> |
| <location chapter="1" section="8" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:47.1</id> |
| <description>The + operator is a string concatenation |
| operator if |
| and only if |
| at least one of the operands |
| is a String.</description> |
| <location chapter="1" section="8.1" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:47.1.1</id> |
| <description>Coerce A and B to String.</description> |
| <location chapter="1" section="8.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:47.1.2</id> |
| <description>Return the concatenated string of A and B.</description> |
| <location chapter="1" section="8.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:21</id> |
| <description>Relational operators - A { <,>,<=,=>,lt,gt,le,ge } |
| B</description> |
| <location chapter="1" section="9.1" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:21.1</id> |
| <description>If A==B, and operator is <=, le, >=, or ge, return |
| true</description> |
| <location chapter="1" section="9.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:21.2</id> |
| <description>If A or B is null, return false.</description> |
| <location chapter="1" section="9.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:21.3</id> |
| <description>If A or B is BigDecimal, coerce both A and B to |
| BigDecimal and |
| use the return value of A.compareTo(B).</description> |
| <location chapter="1" section="9.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:21.4</id> |
| <description>If A or B is Float or Double coerce both A and B to |
| Double and |
| apply operator.</description> |
| <location chapter="1" section="9.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:21.5</id> |
| <description>If A or B is BigInteger, coerce both A and B to |
| BigInteger and |
| use the return value of A.compareTo(B)</description> |
| <location chapter="1" section="9.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:21.6</id> |
| <description>If A or B is Byte, Short, Character, Integer, or Long, |
| coerce |
| both A and B to Long and apply operator.</description> |
| <location chapter="1" section="9.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:21.7</id> |
| <description>If A or B is String coerce both A and B to String, |
| compare |
| lexically.</description> |
| <location chapter="1" section="9.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:21.8</id> |
| <description>If A is Comparable: </description> |
| <location chapter="1" section="9.1" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:21.8.1</id> |
| <description>If A.compareTo(B) throws an exception, error</description> |
| <location chapter="1" section="9.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:21.8.2</id> |
| <description>Otherwise return the result of A.compareTo(B)</description> |
| <location chapter="1" section="9.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:21.9</id> |
| <description>If B is Comparable, then:</description> |
| <location chapter="1" section="9.1" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:21.9.1</id> |
| <description>If B.compareTo(A) throws exception, error</description> |
| <location chapter="1" section="9.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:21.9.2</id> |
| <description>Otherwise use result of B.compareTo(A)</description> |
| <location chapter="1" section="9.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:21.10</id> |
| <description>Otherwise, error</description> |
| <location chapter="1" section="9.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:22</id> |
| <description>Relational Operators - A { ==, !=, eq, ne } B</description> |
| <location chapter="1" section="9.2" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:22.1</id> |
| <description>If A == B, apply operator.</description> |
| <location chapter="1" section="9.2" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:22.2</id> |
| <description>If A or B is null, return false for == or eq, true for |
| != or ne</description> |
| <location chapter="1" section="9.2" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:22.3</id> |
| <description>If A or B is BigDecimal, coerce both A and B to |
| BigDecimal and |
| then:</description> |
| <location chapter="1" section="9.2" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:22.3.1</id> |
| <description>If operator is == or eq, return A.equals(B)</description> |
| <location chapter="1" section="9.2" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:22.3.2</id> |
| <description>If operator is != or ne, return !A.equals(B)</description> |
| <location chapter="1" section="9.2" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:22.4</id> |
| <description>If A or B is Float or Double coerce both A and B to |
| Double and |
| apply operator.</description> |
| <location chapter="1" section="9.2" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:22.5</id> |
| <description>If A or B is BigInteger, coerce both A and B to |
| BigInteger and |
| then:</description> |
| <location chapter="1" section="9.2" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:22.5.1</id> |
| <description>If operator is == or eq, return A.equals(B)</description> |
| <location chapter="1" section="9.2" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:22.5.2</id> |
| <description>If operator is != or ne, return !A.equals(B)</description> |
| <location chapter="1" section="9.2" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:22.6</id> |
| <description>If A or B is Byte, Short, Character, Integer, or Long, |
| coerce |
| both A and B to Long and apply operator.</description> |
| <location chapter="1" section="9.2" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:22.7</id> |
| <description>If A or B is Boolean coerce both A and B to Boolean, |
| apply |
| operator.</description> |
| <location chapter="1" section="9.2" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:22.8</id> |
| <description>If A or B is an enum, coerce both A and B to enum, |
| apply |
| operator</description> |
| <location chapter="1" section="9.2" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:22.9</id> |
| <description>If A or B is String coerce both A and B to String and |
| compare |
| lexically</description> |
| <location chapter="1" section="9.2" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:22.10</id> |
| <description>If error occurs calling A.equals(B), error</description> |
| <location chapter="1" section="9.2" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:22.11</id> |
| <description>Otherwise apply operator to result of A.equals(B).</description> |
| <location chapter="1" section="9.2" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:23</id> |
| <description>Binary Operator - A { &&, ||, and, or } B</description> |
| <location chapter="1" section="9.1" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:23.1</id> |
| <description>Coerce both A and B to Boolean and apply operator.</description> |
| <location chapter="1" section="9.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:23.2</id> |
| <description>The operator stops as soon as the expression can be |
| determined, i.e., A and B and C and D ? if B is false, then only A |
| and B is |
| evaluated.</description> |
| <location chapter="1" section="9.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:24</id> |
| <description>Logical Operators</description> |
| <location chapter="1" section="10" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:24.2</id> |
| <description>Binary operator - A {&&,||,and,or} B</description> |
| <location chapter="1" section="10.1" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:24.2.1</id> |
| <description>Coerce both A and B to Boolean, apply operator.</description> |
| <location chapter="1" section="10.2" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:24.1</id> |
| <description>Unary operator - { !, not } A</description> |
| <location chapter="1" section="10.2" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:24.1.1</id> |
| <description>Coerce A to Boolean and apply operator.</description> |
| <location chapter="1" section="10.2" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:25</id> |
| <description>Empty operator - empty A</description> |
| <location chapter="1" section="11" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:25.1</id> |
| <description>If A is null, return true</description> |
| <location chapter="1" section="11" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:25.2</id> |
| <description>If A is an emtpy String, return true.</description> |
| <location chapter="1" section="11" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:25.3</id> |
| <description>If A is an empty array, then return true.</description> |
| <location chapter="1" section="11" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:25.4</id> |
| <description>If A is an emtpy Map, then return true.</description> |
| <location chapter="1" section="11" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:25.5</id> |
| <description>If A is an empty Collection, then return true.</description> |
| <location chapter="1" section="11" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:25.6</id> |
| <description>Otherwise return false</description> |
| <location chapter="1" section="11" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:26</id> |
| <description>Conditional Operator - A ? B : C</description> |
| <location chapter="1" section="12" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:26.1</id> |
| <description>Evaluate B or C, depending on the result of the |
| evaluation of |
| A. |
| Coerce A to Boolean: |
| </description> |
| <location chapter="1" section="12" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:26.1.1</id> |
| <description>If A is true, evaluate and return B</description> |
| <location chapter="1" section="12" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:26.1.2</id> |
| <description>If A is false, evaluate and return C</description> |
| <location chapter="1" section="12" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:48</id> |
| <description>Assignment Operator - A = B</description> |
| <location chapter="1" section="13" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:48.1</id> |
| <description>Assign the value of B to A. A must be a lvalue, |
| otherwise, a |
| PropertyNotWritableException will be thrown. |
| </description> |
| <location chapter="1" section="13" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:48.1.1</id> |
| <description>Evluate expr-a, up to the last property reolution, |
| to |
| (base-a, prop-a)</description> |
| <location chapter="1" section="13" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:48.1.2</id> |
| <description>Evaluate expr-b, to value-b</description> |
| <location chapter="1" section="13" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:48.1.3</id> |
| <description>Invoke ELResolver.setValue(base-a, prop-a, value-b)</description> |
| <location chapter="1" section="13" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:48.1.4</id> |
| <description>Return value-b</description> |
| <location chapter="1" section="13" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:49</id> |
| <description>Semicolon Operator - A ; B</description> |
| <location chapter="1" section="14" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:49.1</id> |
| <description>To evaluate A;B, A is first evaluated, and its value |
| is |
| discarded. B is then evaluated and its value is returned.</description> |
| <location chapter="1" section="14" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:27</id> |
| <description>Parentheses can be used to change precedence</description> |
| <location chapter="1" section="15" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:28</id> |
| <description>Operator precedence (highest to lowest) - [] . then (), |
| then |
| -(unary) not ! empty, then * / div % mod, then + - (binary), |
| then < > |
| <= >= lt gt le ge, then == != eq ne, then && |
| and, then || or, then |
| ? : then -> then = then ;</description> |
| <location chapter="1" section="16" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:29</id> |
| <description>Qualified functions with a namespace prefix have |
| precedence over |
| the operators. [FunctionPrecedenceOverOperators]</description> |
| <location chapter="1" section="16" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:30</id> |
| <description>The following words are reserved for the language and |
| must not be |
| used as identifiers. |
| and eq gt true instanceof |
| or ne le |
| false empty |
| not lt ge |
| null div mod |
| </description> |
| <location chapter="1" section="17" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:31</id> |
| <description>EL functions are mapped, resolved and bound at parse |
| time. |
| [ELFunctionsBinding]</description> |
| <location chapter="1" section="18" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:32</id> |
| <description>It is the responsibility of the FunctionMapper class to |
| provide |
| the mapping of namespace-qualified functions to static |
| methods of specific |
| classes when expressions are created. |
| [FunctionMapperMapping]</description> |
| <location chapter="1" section="18" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:33</id> |
| <description>If no FunctionMapper is provided (by passing in null), |
| functions |
| are disabled. [FunctionMapperNull]</description> |
| <location chapter="1" section="" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:34</id> |
| <description>EL variables are mapped, resolved and bound at parse |
| time. |
| [ELVariablesBinding]</description> |
| <location chapter="1" section="19" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:35</id> |
| <description>It is the responsibility of the VariableMapper class to |
| provide |
| the mapping of EL variables to ValueExpressions when |
| expressions are created. |
| [VariableMapperMapping]</description> |
| <location chapter="1" section="19" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:36</id> |
| <description>If no VariableMapper is provided to a ValueExpression, |
| variable |
| mapping is disabled. [VariableMapperNull]</description> |
| <location chapter="1" section="19" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:50</id> |
| <description>Lambda Expressions</description> |
| <location chapter="1" section="20" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:50.1</id> |
| <description>x->x+1</description> |
| <location chapter="1" section="20" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:50.2</id> |
| <description>(x,y)->x+y</description> |
| <location chapter="1" section="20" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:50.3</id> |
| <description>((x,y)->x+y)(3,4) evaluates to 7.</description> |
| <location chapter="1" section="20" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:50.4</id> |
| <description>v = (x,y)->x+y</description> |
| <location chapter="1" section="20" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:50.5</id> |
| <description>v(3,4) evaluates to 7</description> |
| <location chapter="1" section="20" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:50.6</id> |
| <description>fact = n -> n==0? 1: n*fact(n-1); fact(5) evaluates to |
| 120</description> |
| <location chapter="1" section="20" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:50.7</id> |
| <description>It can also be passed as an argument to a method, and |
| be |
| invoked in the method, by invoking |
| jakarta.el.LambdaExpression.invoke(), such |
| as |
| employees.where(e->e.firstName == 'Larry')</description> |
| <location chapter="1" section="20" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:50.8</id> |
| <description>A Lambda expression can be nested within another |
| Lambda |
| expression, like |
| customers.select(c->[c.name, |
| c.orders.sum(o->o.total)])</description> |
| <location chapter="1" section="20" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:37</id> |
| <description>To coerce a value X to type Y</description> |
| <location chapter="1" section="23.1" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:37.1</id> |
| <description>If X is of a primitive type, Let X' be the equivalent |
| 'boxed |
| form' of X, otherwise, Let X' be the same as X.</description> |
| <location chapter="1" section="23.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:37.2</id> |
| <description>If Y is of a primitive type, Let Y' be the equivalent |
| 'boxed |
| form' of Y. Otherwise, let Y' be the same as Y.</description> |
| <location chapter="1" section="23.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:37.3</id> |
| <description>Apply the rules in Sections 1.18.2-1.18.7 for coercing |
| X' to Y'</description> |
| <location chapter="1" section="23.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:37.4</id> |
| <description>If Y is a primitive type, then the result is found by |
| 'unboxing' the result of the coercion. If the result of the |
| coercion is |
| null, then error.</description> |
| <location chapter="1" section="23.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:37.5</id> |
| <description>If Y is not a primitive type, then the result is the |
| result of |
| the coercion.</description> |
| <location chapter="1" section="23.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:38</id> |
| <description>Coerce A to String</description> |
| <location chapter="1" section="23.2" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:38.1</id> |
| <description>If A is a String: return A</description> |
| <location chapter="1" section="23.2" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:38.2</id> |
| <description>If A is null, return an empty String ("").</description> |
| <location chapter="1" section="23.2" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:38.3</id> |
| <description>If A is Enum, return A.name()</description> |
| <location chapter="1" section="23.2" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:38.4</id> |
| <description>If A.toString() throws exception, error.</description> |
| <location chapter="1" section="23.2" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:38.5</id> |
| <description>Otherwise return A.toString()</description> |
| <location chapter="1" section="23.2" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:39</id> |
| <description>Coerce A to Number type N</description> |
| <location chapter="1" section="23.3" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:39.1</id> |
| <description>If A is null or "", return 0</description> |
| <location chapter="1" section="23.3" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:39.2</id> |
| <description>If A is Character, convert to short, apply numeric |
| rules below.</description> |
| <location chapter="1" section="23.3" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:39.3</id> |
| <description>If A is a Boolean, then error.</description> |
| <location chapter="1" section="23.3" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:39.4</id> |
| <description>If A is Number type N, return A</description> |
| <location chapter="1" section="23.3" /> |
| </assertion> |
| <assertion required="true" impl-spec="true" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:39.5</id> |
| <description>If A is a Number, coerce quietly to type N using the |
| following |
| algorithm:</description> |
| <location chapter="1" section="23.3" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:39.5.1</id> |
| <description>If N is BigInteger:</description> |
| <location chapter="1" section="23.3" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:39.5.1.1</id> |
| <description>If A is a BigDecimal, return A.toBigInteger()</description> |
| <location chapter="1" section="23.3" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:39.5.1.2</id> |
| <description>Otherwise, return |
| BigInteger.valueOf(A.longValue())</description> |
| <location chapter="1" section="23.3" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:39.5.2</id> |
| <description>If N is BigDecimal</description> |
| <location chapter="1" section="23.3" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:39.5.2.1</id> |
| <description>If A is a BigInteger, return new BigDecimal(A)</description> |
| <location chapter="1" section="23.3" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:39.5.2.2</id> |
| <description>Otherwise, return new BigDecimal(A.doubleValue())</description> |
| <location chapter="1" section="23.3" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:39.5.3</id> |
| <description>If N is Byte, return new Byte(A.byteValue())</description> |
| <location chapter="1" section="23.3" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:39.5.4</id> |
| <description>If N is Short, return new Short(A.shortValue())</description> |
| <location chapter="1" section="23.3" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:39.5.5</id> |
| <description>If N is Integer, return new Integer(A.intValue())</description> |
| <location chapter="1" section="23.3" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:39.5.6</id> |
| <description>If N is Long, return new Long(A.longValue())</description> |
| <location chapter="1" section="23.3" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:39.5.7</id> |
| <description>If N is Float, return new Float(A.floatValue())</description> |
| <location chapter="1" section="23.3" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:39.5.8</id> |
| <description>If N is Double, return new Double(A.doubleValue())</description> |
| <location chapter="1" section="23.3" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:39.5.9</id> |
| <description>Otherwise, error.</description> |
| <location chapter="1" section="23.3" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:39.6</id> |
| <description>If A is String, then:</description> |
| <location chapter="1" section="23.3" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:39.6.1</id> |
| <description>If N is BigDecimal then:</description> |
| <location chapter="1" section="23.3" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:39.6.1.1</id> |
| <description>If new BigDecimal(A) throws an exception then |
| error.</description> |
| <location chapter="1" section="23.3" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:39.6.1.2</id> |
| <description>Otherwise, return new BigDecimal(A).</description> |
| <location chapter="1" section="23.3" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:39.7</id> |
| <description>If N is BigInteger then</description> |
| <location chapter="1" section="23.3" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:39.7.1</id> |
| <description>If new BigInteger(A) throws an exception then error.</description> |
| <location chapter="1" section="23.3" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:39.7.2</id> |
| <description>Otherwise, return new BigInteger(A).</description> |
| <location chapter="1" section="23.3" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:39.7.3</id> |
| <description>If N.valueOf(A) throws an exception, then error.</description> |
| <location chapter="1" section="23.3" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:39.7.4</id> |
| <description>Otherwise, return N.valueOf(A).</description> |
| <location chapter="1" section="23.3" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:39.8</id> |
| <description>Otherwise error.</description> |
| <location chapter="1" section="23.3" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:40</id> |
| <description>Coerce A to Character</description> |
| <location chapter="1" section="23.4" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:40.1</id> |
| <description>If A is null or "". return (char) 0</description> |
| <location chapter="1" section="23.4" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:40.2</id> |
| <description>If A is Character, then return A</description> |
| <location chapter="1" section="23.4" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:40.3</id> |
| <description>If A is Boolean, error.</description> |
| <location chapter="1" section="23.4" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:40.4</id> |
| <description>If A is Number, coerce quietly to type Short, then |
| return a |
| Character whose numeric value is equivalent to that |
| Short.</description> |
| <location chapter="1" section="23.4" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:40.5</id> |
| <description>If A is String, return A.charAt(0)</description> |
| <location chapter="1" section="23.4" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:40.6</id> |
| <description>All other types will result in an error.</description> |
| <location chapter="1" section="23.4" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:41</id> |
| <description>Coerce A to Boolean</description> |
| <location chapter="1" section="23.5" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:41.1</id> |
| <description>If A is null or "", return false</description> |
| <location chapter="1" section="23.5" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:41.2</id> |
| <description>Otherwise if A is Boolean, return A</description> |
| <location chapter="1" section="23.5" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:41.3</id> |
| <description>Otherwise if A is String, and Boolean.valueOf(A) does |
| not throw |
| an exception, return it.</description> |
| <location chapter="1" section="23.5" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:41.4</id> |
| <description>Otherwise error.</description> |
| <location chapter="1" section="23.5" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:42</id> |
| <description>Coerce A to an Enum Type T</description> |
| <location chapter="1" section="23.6" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:42.1</id> |
| <description>If A is null, return null</description> |
| <location chapter="1" section="23.6" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:42.2</id> |
| <description>If A is assignable to T, coerce quietly</description> |
| <location chapter="1" section="23.6" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:42.3</id> |
| <description>If A is "", return null.</description> |
| <location chapter="1" section="23.6" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:42.4</id> |
| <description>If A is a String call Enum.valueOf(T.getClass(), A) |
| and return |
| the result.</description> |
| <location chapter="1" section="23.6" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:81</id> |
| <description>Coerce A to array of type T</description> |
| <location chapter="1" section="23.7" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:81.1</id> |
| <description>If A is null, return null</description> |
| <location chapter="1" section="23.7" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:81.2</id> |
| <description>If A is assignable to an array of type T, coerce |
| quietly</description> |
| <location chapter="1" section="23.7" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:81.3</id> |
| <description>If A is an array, return a copy of the array where |
| each element has been coerced to type T using these |
| rules</description> |
| <location chapter="1" section="23.7" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:81.4</id> |
| <description>If A is an array but at least one element of the |
| array cannot be coerced to type T, error</description> |
| <location chapter="1" section="23.7" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:81.5</id> |
| <description>If A is not an array, error</description> |
| <location chapter="1" section="23.7" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:79</id> |
| <description>Coerce A to functional interface method invocation</description> |
| <location chapter="1" section="23.8" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:79.1</id> |
| <description>If A is LamdaEXpression and parameters are an exact match, coerce to functional interface invocation.</description> |
| <location chapter="1" section="23.8" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:79.2</id> |
| <description>If A is not LamdaEXpression, follow 1.23.9 and throw an exception.</description> |
| <location chapter="1" section="23.8" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:79.3</id> |
| <description>If A is LamdaEXpression and parameters match if coerced, coerce to functional interface invocation.</description> |
| <location chapter="1" section="23.8" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:43</id> |
| <description>Coerce A to any other type T</description> |
| <location chapter="1" section="23.9" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:43.1</id> |
| <description>If A is null, return null.</description> |
| <location chapter="1" section="23.9" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:43.2</id> |
| <description>If A is assignable to T, coerce quietly.</description> |
| <location chapter="1" section="23.9" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:43.3</id> |
| <description>If A is String, and T has no Property Editor, then if |
| A is "" |
| return null, otherwise error.</description> |
| <location chapter="1" section="23.9" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:43.4</id> |
| <description>If A is String, and T's PropertyEditor throws |
| exception, then |
| if A is "" return null, otherwise error.</description> |
| <location chapter="1" section="23.9" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:43.5</id> |
| <description>Otherwise, apply T's PropertyEditor</description> |
| <location chapter="1" section="23.9" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:43.6</id> |
| <description>Otherwise, error</description> |
| <location chapter="1" section="23.9" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| |
| <!-- Start Chapter 2, Operations on Collection Objects --> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:44</id> |
| <description>All Expressions must be Serializable</description> |
| <location chapter="2" section="1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:51</id> |
| <description> |
| Construct an instance of java.lang.util.Set<Object>. |
| </description> |
| <location chapter="2" section="2.2.1" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:51.1</id> |
| <description>SetData := '{' DataList '}'</description> |
| <location chapter="2" section="2.2.1.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:51.2</id> |
| <description>DataList := (expression (',' expression)* )?</description> |
| <location chapter="2" section="2.2.1.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:52</id> |
| <description> |
| Construct an instance of java.lang.util.List<Object>. |
| </description> |
| <location chapter="2" section="2.2.2" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:52.1</id> |
| <description>ListData := '{' DataList '}'</description> |
| <location chapter="2" section="2.2.2.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:52.2</id> |
| <description>DataList := (expression (',' expression)* )?</description> |
| <location chapter="2" section="2.2.2.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:53</id> |
| <description> |
| Construct an instance of java.lang.util.Map<Object>. |
| </description> |
| <location chapter="2" section="2.2.3" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:53.1</id> |
| <description>Map := '{' MapEntries '}'</description> |
| <location chapter="2" section="2.2.3.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:53.2</id> |
| <description>MapEntries := (MapEntry (',' MapEntry)* )?</description> |
| <location chapter="2" section="2.2.3.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:53.3</id> |
| <description>MapEntry := expression ':' expression</description> |
| <location chapter="2" section="2.2.3.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:54</id> |
| <description>Some methods have optional parameters. The |
| declarations |
| of the |
| methods with all possible combinations of the |
| parameters are |
| listed in the |
| syntax sections, as if they are |
| overloaded. A null |
| parameter is not allowed, |
| and will result in |
| NullPointerException.</description> |
| <location chapter="2" section="2.3.2" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:55</id> |
| <description> |
| An instant of Stream is obtained by calling the method |
| stream() |
| of a collection. The methods in this class support the |
| stream |
| operations and |
| are described in Section 2.3.5 to Section |
| 2.3.24. |
| </description> |
| <location chapter="2" section="2.3.3.1" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="false"> |
| <id>EL:SPEC:56</id> |
| <description> |
| The following are methods in an Optional<T> </description> |
| <location chapter="2" section="2.3.3.2" /> |
| <sub-assertions> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:56.1</id> |
| <description> |
| T get() Returns the value held by the Optional, or |
| throws an |
| ELException if the Optional is empty. |
| </description> |
| <location chapter="2" section="2.3.3.2" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:56.2</id> |
| <description> |
| T orElse(T other) Returns the value held by the |
| Optional, or |
| the value other if the Optional is empty. |
| </description> |
| <location chapter="2" section="2.3.3.2" /> |
| </assertion> |
| <assertion required="true" impl-spec="false" defined-by="technology" |
| status="active" testable="true"> |
| <id>EL:SPEC:56.3</id> |
| <description> |
| T orElseGet((()->T) other) Returns the value held by the |
| Optional, or the value returned by the lambda expression |
| other if |
| the |
| Optional is empty. |
| </description> |
| <location chapter="2" section="2.3.3.2" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:57</id> |
| <description>Some operations takes functions (lambda expressions) as |
| parameters. Again, we used the notion (arg1Type, |
| ...)->returnType |
| to |
| describe the argument types and the |
| return type of a function.</description> |
| <location chapter="2" section="2.3.4" /> |
| <sub-assertions> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:57.1</id> |
| <description>predicate S -> boolean |
| This function takes the input |
| argument, usually the element of the |
| source stream, and determines |
| if it |
| satisfies some criteria</description> |
| <location chapter="2" section="2.3.4.1" /> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:57.2</id> |
| <description>booleanSupplier () -> boolean |
| This function takes |
| noarguments, and returns a boolean |
| value.</description> |
| <location chapter="2" section="2.3.4.2" /> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:57.3</id> |
| <description>mapper S -> R |
| This function maps, or transforms the |
| input |
| argument, usually the |
| element of the source stream, to the |
| result.</description> |
| <location chapter="2" section="2.3.4.3" /> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:57.4</id> |
| <description> |
| comparator |
| (S, S) -> int |
| This function compares two |
| arguments, usually the elements of the |
| source stream, and returns a |
| negative integer, zero, or a positive |
| integer, if the first |
| argument is |
| respectively less than, equal |
| to, or greater than the |
| second argument. |
| </description> |
| <location chapter="2" section="2.3.4.4" /> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:57.5</id> |
| <description> |
| consumer S -> void |
| This function processes the input |
| argument, usually the element of the |
| source stream, and returns |
| nothing. |
| </description> |
| <location chapter="2" section="2.3.4.5" /> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:57.6</id> |
| <description> |
| binaryOperator (S, S) -> S |
| This function applies a |
| binary |
| operation to the input |
| arguments, and returns the result. |
| The first argument |
| is usually an internal |
| accumulator, and the |
| second argument is usually the |
| element of the source stream. The |
| arguments and the result are of the same |
| type. |
| </description> |
| <location chapter="2" section="2.3.4.6" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:58</id> |
| <description> |
| The filter method |
| produces a stream containing the source |
| stream |
| elements for which |
| the predicate function return true. The |
| argument |
| of |
| predicate |
| function represents the element to test. |
| </description> |
| <location chapter="2" section="2.3.5" /> |
| <sub-assertions> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:58.1</id> |
| <description> |
| Stream<S> </description> |
| <location chapter="2" section="2.3.5.1" /> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:58.2</id> |
| <description> |
| Stream<S>.filter((S->boolean) predicate) |
| </description> |
| <location chapter="2" section="2.3.5.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:59</id> |
| <description> |
| The map method produces a stream by applying the mapper |
| function |
| on the elements of the source stream. The argument of |
| mapper function |
| represents the element to process. |
| </description> |
| <location chapter="2" section="2.3.6" /> |
| <sub-assertions> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:59.1</id> |
| <description> |
| Stream<R> Stream<S>.map((S->R)mapper) |
| </description> |
| <location chapter="2" section="2.3.6.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:60</id> |
| <description> |
| The flatMap method produces a stream by mapping each of the |
| source elements to another stream and then concatenating the mapped streams. |
| If the mapper function does not return a Stream, the behavior is undefined. |
| source elements to zero or more elements. |
| </description> |
| <location chapter="2" section="2.3.7" /> |
| <sub-assertions> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:60.1</id> |
| <description> |
| Stream<R> |
| Stream<S>.flatMap((S->Stream<R>) mapper) |
| </description> |
| <location chapter="2" section="2.3.7.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:61</id> |
| <description> |
| The distinct method produces a stream containing the |
| elements of |
| the source stream that are distinct, according to |
| Object.equals. |
| </description> |
| <location chapter="2" section="2.3.8" /> |
| <sub-assertions> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:61.1</id> |
| <description> |
| Stream<S> Stream<S>.distinct() |
| </description> |
| <location chapter="2" section="2.3.8.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:62</id> |
| <description> |
| The sorted method produces a stream containing the |
| elements of |
| the source |
| stream in sorted order. If no comparator is |
| specified, the elements |
| are sorted in natural order, and a |
| ELException is thrown if the |
| elements do |
| not implement |
| java.lang.Comparable. If a comparator is |
| specified, the elements |
| are |
| sorted with the provided comparator. |
| </description> |
| <location chapter="2" section="2.3.9" /> |
| <sub-assertions> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:62.1</id> |
| <description> |
| Stream<S> Stream<S>.sorted() |
| </description> |
| <location chapter="2" section="2.3.9.1" /> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:62.2</id> |
| <description> |
| Stream<S> Stream<S>.sorted((p,q)->int) |
| comparator) |
| </description> |
| <location chapter="2" section="2.3.9.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="false" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:63</id> |
| <description> |
| The forEach method invokes the consumer function for each |
| element in the source |
| stream. This method always returns null. |
| </description> |
| <location chapter="2" section="2.3.10" /> |
| <sub-assertions> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:63.1</id> |
| <description> |
| Object stream<S>.forEach(((S)->void)consumer) |
| </description> |
| <location chapter="2" section="2.3.10.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="false" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:64</id> |
| <description> |
| The peek method produces a stream containing the elements of the |
| source stream, and |
| invokes the consumer function for each element in the |
| stream. |
| </description> |
| <location chapter="2" section="2.3.11" /> |
| <sub-assertions> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:64.1</id> |
| <description> |
| Stream<S> Stream<S>.peek(((S)->void)consumer) |
| </description> |
| <location chapter="2" section="2.3.11.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="false" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:65</id> |
| <description> |
| The iterator method returns an iterator for the source stream, |
| suitable for use in Java codes. |
| </description> |
| <location chapter="2" section="2.3.11" /> |
| <sub-assertions> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:65.1</id> |
| <description> |
| Iterator<S> Stream<S>.iterator() |
| </description> |
| <location chapter="2" section="2.3.11.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="false" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:66</id> |
| <description> |
| The limit method produces a stream containing the first count |
| number of elements of the source stream. |
| </description> |
| <location chapter="2" section="2.3.13" /> |
| <sub-assertions> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:66.1</id> |
| <description> |
| Stream<S> Stream<S>.limit(long count) |
| </description> |
| <location chapter="2" section="2.3.13.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="false" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:67</id> |
| <description> |
| The substream method produces a stream containing the source |
| elements, skipping the first start elements, and including the rest of the |
| elements in the stream if end is not specified, or the next (end - start) |
| elements in the stream if end is specified. |
| </description> |
| <location chapter="2" section="2.3.14" /> |
| <sub-assertions> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:67.1</id> |
| <description> |
| Stream<S> Stream<S>.substream(long start) |
| </description> |
| <location chapter="2" section="2.3.14.1" /> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:67.2</id> |
| <description> |
| Stream<S> Stream<S>.substream(long start, |
| long end) |
| </description> |
| <location chapter="2" section="2.3.14.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="false" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:68</id> |
| <description> |
| the toArray method returns an array containing the elements of |
| the source stream. |
| </description> |
| <location chapter="2" section="2.3.15" /> |
| <sub-assertions> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:68.1</id> |
| <description> |
| S[] Stream<S>.toArray() |
| </description> |
| <location chapter="2" section="2.3.15.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="false" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:69</id> |
| <description> |
| The toList |
| </description> |
| <location chapter="2" section="2.3.16" /> |
| <sub-assertions> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:69.1</id> |
| <description> |
| S[] Stream<S>.toList() |
| </description> |
| <location chapter="2" section="2.3.16.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="false" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:70</id> |
| <description> |
| The reduce method with a seed value starts by assigning the seed |
| value to an internal accumulator. Then for each of the elements in the |
| source stream, the next accumulator value is computed, by invoking the |
| binaryOperator function, with the current accumulator value as the first |
| argument and the current element as the second argument. The final |
| accumulator value is returned |
| </description> |
| <location chapter="2" section="2.3.17" /> |
| <sub-assertions> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:70.1</id> |
| <description> |
| Optional<S> Stream<S>.reduce(((S,S)->S) |
| binaryOperator) |
| </description> |
| <location chapter="2" section="2.3.17.1" /> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:70.2</id> |
| <description> |
| S Stream<S>.reduce(S seed, ((S,S)->S) |
| binaryOperator)) |
| </description> |
| <location chapter="2" section="2.3.17.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="false" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:71</id> |
| <description> |
| The max method computes the maximum of the elelments in the |
| source stream. If the comparator function is specified, it is used for |
| comparisons. If no comparator function is specified, the elements themselves |
| are compared, and must implement Comparable, otherwise an ELException is |
| thrown. |
| </description> |
| <location chapter="2" section="2.3.18" /> |
| <sub-assertions> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:71.1</id> |
| <description> |
| Optional Stream<S>.max() |
| </description> |
| <location chapter="2" section="2.3.18.1" /> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:71.2</id> |
| <description> |
| Optional Stream<S>.max(((p,q)->int) comparator) |
| </description> |
| <location chapter="2" section="2.3.18.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="false" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:72</id> |
| <description> |
| The min method computes the minimum of the elelments in the |
| source stream. If the comparator function is specified, it is used for |
| comparisons. If no comparator function is specified, the elements themselves |
| are compared, and must implement Comparable, otherwise an ELException is |
| thrown. |
| </description> |
| <location chapter="2" section="2.3.19" /> |
| <sub-assertions> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:72.1</id> |
| <description> |
| Optional Stream<S>.min() |
| </description> |
| <location chapter="2" section="2.3.19.1" /> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:72.2</id> |
| <description> |
| Optional Stream<S>.min(((p,q)->int) comparator) |
| </description> |
| <location chapter="2" section="2.3.19.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="false" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:73</id> |
| <description> |
| The average method computes the average of all elements in the |
| source stream by first computes the sum of the elements and then divides the |
| sum by the number of elements. The elements are coerced to Number types |
| according to Section 1.23.3 during the computation. |
| This method returns zero |
| for an empty stream. |
| </description> |
| <location chapter="2" section="2.3.20" /> |
| <sub-assertions> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:73.1</id> |
| <description> |
| Optional Stream<S>.average() |
| </description> |
| <location chapter="2" section="2.3.20.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="false" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:74</id> |
| <description> |
| The sum method computes the sum of all elements in the source |
| stream. The elements are coerced to Number types according to Section 1.23.3 |
| during the computation. |
| This method returns zero for an empty stream. |
| </description> |
| <location chapter="2" section="2.3.21" /> |
| <sub-assertions> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:74.1</id> |
| <description> |
| Number Stream<S>.sum() |
| </description> |
| <location chapter="2" section="2.3.21.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="false" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:79</id> |
| <description> |
| This method returns the count of elements in the source stream. |
| </description> |
| <location chapter="2" section="2.3.22" /> |
| <sub-assertions> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:79.1</id> |
| <description> |
| Long Stream<S>.count() |
| </description> |
| <location chapter="2" section="2.3.22.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="false" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:75</id> |
| <description> |
| The anyMatch method returns an Optional of true if any element |
| in the source stream satisfies the test given by the predicate. It returns |
| an empty Optional if the stream is empty. |
| </description> |
| <location chapter="2" section="2.3.23" /> |
| <sub-assertions> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:75.1</id> |
| <description> |
| Optional<boolean> |
| Stream<S>.anyMatch((S->boolean) predicate) |
| </description> |
| <location chapter="2" section="2.3.23.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="false" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:76</id> |
| <description> |
| The allMatch method returns an Optional of true if all elements |
| in the source stream satisfy the test given by the predicate. It returns an |
| empty Optional if the stream is empty. |
| </description> |
| <location chapter="2" section="2.3.24" /> |
| <sub-assertions> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:76.1</id> |
| <description> |
| Optional<boolean> |
| Stream<S>.allMatch((S->boolean) predicate) |
| </description> |
| <location chapter="2" section="2.3.24.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="false" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:77</id> |
| <description> |
| The nonematch method returns an Optional of true if none of the |
| elements in the source stream satisfies the test given by the predicate. It |
| returns an empty Optional if the stream is empty. |
| </description> |
| <location chapter="2" section="2.3.25" /> |
| <sub-assertions> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:77.1</id> |
| <description> |
| Optional<boolean> |
| Stream<S>.noneMatch((S->boolean) predicate) |
| </description> |
| <location chapter="2" section="2.3.25.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| <assertion defined-by="technology" status="active" testable="false" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:78</id> |
| <description> |
| The findFirst method returns an Optional containing the first |
| element in the stream, or an empty Optional if the stream is empty. |
| </description> |
| <location chapter="2" section="2.3.26" /> |
| <sub-assertions> |
| <assertion defined-by="technology" status="active" testable="true" |
| impl-spec="true" required="true"> |
| <id>EL:SPEC:78.1</id> |
| <description> |
| Optional<S> Stream<S>.findFirst() |
| </description> |
| <location chapter="2" section="2.3.26.1" /> |
| </assertion> |
| </sub-assertions> |
| </assertion> |
| </assertions> |
| </spec> |