{ "No varspec (section 3.3, paragraph 3)" : { "variables": { "var" : "value" }, "testcases" : [ ["{}", "{}"], ["{,}", "{,}"], ["{,,}", "{,,}"] ] }, "Missing closing brace (section 3.3 paragraph 4)" : { "variables": { "var" : "value", "hello" : "Hello World!", "list" : [ "val1", "val2", "val3" ], "keys" : {"key1": "val1", "key2": "val2"}, "x" : "1024", "y" : "768" }, "testcases" : [ ["{var", "value"], ["{hello", "Hello%20World%21"], ["{x,y", "1024,768"], ["{var=default", "value"], ["{undef=default", "default"], ["{list", "val1,val2,val3"], ["{list*", "val1,val2,val3"], ["{list+", "list.val1,list.val2,list.val3"], ["{keys", "key1,val1,key2,val2"], ["{keys*", "key1,val1,key2,val2"], ["{keys+", "keys.key1,val1,keys.key2,val2"] ] }, "varspec of only operator and explodes (section 3.3?)" : { "variables": { "var" : "value" }, "testcases" : [ ["{+}", "{+}"], ["{;}", "{;}"], ["{?}", "{?}"], ["{/}", "{/}"], ["{.}", "{.}"], ["{+,}", "{+,}"], ["{;,}", "{;,}"], ["{?,}", "{?,}"], ["{/,}", "{/,}"], ["{.,}", "{.,}"], ["{++}", "{++}"], ["{;+}", "{;+}"], ["{?+}", "{?+}"], ["{/+}", "{/+}"], ["{.+}", "{.+}"], ["{+*}", "{+*}"], ["{;*}", "{;*}"], ["{?*}", "{?*}"], ["{/*}", "{/*}"], ["{.*}", "{.*}"] ] }, "One good varspec and bad varspecs (section 3.3, paragraph 3?)" : { "variables": { "var" : "value" }, "testcases" : [ ["{var,}", "value"], ["{,var}", "value"], ["{,var,,}", "value"], ["{+var,,}", "value"], ["{;var,,}", ";var=value"], ["{?var,,}", "?var=value"], ["{/var,,}", "/value"], ["{.var,,}", ".value"], ["{+,var,}", "value"], ["{;,var,}", ";var=value"], ["{?,var,}", "?var=value"], ["{/,var,}", "/value"], ["{.,var,}", ".value"], ["{+,,var}", "value"], ["{;,,var}", ";var=value"], ["{?,,var}", "?var=value"], ["{/,,var}", "/value"], ["{.,,var}", ".value"] ] }, "Multiple undefined variables (section 3.4)" : { "variables": { "var" : "value" }, "testcases" : [ ["{undef1,undef2}", ""], ["{+undef1,undef2}", ""], ["{;undef1,undef2}", ""], ["{?undef1,undef2}", ""], ["{/undef1,undef2}", ""], ["{.undef1,undef2}", ""] ] }, "Default with variable in varspec (just reported like above cases)" : { "variables": { "var" : "value" }, "testcases" : [ ["{=foo}", "{=foo}"] ] }, "varspec with bad partial (partial gets ignored)" : { "variables": { "var" : "value" }, "testcases" : [ ["{var:}", "value"], ["{var^}", "value"] ] }, "Default of empty string and edge cases with empty strings" : { "variables": { "empty" : "", "x" : "1024", "y" : "768" }, "testcases" : [ ["{empty}", ""], ["{;x,empty,y}", ";x=1024;empty;y=768"], ["{?x,empty,y}", "?x=1024&empty&y=768"], ["{x,empty,y}", "1024,,768"], ["{+x,empty,y}", "1024,,768"], ["{/x,empty,y}", "/1024//768"], ["{.x,empty,y}", ".1024..768"], ["{undef=}", ""], ["{;x,undef=,y}", ";x=1024;undef;y=768"], ["{?x,undef=,y}", "?x=1024&undef&y=768"], ["{x,undef=,y}", "1024,,768"], ["{+x,undef=,y}", "1024,,768"], ["{/x,undef=,y}", "/1024//768"], ["{.x,undef=,y}", ".1024..768"] ] }, "Two defaults for one variable" : { "variables": { "y" : "768" }, "testcases" : [ ["1{undef=a}2{undef=b}3", "1a2b3"], ["0{undef}1{undef=a}2{undef}3{undef=b}4{undef}5", "01a2a3b4b5"] ] }, "Empty strings within arrays and associative arrays" : { "variables": { "list" : [ "val1", "", "val3" ], "keysA" : {"key1": "", "key2": "val2"}, "keysB" : {"key1": "val1", "": "val2"} }, "testcases" : [ ["{list}", "val1,,val3"], ["{list*}", "val1,,val3"], ["{list+}", "list.val1,list.,list.val3"], ["{keysA}", "key1,,key2,val2"], ["{keysA*}", "key1,,key2,val2"], ["{keysA+}", "keysA.key1,,keysA.key2,val2"], ["{keysB}", ",val2,key1,val1"], ["{keysB*}", ",val2,key1,val1"], ["{keysB+}", "keysB.,val2,keysB.key1,val1"], ["{+list}", "val1,,val3"], ["{+list*}", "val1,,val3"], ["{+list+}", "list.val1,list.,list.val3"], ["{+keysA}", "key1,,key2,val2"], ["{+keysA*}", "key1,,key2,val2"], ["{+keysA+}", "keysA.key1,,keysA.key2,val2"], ["{+keysB}", ",val2,key1,val1"], ["{+keysB*}", ",val2,key1,val1"], ["{+keysB+}", "keysB.,val2,keysB.key1,val1"], ["{;list}", ";val1,,val3"], ["{;list*}", ";val1;;val3"], ["{;list+}", ";list=val1;list=;list=val3"], ["{;keysA}", ";key1,key2,val2"], ["{;keysA*}", ";key1;key2=val2"], ["{;keysA+}", ";keysA.key1;keysA.key2=val2"], ["{;keysB}", ";,val2,key1,val1"], ["{;keysB*}", ";=val2;key1=val1"], ["{;keysB+}", ";keysB.=val2;keysB.key1=val1"], ["{?list}", "?list=val1,,val3"], ["{?list*}", "?val1&&val3"], ["{?list+}", "?list=val1&list=&list=val3"], ["{?keysA}", "?keysA=key1,key2,val2"], ["{?keysA*}", "?key1&key2=val2"], ["{?keysA+}", "?keysA.key1&keysA.key2=val2"], ["{?keysB}", "?keysB=,val2,key1,val1"], ["{?keysB*}", "?=val2&key1=val1"], ["{?keysB+}", "?keysB.=val2&keysB.key1=val1"], ["{/list}", "/val1,,val3"], ["{/list*}", "/val1//val3"], ["{/list+}", "/list.val1/list./list.val3"], ["{/keysA}", "/key1,,key2,val2"], ["{/keysA*}", "/key1//key2/val2"], ["{/keysA+}", "/keysA.key1//keysA.key2/val2"], ["{/keysB}", "/,val2,key1,val1"], ["{/keysB*}", "//val2/key1/val1"], ["{/keysB+}", "/keysB./val2/keysB.key1/val1"], ["X{.list}", "X.val1,,val3"], ["X{.list*}", "X.val1..val3"], ["X{.list+}", "X.list.val1.list..list.val3"], ["X{.keysA}", "X.key1,,key2,val2"], ["X{.keysA*}", "X.key1..key2.val2"], ["X{.keysA+}", "X.keysA.key1..keysA.key2.val2"], ["X{.keysB}", "X.,val2,key1,val1"], ["X{.keysB*}", "X..val2.key1.val1"], ["X{.keysB+}", "X.keysB..val2.keysB.key1.val1"] ] } }