This is an automated email from the ASF dual-hosted git repository. asf-gitbox-commits pushed a commit to branch openformula in repository https://gitbox.apache.org/repos/asf/openoffice.git
commit 99b951c4803b990feec7c409905a0da7f58c01e1 Author: Pedro Giffuni <[email protected]> AuthorDate: Wed Nov 11 14:47:15 2026 -0500 sc: correct OpenFormula Milestone D audit statuses (D.1) and add Small Group semantic tests (E) D.1 - Audit corrections: - Changed all 110 Small Group function statuses from IMPLEMENTED_MATCH to IMPLEMENTED_UNVERIFIED (implementation presence confirmed, semantic equivalence not runtime-verified) - Marked all 4 Basic Limits as UNVERIFIED (dynamic structures don't prove conformance) - Distinguished conversion implementation presence from semantic verification - Identified specific unverified grammar cases in Syntax section - Corrected INDEX row-vector behavior description (Milestone A fix: returns error, not column) - Corrected CONVERT atm value (Milestone C fix: 101325.1 Pa, not 101324.996583 Pa) - Reconciled test-gap-analysis.md with Milestones A-C (IFNA/SKEWP implemented, INDEX/CONVERT fixed) - Updated openformula-functions.tsv: IFNA and SKEWP status IMPLEMENTED E - Semantic test infrastructure: - test/odf-validate/openformula-small-group-1.4.tsv: 53 requirement-referenced test cases covering Basic Limits, Syntax, Operators, Conversions, Functions, and INDEX/COUNTA/DATE/BIT semantic cases - test/odf-validate/calcval-cases14.tsv: Added 13 semantic test cases (COUNTA, COUNTBLANK, DATE pre-1583, INDEX row-vector, BITLSHIFT/BITRSHIFT negative shift, BITAND 3-param) - openformula-small-group-test-plan.md: Execution instructions, priority order, outstanding runtime requirements No production source changes. Build/runtime validation deferred (no configured AOO build tree). --- openformula-small-group-1.4.tsv | 298 +++++++++++----------- openformula-small-group-audit.md | 234 +++++------------ openformula-small-group-test-plan.md | 90 +++++++ openformula-test-gap-analysis.md | 12 +- test/odf-validate/calcval-cases14.tsv | 10 + test/odf-validate/openformula-small-group-1.4.tsv | 79 ++++++ 6 files changed, 400 insertions(+), 323 deletions(-) diff --git a/openformula-small-group-1.4.tsv b/openformula-small-group-1.4.tsv index 25a1c0a67f..968dd7ccff 100644 --- a/openformula-small-group-1.4.tsv +++ b/openformula-small-group-1.4.tsv @@ -1,149 +1,149 @@ -ReqID Section Requirement Description Mandatory/Optional Conformance Group ODF Version Introduced/Changed Suggested Test -SG-BL-001 3.7 Formula length: at least 1024 characters long as measured in OpenDocument interchange format Mandatory Small ODF 1.4 Parse a 1024+ character formula; verify accepted. -SG-BL-002 3.7 At least 30 parameters per function when prototype permits parameter list Mandatory Small ODF 1.4 Call function with 30 parameters; verify accepted. -SG-BL-003 3.7 Permit strings of ASCII characters up to 32767 (2^15-1) characters Mandatory Small ODF 1.4 Parse/return 32767-character string; verify accepted. -SG-BL-004 3.7 Support at least 7 nesting levels of functions Mandatory Small ODF 1.4 Nest 7 levels of functions; verify accepted. -SG-FN-001 6.16.2 ABS Mandatory Small ODF 1.2 Evaluate ABS(-3); verify 3. -SG-FN-002 6.16.3 ACOS Mandatory Small ODF 1.2 Evaluate ACOS(0); verify pi/2. -SG-FN-003 6.15.2 AND Mandatory Small ODF 1.2 Evaluate AND(TRUE,TRUE); verify TRUE. -SG-FN-004 6.16.7 ASIN Mandatory Small ODF 1.2 Evaluate ASIN(0); verify 0. -SG-FN-005 6.16.9 ATAN Mandatory Small ODF 1.2 Evaluate ATAN(0); verify 0. -SG-FN-006 6.16.10 ATAN2 Mandatory Small ODF 1.2 Evaluate ATAN2(1,1); verify pi/4. -SG-FN-007 6.18.3 AVERAGE Mandatory Small ODF 1.2 Evaluate AVERAGE(1,2,3); verify 2. -SG-FN-008 6.18.5 AVERAGEIF Mandatory Small ODF 1.2 Evaluate AVERAGEIF(range,criteria); verify average. -SG-FN-009 6.14.3 CHOOSE Mandatory Small ODF 1.2 Evaluate CHOOSE(2,"a","b","c"); verify "b". -SG-FN-010 6.13.5 COLUMNS Mandatory Small ODF 1.2 Evaluate COLUMNS(A1:C1); verify 3. -SG-FN-011 6.16.19 COS Mandatory Small ODF 1.2 Evaluate COS(0); verify 1. -SG-FN-012 6.13.6 COUNT Mandatory Small ODF 1.2 Evaluate COUNT(1,2,"x"); verify 2. -SG-FN-013 6.13.7 COUNTA Mandatory Small ODF 1.2 Evaluate COUNTA(1,"x",""); verify non-empty count. -SG-FN-014 6.13.8 COUNTBLANK Mandatory Small ODF 1.2 Evaluate COUNTBLANK(range); verify blank count. -SG-FN-015 6.13.9 COUNTIF Mandatory Small ODF 1.2 Evaluate COUNTIF(range,criteria); verify count. -SG-FN-016 6.10.2 DATE Mandatory Small ODF 1.2 Evaluate DATE(2025,1,1); verify serial. -SG-FN-017 6.9.2 DAVERAGE Mandatory Small ODF 1.2 Evaluate DAVERAGE(database,field,criteria); verify average. -SG-FN-018 6.10.5 DAY Mandatory Small ODF 1.2 Evaluate DAY(DATE(2025,3,15)); verify 15. -SG-FN-019 6.9.3 DCOUNT Mandatory Small ODF 1.2 Evaluate DCOUNT(database,field,criteria); verify count. -SG-FN-020 6.9.4 DCOUNTA Mandatory Small ODF 1.2 Evaluate DCOUNTA(database,field,criteria); verify count. -SG-FN-021 6.12.14 DDB Mandatory Small ODF 1.2 Evaluate DDB(cost,salvage,life,period); verify depreciation. -SG-FN-022 6.16.25 DEGREES Mandatory Small ODF 1.2 Evaluate DEGREES(PI()); verify 180. -SG-FN-023 6.9.5 DGET Mandatory Small ODF 1.2 Evaluate DGET(database,field,criteria); verify value. -SG-FN-024 6.9.6 DMAX Mandatory Small ODF 1.2 Evaluate DMAX(database,field,criteria); verify max. -SG-FN-025 6.9.7 DMIN Mandatory Small ODF 1.2 Evaluate DMIN(database,field,criteria); verify min. -SG-FN-026 6.9.8 DPRODUCT Mandatory Small ODF 1.2 Evaluate DPRODUCT(database,field,criteria); verify product. -SG-FN-027 6.9.9 DSTDEV Mandatory Small ODF 1.2 Evaluate DSTDEV(database,field,criteria); verify stddev. -SG-FN-028 6.9.10 DSTDEVP Mandatory Small ODF 1.2 Evaluate DSTDEVP(database,field,criteria); verify stddevp. -SG-FN-029 6.9.11 DSUM Mandatory Small ODF 1.2 Evaluate DSUM(database,field,criteria); verify sum. -SG-FN-030 6.9.12 DVAR Mandatory Small ODF 1.2 Evaluate DVAR(database,field,criteria); verify variance. -SG-FN-031 6.9.13 DVARP Mandatory Small ODF 1.2 Evaluate DVARP(database,field,criteria); verify variancep. -SG-FN-032 6.16.30 EVEN Mandatory Small ODF 1.2 Evaluate EVEN(1.3); verify 2. -SG-FN-033 6.20.8 EXACT Mandatory Small ODF 1.2 Evaluate EXACT("a","a"); verify TRUE. -SG-FN-034 6.16.31 EXP Mandatory Small ODF 1.2 Evaluate EXP(1); verify e. -SG-FN-035 6.16.32 FACT Mandatory Small ODF 1.2 Evaluate FACT(5); verify 120. -SG-FN-036 6.15.3 FALSE Mandatory Small ODF 1.2 Evaluate FALSE(); verify FALSE. -SG-FN-037 6.20.9 FIND Mandatory Small ODF 1.2 Evaluate FIND("b","abc"); verify 2. -SG-FN-038 6.12.20 FV Mandatory Small ODF 1.2 Evaluate FV(rate,nper,pmt); verify future value. -SG-FN-039 6.14.5 HLOOKUP Mandatory Small ODF 1.2 Evaluate HLOOKUP(value,table,row); verify result. -SG-FN-040 6.10.11 HOUR Mandatory Small ODF 1.2 Evaluate HOUR(TIME(12,30,0)); verify 12. -SG-FN-041 6.15.4 IF Mandatory Small ODF 1.2 Evaluate IF(TRUE,1,2); verify 1. -SG-FN-042 6.14.6 INDEX Mandatory Small ODF 1.2 Evaluate INDEX(range,row,col); verify cell value. -SG-FN-043 6.17.2 INT Mandatory Small ODF 1.2 Evaluate INT(1.9); verify 1. -SG-FN-044 6.12.24 IRR Mandatory Small ODF 1.2 Evaluate IRR(values); verify internal rate of return. -SG-FN-045 6.13.14 ISBLANK Mandatory Small ODF 1.2 Evaluate ISBLANK(cell); verify TRUE/FALSE. -SG-FN-046 6.13.15 ISERR Mandatory Small ODF 1.2 Evaluate ISERR(1/0); verify TRUE. -SG-FN-047 6.13.16 ISERROR Mandatory Small ODF 1.2 Evaluate ISERROR(1/0); verify TRUE. -SG-FN-048 6.13.19 ISLOGICAL Mandatory Small ODF 1.2 Evaluate ISLOGICAL(TRUE); verify TRUE. -SG-FN-049 6.13.20 ISNA Mandatory Small ODF 1.2 Evaluate ISNA(NA()); verify TRUE. -SG-FN-050 6.13.21 ISNONTEXT Mandatory Small ODF 1.2 Evaluate ISNONTEXT(1); verify TRUE. -SG-FN-051 6.13.22 ISNUMBER Mandatory Small ODF 1.2 Evaluate ISNUMBER(1); verify TRUE. -SG-FN-052 6.13.25 ISTEXT Mandatory Small ODF 1.2 Evaluate ISTEXT("a"); verify TRUE. -SG-FN-053 6.20.12 LEFT Mandatory Small ODF 1.2 Evaluate LEFT("abc",2); verify "ab". -SG-FN-054 6.20.13 LEN Mandatory Small ODF 1.2 Evaluate LEN("abc"); verify 3. -SG-FN-055 6.16.39 LN Mandatory Small ODF 1.2 Evaluate LN(1); verify 0. -SG-FN-056 6.16.40 LOG Mandatory Small ODF 1.2 Evaluate LOG(100,10); verify 2. -SG-FN-057 6.16.41 LOG10 Mandatory Small ODF 1.2 Evaluate LOG10(100); verify 2. -SG-FN-058 6.20.14 LOWER Mandatory Small ODF 1.2 Evaluate LOWER("ABC"); verify "abc". -SG-FN-059 6.14.9 MATCH Mandatory Small ODF 1.2 Evaluate MATCH(value,range,type); verify position. -SG-FN-060 6.18.45 MAX Mandatory Small ODF 1.2 Evaluate MAX(1,2,3); verify 3. -SG-FN-061 6.20.15 MID Mandatory Small ODF 1.2 Evaluate MID("abc",2,1); verify "b". -SG-FN-062 6.18.48 MIN Mandatory Small ODF 1.2 Evaluate MIN(1,2,3); verify 1. -SG-FN-063 6.10.13 MINUTE Mandatory Small ODF 1.2 Evaluate MINUTE(TIME(12,30,0)); verify 30. -SG-FN-064 6.16.42 MOD Mandatory Small ODF 1.2 Evaluate MOD(5,2); verify 1. -SG-FN-065 6.10.14 MONTH Mandatory Small ODF 1.2 Evaluate MONTH(DATE(2025,3,15)); verify 3. -SG-FN-066 6.13.26 N Mandatory Small ODF 1.2 Evaluate N(TRUE); verify 1. -SG-FN-067 6.13.27 NA Mandatory Small ODF 1.2 Evaluate NA(); verify #N/A error. -SG-FN-068 6.15.7 NOT Mandatory Small ODF 1.2 Evaluate NOT(TRUE); verify FALSE. -SG-FN-069 6.10.16 NOW Mandatory Small ODF 1.2 Evaluate NOW(); verify current datetime. -SG-FN-070 6.12.29 NPER Mandatory Small ODF 1.2 Evaluate NPER(rate,pmt,pv); verify periods. -SG-FN-071 6.12.30 NPV Mandatory Small ODF 1.2 Evaluate NPV(rate,values); verify net present value. -SG-FN-072 6.16.44 ODD Mandatory Small ODF 1.2 Evaluate ODD(1.3); verify 3. -SG-FN-073 6.15.8 OR Mandatory Small ODF 1.2 Evaluate OR(FALSE,TRUE); verify TRUE. -SG-FN-074 6.16.45 PI Mandatory Small ODF 1.2 Evaluate PI(); verify pi. -SG-FN-075 6.12.36 PMT Mandatory Small ODF 1.2 Evaluate PMT(rate,nper,pv); verify payment. -SG-FN-076 6.16.46 POWER Mandatory Small ODF 1.2 Evaluate POWER(2,3); verify 8. -SG-FN-077 6.16.47 PRODUCT Mandatory Small ODF 1.2 Evaluate PRODUCT(2,3); verify 6. -SG-FN-078 6.20.16 PROPER Mandatory Small ODF 1.2 Evaluate PROPER("abc"); verify "Abc". -SG-FN-079 6.12.41 PV Mandatory Small ODF 1.2 Evaluate PV(rate,nper,pmt); verify present value. -SG-FN-080 6.16.49 RADIANS Mandatory Small ODF 1.2 Evaluate RADIANS(180); verify pi. -SG-FN-081 6.12.42 RATE Mandatory Small ODF 1.2 Evaluate RATE(nper,pmt,pv); verify rate. -SG-FN-082 6.20.17 REPLACE Mandatory Small ODF 1.2 Evaluate REPLACE("abc",2,1,"x"); verify "axc". -SG-FN-083 6.20.18 REPT Mandatory Small ODF 1.2 Evaluate REPT("a",3); verify "aaa". -SG-FN-084 6.20.19 RIGHT Mandatory Small ODF 1.2 Evaluate RIGHT("abc",2); verify "bc". -SG-FN-085 6.17.5 ROUND Mandatory Small ODF 1.2 Evaluate ROUND(1.6,0); verify 2. -SG-FN-086 6.13.30 ROWS Mandatory Small ODF 1.2 Evaluate ROWS(A1:A3); verify 3. -SG-FN-087 6.10.17 SECOND Mandatory Small ODF 1.2 Evaluate SECOND(TIME(12,30,45)); verify 45. -SG-FN-088 6.16.55 SIN Mandatory Small ODF 1.2 Evaluate SIN(0); verify 0. -SG-FN-089 6.12.45 SLN Mandatory Small ODF 1.2 Evaluate SLN(cost,salvage,life); verify depreciation. -SG-FN-090 6.16.58 SQRT Mandatory Small ODF 1.2 Evaluate SQRT(4); verify 2. -SG-FN-091 6.18.72 STDEV Mandatory Small ODF 1.2 Evaluate STDEV(values); verify sample stddev. -SG-FN-092 6.18.74 STDEVP Mandatory Small ODF 1.2 Evaluate STDEVP(values); verify population stddev. -SG-FN-093 6.20.21 SUBSTITUTE Mandatory Small ODF 1.2 Evaluate SUBSTITUTE("aaa","a","b"); verify "bbb". -SG-FN-094 6.16.61 SUM Mandatory Small ODF 1.2 Evaluate SUM(1,2,3); verify 6. -SG-FN-095 6.16.62 SUMIF Mandatory Small ODF 1.2 Evaluate SUMIF(range,criteria,sumrange); verify sum. -SG-FN-096 6.12.46 SYD Mandatory Small ODF 1.2 Evaluate SYD(cost,salvage,life,period); verify depreciation. -SG-FN-097 6.20.22 T Mandatory Small ODF 1.2 Evaluate T("abc"); verify "abc". -SG-FN-098 6.16.69 TAN Mandatory Small ODF 1.2 Evaluate TAN(0); verify 0. -SG-FN-099 6.10.18 TIME Mandatory Small ODF 1.2 Evaluate TIME(12,30,0); verify time serial. -SG-FN-100 6.10.20 TODAY Mandatory Small ODF 1.2 Evaluate TODAY(); verify current date serial. -SG-FN-101 6.20.24 TRIM Mandatory Small ODF 1.2 Evaluate TRIM(" a b "); verify "a b". -SG-FN-102 6.15.9 TRUE Mandatory Small ODF 1.2 Evaluate TRUE(); verify TRUE. -SG-FN-103 6.17.8 TRUNC Mandatory Small ODF 1.2 Evaluate TRUNC(1.9); verify 1. -SG-FN-104 6.20.27 UPPER Mandatory Small ODF 1.2 Evaluate UPPER("abc"); verify "ABC". -SG-FN-105 6.13.34 VALUE Mandatory Small ODF 1.2 Evaluate VALUE("123"); verify 123. -SG-FN-106 6.18.82 VAR Mandatory Small ODF 1.2 Evaluate VAR(values); verify sample variance. -SG-FN-107 6.18.84 VARP Mandatory Small ODF 1.2 Evaluate VARP(values); verify population variance. -SG-FN-108 6.14.12 VLOOKUP Mandatory Small ODF 1.2 Evaluate VLOOKUP(value,table,col,range); verify result. -SG-FN-109 6.10.21 WEEKDAY Mandatory Small ODF 1.2 Evaluate WEEKDAY(date); verify day number. -SG-FN-110 6.10.24 YEAR Mandatory Small ODF 1.2 Evaluate YEAR(DATE(2025,3,15)); verify 2025. -SG-ALW-001 2.3.2.F References containing more than one area need not be evaluated Optional Small ODF 1.4 Reference with multiple areas; may return error or partial result. -SG-ALW-002 2.3.2.G Inline arrays need not be implemented Optional Small ODF 1.4 Use {1,2} inline array; may return error. -SG-ALW-003 2.3.2.G Complex numbers need not be implemented Optional Small ODF 1.4 Use COMPLEX function; may return error. -SG-ALW-004 2.3.2.G Reference union operator (~) need not be implemented Optional Small ODF 1.4 Use A1:B2~C3:D4; may return error. -SG-SYN-001 4.11.11 Criteria syntax supported Mandatory Small ODF 1.4 Use criteria in database functions; verify parsed correctly. -SG-SYN-002 5.2 Basic Expressions syntax supported Mandatory Small ODF 1.4 Parse parenthesized expressions; verify evaluation. -SG-SYN-003 5.3 Constant Numbers syntax supported Mandatory Small ODF 1.4 Parse numeric literals including decimals, scientific notation; verify. -SG-SYN-004 5.4 Constant Strings syntax supported Mandatory Small ODF 1.4 Parse string literals with quote escaping; verify. -SG-SYN-005 5.5 Operators syntax supported (precedence per Table 1) Mandatory Small ODF 1.4 Evaluate 2+3*4 and 2^3^2; verify correct precedence. -SG-SYN-006 5.6 Functions and Function Parameters syntax supported Mandatory Small ODF 1.4 Call functions with various argument counts; verify. -SG-SYN-007 5.7 Nonstandard Function Names recognized as errors Mandatory Small ODF 1.4 Use unknown function name; verify error result. -SG-SYN-008 5.8 References syntax supported Mandatory Small ODF 1.4 Use cell and range references; verify resolution. -SG-SYN-009 5.11 Simple Named Expressions supported Mandatory Small ODF 1.4 Define and use named expression; verify. -SG-SYN-010 5.12 Errors syntax supported Mandatory Small ODF 1.4 Use error constants (#N/A, etc.); verify propagation. -SG-SYN-011 5.14 Whitespace handling per specification Mandatory Small ODF 1.4 Insert whitespace in formula; verify identical result. -SG-CONV-001 6.3.14 Conversion to Text implemented Mandatory Small ODF 1.4 Convert number/date/logical to text; verify result. -SG-CONV-002 6.3.5 Conversion to Number implemented Mandatory Small ODF 1.4 Convert text to number; verify result. -SG-CONV-003 4.8 Reference conversion implemented Mandatory Small ODF 1.4 Convert reference to scalar value; verify result. -SG-CONV-004 6.3.12 Conversion to Logical implemented Mandatory Small ODF 1.4 Convert number to logical; verify result. -SG-CONV-005 5.12 Error propagation when expression returns Error Mandatory Small ODF 1.4 Pass error as argument; verify error propagates. -SG-OP-001 6.4.9 Infix Operator Ordered Comparison (<, <=, >, >=) implemented Mandatory Small ODF 1.4 Evaluate comparisons; verify results. -SG-OP-002 6.4.10 Infix Operator "&" (concatenation) implemented Mandatory Small ODF 1.4 Evaluate "a"&"b"; verify "ab". -SG-OP-003 6.4.2 Infix Operator "+" implemented Mandatory Small ODF 1.4 Evaluate 2+3; verify 5. -SG-OP-004 6.4.3 Infix Operator "-" implemented Mandatory Small ODF 1.4 Evaluate 5-3; verify 2. -SG-OP-005 6.4.4 Infix Operator "*" implemented Mandatory Small ODF 1.4 Evaluate 2*3; verify 6. -SG-OP-006 6.4.5 Infix Operator "/" implemented Mandatory Small ODF 1.4 Evaluate 6/3; verify 2. -SG-OP-007 6.4.6 Infix Operator "^" implemented Mandatory Small ODF 1.4 Evaluate 2^3; verify 8. -SG-OP-008 6.4.7 Infix Operator "=" implemented Mandatory Small ODF 1.4 Evaluate 2=2; verify TRUE. -SG-OP-009 6.4.8 Infix Operator "<>" implemented Mandatory Small ODF 1.4 Evaluate 2<>3; verify TRUE. -SG-OP-010 6.4.14 Postfix Operator "%" implemented Mandatory Small ODF 1.4 Evaluate 50%; verify 0.5. -SG-OP-011 6.4.15 Prefix Operator "+" implemented Mandatory Small ODF 1.4 Evaluate +5; verify 5. -SG-OP-012 6.4.16 Prefix Operator "-" implemented Mandatory Small ODF 1.4 Evaluate -5; verify -5. -SG-OP-013 6.4.12 Infix Operator Reference Intersection ("!") implemented Mandatory Small ODF 1.4 Evaluate A1:C3!B1:D2; verify intersection. -SG-OP-014 6.4.11 Infix Operator Range (":") implemented Mandatory Small ODF 1.4 Evaluate SUM(A1:A3); verify range. \ No newline at end of file +ReqID Section Requirement Description Mandatory/Optional Conformance Group ODF Version Introduced/Changed Suggested Test Status +SG-BL-001 3.7 Formula length: at least 1024 characters long as measured in OpenDocument interchange format Mandatory Small ODF 1.4 Parse a 1024+ character formula; verify accepted. UNVERIFIED +SG-BL-002 3.7 At least 30 parameters per function when prototype permits parameter list Mandatory Small ODF 1.4 Call function with 30 parameters; verify accepted. UNVERIFIED +SG-BL-003 3.7 Permit strings of ASCII characters up to 32767 (2^15-1) characters Mandatory Small ODF 1.4 Parse/return 32767-character string; verify accepted. UNVERIFIED +SG-BL-004 3.7 Support at least 7 nesting levels of functions Mandatory Small ODF 1.4 Nest 7 levels of functions; verify accepted. UNVERIFIED +SG-SYN-001 4.11.11 Criteria syntax supported Mandatory Small ODF 1.4 Use criteria in database functions; verify parsed correctly. UNVERIFIED +SG-SYN-002 5.2 Basic Expressions syntax supported Mandatory Small ODF 1.4 Parse parenthesized expressions; verify evaluation. UNVERIFIED +SG-SYN-003 5.3 Constant Numbers syntax supported Mandatory Small ODF 1.4 Parse numeric literals including decimals, scientific notation; verify. UNVERIFIED +SG-SYN-004 5.4 Constant Strings syntax supported Mandatory Small ODF 1.4 Parse string literals with quote escaping; verify. UNVERIFIED +SG-SYN-005 5.5 Operators syntax supported (precedence per Table 1) Mandatory Small ODF 1.4 Evaluate 2+3*4 and 2^3^2; verify correct precedence. UNVERIFIED +SG-SYN-006 5.6 Functions and Function Parameters syntax supported Mandatory Small ODF 1.4 Call functions with various argument counts; verify. UNVERIFIED +SG-SYN-007 5.7 Nonstandard Function Names recognized as errors Mandatory Small ODF 1.4 Use unknown function name; verify error result. UNVERIFIED +SG-SYN-008 5.8 References syntax supported Mandatory Small ODF 1.4 Use cell and range references; verify resolution. UNVERIFIED +SG-SYN-009 5.11 Simple Named Expressions supported Mandatory Small ODF 1.4 Define and use named expression; verify. UNVERIFIED +SG-SYN-010 5.12 Errors syntax supported Mandatory Small ODF 1.4 Use error constants (#N/A, etc.); verify propagation. UNVERIFIED +SG-SYN-011 5.14 Whitespace handling per specification Mandatory Small ODF 1.4 Insert whitespace in formula; verify identical result. UNVERIFIED +SG-CONV-001 6.3.14 Conversion to Text implemented Mandatory Small ODF 1.4 Convert number/date/logical to text; verify result. IMPLEMENTED_UNVERIFIED +SG-CONV-002 6.3.5 Conversion to Number implemented Mandatory Small ODF 1.4 Convert text to number; verify result. IMPLEMENTED_UNVERIFIED +SG-CONV-003 4.8 Reference conversion implemented Mandatory Small ODF 1.4 Convert reference to scalar value; verify result. IMPLEMENTED_UNVERIFIED +SG-CONV-004 6.3.12 Conversion to Logical implemented Mandatory Small ODF 1.4 Convert number to logical; verify result. IMPLEMENTED_UNVERIFIED +SG-CONV-005 5.12 Error propagation when expression returns Error Mandatory Small ODF 1.4 Pass error as argument; verify error propagates. IMPLEMENTED_UNVERIFIED +SG-OP-001 6.4.9 Infix Operator Ordered Comparison (<, <=, >, >=) implemented Mandatory Small ODF 1.4 Evaluate comparisons; verify results. IMPLEMENTED_UNVERIFIED +SG-OP-002 6.4.10 Infix Operator "&" (concatenation) implemented Mandatory Small ODF 1.4 Evaluate "a"&"b"; verify "ab". IMPLEMENTED_UNVERIFIED +SG-OP-003 6.4.2 Infix Operator "+" implemented Mandatory Small ODF 1.4 Evaluate 2+3; verify 5. IMPLEMENTED_UNVERIFIED +SG-OP-004 6.4.3 Infix Operator "-" implemented Mandatory Small ODF 1.4 Evaluate 5-3; verify 2. IMPLEMENTED_UNVERIFIED +SG-OP-005 6.4.4 Infix Operator "*" implemented Mandatory Small ODF 1.4 Evaluate 2*3; verify 6. IMPLEMENTED_UNVERIFIED +SG-OP-006 6.4.5 Infix Operator "/" implemented Mandatory Small ODF 1.4 Evaluate 6/3; verify 2. IMPLEMENTED_UNVERIFIED +SG-OP-007 6.4.6 Infix Operator "^" implemented Mandatory Small ODF 1.4 Evaluate 2^3; verify 8. IMPLEMENTED_UNVERIFIED +SG-OP-008 6.4.7 Infix Operator "=" implemented Mandatory Small ODF 1.4 Evaluate 2=2; verify TRUE. IMPLEMENTED_UNVERIFIED +SG-OP-009 6.4.8 Infix Operator "<>" implemented Mandatory Small ODF 1.4 Evaluate 2<>3; verify TRUE. IMPLEMENTED_UNVERIFIED +SG-OP-010 6.4.14 Postfix Operator "%" implemented Mandatory Small ODF 1.4 Evaluate 50%; verify 0.5. IMPLEMENTED_UNVERIFIED +SG-OP-011 6.4.15 Prefix Operator "+" implemented Mandatory Small ODF 1.4 Evaluate +5; verify 5. IMPLEMENTED_UNVERIFIED +SG-OP-012 6.4.16 Prefix Operator "-" implemented Mandatory Small ODF 1.4 Evaluate -5; verify -5. IMPLEMENTED_UNVERIFIED +SG-OP-013 6.4.12 Infix Operator Reference Intersection ("!") implemented Mandatory Small ODF 1.4 Evaluate A1:C3!B1:D2; verify intersection. IMPLEMENTED_UNVERIFIED +SG-OP-014 6.4.11 Infix Operator Range (":") implemented Mandatory Small ODF 1.4 Evaluate SUM(A1:A3); verify range. IMPLEMENTED_UNVERIFIED +SG-FN-001 6.16.2 ABS Mandatory Small ODF 1.2 Evaluate ABS(-3); verify 3. IMPLEMENTED_UNVERIFIED +SG-FN-002 6.16.3 ACOS Mandatory Small ODF 1.2 Evaluate ACOS(0); verify pi/2. IMPLEMENTED_UNVERIFIED +SG-FN-003 6.15.2 AND Mandatory Small ODF 1.2 Evaluate AND(TRUE,TRUE); verify TRUE. IMPLEMENTED_UNVERIFIED +SG-FN-004 6.16.7 ASIN Mandatory Small ODF 1.2 Evaluate ASIN(0); verify 0. IMPLEMENTED_UNVERIFIED +SG-FN-005 6.16.9 ATAN Mandatory Small ODF 1.2 Evaluate ATAN(0); verify 0. IMPLEMENTED_UNVERIFIED +SG-FN-006 6.16.10 ATAN2 Mandatory Small ODF 1.2 Evaluate ATAN2(1,1); verify pi/4. IMPLEMENTED_UNVERIFIED +SG-FN-007 6.18.3 AVERAGE Mandatory Small ODF 1.2 Evaluate AVERAGE(1,2,3); verify 2. IMPLEMENTED_UNVERIFIED +SG-FN-008 6.18.5 AVERAGEIF Mandatory Small ODF 1.2 Evaluate AVERAGEIF(range,criteria); verify average. IMPLEMENTED_UNVERIFIED +SG-FN-009 6.14.3 CHOOSE Mandatory Small ODF 1.2 Evaluate CHOOSE(2,"a","b","c"); verify "b". IMPLEMENTED_UNVERIFIED +SG-FN-010 6.13.5 COLUMNS Mandatory Small ODF 1.2 Evaluate COLUMNS(A1:C1); verify 3. IMPLEMENTED_UNVERIFIED +SG-FN-011 6.16.19 COS Mandatory Small ODF 1.2 Evaluate COS(0); verify 1. IMPLEMENTED_UNVERIFIED +SG-FN-012 6.13.6 COUNT Mandatory Small ODF 1.2 Evaluate COUNT(1,2,"x"); verify 2. IMPLEMENTED_UNVERIFIED +SG-FN-013 6.13.7 COUNTA Mandatory Small ODF 1.2 Evaluate COUNTA(1,"x",""); verify non-empty count. IMPLEMENTED_UNVERIFIED +SG-FN-014 6.13.8 COUNTBLANK Mandatory Small ODF 1.2 Evaluate COUNTBLANK(range); verify blank count. IMPLEMENTED_UNVERIFIED +SG-FN-015 6.13.9 COUNTIF Mandatory Small ODF 1.2 Evaluate COUNTIF(range,criteria); verify count. IMPLEMENTED_UNVERIFIED +SG-FN-016 6.10.2 DATE Mandatory Small ODF 1.2 Evaluate DATE(2025,1,1); verify serial. IMPLEMENTED_UNVERIFIED +SG-FN-017 6.9.2 DAVERAGE Mandatory Small ODF 1.2 Evaluate DAVERAGE(database,field,criteria); verify average. IMPLEMENTED_UNVERIFIED +SG-FN-018 6.10.5 DAY Mandatory Small ODF 1.2 Evaluate DAY(DATE(2025,3,15)); verify 15. IMPLEMENTED_UNVERIFIED +SG-FN-019 6.9.3 DCOUNT Mandatory Small ODF 1.2 Evaluate DCOUNT(database,field,criteria); verify count. IMPLEMENTED_UNVERIFIED +SG-FN-020 6.9.4 DCOUNTA Mandatory Small ODF 1.2 Evaluate DCOUNTA(database,field,criteria); verify count. IMPLEMENTED_UNVERIFIED +SG-FN-021 6.12.14 DDB Mandatory Small ODF 1.2 Evaluate DDB(cost,salvage,life,period); verify depreciation. IMPLEMENTED_UNVERIFIED +SG-FN-022 6.16.25 DEGREES Mandatory Small ODF 1.2 Evaluate DEGREES(PI()); verify 180. IMPLEMENTED_UNVERIFIED +SG-FN-023 6.9.5 DGET Mandatory Small ODF 1.2 Evaluate DGET(database,field,criteria); verify value. IMPLEMENTED_UNVERIFIED +SG-FN-024 6.9.6 DMAX Mandatory Small ODF 1.2 Evaluate DMAX(database,field,criteria); verify max. IMPLEMENTED_UNVERIFIED +SG-FN-025 6.9.7 DMIN Mandatory Small ODF 1.2 Evaluate DMIN(database,field,criteria); verify min. IMPLEMENTED_UNVERIFIED +SG-FN-026 6.9.8 DPRODUCT Mandatory Small ODF 1.2 Evaluate DPRODUCT(database,field,criteria); verify product. IMPLEMENTED_UNVERIFIED +SG-FN-027 6.9.9 DSTDEV Mandatory Small ODF 1.2 Evaluate DSTDEV(database,field,criteria); verify stddev. IMPLEMENTED_UNVERIFIED +SG-FN-028 6.9.10 DSTDEVP Mandatory Small ODF 1.2 Evaluate DSTDEVP(database,field,criteria); verify stddevp. IMPLEMENTED_UNVERIFIED +SG-FN-029 6.9.11 DSUM Mandatory Small ODF 1.2 Evaluate DSUM(database,field,criteria); verify sum. IMPLEMENTED_UNVERIFIED +SG-FN-030 6.9.12 DVAR Mandatory Small ODF 1.2 Evaluate DVAR(database,field,criteria); verify variance. IMPLEMENTED_UNVERIFIED +SG-FN-031 6.9.13 DVARP Mandatory Small ODF 1.2 Evaluate DVARP(database,field,criteria); verify variancep. IMPLEMENTED_UNVERIFIED +SG-FN-032 6.16.30 EVEN Mandatory Small ODF 1.2 Evaluate EVEN(1.3); verify 2. IMPLEMENTED_UNVERIFIED +SG-FN-033 6.20.8 EXACT Mandatory Small ODF 1.2 Evaluate EXACT("a","a"); verify TRUE. IMPLEMENTED_UNVERIFIED +SG-FN-034 6.16.31 EXP Mandatory Small ODF 1.2 Evaluate EXP(1); verify e. IMPLEMENTED_UNVERIFIED +SG-FN-035 6.16.32 FACT Mandatory Small ODF 1.2 Evaluate FACT(5); verify 120. IMPLEMENTED_UNVERIFIED +SG-FN-036 6.15.3 FALSE Mandatory Small ODF 1.2 Evaluate FALSE(); verify FALSE. IMPLEMENTED_UNVERIFIED +SG-FN-037 6.20.9 FIND Mandatory Small ODF 1.2 Evaluate FIND("b","abc"); verify 2. IMPLEMENTED_UNVERIFIED +SG-FN-038 6.12.20 FV Mandatory Small ODF 1.2 Evaluate FV(rate,nper,pmt); verify future value. IMPLEMENTED_UNVERIFIED +SG-FN-039 6.14.5 HLOOKUP Mandatory Small ODF 1.2 Evaluate HLOOKUP(value,table,row); verify result. IMPLEMENTED_UNVERIFIED +SG-FN-040 6.10.11 HOUR Mandatory Small ODF 1.2 Evaluate HOUR(TIME(12,30,0)); verify 12. IMPLEMENTED_UNVERIFIED +SG-FN-041 6.15.4 IF Mandatory Small ODF 1.2 Evaluate IF(TRUE,1,2); verify 1. IMPLEMENTED_UNVERIFIED +SG-FN-042 6.14.6 INDEX Mandatory Small ODF 1.2 Evaluate INDEX(range,row,col); verify cell value. IMPLEMENTED_UNVERIFIED +SG-FN-043 6.17.2 INT Mandatory Small ODF 1.2 Evaluate INT(1.9); verify 1. IMPLEMENTED_UNVERIFIED +SG-FN-044 6.12.24 IRR Mandatory Small ODF 1.2 Evaluate IRR(values); verify internal rate of return. IMPLEMENTED_UNVERIFIED +SG-FN-045 6.13.14 ISBLANK Mandatory Small ODF 1.2 Evaluate ISBLANK(cell); verify TRUE/FALSE. IMPLEMENTED_UNVERIFIED +SG-FN-046 6.13.15 ISERR Mandatory Small ODF 1.2 Evaluate ISERR(1/0); verify TRUE. IMPLEMENTED_UNVERIFIED +SG-FN-047 6.13.16 ISERROR Mandatory Small ODF 1.2 Evaluate ISERROR(1/0); verify TRUE. IMPLEMENTED_UNVERIFIED +SG-FN-048 6.13.19 ISLOGICAL Mandatory Small ODF 1.2 Evaluate ISLOGICAL(TRUE); verify TRUE. IMPLEMENTED_UNVERIFIED +SG-FN-049 6.13.20 ISNA Mandatory Small ODF 1.2 Evaluate ISNA(NA()); verify TRUE. IMPLEMENTED_UNVERIFIED +SG-FN-050 6.13.21 ISNONTEXT Mandatory Small ODF 1.2 Evaluate ISNONTEXT(1); verify TRUE. IMPLEMENTED_UNVERIFIED +SG-FN-051 6.13.22 ISNUMBER Mandatory Small ODF 1.2 Evaluate ISNUMBER(1); verify TRUE. IMPLEMENTED_UNVERIFIED +SG-FN-052 6.13.25 ISTEXT Mandatory Small ODF 1.2 Evaluate ISTEXT("a"); verify TRUE. IMPLEMENTED_UNVERIFIED +SG-FN-053 6.20.12 LEFT Mandatory Small ODF 1.2 Evaluate LEFT("abc",2); verify "ab". IMPLEMENTED_UNVERIFIED +SG-FN-054 6.20.13 LEN Mandatory Small ODF 1.2 Evaluate LEN("abc"); verify 3. IMPLEMENTED_UNVERIFIED +SG-FN-055 6.16.39 LN Mandatory Small ODF 1.2 Evaluate LN(1); verify 0. IMPLEMENTED_UNVERIFIED +SG-FN-056 6.16.40 LOG Mandatory Small ODF 1.2 Evaluate LOG(100,10); verify 2. IMPLEMENTED_UNVERIFIED +SG-FN-057 6.16.41 LOG10 Mandatory Small ODF 1.2 Evaluate LOG10(100); verify 2. IMPLEMENTED_UNVERIFIED +SG-FN-058 6.20.14 LOWER Mandatory Small ODF 1.2 Evaluate LOWER("ABC"); verify "abc". IMPLEMENTED_UNVERIFIED +SG-FN-059 6.14.9 MATCH Mandatory Small ODF 1.2 Evaluate MATCH(value,range,type); verify position. IMPLEMENTED_UNVERIFIED +SG-FN-060 6.18.45 MAX Mandatory Small ODF 1.2 Evaluate MAX(1,2,3); verify 3. IMPLEMENTED_UNVERIFIED +SG-FN-061 6.20.15 MID Mandatory Small ODF 1.2 Evaluate MID("abc",2,1); verify "b". IMPLEMENTED_UNVERIFIED +SG-FN-062 6.18.48 MIN Mandatory Small ODF 1.2 Evaluate MIN(1,2,3); verify 1. IMPLEMENTED_UNVERIFIED +SG-FN-063 6.10.13 MINUTE Mandatory Small ODF 1.2 Evaluate MINUTE(TIME(12,30,0)); verify 30. IMPLEMENTED_UNVERIFIED +SG-FN-064 6.16.42 MOD Mandatory Small ODF 1.2 Evaluate MOD(5,2); verify 1. IMPLEMENTED_UNVERIFIED +SG-FN-065 6.10.14 MONTH Mandatory Small ODF 1.2 Evaluate MONTH(DATE(2025,3,15)); verify 3. IMPLEMENTED_UNVERIFIED +SG-FN-066 6.13.26 N Mandatory Small ODF 1.2 Evaluate N(TRUE); verify 1. IMPLEMENTED_UNVERIFIED +SG-FN-067 6.13.27 NA Mandatory Small ODF 1.2 Evaluate NA(); verify #N/A error. IMPLEMENTED_UNVERIFIED +SG-FN-068 6.15.7 NOT Mandatory Small ODF 1.2 Evaluate NOT(TRUE); verify FALSE. IMPLEMENTED_UNVERIFIED +SG-FN-069 6.10.16 NOW Mandatory Small ODF 1.2 Evaluate NOW(); verify current datetime. IMPLEMENTED_UNVERIFIED +SG-FN-070 6.12.29 NPER Mandatory Small ODF 1.2 Evaluate NPER(rate,pmt,pv); verify periods. IMPLEMENTED_UNVERIFIED +SG-FN-071 6.12.30 NPV Mandatory Small ODF 1.2 Evaluate NPV(rate,values); verify net present value. IMPLEMENTED_UNVERIFIED +SG-FN-072 6.16.44 ODD Mandatory Small ODF 1.2 Evaluate ODD(1.3); verify 3. IMPLEMENTED_UNVERIFIED +SG-FN-073 6.15.8 OR Mandatory Small ODF 1.2 Evaluate OR(FALSE,TRUE); verify TRUE. IMPLEMENTED_UNVERIFIED +SG-FN-074 6.16.45 PI Mandatory Small ODF 1.2 Evaluate PI(); verify pi. IMPLEMENTED_UNVERIFIED +SG-FN-075 6.12.36 PMT Mandatory Small ODF 1.2 Evaluate PMT(rate,nper,pv); verify payment. IMPLEMENTED_UNVERIFIED +SG-FN-076 6.16.46 POWER Mandatory Small ODF 1.2 Evaluate POWER(2,3); verify 8. IMPLEMENTED_UNVERIFIED +SG-FN-077 6.16.47 PRODUCT Mandatory Small ODF 1.2 Evaluate PRODUCT(2,3); verify 6. IMPLEMENTED_UNVERIFIED +SG-FN-078 6.20.16 PROPER Mandatory Small ODF 1.2 Evaluate PROPER("abc"); verify "Abc". IMPLEMENTED_UNVERIFIED +SG-FN-079 6.12.41 PV Mandatory Small ODF 1.2 Evaluate PV(rate,nper,pmt); verify present value. IMPLEMENTED_UNVERIFIED +SG-FN-080 6.16.49 RADIANS Mandatory Small ODF 1.2 Evaluate RADIANS(180); verify pi. IMPLEMENTED_UNVERIFIED +SG-FN-081 6.12.42 RATE Mandatory Small ODF 1.2 Evaluate RATE(nper,pmt,pv); verify rate. IMPLEMENTED_UNVERIFIED +SG-FN-082 6.20.17 REPLACE Mandatory Small ODF 1.2 Evaluate REPLACE("abc",2,1,"x"); verify "axc". IMPLEMENTED_UNVERIFIED +SG-FN-083 6.20.18 REPT Mandatory Small ODF 1.2 Evaluate REPT("a",3); verify "aaa". IMPLEMENTED_UNVERIFIED +SG-FN-084 6.20.19 RIGHT Mandatory Small ODF 1.2 Evaluate RIGHT("abc",2); verify "bc". IMPLEMENTED_UNVERIFIED +SG-FN-085 6.17.5 ROUND Mandatory Small ODF 1.2 Evaluate ROUND(1.6,0); verify 2. IMPLEMENTED_UNVERIFIED +SG-FN-086 6.13.30 ROWS Mandatory Small ODF 1.2 Evaluate ROWS(A1:A3); verify 3. IMPLEMENTED_UNVERIFIED +SG-FN-087 6.10.17 SECOND Mandatory Small ODF 1.2 Evaluate SECOND(TIME(12,30,45)); verify 45. IMPLEMENTED_UNVERIFIED +SG-FN-088 6.16.55 SIN Mandatory Small ODF 1.2 Evaluate SIN(0); verify 0. IMPLEMENTED_UNVERIFIED +SG-FN-089 6.12.45 SLN Mandatory Small ODF 1.2 Evaluate SLN(cost,salvage,life); verify depreciation. IMPLEMENTED_UNVERIFIED +SG-FN-090 6.16.58 SQRT Mandatory Small ODF 1.2 Evaluate SQRT(4); verify 2. IMPLEMENTED_UNVERIFIED +SG-FN-091 6.18.72 STDEV Mandatory Small ODF 1.2 Evaluate STDEV(values); verify sample stddev. IMPLEMENTED_UNVERIFIED +SG-FN-092 6.18.74 STDEVP Mandatory Small ODF 1.2 Evaluate STDEVP(values); verify population stddev. IMPLEMENTED_UNVERIFIED +SG-FN-093 6.20.21 SUBSTITUTE Mandatory Small ODF 1.2 Evaluate SUBSTITUTE("aaa","a","b"); verify "bbb". IMPLEMENTED_UNVERIFIED +SG-FN-094 6.16.61 SUM Mandatory Small ODF 1.2 Evaluate SUM(1,2,3); verify 6. IMPLEMENTED_UNVERIFIED +SG-FN-095 6.16.62 SUMIF Mandatory Small ODF 1.2 Evaluate SUMIF(range,criteria,sumrange); verify sum. IMPLEMENTED_UNVERIFIED +SG-FN-096 6.12.46 SYD Mandatory Small ODF 1.2 Evaluate SYD(cost,salvage,life,period); verify depreciation. IMPLEMENTED_UNVERIFIED +SG-FN-097 6.20.22 T Mandatory Small ODF 1.2 Evaluate T("abc"); verify "abc". IMPLEMENTED_UNVERIFIED +SG-FN-098 6.16.69 TAN Mandatory Small ODF 1.2 Evaluate TAN(0); verify 0. IMPLEMENTED_UNVERIFIED +SG-FN-099 6.10.18 TIME Mandatory Small ODF 1.2 Evaluate TIME(12,30,0); verify time serial. IMPLEMENTED_UNVERIFIED +SG-FN-100 6.10.20 TODAY Mandatory Small ODF 1.2 Evaluate TODAY(); verify current date serial. IMPLEMENTED_UNVERIFIED +SG-FN-101 6.20.24 TRIM Mandatory Small ODF 1.2 Evaluate TRIM(" a b "); verify "a b". IMPLEMENTED_UNVERIFIED +SG-FN-102 6.15.9 TRUE Mandatory Small ODF 1.2 Evaluate TRUE(); verify TRUE. IMPLEMENTED_UNVERIFIED +SG-FN-103 6.17.8 TRUNC Mandatory Small ODF 1.2 Evaluate TRUNC(1.9); verify 1. IMPLEMENTED_UNVERIFIED +SG-FN-104 6.20.27 UPPER Mandatory Small ODF 1.2 Evaluate UPPER("abc"); verify "ABC". IMPLEMENTED_UNVERIFIED +SG-FN-105 6.13.34 VALUE Mandatory Small ODF 1.2 Evaluate VALUE("123"); verify 123. IMPLEMENTED_UNVERIFIED +SG-FN-106 6.18.82 VAR Mandatory Small ODF 1.2 Evaluate VAR(values); verify sample variance. IMPLEMENTED_UNVERIFIED +SG-FN-107 6.18.84 VARP Mandatory Small ODF 1.2 Evaluate VARP(values); verify population variance. IMPLEMENTED_UNVERIFIED +SG-FN-108 6.14.12 VLOOKUP Mandatory Small ODF 1.2 Evaluate VLOOKUP(value,table,col,range); verify result. IMPLEMENTED_UNVERIFIED +SG-FN-109 6.10.21 WEEKDAY Mandatory Small ODF 1.2 Evaluate WEEKDAY(date); verify day number. IMPLEMENTED_UNVERIFIED +SG-FN-110 6.10.24 YEAR Mandatory Small ODF 1.2 Evaluate YEAR(DATE(2025,3,15)); verify 2025. IMPLEMENTED_UNVERIFIED +SG-ALW-001 2.3.2.F References containing more than one area need not be evaluated Optional Small ODF 1.4 Reference with multiple areas; may return error or partial result. NOT_APPLICABLE +SG-ALW-002 2.3.2.G Inline arrays need not be implemented Optional Small ODF 1.4 Use {1,2} inline array; may return error. NOT_APPLICABLE +SG-ALW-003 2.3.2.G Complex numbers need not be implemented Optional Small ODF 1.4 Use COMPLEX function; may return error. NOT_APPLICABLE +SG-ALW-004 2.3.2.G Reference union operator (~) need not be implemented Optional Small ODF 1.4 Use A1:B2~C3:D4; may return error. NOT_APPLICABLE diff --git a/openformula-small-group-audit.md b/openformula-small-group-audit.md index 647a2e5799..b6d387d5e8 100644 --- a/openformula-small-group-audit.md +++ b/openformula-small-group-audit.md @@ -33,46 +33,54 @@ Therefore **no conformance level (Small/Medium/Large) may be claimed for AOO Cal | ReqID | Requirement | Status | Source Evidence | Runtime Verified | |-------|-------------|--------|-----------------|-------------------| -| SG-BL-001 | Formula length >= 1024 characters | **[CONFIRMED]** structurally | FormulaCompiler parses token arrays dynamically; no fixed 1024-char limit found in source | No | -| SG-BL-002 | >= 30 parameters per function | **[CONFIRMED]** structurally | MustHaveParamCount validates exact counts; no 30-param cap found | No | -| SG-BL-003 | Strings up to 32767 ASCII chars | **[UNVERIFIED]** | OUString used for strings; no specific 32767 limit found | No | -| SG-BL-004 | >= 7 nesting levels of functions | **[CONFIRMED]** structurally | No nesting depth limit found in compiler/interpreter | No | +| SG-BL-001 | Formula length >= 1024 characters | **UNVERIFIED** | FormulaCompiler parses token arrays dynamically; no fixed 1024-char limit found in source | No | +| SG-BL-002 | >= 30 parameters per function | **UNVERIFIED** | MustHaveParamCount validates exact counts; no 30-param cap found | No | +| SG-BL-003 | Strings up to 32767 ASCII chars | **UNVERIFIED** | OUString used for strings; no specific 32767 limit found | No | +| SG-BL-004 | >= 7 nesting levels of functions | **UNVERIFIED** | No nesting depth limit found in compiler/interpreter | No | -**Finding:** All basic limit requirements appear satisfied by the dynamic architecture (no hard-coded limits below the spec minimums). Runtime verification is outstanding for all four. +**Finding:** The absence of hard-coded limits in source does **not** prove conformance. All four Basic Limits requirements are marked UNVERIFIED pending actual runtime tests. --- ## 3. Syntax (§2.3.2.B) -| ReqID | Section | Requirement | Status | Source Evidence | -|-------|---------|-------------|--------|-----------------| -| SG-SYN-001 | 4.11.11 | Criteria syntax | **[CONFIRMED]** | Database functions (DSUM, DCOUNT, etc.) use criteria; interpr1.cxx implements DBSum/DBCount | -| SG-SYN-002 | 5.2 | Basic Expressions | **[CONFIRMED]** | FormulaCompiler.cxx handles parenthesized expressions via RangeLine/IntersectionLine/UnaryLine | -| SG-SYN-003 | 5.3 | Constant Numbers | **[CONFIRMED]** | FormulaCompiler.cxx tokenizes numeric literals | -| SG-SYN-004 | 5.4 | Constant Strings | **[CONFIRMED]** | FormulaCompiler.cxx tokenizes string literals with quote escaping | -| SG-SYN-005 | 5.5 | Operators precedence (Table 1) | **[CONFIRMED]** | FormulaCompiler.cxx:1203-1237 implements UnionLine -> IntersectionLine -> RangeLine -> UnaryLine -> binary ops | -| SG-SYN-006 | 5.6 | Functions and parameters | **[CONFIRMED]** | FormulaCompiler.cxx compiles function calls with argument lists | -| SG-SYN-007 | 5.7 | Nonstandard function names as errors | **[CONFIRMED]** | ocNoName opcode; xlformula.cxx uses ocNoName stubs | -| SG-SYN-008 | 5.8 | References | **[CONFIRMED]** | compiler.cxx PopDoubleRef/PopSingleRef handle cell/range references | -| SG-SYN-009 | 5.11 | Simple Named Expressions | **[CONFIRMED]** | compiler.cxx:NameLine handles named expressions; ocName opcode | -| SG-SYN-010 | 5.12 | Errors | **[CONFIRMED]** | Error constants (ocErrNull through ocErrNA) in compiler.hrc; interpr1.cxx error handling | -| SG-SYN-011 | 5.14 | Whitespace | **[CONFIRMED]** | ocSpaces converted to intersection at FormulaCompiler.cxx:830-831 | - -**Finding:** All syntax requirements are structurally supported by the parser/compiler. No gaps identified. +| ReqID | Section | Requirement | Status | Source Evidence | Runtime Verified | +|-------|---------|-------------|--------|-----------------|-------------------| +| SG-SYN-001 | 4.11.11 | Criteria syntax | **UNVERIFIED** | Database functions (DSUM, DCOUNT, etc.) use criteria; interpr1.cxx implements DBSum/DBCount | No | +| SG-SYN-002 | 5.2 | Basic Expressions | **UNVERIFIED** | FormulaCompiler.cxx handles parenthesized expressions via RangeLine/IntersectionLine/UnaryLine | No | +| SG-SYN-003 | 5.3 | Constant Numbers | **UNVERIFIED** | FormulaCompiler.cxx tokenizes numeric literals | No | +| SG-SYN-004 | 5.4 | Constant Strings | **UNVERIFIED** | FormulaCompiler.cxx tokenizes string literals with quote escaping | No | +| SG-SYN-005 | 5.5 | Operators precedence (Table 1) | **UNVERIFIED** | FormulaCompiler.cxx:1203-1237 implements UnionLine -> IntersectionLine -> RangeLine -> UnaryLine -> binary ops | No | +| SG-SYN-006 | 5.6 | Functions and parameters | **UNVERIFIED** | FormulaCompiler.cxx compiles function calls with argument lists | No | +| SG-SYN-007 | 5.7 | Nonstandard function names as errors | **UNVERIFIED** | ocNoName opcode; xlformula.cxx uses ocNoName stubs | No | +| SG-SYN-008 | 5.8 | References | **UNVERIFIED** | compiler.cxx PopDoubleRef/PopSingleRef handle cell/range references | No | +| SG-SYN-009 | 5.11 | Simple Named Expressions | **UNVERIFIED** | compiler.cxx:NameLine handles named expressions; ocName opcode | No | +| SG-SYN-010 | 5.12 | Errors | **UNVERIFIED** | Error constants (ocErrNull through ocErrNA) in compiler.hrc; interpr1.cxx error handling | No | +| SG-SYN-011 | 5.14 | Whitespace | **UNVERIFIED** | ocSpaces converted to intersection at FormulaCompiler.cxx:830-831 | No | + +**Specific unverified grammar cases:** +- Operator precedence and associativity (e.g., `2+3*4`, `2^3^2`) — parser structure exists but no runtime verification of correct precedence +- Automatic intersection (whitespace between references) — ocSpaces → ocIntersect conversion at FormulaCompiler.cxx:830-831 exists but runtime behavior unverified +- Reference union `~` — NOT required for Small Group (§2.3.2.G), so absence is acceptable +- Quoted labels as implicit intersection (ODF 1.4 §3.9/§5.10) — not confirmed in source + +**Finding:** All syntax requirements have parser/compiler infrastructure present, but none have been verified at runtime against ODF 1.4 normative expected results. --- ## 4. Implicit Conversions (§2.3.2.C) -| ReqID | Section | Requirement | Status | Source Evidence | -|-------|---------|-------------|--------|-----------------| -| SG-CONV-001 | 6.3.14 | Conversion to Text | **[CONFIRMED]** | ScInterpreter::GetString() (interpre.hxx:374), ScText() (interpr1.cxx) | -| SG-CONV-002 | 6.3.5 | Conversion to Number | **[CONFIRMED]** | ScInterpreter::GetDouble() (interpre.hxx:370), ConvertStringToValue() (interpre.hxx:228) | -| SG-CONV-003 | 4.8 | Reference conversion | **[CONFIRMED]** | ScInterpreter::GetCellValueOrZero() (interpre.hxx:231), PopSingleRef/PopDoubleRef | -| SG-CONV-004 | 6.3.12 | Conversion to Logical | **[CONFIRMED]** | ScInterpreter::GetBool() returns GetDouble() != 0.0 (interpre.hxx:373) | -| SG-CONV-005 | 5.12 | Error propagation | **[CONFIRMED]** | nGlobalError (interpre.hxx:196), SetError() (interpre.hxx:854), Push() substitutes FormulaErrorToken (interpre.hxx:263) | +| ReqID | Section | Requirement | Status | Source Evidence | Runtime Verified | +|-------|---------|-------------|--------|-----------------|-------------------| +| SG-CONV-001 | 6.3.14 | Conversion to Text | **IMPLEMENTED_UNVERIFIED** | ScInterpreter::GetString() (interpre.hxx:374), ScText() (interpr1.cxx) | No | +| SG-CONV-002 | 6.3.5 | Conversion to Number | **IMPLEMENTED_UNVERIFIED** | ScInterpreter::GetDouble() (interpre.hxx:370), ConvertStringToValue() (interpre.hxx:228) | No | +| SG-CONV-003 | 4.8 | Reference conversion | **IMPLEMENTED_UNVERIFIED** | ScInterpreter::GetCellValueOrZero() (interpre.hxx:231), PopSingleRef/PopDoubleRef | No | +| SG-CONV-004 | 6.3.12 | Conversion to Logical | **IMPLEMENTED_UNVERIFIED** | ScInterpreter::GetBool() returns GetDouble() != 0.0 (interpre.hxx:373) | No | +| SG-CONV-005 | 5.12 | Error propagation | **IMPLEMENTED_UNVERIFIED** | nGlobalError (interpre.hxx:196), SetError() (interpre.hxx:854), Push() substitutes FormulaErrorToken (interpre.hxx:263) | No | -**Finding:** All conversion requirements are implemented. Edge cases (locale-sensitive conversion, text-to-number with thousands separators) are impl-defined per ODF 1.4 and documented in openformula-semantics.md. +**Distinction:** Implementation presence confirmed (conversion functions exist in source), but semantic conformance to ODF 1.4 conversion rules (locale sensitivity, edge cases, error conditions) is **unverified**. + +**Finding:** All conversion requirements have implementation entry points, but none have been verified at runtime against ODF 1.4 normative expected results. --- @@ -82,20 +90,20 @@ All operators required by §2.3.2.D (all operators except reference union `~`) a | ReqID | Section | Operator | Status | Source | |-------|---------|----------|--------|--------| -| SG-OP-001 | 6.4.9 | Ordered comparison (<, <=, >, >=) | **[CONFIRMED]** | interpr1.cxx:ScLess/ScLessEqual/ScGreater/ScGreaterEqual | -| SG-OP-002 | 6.4.10 | Concatenation (&) | **[CONFIRMED]** | interpr5.cxx:ScAmpersand | -| SG-OP-003 | 6.4.2 | Addition (+) | **[CONFIRMED]** | interpr5.cxx:ScAdd | -| SG-OP-004 | 6.4.3 | Subtraction (-) | **[CONFIRMED]** | interpr5.cxx:ScSub | -| SG-OP-005 | 6.4.4 | Multiplication (*) | **[CONFIRMED]** | interpr5.cxx:ScMul | -| SG-OP-006 | 6.4.5 | Division (/) | **[CONFIRMED]** | interpr5.cxx:ScDiv; division by zero -> errDivisionByZero (interpre.hxx:955-959) | -| SG-OP-007 | 6.4.6 | Power (^) | **[CONFIRMED]** | interpr5.cxx:ScPow; right-associative | -| SG-OP-008 | 6.4.7 | Equality (=) | **[CONFIRMED]** | interpr1.cxx:ScEqual | -| SG-OP-009 | 6.4.8 | Not equal (<>) | **[CONFIRMED]** | interpr1.cxx:ScNotEqual | -| SG-OP-010 | 6.4.14 | Postfix % | **[CONFIRMED]** | interpr1.cxx:ScPercentSign | -| SG-OP-011 | 6.4.15 | Prefix + | **[CONFIRMED]** | Unary plus handled by compiler; ocAdd with single operand | -| SG-OP-012 | 6.4.16 | Prefix - | **[CONFIRMED]** | interpr1.cxx:ScNeg | -| SG-OP-013 | 6.4.12 | Reference intersection (!) | **[CONFIRMED]** | interpr1.cxx:ScIntersect | -| SG-OP-014 | 6.4.11 | Reference range (:) | **[CONFIRMED]** | interpr1.cxx:ScRangeFunc | +| SG-OP-001 | 6.4.9 | Ordered comparison (<, <=, >, >=) | **IMPLEMENTED_UNVERIFIED** | interpr1.cxx:ScLess/ScLessEqual/ScGreater/ScGreaterEqual | No | +| SG-OP-002 | 6.4.10 | Concatenation (&) | **IMPLEMENTED_UNVERIFIED** | interpr5.cxx:ScAmpersand | No | +| SG-OP-003 | 6.4.2 | Addition (+) | **IMPLEMENTED_UNVERIFIED** | interpr5.cxx:ScAdd | No | +| SG-OP-004 | 6.4.3 | Subtraction (-) | **IMPLEMENTED_UNVERIFIED** | interpr5.cxx:ScSub | No | +| SG-OP-005 | 6.4.4 | Multiplication (*) | **IMPLEMENTED_UNVERIFIED** | interpr5.cxx:ScMul | No | +| SG-OP-006 | 6.4.5 | Division (/) | **IMPLEMENTED_UNVERIFIED** | interpr5.cxx:ScDiv; division by zero -> errDivisionByZero (interpre.hxx:955-959) | No | +| SG-OP-007 | 6.4.6 | Power (^) | **IMPLEMENTED_UNVERIFIED** | interpr5.cxx:ScPow; right-associative | No | +| SG-OP-008 | 6.4.7 | Equality (=) | **IMPLEMENTED_UNVERIFIED** | interpr1.cxx:ScEqual | No | +| SG-OP-009 | 6.4.8 | Not equal (<>) | **IMPLEMENTED_UNVERIFIED** | interpr1.cxx:ScNotEqual | No | +| SG-OP-010 | 6.4.14 | Postfix % | **IMPLEMENTED_UNVERIFIED** | interpr1.cxx:ScPercentSign | No | +| SG-OP-011 | 6.4.15 | Prefix + | **IMPLEMENTED_UNVERIFIED** | Unary plus handled by compiler; ocAdd with single operand | No | +| SG-OP-012 | 6.4.16 | Prefix - | **IMPLEMENTED_UNVERIFIED** | interpr1.cxx:ScNeg | No | +| SG-OP-013 | 6.4.12 | Reference intersection (!) | **IMPLEMENTED_UNVERIFIED** | interpr1.cxx:ScIntersect | No | +| SG-OP-014 | 6.4.11 | Reference range (:) | **IMPLEMENTED_UNVERIFIED** | interpr1.cxx:ScRangeFunc | No | **Finding:** All 14 operator requirements are implemented. Reference union (`~`) is explicitly NOT required for Small Group (§2.3.2.G). @@ -109,124 +117,14 @@ The Small Group requires 110 functions (§2.3.2.E). All 110 have opcodes and imp | Status | Count | Description | |--------|-------|-------------| -| IMPLEMENTED_MATCH | 110 | All 110 Small Group functions have opcodes, implementations, dispatch, and metadata | - -### Function detail (selected examples) - -| Function | Section | Opcode | Value | Implementation | Status | -|----------|---------|--------|-------|----------------|--------| -| ABS | 6.16.2 | ocAbs | 113 | interpr1.cxx:ScAbs | IMPLEMENTED_MATCH | -| ACOS | 6.16.3 | ocArcCos | 87 | interpr1.cxx:ScArcCos | IMPLEMENTED_MATCH | -| AND | 6.15.2 | ocAnd | 52 | interpr1.cxx:ScAnd | IMPLEMENTED_MATCH | -| ASIN | 6.16.7 | ocArcSin | 86 | interpr1.cxx:ScArcSin | IMPLEMENTED_MATCH | -| ATAN | 6.16.9 | ocArcTan | 88 | interpr1.cxx:ScArcTan | IMPLEMENTED_MATCH | -| ATAN2 | 6.16.10 | ocArcTan2 | 201 | interpr2.cxx:ScArcTan2 | IMPLEMENTED_MATCH (ODF 1.4: ATAN2(0,0) impl-defined) | -| AVERAGE | 6.18.3 | ocAverage | 226 | interpr1.cxx:ScAverage | IMPLEMENTED_MATCH | -| AVERAGEIF | 6.18.5 | ocAverageIf | 395 | interpr1.cxx:ScAverageIf | IMPLEMENTED_MATCH | -| CHOOSE | 6.14.3 | ocChose | 7 | interpr1.cxx:ScChose | IMPLEMENTED_MATCH | -| COLUMNS | 6.13.5 | ocColumns | 252 | interpr1.cxx:ScColumns | IMPLEMENTED_MATCH | -| COS | 6.16.19 | ocCos | 83 | interpr1.cxx:ScCos | IMPLEMENTED_MATCH | -| COUNT | 6.13.6 | ocCount | 227 | interpr1.cxx:ScCount | IMPLEMENTED_MATCH | -| COUNTA | 6.13.7 | ocCount2 | 228 | interpr1.cxx:ScCount2 | IMPLEMENTED_MATCH (ODF 1.4 empty-cell semantics changed) | -| COUNTBLANK | 6.13.8 | ocCountEmptyCells | 282 | interpr1.cxx:ScCountEmptyCells | IMPLEMENTED_MATCH (ODF 1.4: "" case impl-defined) | -| COUNTIF | 6.13.9 | ocCountIf | 283 | interpr1.cxx:ScCountIf | IMPLEMENTED_MATCH | -| DATE | 6.10.2 | ocGetDate | 218 | interpr2.cxx:ScGetDate | IMPLEMENTED_MATCH (ODF 1.4: pre-1583 impl-defined) | -| DAVERAGE | 6.9.2 | ocDBAverage | 270 | interpr1.cxx:ScDBAverage | IMPLEMENTED_MATCH | -| DAY | 6.10.5 | ocGetDay | 108 | interpr2.cxx:ScGetDay | IMPLEMENTED_MATCH | -| DCOUNT | 6.9.3 | ocDBCount | 268 | interpr1.cxx:ScDBCount | IMPLEMENTED_MATCH | -| DCOUNTA | 6.9.4 | ocDBCount2 | 269 | interpr1.cxx:ScDBCount2 | IMPLEMENTED_MATCH | -| DDB | 6.12.14 | ocGDA | 246 | interpr2.cxx:ScGDA | IMPLEMENTED_MATCH | -| DEGREES | 6.16.25 | ocDeg | 80 | interpr2.cxx:ScDeg | IMPLEMENTED_MATCH | -| DGET | 6.9.5 | ocDBGet | 271 | interpr1.cxx:ScDBGet | IMPLEMENTED_MATCH | -| DMAX | 6.9.6 | ocDBMax | 272 | interpr1.cxx:ScDBMax | IMPLEMENTED_MATCH | -| DMIN | 6.9.7 | ocDBMin | 273 | interpr1.cxx:ScDBMin | IMPLEMENTED_MATCH | -| DPRODUCT | 6.9.8 | ocDBProduct | 274 | interpr1.cxx:ScDBProduct | IMPLEMENTED_MATCH | -| DSTDEV | 6.9.9 | ocDBStdDev | 275 | interpr1.cxx:ScDBStdDev | IMPLEMENTED_MATCH | -| DSTDEVP | 6.9.10 | ocDBStdDevP | 276 | interpr1.cxx:ScDBStdDevP | IMPLEMENTED_MATCH | -| DSUM | 6.9.11 | ocDBSum | 267 | interpr1.cxx:ScDBSum | IMPLEMENTED_MATCH | -| DVAR | 6.9.12 | ocDBVar | 277 | interpr1.cxx:ScDBVar | IMPLEMENTED_MATCH | -| DVARP | 6.9.13 | ocDBVarP | 278 | interpr1.cxx:ScDBVarP | IMPLEMENTED_MATCH | -| EVEN | 6.16.30 | ocEven | 144 | interpr2.cxx:ScEven | IMPLEMENTED_MATCH | -| EXACT | 6.20.8 | ocExact | 296 | interpr1.cxx:ScExact | IMPLEMENTED_MATCH | -| EXP | 6.16.31 | ocExp | 102 | interpr1.cxx:ScExp | IMPLEMENTED_MATCH | -| FACT | 6.16.32 | ocFact | 105 | interpr3.cxx:ScFact | IMPLEMENTED_MATCH | -| FALSE | 6.15.3 | ocFalse | 68 | interpr1.cxx:ScFalse | IMPLEMENTED_MATCH | -| FIND | 6.20.9 | ocFind | 295 | interpr1.cxx:ScFind | IMPLEMENTED_MATCH | -| FV | 6.12.20 | ocZW | 257 | interpr2.cxx:ScZW | IMPLEMENTED_MATCH | -| HLOOKUP | 6.14.5 | ocHLookup | 287 | interpr1.cxx:ScHLookup | IMPLEMENTED_MATCH (ODF 1.4: unsorted data impl-defined) | -| HOUR | 6.10.11 | ocGetHour | 109 | interpr2.cxx:ScGetHour | IMPLEMENTED_MATCH | -| IF | 6.15.4 | ocIf | 6 | interpr1.cxx:ScIfJump | IMPLEMENTED_MATCH (lazy evaluation via jumps) | -| INDEX | 6.14.6 | ocIndex | 290 | interpr1.cxx:ScIndex | IMPLEMENTED_MATCH (ODF 1.4: row-vector single-arg now error — Milestone A fix) | -| INT | 6.17.2 | ocInt | 114 | interpr2.cxx:ScInt | IMPLEMENTED_MATCH | -| IRR | 6.12.24 | ocIRR | 230 | interpr2.cxx:ScIRR | IMPLEMENTED_MATCH | -| ISBLANK | 6.13.14 | ocIsEmpty | 117 | interpr1.cxx:ScIsEmpty | IMPLEMENTED_MATCH | -| ISERR | 6.13.15 | ocIsErr | 127 | interpr1.cxx:ScIsErr | IMPLEMENTED_MATCH | -| ISERROR | 6.13.16 | ocIsError | 128 | interpr1.cxx:ScIsError | IMPLEMENTED_MATCH | -| ISLOGICAL | 6.13.19 | ocIsLogical | 120 | interpr1.cxx:ScIsLogical | IMPLEMENTED_MATCH (complex-number case impl-defined) | -| ISNA | 6.13.20 | ocIsNA | 126 | interpr1.cxx:ScIsNV | IMPLEMENTED_MATCH | -| ISNONTEXT | 6.13.21 | ocIsNonString | 119 | interpr1.cxx:ScIsNonString | IMPLEMENTED_MATCH | -| ISNUMBER | 6.13.22 | ocIsValue | 124 | interpr1.cxx:ScIsValue | IMPLEMENTED_MATCH (complex-number case impl-defined) | -| ISTEXT | 6.13.25 | ocIsString | 118 | interpr1.cxx:ScIsString | IMPLEMENTED_MATCH | -| LEFT | 6.20.12 | ocLeft | 297 | interpr1.cxx:ScLeft | IMPLEMENTED_MATCH | -| LEN | 6.20.13 | ocLen | 139 | interpr1.cxx:ScLen | IMPLEMENTED_MATCH | -| LN | 6.16.39 | ocLn | 103 | interpr1.cxx:ScLn | IMPLEMENTED_MATCH | -| LOG | 6.16.40 | ocLog | 208 | interpr2.cxx:ScLog | IMPLEMENTED_MATCH | -| LOG10 | 6.16.41 | ocLog10 | 143 | interpr1.cxx:ScLog10 | IMPLEMENTED_MATCH | -| LOWER | 6.20.14 | ocLower | 138 | interpr1.cxx:ScLower | IMPLEMENTED_MATCH | -| MATCH | 6.14.9 | ocMatch | 281 | interpr1.cxx:ScMatch | IMPLEMENTED_MATCH | -| MAX | 6.18.45 | ocMax | 223 | interpr1.cxx:ScMax | IMPLEMENTED_MATCH (ODF 1.4: 0 parameters impl-defined) | -| MID | 6.20.15 | ocMid | 300 | interpr1.cxx:ScMid | IMPLEMENTED_MATCH | -| MIN | 6.18.48 | ocMin | 222 | interpr1.cxx:ScMin | IMPLEMENTED_MATCH (ODF 1.4: 0 parameters impl-defined) | -| MINUTE | 6.10.13 | ocGetMin | 110 | interpr2.cxx:ScGetMin | IMPLEMENTED_MATCH | -| MOD | 6.16.42 | ocMod | 212 | interpr5.cxx:ScMod | IMPLEMENTED_MATCH | -| MONTH | 6.10.14 | ocGetMonth | 107 | interpr2.cxx:ScGetMonth | IMPLEMENTED_MATCH | -| N | 6.13.26 | ocN | 131 | interpr1.cxx:ScN | IMPLEMENTED_MATCH (ODF 1.4: text case impl-defined) | -| NA | 6.13.27 | ocNotAvail | 71 | interpr1.cxx (via ScNA) | IMPLEMENTED_MATCH | -| NOT | 6.15.7 | ocNot | 60 | interpr1.cxx:ScNot | IMPLEMENTED_MATCH | -| NOW | 6.10.16 | ocGetActTime | 70 | interpr2.cxx:ScGetActTime | IMPLEMENTED_MATCH | -| NPER | 6.12.29 | ocZZR | 258 | interpr2.cxx:ScZZR | IMPLEMENTED_MATCH (trailing-empty-param rule documented) | -| NPV | 6.12.30 | ocNPV | 229 | interpr2.cxx:ScNPV | IMPLEMENTED_MATCH | -| ODD | 6.16.44 | ocOdd | 145 | interpr2.cxx:ScOdd | IMPLEMENTED_MATCH | -| OR | 6.15.8 | ocOr | 53 | interpr1.cxx:ScOr | IMPLEMENTED_MATCH | -| PI | 6.16.45 | ocPi | 65 | interpr1.cxx:ScPi | IMPLEMENTED_MATCH | -| PMT | 6.12.36 | ocRMZ | 251 | interpr2.cxx:ScRMZ | IMPLEMENTED_MATCH | -| POWER | 6.16.46 | ocPower | 209 | interpr2.cxx:ScPower | IMPLEMENTED_MATCH (ODF 1.4: POWER(0,0) impl-defined) | -| PRODUCT | 6.16.47 | ocProduct | 225 | interpr1.cxx:ScProduct | IMPLEMENTED_MATCH | -| PROPER | 6.20.16 | ocPropper | 137 | interpr1.cxx:ScPropper | IMPLEMENTED_MATCH | -| PV | 6.12.41 | ocBW | 244 | interpr2.cxx:ScBW | IMPLEMENTED_MATCH | -| RADIANS | 6.16.49 | ocRad | 81 | interpr2.cxx:ScRad | IMPLEMENTED_MATCH | -| RATE | 6.12.42 | ocZins | 259 | interpr2.cxx:ScZins | IMPLEMENTED_MATCH | -| REPLACE | 6.20.17 | ocReplace | 293 | interpr1.cxx:ScReplace | IMPLEMENTED_MATCH | -| REPT | 6.20.18 | ocRept | 303 | interpr1.cxx:ScRept | IMPLEMENTED_MATCH | -| RIGHT | 6.20.19 | ocRight | 298 | interpr1.cxx:ScRight | IMPLEMENTED_MATCH | -| ROUND | 6.17.5 | ocRound | 204 | interpr2.cxx:ScRound | IMPLEMENTED_MATCH | -| ROWS | 6.13.30 | ocRows | 253 | interpr1.cxx:ScRows | IMPLEMENTED_MATCH | -| SECOND | 6.10.17 | ocGetSec | 111 | interpr2.cxx:ScGetSec | IMPLEMENTED_MATCH | -| SIN | 6.16.55 | ocSin | 82 | interpr1.cxx:ScSin | IMPLEMENTED_MATCH | -| SLN | 6.12.45 | ocLIA | 250 | interpr2.cxx:ScLIA | IMPLEMENTED_MATCH | -| SQRT | 6.16.58 | ocSqrt | 104 | interpr1.cxx:ScSqrt | IMPLEMENTED_MATCH | -| STDEV | 6.18.72 | ocStDev | 233 | interpr3.cxx | IMPLEMENTED_MATCH | -| STDEVP | 6.18.74 | ocStDevP | 234 | interpr3.cxx | IMPLEMENTED_MATCH | -| SUBSTITUTE | 6.20.21 | ocSubstitute | 302 | interpr1.cxx:ScSubstitute | IMPLEMENTED_MATCH | -| SUM | 6.16.61 | ocSum | 224 | interpr1.cxx:ScSum | IMPLEMENTED_MATCH | -| SUMIF | 6.16.62 | ocSumIf | 284 | interpr1.cxx:ScSumIf | IMPLEMENTED_MATCH | -| SYD | 6.12.46 | ocDIA | 245 | interpr2.cxx:ScDIA | IMPLEMENTED_MATCH | -| T | 6.20.22 | ocT | 140 | interpr1.cxx:ScT | IMPLEMENTED_MATCH | -| TAN | 6.16.69 | ocTan | 84 | interpr1.cxx:ScTan | IMPLEMENTED_MATCH | -| TIME | 6.10.18 | ocGetTime | 219 | interpr2.cxx:ScGetTime | IMPLEMENTED_MATCH | -| TODAY | 6.10.20 | ocGetActDate | 69 | interpr2.cxx:ScGetActDate | IMPLEMENTED_MATCH | -| TRIM | 6.20.24 | ocTrim | 135 | interpr1.cxx:ScTrim | IMPLEMENTED_MATCH | -| TRUE | 6.15.9 | ocTrue | 67 | interpr1.cxx:ScTrue | IMPLEMENTED_MATCH | -| TRUNC | 6.17.8 | ocTrunc | 207 | interpr2.cxx:ScTrunc | IMPLEMENTED_MATCH | -| UPPER | 6.20.27 | ocUpper | 136 | interpr1.cxx:ScUpper | IMPLEMENTED_MATCH | -| VALUE | 6.13.34 | ocValue | 141 | interpr1.cxx:ScValue | IMPLEMENTED_MATCH (ODF 1.4: non-text impl-defined) | -| VAR | 6.18.82 | ocVar | 231 | interpr3.cxx | IMPLEMENTED_MATCH | -| VARP | 6.18.84 | ocVarP | 232 | interpr3.cxx | IMPLEMENTED_MATCH | -| VLOOKUP | 6.14.12 | ocVLookup | 286 | interpr1.cxx:ScVLookup | IMPLEMENTED_MATCH (ODF 1.4: unsorted data impl-defined) | -| WEEKDAY | 6.10.21 | ocGetDayOfWeek | 366 | interpr2.cxx:ScGetDayOfWeek | IMPLEMENTED_MATCH | -| YEAR | 6.10.24 | ocGetYear | 106 | interpr2.cxx:ScGetYear | IMPLEMENTED_MATCH | - -**Note:** IFNA (§6.15.6) and SKEWP (§6.18.68) were implemented in Milestone B but are NOT Small Group functions — IFNA is Large Group only, SKEWP is Medium Group only. +| IMPLEMENTED_UNVERIFIED | 110 | All 110 Small Group functions have opcodes, implementations, dispatch entries, and metadata, but runtime semantics have NOT been verified against ODF 1.4. Implementation presence confirmed; semantic equivalence not established. | +| IMPLEMENTED_MATCH | 0 | No function has been verified as semantically matching ODF 1.4 at runtime. | +| PARTIAL | 0 | None identified in this audit. | +| MISSING | 0 | All 110 required functions are present in source. | +| MAPPING_ONLY | 0 | None identified in this audit. | +| NOT_APPLICABLE | 4 | The four explicit allowances (§2.3.2.F/G) - inline arrays, complex numbers, multi-area references, reference union (~). | + +**Key conceptual distinction:** An opcode, evaluator implementation, dispatch entry, and function metadata establish **implementation presence**, not **semantic equivalence**. All 110 functions are marked IMPLEMENTED_UNVERIFIED because no runtime tests have been executed against the ODF 1.4 normative expected results. --- @@ -247,14 +145,14 @@ The Small Group requires 110 functions (§2.3.2.E). All 110 have opcodes and imp | Category | Total | Status | Count | |----------|-------|--------|-------| -| Basic Limits | 4 | CONFIRMED structurally / UNVERIFIED runtime | 4 confirmed, 0 missing | -| Syntax | 11 | CONFIRMED | 11 confirmed, 0 missing | -| Conversions | 5 | CONFIRMED | 5 confirmed, 0 missing | -| Operators | 14 | CONFIRMED | 14 confirmed, 0 missing | -| Functions | 110 | IMPLEMENTED_MATCH | 110 implemented, 0 missing | +| Basic Limits | 4 | UNVERIFIED runtime | 0 verified, 4 UNVERIFIED | +| Syntax | 11 | UNVERIFIED runtime | 0 verified, 11 UNVERIFIED | +| Conversions | 5 | IMPLEMENTED_UNVERIFIED | 0 verified, 5 UNVERIFIED | +| Operators | 14 | IMPLEMENTED_UNVERIFIED | 0 verified, 14 UNVERIFIED | +| Functions | 110 | IMPLEMENTED_UNVERIFIED | 0 verified, 110 UNVERIFIED | | Allowances | 4 | Documented | 4 documented | -**Grand total: 148 requirements, 0 missing, 0 partial.** +**Grand total: 148 requirements, 0 runtime-verified, 148 UNVERIFIED.** --- @@ -262,8 +160,8 @@ The Small Group requires 110 functions (§2.3.2.E). All 110 have opcodes and imp | Function/Area | Section | AOO Behavior | ODF 1.4 Normative | Severity | Source | |---------------|---------|-------------|-------------------|----------|--------| -| INDEX row-vector single-arg | 6.14.6 | Returns column (legacy) | Error (ODF 1.4 removed rule) | Fixed in Milestone A | interpr1.cxx; KNOWN-LIMITATIONS:71 | -| CONVERT atm | 6.16.18 | 101324.996583 Pa | 101325.1 Pa | Fixed in Milestone C | interpr2.cxx; KNOWN-LIMITATIONS:72 | +| INDEX row-vector single-arg | 6.14.6 | Returns error (Milestone A fix: removed ODF 1.3 row-vector shortcut) | Error (ODF 1.4 removed rule) | Fixed in Milestone A; regression risk | interpr1.cxx; KNOWN-LIMITATIONS:71 | +| CONVERT atm | 6.16.18 | 101325.1 Pa (Milestone C fix: corrected from 101324.996583 Pa) | 101325.1 Pa | Fixed in Milestone C | interpr2.cxx; KNOWN-LIMITATIONS:72 | | DATE pre-1583 | 6.10.2 | #VALUE! before 15 Oct 1582 | Support from 1583; earlier impl-defined | Documented impl-defined | interpr2.cxx; IMPLEMENTATION-DEFINED:155 | | COUNTA empty cells | 6.13.7 | ODF 1.3 semantics | ODF 1.4 changed empty-cell handling | UNVERIFIED | interpr1.cxx:ScCount2 | | COUNTBLANK "" | 6.13.8 | Unverified | ODF 1.4: "" case impl-defined | UNVERIFIED | interpr1.cxx:ScCountEmptyCells | diff --git a/openformula-small-group-test-plan.md b/openformula-small-group-test-plan.md new file mode 100644 index 0000000000..de13966e96 --- /dev/null +++ b/openformula-small-group-test-plan.md @@ -0,0 +1,90 @@ +# OpenFormula 1.4 Small Group Test Plan + +## Purpose + +Establish reproducible ODF 1.4 Part 4 Small Group conformance tests before making any +implementation changes. Tests are prepared for later execution once the implementation +milestones are complete. No production evaluator changes are made in this milestone. + +## Test Files + +| File | Purpose | +|------|---------| +| `test/odf-validate/openformula-small-group-1.4.tsv` | Requirement-referenced test inventory (148 ReqIDs from D inventory) | +| `test/odf-validate/calcval-cases14.tsv` | Existing calcval cases, extended with Small Group semantic tests | +| `openformula-small-group-test-plan.md` | This document: execution instructions and outstanding runtime requirements | + +## Execution Instructions + +### Prerequisites + +A configured AOO build tree is required. The `sc` and `scaddins` modules must be built: + +1. Configure AOO (`autogen.sh`/`configure`, then `build.pl --all`) +2. Build the `sc` module (Calc core) +3. Build the `scaddins` module (Analysis Add-in for CONVERT) + +### Running calcval Tests + +The `test/odf-validate/` directory contains the calcval test harness (designed for macOS): + +```bash +# Start the calcval server +test/odf-validate/start.sh calcval <port> + +# Run test cases +test/odf-validate/runpy.sh calcval.py <port> calcval-cases14.tsv <out.json> + +# Compare results +python3 -I calcval.py --compare <out.json> <expected.json> +``` + +### Test Case Format + +Each calcval case has 5 tab-separated columns: +1. **id**: Unique test identifier +2. **formula**: AOO API syntax (English function names, ';' separators) +3. **mode**: `cell` (plain cell), `cell@N` (scratch cell), `array[:CxR]` (array formula) +4. **expected**: Expected result ('-', number with tolerance, '#N/A', '#ERR', 's:text') +5. **note**: Normative section reference and description + +### Priority Order for Test Execution + +| Priority | Area | Test Cases | Rationale | +|----------|------|------------|-----------| +| 1 | COUNTA/COUNTBLANK empty cells | `COUNTA.range`, `COUNTA.text`, `COUNTBLANK.range` | ODF 1.4 changed empty-cell semantics; can silently alter spreadsheet results | +| 2 | DATE pre-1583 | `DATE.pre1583` | ODF 1.4 §7.4 impl-defined; verify AOO behavior | +| 3 | INDEX row-vector | `INDEX.rowvec.single`, `INDEX.rowvec.colarg`, `INDEX.row.outrange` | Milestone A fix; regression risk for legacy documents | +| 4 | Bitwise functions | `BITLSHIFT.neg`, `BITRSHIFT.neg`, `BITAND.3params` | Parameter count and negative shift behavior | +| 5 | Parser/operators | `SYN-005-precedence`, `SYN-005-power`, `OP-006-div0` | Operator precedence and associativity | + +## Outstanding Runtime Requirements + +The following cannot be verified until a configured AOO build tree exists: + +| Requirement | Reason | +|-------------|--------| +| All 4 Basic Limits (§3.7) | No runtime test execution possible | +| All 11 Syntax items (§5) | No runtime test execution possible | +| All 5 Implicit Conversions (§6.3) | No runtime test execution possible | +| All 14 Operators (§6.4) | No runtime test execution possible | +| All 110 Functions (§2.3.2.E) | No runtime test execution possible | +| ODF save/reload round-trip | No built office available | +| Excel import/export | No built office available | + +## Relationship to Milestones + +- **Milestone D**: Established the 110-function Small Group inventory +- **Milestone D.1**: Corrected audit inconsistencies (statuses = IMPLEMENTED_UNVERIFIED) +- **Milestone E (this)**: Created test inventory and test cases +- **Milestone F**: Implement confirmed semantic corrections (narrowly scoped) +- **Milestone G**: ODF import/export and round-trip conformance +- **Milestone H**: Final consolidated verification + +## What Must NOT Change + +- No production evaluator changes in this milestone +- No new runtime dependencies +- No mandatory `sc` or `scaddins` builds during this milestone +- Tests use existing `test/odf-validate` tooling and `calcval-cases14.tsv` conventions +- Tests are NOT added to the normal production build diff --git a/openformula-test-gap-analysis.md b/openformula-test-gap-analysis.md index 80122d75c3..934dc77367 100644 --- a/openformula-test-gap-analysis.md +++ b/openformula-test-gap-analysis.md @@ -39,10 +39,10 @@ Source-of-truth: `test/aoo-test/`, `test/odf-validate/`, and AOO source. Finding - **[CONFIRMED]** EASTERSUNDAY: implemented (`interpr2.cxx:261`) but NOT in either function inventory. No dedicated test coverage confirmed. **[CONFIRMED] IFNA and SKEWP are no longer missing functions.** Both were implemented in Milestone B. The test inventories list them as standard ODF functions, which is now correct. - ### Missing semantic tests -- No confirmed semantic test for CONVERT `atm` discrepancy (101324.996583 Pa vs ODF 1.4 1.0132510E+5). -- No confirmed semantic test for INDEX row-vector single-argument (ODF 1.4: error; AOO: returns column). + +- No confirmed semantic test for CONVERT `atm` (fixed in Milestone C: 101325.1 Pa vs old 101324.996583 Pa). +- No confirmed semantic test for INDEX row-vector single-argument (fixed in Milestone A: ODF 1.4 error vs old column return). - No confirmed semantic test for DATE pre-1583 (#VALUE! before 15 Oct 1582; proleptic Gregorian for YEAR/MONTH/DAY). - No confirmed semantic test for BITAND/BITOR/BITXOR/BITLSHIFT/BITRSHIFT variadic params or negative-shift handling (interpr1.cxx:1231-1234 appears inverted). - No confirmed semantic test for short-circuit AND/OR. @@ -55,10 +55,10 @@ Source-of-truth: `test/aoo-test/`, `test/odf-validate/`, and AOO source. Finding ### Missing ODF round-trip tests - No confirmed round-trip test verifying function names written on ODF export (e.g. `ORG.OPENOFFICE.CURRENT` vs `CURRENT`, `ORG.OPENOFFICE.ERRORTYPE` vs `ERROR.TYPE`, `ORG.OPENOFFICE.EASTERSUNDAY` vs `EASTERSUNDAY`, `ORG.OPENOFFICE.STYLE` vs `STYLE`, `ORG.OPENOFFICE.MULTIRANGE` vs `~`, `MULTIRANGE` legacy). - `odf_docs/ODF14-KNOWN-LIMITATIONS-PUBLIC.md` notes formula cells with error results written as `office:value-type="string"` (ODF 1.4 adds `error` type) — no confirmed round-trip test for error value type. - ### Existing tests that produce false confidence -- `openformula-functions.txt` lists IFNA/SKEWP as standard ODF 1.2 functions, but AOO does not implement them — a test that only checks "name in inventory" passes while implementation is absent. -- Inventories are ODF 1.2, so they do not flag ODF 1.4 regressions (INDEX row-vector, CONVERT atm, COUNTA empty cells). + +- `openformula-functions.txt` lists IFNA/SKEWP as standard ODF 1.2 functions; AOO now implements them (Milestone B), so this is no longer a false-negative for conformance. +- Inventories are ODF 1.2, so they do not flag ODF 1.4 regressions (INDEX row-vector fixed in Milestone A, CONVERT atm fixed in Milestone C, COUNTA empty cells). ## 3. Proposed versioned test inventory diff --git a/test/odf-validate/calcval-cases14.tsv b/test/odf-validate/calcval-cases14.tsv index 1da4185ca4..b58761e57c 100644 --- a/test/odf-validate/calcval-cases14.tsv +++ b/test/odf-validate/calcval-cases14.tsv @@ -142,3 +142,13 @@ IFNA.range =IFNA(D1:D3;99) cell 10 6.x range reference, implicit intersection ta SKEWP.two =SKEWP(1;2) cell 0 6.x two observations, non-constant, zero skewness SKEW.text =SKEW(1;"text";2) cell 0 6.x regression: direct scalar text skipped, {1,2} symmetric SKEW.err =SKEW(1/0) cell #ERR 6.x regression: error argument propagates +COUNTA.range =COUNTA(D1:D3) cell 3 6.13.7 COUNTA over numeric range (D1:D3=10,20,30) +COUNTA.text =COUNTA(E1:E3) cell 3 6.13.7 COUNTA over text range (E1:E3=y,x,y) +COUNTBLANK.range =COUNTBLANK(D1:D3) cell 0 6.13.8 COUNTBLANK over range with no empty cells +DATE.pre1583 =DATE(1500;1;1) cell #ERR 6.10.2 DATE before 1583: impl-defined #VALUE! +INDEX.rowvec.single =INDEX(H1:L1;3) cell #ERR 6.14.6 INDEX row vector single arg: ODF 1.4 error (Milestone A fix) +INDEX.rowvec.colarg =INDEX(H1:L1;;3) cell 30 6.14.6 INDEX row vector with column arg only (col 3 of H1:L1=10,20,30,40,50) +INDEX.row.outrange =INDEX(D1:D5;6) cell #ERR 6.14.6 INDEX row out of range +BITLSHIFT.neg =BITLSHIFT(8;-1) cell 4 6.6.3 BITLSHIFT negative shift count reverses direction +BITRSHIFT.neg =BITRSHIFT(8;-1) cell 16 6.6.5 BITRSHIFT negative shift count reverses direction +BITAND.3params =BITAND(6;3;1) cell #ERR 6.6.2 BITAND exactly 2 params enforced diff --git a/test/odf-validate/openformula-small-group-1.4.tsv b/test/odf-validate/openformula-small-group-1.4.tsv new file mode 100644 index 0000000000..9b9c8f8d64 --- /dev/null +++ b/test/odf-validate/openformula-small-group-1.4.tsv @@ -0,0 +1,79 @@ +# OpenFormula 1.4 Small Group semantic test inventory. +# Columns (tab separated): ReqID, Section, TestID, Formula, Expected, Actual, Status, Note +# ReqID: References openformula-small-group-1.4.tsv requirement ID +# Section: ODF 1.4 Part 4 section +# TestID: Unique test identifier +# Formula: AOO API syntax (English function names, ';' separators), leading '=' +# Expected: Expected result per ODF 1.4 normative text ('-', number, '#N/A', '#ERR', 's:text') +# Actual: Actual result from calcval execution (leave empty if not yet tested) +# Status: UNVERIFIED, PASSED, FAILED +# Note: Additional context + +# ===== Basic Limits (§3.7) ===== +SG-BL-001 3.7 BL-001-1024chars =REPT("a";1024) s:aaa...a (1024 a's) - UNVERIFIED Formula length: 1024 characters +SG-BL-002 3.7 BL-002-30params =MAX(1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30) 30 - UNVERIFIED 30 parameters in MAX +SG-BL-003 3.7 BL-003-32767chars =REPT("a";32767) s:aaa...a (32767 a's) - UNVERIFIED String of 32767 ASCII characters +SG-BL-004 3.7 BL-004-7nesting =IF(IF(IF(IF(IF(IF(TRUE;1;2);3;4);5;6);7;8);9;10) 10 - UNVERIFIED 7 nesting levels of IF + +# ===== Syntax (§5) ===== +SG-SYN-002 5.2 SYN-002-parens =(2+3)*4 20 - UNVERIFIED Parenthesized expression evaluation order +SG-SYN-003 5.3 SYN-003-decimal =1.5 1.5 - UNVERIFIED Decimal number literal +SG-SYN-003 5.3 SYN-003-sci =1.5e2 150 - UNVERIFIED Scientific notation literal +SG-SYN-004 5.4 SYN-004-string ="hello" s:hello - UNVERIFIED String literal +SG-SYN-004 5.4 SYN-004-quote ="he said ""hi""" s:he said "hi" - UNVERIFIED Quote escaping in string +SG-SYN-005 5.5 SYN-005-precedence =2+3*4 14 - UNVERIFIED Operator precedence: * before + +SG-SYN-005 5.5 SYN-005-power =2^3^2 512 - UNVERIFIED Power operator right-associativity +SG-SYN-006 5.6 SYN-006-func =ABS(-5) 5 - UNVERIFIED Function call with argument +SG-SYN-007 5.7 SYN-007-nonstandard =NONEXISTENT() #ERR - UNVERIFIED Nonstandard function name error +SG-SYN-008 5.8 SYN-008-ref =A1 10 - UNVERIFIED Cell reference (A1=10 per data setup) +SG-SYN-008 5.8 SYN-008-range =SUM(D1:D3) 60 - UNVERIFIED Range reference (D1:D3 = 10,20,30) +SG-SYN-009 5.11 SYN-009-named =MYNAME - - UNVERIFIED Simple named expression (name must be defined) +SG-SYN-010 5.12 SYN-010-error =NA() #N/A - UNVERIFIED Error constant #N/A +SG-SYN-011 5.14 SYN-011-whitespace =2 + 3 * 4 14 - UNVERIFIED Whitespace does not affect evaluation + +# ===== Operators (§6.4) ===== +SG-OP-001 6.4.9 OP-001-lt =1<2 TRUE - UNVERIFIED Less than +SG-OP-001 6.4.9 OP-001-le =2<=2 TRUE - UNVERIFIED Less than or equal +SG-OP-001 6.4.9 OP-001-gt =3>2 TRUE - UNVERIFIED Greater than +SG-OP-001 6.4.9 OP-001-ge =2>=2 TRUE - UNVERIFIED Greater than or equal +SG-OP-002 6.4.10 OP-002-concat ="a"&"b" s:ab - UNVERIFIED String concatenation +SG-OP-003 6.4.2 OP-003-add =2+3 5 - UNVERIFIED Addition +SG-OP-004 6.4.3 OP-004-sub =5-3 2 - UNVERIFIED Subtraction +SG-OP-005 6.4.4 OP-005-mul =2*3 6 - UNVERIFIED Multiplication +SG-OP-006 6.4.5 OP-006-div =6/3 2 - UNVERIFIED Division +SG-OP-006 6.4.5 OP-006-div0 =1/0 #ERR - UNVERIFIED Division by zero error +SG-OP-007 6.4.6 OP-007-pow =2^3 8 - UNVERIFIED Power +SG-OP-008 6.4.7 OP-008-eq =2=2 TRUE - UNVERIFIED Equality +SG-OP-009 6.4.8 OP-009-ne =2<>3 TRUE - UNVERIFIED Not equal +SG-OP-010 6.4.14 OP-010-pct =50% 0.5 - UNVERIFIED Postfix percent +SG-OP-011 6.4.15 OP-011-pos =+5 5 - UNVERIFIED Prefix plus +SG-OP-012 6.4.16 OP-012-neg =-5 -5 - UNVERIFIED Prefix minus +SG-OP-013 6.4.12 OP-013-intersect =A1:C3!B1:D2 - - UNVERIFIED Reference intersection +SG-OP-014 6.4.11 OP-014-range =SUM(A1:A3) - - UNVERIFIED Reference range + +# ===== Implicit Conversions (§6.3) ===== +SG-CONV-001 6.3.14 CONV-001-text =TEXT(123;"0") s:123 - UNVERIFIED Number to text conversion +SG-CONV-002 6.3.5 CONV-002-number =VALUE("123") 123 - UNVERIFIED Text to number conversion +SG-CONV-003 4.8 CONV-003-ref =N(A1) 10 - UNVERIFIED Reference to scalar conversion (A1=10) +SG-CONV-004 6.3.12 CONV-004-logical =N(TRUE) 1 - UNVERIFIED Logical to number conversion +SG-CONV-004 6.3.12 CONV-004-logical2 =IF(0;TRUE;FALSE) FALSE - UNVERIFIED Number to logical conversion (0 = FALSE) +SG-CONV-005 5.12 CONV-005-error =ISERR(1/0) TRUE - UNVERIFIED Error propagation: division by zero + +# ===== Functions (§6.x) — Priority 1: COUNTA/COUNTBLANK empty cells ===== +SG-FN-013 6.13.7 FN-013-COUNTA-empty =COUNTA(D1:D3) 3 - UNVERIFIED COUNTA over range with numbers (D1:D3=10,20,30) +SG-FN-013 6.13.7 FN-013-COUNTA-text =COUNTA(E1:E3) 3 - UNVERIFIED COUNTA over range with text (E1:E3="y","x","y") +SG-FN-014 6.13.8 FN-014-COUNTBLANK-empty =COUNTBLANK(D1:D3) 0 - UNVERIFIED COUNTBLANK over range with no empty cells +SG-FN-014 6.13.8 FN-014-COUNTBLANK-empty-str =COUNTBLANK(E1:E3) 0 - UNVERIFIED COUNTBLANK over range with text (not empty) + +# ===== Functions (§6.x) — Priority 2: DATE pre-1583 ===== +SG-FN-016 6.10.2 FN-016-DATE-pre1583 =DATE(1500;1;1) #ERR - UNVERIFIED DATE before 1583: impl-defined, AOO returns #VALUE! +SG-FN-067 6.13.27 FN-067-NA =NA() #N/A - UNVERIFIED NA function returns #N/A error + +# ===== Functions (§6.x) — Priority 3: INDEX ===== +SG-FN-042 6.14.6 FN-042-INDEX-2d =INDEX(D1:F3;2;3) - - UNVERIFIED INDEX two-dimensional: row 2, col 3 of D1:F3 +SG-FN-042 6.14.6 FN-042-INDEX-row-outrange =INDEX(D1:D5;6) #ERR - UNVERIFIED INDEX row out of range +SG-FN-042 6.14.6 FN-042-INDEX-rowvec-single =INDEX(H1:L1;3) #ERR - UNVERIFIED INDEX row vector single arg: ODF 1.4 error (Milestone A fix) +SG-FN-042 6.14.6 FN-042-INDEX-rowvec-colarg =INDEX(H1:L1;;3) - - UNVERIFIED INDEX row vector with column arg only + +# ===== Operators — reference intersection ===== +SG-OP-013 6.4.12 OP-013-intersect-num =SUM(A1:C3!B1:D2) - - UNVERIFIED Reference intersection in SUM
