!! Version 2 # Force the test runner to ensure the extension is loaded !! functionhooks af_foreach !! endfunctionhooks # This file tests the #af_foreach parser function !! test Test loop over simple list !! wikitext {{#af_foreach: {{#af_list: a | b | c }} | | value | {{{value}}} }} !! html

abc

!! end !! test Test loop over simple list with key !! wikitext {{#af_foreach: {{#af_list: a | b | c }} | key | value | {{{key}}}={{{value}}} }} !! html

0=a1=b2=c

!! end !! test Test loop over empty list !! wikitext {{#af_foreach: {{AF_EMPTY}} | key | value | {{{value}}} }} !! html !! end !! test Test loop without key or value !! wikitext {{#af_foreach: {{#af_list: a | b | c }} | | | a }} !! html

aaa

!! end !! test Test loop over object !! wikitext {{#af_foreach: {{#af_object: foo=bar | boo=far }} | | value | {{{value}}} }} !! html

barfar

!! end !! test Test loop over object with key !! wikitext {{#af_foreach: {{#af_object: foo=bar | boo=far }} | key | value | {{{key}}}={{{value}}} }} !! html

foo=barboo=far

!! end !! test Test loop over object without key or value !! wikitext {{#af_foreach: {{#af_object: foo=bar | boo=far }} | | | a }} !! html

aa

!! end !! test Test loop over object with simple delimiter !! wikitext {{#af_foreach: {{#af_object: foo=bar | boo=far }} | key | value | {{{key}}}={{{value}}} | delimiter=! }} !! html

foo=bar!boo=far

!! end !! test Test loop over object with escape sequence !! wikitext {{#af_foreach: {{#af_object: foo=bar | boo=far }} | key | value | {{{key}}}={{{value}}} | delimiter=\n }} !! html

foo=bar boo=far

!! end !! test Test loop over object with escape sequence 2 !! wikitext {{#af_foreach: {{#af_object: foo=bar | boo=far }} | key | value | {{{key}}}={{{value}}} | delimiter=\s }} !! html

foo=bar boo=far

!! end !! test Test no body !! wikitext {{#af_foreach: {{#af_list: a | b | c }} | key | value }} !! html !! end !! test Test no value !! wikitext {{#af_foreach: {{#af_list: a | b | c }} | key }} !! html !! end !! test Test no key !! wikitext {{#af_foreach: {{#af_list: a | b | c }} }} !! html !! end !! test Test first parameter must be an array !! wikitext {{#af_foreach: foobar | key | value | }} !! html

ArrayFunctions (#af_foreach): Could not match expected type array with actual type string for parameter 1 ("foobar").

!! end !! test Test too many arguments !! wikitext {{#af_foreach: {{#af_list: a | b | c }} | key | value | body | more }} !! html

ArrayFunctions (#af_foreach): Expected at most 4 positional parameters, 5 given.

!! end !! test Test loop over array with single value !! wikitext {{#af_foreach: {{#af_list: single }} | key | value | {{{key}}}={{{value}}} }} !! html

0=single

!! end !! test Test loop over empty array !! wikitext {{#af_foreach: {{AF_EMPTY}} | key | value | {{{key}}}={{{value}}} }} !! html !! end !! test Test loop over array with delimiter !! wikitext {{#af_foreach: {{#af_list: a | b | c }} | key | value | {{{value}}} | delimiter=, }} !! html

a,b,c

!! end !! test Test loop over array with no key or value and delimiter !! wikitext {{#af_foreach: {{#af_list: x | y | z }} | | | z | delimiter=; }} !! html

z;z;z

!! end !! test Test loop over object with complex body !! wikitext {{#af_foreach: {{#af_object: name=John | age=30 }} | key | value | {{{key}}}: {{{value}}} }} !! html

name: Johnage: 30

!! end !! test Test loop over array with escaped delimiter !! wikitext {{#af_foreach: {{#af_list: 1 | 2 | 3 }} | key | value | {{{value}}} | delimiter=\n }} !! html

1 2 3

!! end !! test Test empty array with delimiter !! wikitext {{#af_foreach: {{AF_EMPTY}} | key | value | {{{key}}}={{{value}}} | delimiter=, }} !! html !! end !! test Test object with duplicate keys !! wikitext {{#af_foreach: {{#af_object: key=value1 | key=value2 }} | key | value | {{{key}}}={{{value}}} }} !! html

key=value2

!! end !! test Test nested foreach loops !! wikitext {{#af_foreach: {{#af_list: 1 | 2 }} | outerKey | outerValue | {{#af_foreach: {{#af_list: a | b }} | innerKey | innerValue | {{{outerValue}}}:{{{innerValue}}} }} }} !! html

1:a1:b2:a2:b

!! end !! test Test invalid array parameter !! wikitext {{#af_foreach: notAnArray | key | value | {{{key}}}={{{value}}} }} !! html

ArrayFunctions (#af_foreach): Could not match expected type array with actual type string for parameter 1 ("notAnArray").

!! end !! test Test missing body with valid array !! wikitext {{#af_foreach: {{#af_list: a | b | c }} | key | value }} !! html !! end !! test Test array with special characters !! wikitext {{#af_foreach: {{#af_list: @ | # | $ }} | key | value | {{{value}}} }} !! html

@#$

!! end !! test Test nested loop with delimiter !! wikitext {{#af_foreach: {{#af_list: x | y }} | outerKey | outerValue | {{#af_foreach: {{#af_list: 1 | 2 }} | innerKey | innerValue | {{{outerValue}}}-{{{innerValue}}} | delimiter=; }} | delimiter=, }} !! html

x-1;x-2,y-1;y-2

!! end !! test Test too many arguments in foreach !! wikitext {{#af_foreach: {{#af_list: a | b | c }} | key | value | body | extra }} !! html

ArrayFunctions (#af_foreach): Expected at most 4 positional parameters, 5 given.

!! end