-
-
Notifications
You must be signed in to change notification settings - Fork 767
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ICU-22907 MF2: Finish updating spec tests and implement required test functions #3216
base: main
Are you sure you want to change the base?
ICU-22907 MF2: Finish updating spec tests and implement required test functions #3216
Conversation
2680b67
to
c3902e3
Compare
Notice: the branch changed across the force-push!
~ Your Friendly Jira-GitHub PR Checker Bot |
c3902e3
to
5f55d7c
Compare
Notice: the branch changed across the force-push!
~ Your Friendly Jira-GitHub PR Checker Bot |
5f55d7c
to
38500d3
Compare
Notice: the branch changed across the force-push!
~ Your Friendly Jira-GitHub PR Checker Bot |
51d2915
to
43b0280
Compare
Notice: the branch changed across the force-push!
~ Your Friendly Jira-GitHub PR Checker Bot |
43b0280
to
076ee46
Compare
Notice: the branch changed across the force-push!
~ Your Friendly Jira-GitHub PR Checker Bot |
076ee46
to
31abd17
Compare
Hooray! The files in the branch are the same across the force-push. 😃 ~ Your Friendly Jira-GitHub PR Checker Bot |
… functions Implement :test:format, :test:select, and :test:function, which are required by the new `pattern-selection.json` tests. Change the internal value representation in the formatter in order to support some of the test cases (binding the results of selectors to a variable).
31abd17
to
99fe24c
Compare
Notice: the branch changed across the force-push!
~ Your Friendly Jira-GitHub PR Checker Bot |
@catamorphism and @srl295 What's going on with this one? Do we need new reviewers? Is this still happening? |
@richgillam I'm currently on medical leave, hopefully returning Feb. 24. In the meantime, it could be reviewed. I hope it's still happening, as it's necessary for spec compliance! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this looks reasonable to me— there are suggestions for improvement that are minor - performance, maintainability. I would recommend this is mergable with followups.
} | ||
// 9. If the fails option is set, then | ||
Formattable failsOpt; | ||
if (options.getFunctionOption(UnicodeString("fails"), failsOpt)) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is the expensive constructor for UnicodeString, using default char* constructor.
I think a followon would be good to make these statics or something.
UnicodeString failsString = failsOpt.getString(status); | ||
if (U_SUCCESS(status)) { | ||
// 9i. If its value resolves to the string 'always', then | ||
if (failsString == u"always") { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- won't this construct a string every time?
- move these strings into constants?
@@ -211,6 +211,60 @@ namespace message2 { | |||
|
|||
TextSelector(const Locale& l) : locale(l) {} | |||
}; | |||
|
|||
// See https://github.com/unicode-org/message-format-wg/blob/main/test/README.md |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For API (though this is internal?) this should perhaps go to something more permanent in the ICU user guide?
// TODO doc comments | ||
// Encapsulates either a formatted string or formatted number; | ||
// more output types could be added in the future. | ||
// Returns a new FunctionOptions |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
// Returns a new FunctionOptions | |
/** | |
* The original FunctionOptions isn't usable after this call. | |
* @returns A new, merged FunctionOptions. | |
*/ |
is 'other' usable after this?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
looks like neither are usable
// 3i. The character . U+002E Full Stop. | ||
result += u"."; | ||
// 3ii. The single decimal digit character representing the value | ||
// floor((abs(Input) - floor(abs(Input))) * 10) | ||
int32_t val = floor((abs(input) - floor(abs(input)) * 10)); | ||
result += digitToChar(val, status); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
seems like it should be a utility function w/ other ICU number formatting. COuld be future.
} | ||
|
||
ResolvedSelector::ResolvedSelector(FormattedPlaceholder&& val) : value(std::move(val)) {} | ||
// Options in `this` take precedence | ||
// `this` can't be used after mergeOptions is called |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
i added a comment, this might be good to note in the function declaration
} else { | ||
formatSelectors(context, *globalEnv, status, result); | ||
// Check for errors/warnings -- if so, then the result of pattern selection is the fallback value | ||
// See https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#pattern-selection |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
should link to tr35 - maybe current spec
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
// See https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#pattern-selection | |
// See https://www.unicode.org/reports/tr35/tr35-messageFormat.html#pattern-selection |
@@ -465,8 +469,42 @@ static double parseNumberLiteral(const FormattedPlaceholder& input, UErrorCode& | |||
return result; | |||
} | |||
|
|||
static UChar32 digitToChar(int32_t val, UErrorCode errorCode) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
should be merged with or use other utility function in ICU
This PR does everything that's needed in order to make the pattern-selection spec tests work.
This includes implementing the test-only standard functions,
test:function
,test:format
andtest:select
, specified in the test README file in the spec.This was tricky because the select-only
test:select
function is used in a composable way in these tests, which isn't something that appeared in previous tests. Previously, the code assumed that a named result of a selector could be used in a.match
, but not used as an operand to another function.So in this PR, I implement a limited form of what will eventually (see draft PR #3228, which is still in design review) be a more coherent mechanism for function composition. I implemented just enough of it to make these tests work.
I added an
InternalValue
type used in the formatter, which is distinct from theFormattedPlaceholder
type that function handlers return. This makes it easier to guarantee that fallback (error) values are not passed to functions. AnInternalValue
includes a function name, operand, and options. Since at the time when a resolved value is named, it's unknown whether it will be used for formatting or selection,InternalValue
has both a formatting and a selection method, which can be called when the resolved value is eventually consumed by either a.match
or a pattern.I had to modify the
depstest.py
script for the same reasons as before; now, code that manipulates variants is also found inmessageformat2_evaluation.cpp
, but as before, it's never used in a way that could throw an exception.I'll be happy to explain more and/or add comments to the code as needed.
Checklist