@@ -23,3 +23,103 @@ Some examples of test harnesses using these tests, from the source repository:
2323A [ JSON schema] ( ./schemas/ ) is included for the test files in this repository.
2424
2525For users of Visual Studio Code, a [ settings file] ( ./.vscode/settings.json ) is included that enables schema validation while editing the test files.
26+
27+ ## Test Functions
28+
29+ As the behaviour of some of the default registry _ functions_
30+ such as ` :number ` and ` :datetime `
31+ is dependent on locale-specific data and may vary between implementations,
32+ the following _ functions_ are defined for ** test use only** :
33+
34+ ### ` :test:function `
35+
36+ This function is valid both as a _ selector_ and as a _ formatter_ .
37+
38+ #### Operands
39+
40+ The function ` :test:function ` requires a [ Number Operand] ( /spec/registry.md#number-operands ) as its _ operand_ .
41+
42+ #### Options
43+
44+ The only _ option_ ` :test:function ` recognizes is ` decimalPlaces ` ,
45+ a _ digit size option_ for which only ` 0 ` and ` 1 ` are valid values.
46+
47+ All other _ options_ and their values are ignored.
48+
49+ #### Behavior
50+
51+ When resolving a ` :test:function ` expression,
52+ its ` Input ` and ` DecimalPlaces ` values are determined as follows:
53+
54+ 1 . Let ` DecimalPlaces ` be 0.
55+ 1 . Let ` arg ` be the resolved value of the _ expression_ _ operand_ .
56+ 1 . If ` arg ` is the resolved value of an _ expression_
57+ with a ` :test:function ` , ` :test:select ` , or ` :test:format ` _ annotation_
58+ for which resolution has succeeded, then
59+ 1 . Let ` Input ` be the ` Input ` value of ` arg ` .
60+ 1 . Set ` DecimalPlaces ` to be ` DecimalPlaces ` value of ` arg ` .
61+ 1 . Else if ` arg ` is a numerical value
62+ or a string matching the ` number-literal ` production, then
63+ 1 . Let ` Input ` be the numerical value of ` arg ` .
64+ 1 . Else,
65+ 1 . Emit "bad-input" _ Resolution Error_ .
66+ 1 . Use a _ fallback value_ as the resolved value of the _ expression_ .
67+ Further steps of this algorithm are not followed.
68+ 1 . If the ` decimalPlaces ` _ option_ is set, then
69+ 1 . If its value resolves to a numerical integer value 0 or 1
70+ or their corresponding string representations ` '0' ` or ` '1' ` , then
71+ 1 . Set ` DecimalPlaces ` to be the numerical value of the _ option_ .
72+ 1 . Else if its value is not an unresolved value set by _ option resolution_ ,
73+ 1 . Emit "bad-option" _ Resolution Error_ .
74+ 1 . Use a _ fallback value_ as the resolved value of the _ expression_ .
75+
76+ When ` :test:function ` is used as a _ selector_ ,
77+ the behaviour of calling it as the ` rv ` value of MatchSelectorKeys(` rv ` , ` keys ` )
78+ (see [ Resolve Preferences] ( /spec/formatting.md#resolve-preferences ) for more information)
79+ depends on its ` Input ` and ` DecimalPlaces ` values.
80+
81+ - If the ` Input ` is 1 and ` DecimalPlaces ` is 1,
82+ the method will return some slice of the list « ` '1.0' ` , ` '1' ` »,
83+ depending on whether those values are included in ` keys ` .
84+ - If the ` Input ` is 1 and ` DecimalPlaces ` is 0,
85+ the method will return the list « ` '1' ` » if ` keys ` includes ` '1' ` , or an empty list otherwise.
86+ - If the ` Input ` is any other value, the method will return an empty list.
87+
88+ When an _ expression_ with a ` :test:function ` _ annotation_ is assigned to a _ variable_ by a _ declaration_
89+ and that _ variable_ is used as an _ option_ value,
90+ its resolved value is the ` Input ` value.
91+
92+ When ` :test:function ` is used as a _ formatter_ ,
93+ a _ placeholder_ resolving to a value with a ` :test:function ` _ expression_
94+ is formatted as a concatenation of the following parts:
95+
96+ 1 . If ` Input ` is less than 0, the character ` - ` U+002D Hyphen-Minus.
97+ 1 . The truncated absolute integer value of ` Input ` , i.e. floor(abs(` Input ` )),
98+ formatted as a sequence of decimal digit characters (U+0030...U+0039).
99+ 1 . If ` DecimalPlaces ` is 1, then
100+ 1 . The character ` . ` U+002E Full Stop.
101+ 1 . The single decimal digit character representing the value floor((abs(` Input ` ) - floor(abs(` Input ` ))) \* 10)
102+
103+ If the formatting target is a sequence of parts,
104+ each of the above parts will be emitted separately
105+ rather than being concatenated into a single string.
106+
107+
108+ ### ` :test:select `
109+
110+ This _ function_ accepts the same _ operands_ and _ options_ ,
111+ and behaves exactly the same as ` :test:function ` ,
112+ except that it cannot be used for formatting.
113+
114+ When ` :test:select ` is used as a _ formatter_ ,
115+ a "not-formattable" error is emitted and the _ placeholder_ is formatted with
116+ a _ fallback value_ .
117+
118+ ### ` :test:format `
119+
120+ This _ function_ accepts the same _ operands_ and _ options_ ,
121+ and behaves exactly the same as ` :test:function ` ,
122+ except that it cannot be used for selection.
123+
124+ When ` :test:format ` is used as a _ selector_ ,
125+ the steps under 2.iii. of [ Resolve Selectors] ( /spec/formatting.md#resolve-selectors ) are followed.
0 commit comments