| function(assert_strequal actual expected) | |
| if(NOT expected STREQUAL actual) | |
| message(SEND_ERROR "Output:\n${actual}\nDid not match expected:\n${expected}\n") | |
| endif() | |
| endfunction() | |
| function(assert_strequal_error actual expected error) | |
| if(error) | |
| message(SEND_ERROR "Unexpected error: ${error}") | |
| endif() | |
| assert_strequal("${actual}" "${expected}") | |
| endfunction() | |
| function(assert_json_equal error actual expected) | |
| if(error) | |
| message(SEND_ERROR "Unexpected error: ${error}") | |
| endif() | |
| string(JSON eql EQUAL "${actual}" "${expected}") | |
| if(NOT eql) | |
| message(SEND_ERROR "Expected equality got\n ${actual}\n expected\n${expected}") | |
| endif() | |
| endfunction() | |
| # test EQUAL | |
| string(JSON result EQUAL | |
| [=[ {"foo":"bar"} ]=] | |
| [=[ | |
| { | |
| "foo": "bar" | |
| } | |
| ]=]) | |
| if(NOT result) | |
| message(SEND_ERROR "Expected ON got ${result}") | |
| endif() | |
| string(JSON result EQUAL | |
| [=[ {"foo":"bar"} ]=] | |
| [=[ | |
| { | |
| "foo1": "bar" | |
| } | |
| ]=]) | |
| if(result) | |
| message(SEND_ERROR "Expected OFF got ${result}") | |
| endif() | |
| set(json1 [=[ | |
| { | |
| "foo" : "bar", | |
| "array" : [5, "val", {"some": "other"}, null], | |
| "types" : { | |
| "null" : null, | |
| "number" : 5, | |
| "string" : "foo", | |
| "boolean" : false, | |
| "array" : [1,2,3], | |
| "object" : {} | |
| }, | |
| "values" : { | |
| "null" : null, | |
| "number" : 5, | |
| "string" : "foo", | |
| "false" : false, | |
| "true" : true | |
| }, | |
| "special" : { | |
| "foo;bar" : "value1", | |
| ";" : "value2", | |
| "semicolon" : ";", | |
| "list" : ["one", "two;three", "four"], | |
| "quote" : "\"", | |
| "\"" : "quote", | |
| "backslash" : "\\", | |
| "\\" : "backslash", | |
| "slash" : "\/", | |
| "\/" : "slash", | |
| "newline" : "\n", | |
| "\n" : "newline", | |
| "return" : "\r", | |
| "\r" : "return", | |
| "tab" : "\t", | |
| "\t" : "tab", | |
| "backspace" : "\b", | |
| "\b" : "backspace", | |
| "formfeed" : "\f", | |
| "\f" : "formfeed" | |
| } | |
| } | |
| ]=]) | |
| string(JSON result GET "${json1}" foo) | |
| assert_strequal("${result}" bar) | |
| string(JSON result GET "${json1}" array 0) | |
| assert_strequal("${result}" 5) | |
| string(JSON result GET "${json1}" array 1) | |
| assert_strequal("${result}" val) | |
| string(JSON result GET "${json1}" array 2 some) | |
| assert_strequal("${result}" other) | |
| string(JSON result GET "${json1}" values null) | |
| assert_strequal("${result}" "") | |
| string(JSON result GET "${json1}" values number) | |
| assert_strequal("${result}" 5) | |
| string(JSON result GET "${json1}" values string) | |
| assert_strequal("${result}" "foo") | |
| string(JSON result GET "${json1}" values true) | |
| assert_strequal("${result}" "ON") | |
| if(NOT result) | |
| message(SEND_ERROR "Output did not match expected: TRUE actual: ${result}") | |
| endif() | |
| string(JSON result GET "${json1}" values false) | |
| assert_strequal("${result}" "OFF") | |
| if(result) | |
| message(SEND_ERROR "Output did not match expected: FALSE actual: ${result}") | |
| endif() | |
| string(JSON result ERROR_VARIABLE error GET "${json1}" foo) | |
| assert_strequal_error("${result}" "bar" "${error}") | |
| string(JSON result ERROR_VARIABLE error GET "${json1}" notThere) | |
| assert_strequal("${result}" "notThere-NOTFOUND") | |
| assert_strequal("${error}" "member 'notThere' not found") | |
| string(JSON result ERROR_VARIABLE error GET "${json1}" 0) | |
| assert_strequal("${result}" "0-NOTFOUND") | |
| assert_strequal("${error}" "member '0' not found") | |
| string(JSON result ERROR_VARIABLE error GET "${json1}" array 10) | |
| assert_strequal("${result}" "array-10-NOTFOUND") | |
| assert_strequal("${error}" "expected an index less then 4 got '10'") | |
| string(JSON result ERROR_VARIABLE error GET "${json1}" array 2 some notThere) | |
| assert_strequal("${result}" "array-2-some-notThere-NOTFOUND") | |
| assert_strequal("${error}" "invalid path 'array 2 some notThere', need element of OBJECT or ARRAY type to lookup 'notThere' got STRING") | |
| # special chars | |
| string(JSON result ERROR_VARIABLE error GET "${json1}" special "foo;bar") | |
| assert_strequal_error("${result}" "value1" "${error}") | |
| string(JSON result ERROR_VARIABLE error GET "${json1}" special ";") | |
| assert_strequal_error("${result}" "value2" "${error}") | |
| string(JSON result ERROR_VARIABLE error GET "${json1}" special semicolon) | |
| assert_strequal_error("${result}" ";" "${error}") | |
| string(JSON result ERROR_VARIABLE error GET "${json1}" special list 1) | |
| assert_strequal_error("${result}" "two;three" "${error}") | |
| string(JSON result ERROR_VARIABLE error GET "${json1}") | |
| assert_json_equal("${error}" "${result}" "${json1}") | |
| string(JSON result ERROR_VARIABLE error GET "${json1}" array) | |
| assert_json_equal("${error}" "${result}" [=[ [5, "val", {"some": "other"}, null] ]=]) | |
| string(JSON result ERROR_VARIABLE error GET "${json1}" special quote) | |
| assert_strequal_error("${result}" "\"" "${error}") | |
| string(JSON result ERROR_VARIABLE error GET "${json1}" special "\"") | |
| assert_strequal_error("${result}" "quote" "${error}") | |
| string(JSON result ERROR_VARIABLE error GET "${json1}" special backslash) | |
| assert_strequal_error("${result}" "\\" "${error}") | |
| string(JSON result ERROR_VARIABLE error GET "${json1}" special "\\") | |
| assert_strequal_error("${result}" "backslash" "${error}") | |
| string(JSON result ERROR_VARIABLE error GET "${json1}" special slash) | |
| assert_strequal_error("${result}" "/" "${error}") | |
| string(JSON result ERROR_VARIABLE error GET "${json1}" special "/") | |
| assert_strequal_error("${result}" "slash" "${error}") | |
| string(JSON result ERROR_VARIABLE error GET "${json1}" special newline) | |
| assert_strequal_error("${result}" "\n" "${error}") | |
| string(JSON result ERROR_VARIABLE error GET "${json1}" special "\n") | |
| assert_strequal_error("${result}" "newline" "${error}") | |
| string(JSON result ERROR_VARIABLE error GET "${json1}" special return) | |
| assert_strequal_error("${result}" "\r" "${error}") | |
| string(JSON result ERROR_VARIABLE error GET "${json1}" special "\r") | |
| assert_strequal_error("${result}" "return" "${error}") | |
| string(JSON result ERROR_VARIABLE error GET "${json1}" special tab) | |
| assert_strequal_error("${result}" "\t" "${error}") | |
| string(JSON result ERROR_VARIABLE error GET "${json1}" special "\t") | |
| assert_strequal_error("${result}" "tab" "${error}") | |
| file(READ ${CMAKE_CURRENT_LIST_DIR}/json/unicode.json unicode) | |
| string(JSON char ERROR_VARIABLE error GET "${unicode}" backspace) | |
| string(JSON result ERROR_VARIABLE error GET "${unicode}" "${char}") | |
| assert_strequal_error("${result}" "backspace" "${error}") | |
| file(READ ${CMAKE_CURRENT_LIST_DIR}/json/unicode.json unicode) | |
| string(JSON char ERROR_VARIABLE error GET "${unicode}" backspace) | |
| string(JSON result ERROR_VARIABLE error GET "${unicode}" "${char}") | |
| assert_strequal_error("${result}" "backspace" "${error}") | |
| string(JSON char ERROR_VARIABLE error GET "${unicode}" formfeed) | |
| string(JSON result ERROR_VARIABLE error GET "${unicode}" "${char}") | |
| assert_strequal_error("${result}" "formfeed" "${error}") | |
| string(JSON char ERROR_VARIABLE error GET "${unicode}" datalinkescape) | |
| string(JSON result ERROR_VARIABLE error GET "${unicode}" "${char}") | |
| assert_strequal_error("${result}" "datalinkescape" "${error}") | |
| # Test TYPE | |
| string(JSON result TYPE "${json1}" types null) | |
| assert_strequal("${result}" NULL) | |
| string(JSON result TYPE "${json1}" types number) | |
| assert_strequal("${result}" NUMBER) | |
| string(JSON result TYPE "${json1}" types string) | |
| assert_strequal("${result}" STRING) | |
| string(JSON result TYPE "${json1}" types boolean) | |
| assert_strequal("${result}" BOOLEAN) | |
| string(JSON result TYPE "${json1}" types array) | |
| assert_strequal("${result}" ARRAY) | |
| string(JSON result TYPE "${json1}" types object) | |
| assert_strequal("${result}" OBJECT) | |
| # Test LENGTH | |
| string(JSON result ERROR_VARIABLE error LENGTH "${json1}") | |
| assert_strequal("${result}" 5) | |
| if(error) | |
| message(SEND_ERROR "Unexpected error: ${error}") | |
| endif() | |
| string(JSON result ERROR_VARIABLE error LENGTH "${json1}" array) | |
| assert_strequal("${result}" 4) | |
| if(error) | |
| message(SEND_ERROR "Unexpected error: ${error}") | |
| endif() | |
| string(JSON result ERROR_VARIABLE error LENGTH "${json1}" foo) | |
| assert_strequal("${result}" "foo-NOTFOUND") | |
| assert_strequal("${error}" "LENGTH needs to be called with an element of type ARRAY or OBJECT, got STRING") | |
| # Test MEMBER | |
| string(JSON result ERROR_VARIABLE error MEMBER "${json1}" values 2) | |
| assert_strequal("${result}" "number") | |
| if(error) | |
| message(SEND_ERROR "Unexpected error: ${error}") | |
| endif() | |
| string(JSON result ERROR_VARIABLE error MEMBER "${json1}" values 100) | |
| assert_strequal("${result}" "values-100-NOTFOUND") | |
| assert_strequal("${error}" "expected an index less then 5 got '100'") | |
| # Test length loops | |
| string(JSON arrayLength ERROR_VARIABLE error LENGTH "${json1}" types array) | |
| if(error) | |
| message(SEND_ERROR "Unexpected error: ${error}") | |
| endif() | |
| set(values "") | |
| math(EXPR arrayLength "${arrayLength}-1") | |
| foreach(index RANGE ${arrayLength}) | |
| string(JSON value ERROR_VARIABLE error GET "${json1}" types array ${index}) | |
| if(error) | |
| message(SEND_ERROR "Unexpected error: ${error}") | |
| endif() | |
| list(APPEND values "${value}") | |
| endforeach() | |
| assert_strequal("${values}" "1;2;3") | |
| string(JSON valuesLength ERROR_VARIABLE error LENGTH "${json1}" values) | |
| if(error) | |
| message(SEND_ERROR "Unexpected error: ${error}") | |
| endif() | |
| set(values "") | |
| set(members "") | |
| math(EXPR valuesLength "${valuesLength}-1") | |
| foreach(index RANGE ${valuesLength}) | |
| string(JSON member ERROR_VARIABLE error MEMBER "${json1}" values ${index}) | |
| if(error) | |
| message(SEND_ERROR "Unexpected error: ${error}") | |
| endif() | |
| string(JSON value ERROR_VARIABLE error GET "${json1}" values ${member}) | |
| if(error) | |
| message(SEND_ERROR "Unexpected error: ${error}") | |
| endif() | |
| list(APPEND members "${member}") | |
| list(APPEND values "${value}") | |
| endforeach() | |
| assert_strequal("${members}" "false;null;number;string;true") | |
| assert_strequal("${values}" "OFF;;5;foo;ON") | |
| # Test REMOVE | |
| set(json2 [=[{ | |
| "foo" : "bar", | |
| "array" : [5, "val", {"some": "other"}, null] | |
| }]=]) | |
| string(JSON result ERROR_VARIABLE error REMOVE ${json2} foo) | |
| assert_json_equal("${error}" "${result}" | |
| [=[{ | |
| "array" : [5, "val", {"some": "other"}, null] | |
| }]=]) | |
| string(JSON result ERROR_VARIABLE error REMOVE ${json2} array 1) | |
| assert_json_equal("${error}" "${result}" | |
| [=[{ | |
| "foo" : "bar", | |
| "array" : [5, {"some": "other"}, null] | |
| }]=]) | |
| string(JSON result ERROR_VARIABLE error REMOVE ${json2} array 100) | |
| assert_strequal("${result}" "array-100-NOTFOUND") | |
| assert_strequal("${error}" "expected an index less then 4 got '100'") | |
| # Test SET | |
| string(JSON result ERROR_VARIABLE error SET ${json2} new 5) | |
| assert_json_equal("${error}" "${result}" | |
| [=[{ | |
| "foo" : "bar", | |
| "array" : [5, "val", {"some": "other"}, null], | |
| "new" : 5 | |
| }]=]) | |
| string(JSON result ERROR_VARIABLE error SET ${json2} new [=[ {"obj" : false} ]=]) | |
| assert_json_equal("${error}" "${result}" | |
| [=[{ | |
| "foo" : "bar", | |
| "array" : [5, "val", {"some": "other"}, null], | |
| "new" : {"obj" : false} | |
| }]=]) | |
| string(JSON result ERROR_VARIABLE error SET ${json2} array 0 6) | |
| assert_json_equal("${error}" "${result}" | |
| [=[{ | |
| "foo" : "bar", | |
| "array" : [6, "val", {"some": "other"}, null] | |
| }]=]) | |
| string(JSON result ERROR_VARIABLE error SET ${json2} array 5 [["append"]]) | |
| assert_json_equal("${error}" "${result}" | |
| [=[{ | |
| "foo" : "bar", | |
| "array" : [5, "val", {"some": "other"}, null, "append"] | |
| }]=]) | |
| string(JSON result ERROR_VARIABLE error SET ${json2} array 100 [["append"]]) | |
| assert_json_equal("${error}" "${result}" | |
| [=[{ | |
| "foo" : "bar", | |
| "array" : [5, "val", {"some": "other"}, null, "append"] | |
| }]=]) |