mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 09:40:21 +00:00
1170 lines
51 KiB
Plaintext
1170 lines
51 KiB
Plaintext
// Originally from /jsonion_test.gml in JSOnion
|
|
// JSOnion v1.0.0d is licensed under the MIT licence. You may freely adapt and use this library in commercial and non-commercial projects.
|
|
|
|
#define assert_true
|
|
{
|
|
/**
|
|
assert_true(result, errormsg): Display error <errormsg> unless <result> is true.
|
|
*/
|
|
|
|
if (!argument0) {
|
|
_assert_error_popup(argument1 + string_repeat(_assert_newline(), 2) + "Expected true, got false.");
|
|
}
|
|
}
|
|
|
|
#define assert_false
|
|
{
|
|
/**
|
|
assert_false(result, errormsg): Display error <errormsg> unless <result> is false.
|
|
*/
|
|
|
|
if (argument0) {
|
|
_assert_error_popup(argument1 + string_repeat(_assert_newline(), 2) + "Expected false, got true.");
|
|
}
|
|
}
|
|
|
|
#define assert_equal
|
|
{
|
|
/**
|
|
assert_equal(expected, result, errormsg): Display error <errormsg> unless <expected> and <result> are equal.
|
|
*/
|
|
|
|
//Safe equality check; won't crash even if the two are different types
|
|
var match;
|
|
match = is_string(argument0) == is_string(argument1);
|
|
if (match) {
|
|
match = argument0 == argument1;
|
|
}
|
|
|
|
//No match?
|
|
if (!match) {
|
|
//Data types
|
|
var type;
|
|
type[0] = "(Real)";
|
|
type[1] = "(String)";
|
|
|
|
//Construct message
|
|
var msg;
|
|
msg = argument2;
|
|
//Add expected value
|
|
msg += string_repeat(_assert_newline(), 2);
|
|
msg += "Expected " + type[is_string(argument0)] + ":" + _assert_newline();
|
|
msg += _assert_debug_value(argument0);
|
|
//Add actual value
|
|
msg += string_repeat(_assert_newline(), 2);
|
|
msg += "Actual " + type[is_string(argument1)] + ":" + _assert_newline();
|
|
msg += _assert_debug_value(argument1);
|
|
|
|
//Display message
|
|
_assert_error_popup(msg);
|
|
}
|
|
}
|
|
|
|
#define _assert_error_popup
|
|
{
|
|
/**
|
|
_assert_error_popup(msg): Display an assertion error.
|
|
*/
|
|
|
|
//Display message
|
|
if (os_browser == browser_not_a_browser) {
|
|
show_error(argument0, false); //Full-fledged error message for non-browser environments
|
|
} else {
|
|
show_message(argument0); //Browsers don't support show_error(), use show_message() instead
|
|
}
|
|
}
|
|
|
|
#define _assert_debug_value
|
|
{
|
|
/**
|
|
_assert_debug_value(val): Returns a low-level debug value for the value <val>.
|
|
<val> can be a string or a real value.
|
|
*/
|
|
|
|
//String
|
|
if (is_string(argument0)) {
|
|
if (os_browser == browser_not_a_browser) {
|
|
return argument0;
|
|
} else {
|
|
return string_replace_all(argument0, "#", "\#");
|
|
}
|
|
}
|
|
|
|
//Numeric --- use GMTuple's algorithm
|
|
else {
|
|
|
|
//Integers
|
|
if (frac(argument0) == 0) {
|
|
return string(argument0);
|
|
}
|
|
|
|
//Decimal numbers; get exponent and mantissa
|
|
var mantissa, exponent;
|
|
exponent = floor(log10(abs(argument0)));
|
|
mantissa = string_format(argument0/power(10,exponent), 15, 14);
|
|
//Look for trailing zeros in the mantissa
|
|
var i, ca;
|
|
i = string_length(mantissa);
|
|
do {
|
|
ca = string_char_at(mantissa, i);
|
|
i -= 1;
|
|
} until (ca != "0")
|
|
//Remove the dot if only the first digit of the normalized mantissa is nonzero
|
|
if (ca != ".") {
|
|
mantissa = string_copy(mantissa, 1, i+1);
|
|
}
|
|
else {
|
|
mantissa = string_copy(mantissa, 1, i);
|
|
}
|
|
//Remove the exponent if it is 0
|
|
if (exponent != 0) {
|
|
return mantissa + "e" + string(exponent);
|
|
} else {
|
|
return mantissa;
|
|
}
|
|
|
|
//GMTuple algorithm done
|
|
}
|
|
}
|
|
|
|
#define _assert_newline
|
|
{
|
|
/**
|
|
_assert_newline(): Returns a system-appropriate newline character sequence.
|
|
*/
|
|
|
|
if (os_browser == browser_not_a_browser) {
|
|
return chr(13) + chr(10);
|
|
} else {
|
|
return "#";
|
|
}
|
|
}
|
|
|
|
#define jso_test_all
|
|
{
|
|
/**
|
|
jso_test_all(): Run the test suite for the JSOnion library.
|
|
JSOnion version: 1.0.0d
|
|
*/
|
|
var a, b;
|
|
a = current_time;
|
|
_test_jso_new();
|
|
_test_jso_map_add();
|
|
_test_jso_list_add();
|
|
_test_jso_encode();
|
|
_test_jso_compare();
|
|
_test_jso_decode();
|
|
_test_jso_lookup();
|
|
_test_jso_bugs();
|
|
__jso_gmt_test_all();
|
|
b = current_time;
|
|
show_debug_message("JSOnion: Tests completed in " + string(b-a) + "ms.");
|
|
}
|
|
|
|
#define _test_jso_new
|
|
{
|
|
/**
|
|
_test_jso_new(): Test jso_new_*() functions.
|
|
JSOnion version: 1.0.0d
|
|
*/
|
|
|
|
var expected, actual;
|
|
|
|
//jso_new_map()
|
|
actual = jso_new_map();
|
|
assert_true(actual >= 0, "jso_new_map() failed to create a new map.");
|
|
ds_map_destroy(actual);
|
|
|
|
//jso_new_list()
|
|
actual = jso_new_list();
|
|
assert_true(actual >= 0, "jso_new_list() failed to create a new list.");
|
|
ds_list_destroy(actual);
|
|
}
|
|
|
|
#define _test_jso_map_add
|
|
{
|
|
/**
|
|
_test_jso_map_add(): Test jso_map_add_*() functions.
|
|
JSOnion version: 1.0.0d
|
|
*/
|
|
|
|
var expected, actual, key, map;
|
|
map = jso_new_map();
|
|
|
|
//jso_map_add_real()
|
|
expected = pi;
|
|
key = "pi";
|
|
jso_map_add_real(map, key, expected);
|
|
actual = jso_map_get(map, key);
|
|
assert_true(ds_map_exists(map, key), "jso_map_add_real() failed to add the number.");
|
|
assert_equal(expected, actual, "jso_map_add_real() added the wrong number.");
|
|
ds_map_delete(map, key);
|
|
|
|
//jso_map_add_string()
|
|
expected = "waahoo";
|
|
key = "str";
|
|
jso_map_add_string(map, key, expected);
|
|
actual = jso_map_get(map, key);
|
|
assert_true(ds_map_exists(map, key), "jso_map_add_string() failed to add the string.");
|
|
assert_equal(expected, actual, "jso_map_add_string() added the wrong string.");
|
|
ds_map_delete(map, key);
|
|
|
|
//jso_map_add_sublist()
|
|
expected = jso_new_list();
|
|
key = "sublist";
|
|
jso_map_add_sublist(map, key, expected);
|
|
actual = jso_map_get(map, key);
|
|
assert_true(ds_map_exists(map, key), "jso_map_add_sublist() failed to add the new sublist.");
|
|
assert_equal(expected, actual, "jso_map_add_sublist() added the wrong sublist.");
|
|
ds_map_delete(map, key);
|
|
ds_list_destroy(expected);
|
|
|
|
//jso_map_add_submap()
|
|
expected = jso_new_map();
|
|
key = "sublist";
|
|
jso_map_add_sublist(map, key, expected);
|
|
actual = jso_map_get(map, key);
|
|
assert_true(ds_map_exists(map, key), "jso_map_add_submap() failed to add the new submap.");
|
|
assert_equal(expected, actual, "jso_map_add_submap() added the wrong submap.");
|
|
ds_map_delete(map, key);
|
|
ds_map_destroy(expected);
|
|
|
|
//jso_map_add_integer()
|
|
expected = 2345;
|
|
key = "integer";
|
|
jso_map_add_integer(map, key, expected);
|
|
actual = jso_map_get(map, key);
|
|
assert_true(ds_map_exists(map, key), "jso_map_add_integer() failed to add the new integer.");
|
|
assert_equal(expected, actual, "jso_map_add_integer() added the wrong integer.");
|
|
ds_map_delete(map, key);
|
|
|
|
//jso_map_add_boolean() --- true
|
|
expected = true;
|
|
key = "booleantrue";
|
|
jso_map_add_boolean(map, key, expected);
|
|
actual = jso_map_get(map, key);
|
|
assert_true(ds_map_exists(map, key), "jso_map_add_boolean() failed to add true.");
|
|
assert_true(actual, "jso_map_add_boolean() added the wrong true.");
|
|
ds_map_delete(map, key);
|
|
|
|
//jso_map_add_boolean() --- false
|
|
expected = false;
|
|
key = "booleanfalse";
|
|
jso_map_add_boolean(map, key, expected);
|
|
actual = jso_map_get(map, key)
|
|
assert_true(ds_map_exists(map, key), "jso_map_add_boolean() failed to add false.");
|
|
assert_false(actual, "jso_map_add_boolean() added the wrong false.");
|
|
ds_map_delete(map, key);
|
|
|
|
//Cleanup
|
|
ds_map_destroy(map);
|
|
}
|
|
|
|
#define _test_jso_list_add
|
|
{
|
|
/**
|
|
_test_jso_list_add(): Test jso_list_add_*() functions.
|
|
JSOnion version: 1.0.0d
|
|
*/
|
|
|
|
var expected, actual, list;
|
|
list = jso_new_list();
|
|
|
|
//jso_list_add_real()
|
|
expected = pi;
|
|
jso_list_add_real(list, expected);
|
|
actual = jso_list_get(list, 0);
|
|
assert_false(ds_list_empty(list), "jso_list_add_real() failed to add the number.");
|
|
assert_equal(expected, actual, "jso_list_add_real() added the wrong number.");
|
|
ds_list_clear(list);
|
|
|
|
//jso_list_add_string()
|
|
expected = "waahoo";
|
|
jso_list_add_string(list, expected);
|
|
actual = jso_list_get(list, 0);
|
|
assert_false(ds_list_empty(list), "jso_list_add_string() failed to add the string.");
|
|
assert_equal(expected, actual, "jso_list_add_string() added the wrong string.");
|
|
ds_list_clear(list);
|
|
|
|
//jso_list_add_sublist()
|
|
expected = jso_new_list();
|
|
jso_list_add_sublist(list, expected);
|
|
actual = jso_list_get(list, 0);
|
|
assert_false(ds_list_empty(list), "jso_list_add_sublist() failed to add the sublist.");
|
|
assert_equal(expected, actual, "jso_list_add_sublist() added the wrong sublist.");
|
|
ds_list_clear(list);
|
|
ds_list_destroy(expected);
|
|
|
|
//jso_list_add_submap()
|
|
expected = jso_new_map();
|
|
jso_list_add_submap(list, expected);
|
|
actual = jso_list_get(list, 0);
|
|
assert_false(ds_list_empty(list), "jso_list_add_submap() failed to add the submap.");
|
|
assert_equal(expected, actual, "jso_list_add_submap() added the wrong submap.");
|
|
ds_list_clear(list);
|
|
ds_map_destroy(expected);
|
|
|
|
//jso_list_add_integer()
|
|
expected = 2345;
|
|
jso_list_add_integer(list, expected);
|
|
actual = jso_list_get(list, 0);
|
|
assert_false(ds_list_empty(list), "jso_list_add_integer() failed to add integer.");
|
|
assert_equal(expected, actual, "jso_list_add_integer() added the wrong integer.");
|
|
ds_list_clear(list);
|
|
|
|
//jso_list_add_boolean() --- true
|
|
expected = true;
|
|
jso_list_add_boolean(list, expected);
|
|
actual = jso_list_get(list, 0);
|
|
assert_false(ds_list_empty(list), "jso_list_add_boolean() failed to add boolean true.");
|
|
assert_true(actual, "jso_list_add_boolean() added the wrong boolean true.");
|
|
ds_list_clear(list);
|
|
|
|
//jso_list_add_boolean() --- false
|
|
expected = false;
|
|
jso_list_add_boolean(list, expected);
|
|
actual = jso_list_get(list, 0);
|
|
assert_false(ds_list_empty(list), "jso_list_add_boolean() failed to add boolean false.");
|
|
assert_false(actual, "jso_list_add_boolean() added the wrong boolean false.");
|
|
ds_list_clear(list);
|
|
|
|
//Cleanup
|
|
ds_list_destroy(list);
|
|
}
|
|
|
|
#define _test_jso_encode
|
|
{
|
|
/**
|
|
_test_jso_encode(): Tests jso_encode_*() functions.
|
|
JSOnion version: 1.0.0d
|
|
*/
|
|
|
|
var original, expected, actual;
|
|
|
|
//jso_encode_real() --- Positive
|
|
expected = 3.1415;
|
|
actual = jso_encode_real(3.1415);
|
|
assert_equal(expected, real(actual), "jso_encode_real() failed to encode positive real!");
|
|
|
|
//jso_encode_real() --- Negative
|
|
expected = -2.71828;
|
|
actual = jso_encode_real(-2.71828);
|
|
assert_equal(expected, real(actual), "jso_encode_real() failed to encode negative real!");
|
|
|
|
//jso_encode_real() --- Zero
|
|
expected = 0;
|
|
actual = jso_encode_integer(0);
|
|
assert_equal(expected, real(actual), "jso_encode_real() failed to encode zero!");
|
|
|
|
//jso_encode_integer() --- Positive
|
|
expected = "2345";
|
|
actual = jso_encode_integer(2345);
|
|
assert_equal(expected, actual, "jso_encode_integer() failed to encode positive integer!");
|
|
|
|
//jso_encode_integer() --- Negative
|
|
expected = "-45";
|
|
actual = jso_encode_integer(-45);
|
|
assert_equal(expected, actual, "jso_encode_integer() failed to encode negative integer!");
|
|
|
|
//jso_encode_integer() --- Zero
|
|
expected = "0";
|
|
actual = jso_encode_integer(0);
|
|
assert_equal(expected, actual, "jso_encode_integer() failed to encode zero!");
|
|
|
|
//jso_encode_boolean() --- true
|
|
expected = "true";
|
|
actual = jso_encode_boolean(true);
|
|
assert_equal(expected, actual, "jso_encode_boolean() failed to encode true!");
|
|
|
|
//jso_encode_boolean() --- false
|
|
expected = "false";
|
|
actual = jso_encode_boolean(false);
|
|
assert_equal(expected, actual, "jso_encode_boolean() failed to encode false!");
|
|
|
|
//jso_encode_string() --- Simple string
|
|
expected = '"waahoo"';
|
|
actual = jso_encode_string("waahoo");
|
|
assert_equal(expected, actual, "jso_encode_string() failed to encode simple string!");
|
|
|
|
//jso_encode_string() --- Empty string
|
|
expected = '""';
|
|
actual = jso_encode_string("");
|
|
assert_equal(expected, actual, "jso_encode_string() failed to encode empty string!");
|
|
|
|
//jso_encode_string() --- Basic escape characters
|
|
expected = '"\\\"\b\f\n\r\t"';
|
|
actual = jso_encode_string('\"' + chr(8) + chr(12) + chr(10) + chr(13) + chr(9));
|
|
assert_equal(expected, actual, "jso_encode_string() failed to encode escape character string!");
|
|
|
|
//jso_encode_map() --- Empty map
|
|
var empty_map;
|
|
empty_map = jso_new_map();
|
|
expected = "{}";
|
|
actual = jso_encode_map(empty_map);
|
|
assert_equal(expected, actual, "jso_encode_map() failed to encode empty map!");
|
|
jso_cleanup_map(empty_map);
|
|
|
|
//jso_encode_map() --- One-element map
|
|
var one_map;
|
|
one_map = jso_new_map();
|
|
jso_map_add_string(one_map, "key", "value");
|
|
expected = '{"key":"value"}';
|
|
actual = jso_encode_map(one_map);
|
|
assert_equal(expected, actual, "jso_encode_map() failed to encode one-element map!");
|
|
jso_cleanup_map(one_map);
|
|
|
|
//jso_encode_map() --- Multi-element map
|
|
var multi_map, ok1, ok2;
|
|
multi_map = jso_new_map();
|
|
jso_map_add_string(multi_map, "key1", "value\1");
|
|
jso_map_add_integer(multi_map, "key2", 2);
|
|
ok1 = '{"key1":"value\\1","key2":2}';
|
|
ok2 = '{"key2":2,"key1":"value\\1"}';
|
|
actual = jso_encode_map(multi_map);
|
|
assert_true((actual == ok1) || (actual == ok2), "jso_encode_map() failed to encode multi-element map!");
|
|
jso_cleanup_map(multi_map);
|
|
|
|
//jso_encode_list() --- Empty list
|
|
var empty_list;
|
|
empty_list = jso_new_list();
|
|
expected = "[]";
|
|
actual = jso_encode_list(empty_list);
|
|
assert_equal(expected, actual, "jso_encode_list() failed to encode empty list!");
|
|
jso_cleanup_list(empty_list);
|
|
|
|
//jso_encode_list() --- One-element nested list
|
|
var one_list;
|
|
one_list = jso_new_list();
|
|
jso_list_add_submap(one_list, jso_new_map());
|
|
expected = "[{}]";
|
|
actual = jso_encode_list(one_list);
|
|
assert_equal(expected, actual, "jso_encode_list() failed to encode one-element nested list!");
|
|
jso_cleanup_list(one_list);
|
|
|
|
//jso_encode_list() --- Multi-element nested list
|
|
var multi_list, submap, sublist;
|
|
multi_list = jso_new_list();
|
|
submap = jso_new_map();
|
|
jso_map_add_string(submap, "1", "one");
|
|
jso_list_add_submap(multi_list, submap);
|
|
jso_list_add_integer(multi_list, 2);
|
|
sublist = jso_new_list();
|
|
jso_list_add_string(sublist, "three");
|
|
jso_list_add_boolean(sublist, true);
|
|
jso_list_add_sublist(multi_list, sublist);
|
|
expected = '[{"1":"one"},2,["three",true]]';
|
|
actual = jso_encode_list(multi_list);
|
|
assert_equal(expected, actual, "jso_encode_list() failed to encode one-element nested list!");
|
|
jso_cleanup_list(multi_list);
|
|
}
|
|
|
|
#define _test_jso_decode
|
|
{
|
|
/**
|
|
_test_jso_decode(): Test core _jso_decode_*() functions.
|
|
The formatting is intentionally erratic here to simulate actual formatting deviations.
|
|
JSOnion version: 1.0.0d
|
|
*/
|
|
var json, expected, actual, expected_structure, actual_structure;
|
|
|
|
////Primitives
|
|
|
|
//_jso_decode_string(): Empty string
|
|
json = '""';
|
|
expected = __jso_gmt_tuple("", 3);
|
|
actual = _jso_decode_string(json, 1);
|
|
assert_equal(expected, actual, "_jso_decode_string() failed to decode an empty string!");
|
|
|
|
//_jso_decode_string(): Small string
|
|
json = '"key" ';
|
|
expected = __jso_gmt_tuple("key", 6);
|
|
actual = _jso_decode_string(json, 1);
|
|
assert_equal(expected, actual, "_jso_decode_string() failed to decode a small string!");
|
|
|
|
//_jso_decode_string(): Simple string
|
|
json = ' "The quick brown fox jumps over the lazy dog." ';
|
|
expected = __jso_gmt_tuple("The quick brown fox jumps over the lazy dog.", 49);
|
|
actual = _jso_decode_string(json, 1);
|
|
assert_equal(expected, actual, "_jso_decode_string() failed to decode a simple string!");
|
|
|
|
//_jso_decode_string(): Escape characters
|
|
json = ' "\"\\\b\f\n\r\t\u003A"';
|
|
expected = __jso_gmt_tuple('"\' + chr(8) + chr(12) + chr(10) + chr(13) + chr(9) + chr($003a), 24);
|
|
actual = _jso_decode_string(json, 1);
|
|
assert_equal(expected, actual, "_jso_decode_string() failed to decode a string with escape characters!");
|
|
|
|
//_jso_decode_string(): Mixed characters
|
|
json = ' "\"\\\bWaahoo\f\n\r\tnegg\u003a"';
|
|
expected = __jso_gmt_tuple('"\' + chr(8) + "Waahoo" + chr(12) + chr(10) + chr(13) + chr(9) + "negg" + chr($003a), 34);
|
|
actual = _jso_decode_string(json, 1);
|
|
assert_equal(expected, actual, "_jso_decode_string() failed to decode a string with mixed characters!");
|
|
|
|
//_jso_decode_boolean(): True
|
|
json = 'true';
|
|
expected = __jso_gmt_tuple(true, 5);
|
|
actual = _jso_decode_boolean(json, 1);
|
|
assert_equal(expected, actual, "_jso_decode_boolean() failed to decode true!");
|
|
|
|
//_jso_decode_boolean(): False
|
|
json = ' false ';
|
|
expected = __jso_gmt_tuple(false, 8);
|
|
actual = _jso_decode_boolean(json, 1);
|
|
assert_equal(expected, actual, "_jso_decode_boolean() failed to decode false!");
|
|
|
|
//_jso_decode_real(): Zero
|
|
json = '0';
|
|
expected = __jso_gmt_tuple(0, 2);
|
|
actual = _jso_decode_real(json, 1);
|
|
assert_equal(expected, actual, "_jso_decode_real() failed to decode standard zero!");
|
|
|
|
//_jso_decode_real(): Signed zero
|
|
json = ' +0 ';
|
|
expected = __jso_gmt_tuple(0, 5);
|
|
actual = _jso_decode_real(json, 1);
|
|
assert_equal(expected, actual, "_jso_decode_real() failed to decode signed zero!");
|
|
|
|
//_jso_decode_real(): Signed zero with decimal digits
|
|
json = ' -0.000';
|
|
expected = __jso_gmt_tuple(0, 8);
|
|
actual = _jso_decode_real(json, 1);
|
|
assert_equal(expected, actual, "_jso_decode_real() failed to decode signed zero with decimal digits!");
|
|
|
|
//_jso_decode_real(): Positive real
|
|
json = '3.14159';
|
|
expected = __jso_gmt_tuple(3.14159, 8);
|
|
actual = _jso_decode_real(json, 1);
|
|
assert_equal(expected, actual, "_jso_decode_real() failed to decode positive real number!");
|
|
|
|
//_jso_decode_real(): Negative real
|
|
json = ' -2.71828';
|
|
expected = __jso_gmt_tuple(-2.71828, 10);
|
|
actual = _jso_decode_real(json, 1);
|
|
assert_equal(expected, actual, "_jso_decode_real() failed to decode negative real number!");
|
|
|
|
//_jso_decode_real(): Positive real with positive exponent
|
|
json = ' 3.14159e2';
|
|
expected = __jso_gmt_tuple(3.14159*100, 11);
|
|
actual = _jso_decode_real(json, 1);
|
|
assert_equal(expected, actual, "_jso_decode_real() failed to decode positive real number with positive exponent!");
|
|
|
|
//_jso_decode_real(): Negative real with positive exponent
|
|
json = ' -2.71828E2';
|
|
expected = __jso_gmt_tuple(-2.71828*100, 12);
|
|
actual = _jso_decode_real(json, 1);
|
|
assert_equal(expected, actual, "_jso_decode_real() failed to decode negative real number with positive exponent!");
|
|
|
|
//_jso_decode_real(): Positive real with negative exponent
|
|
json = ' 314.159e-2';
|
|
expected = __jso_gmt_tuple(3.14159, 12);
|
|
actual = _jso_decode_real(json, 1);
|
|
assert_equal(expected, actual, "_jso_decode_real() failed to decode positive real number with negative exponent!");
|
|
|
|
//_jso_decode_real(): Negative real with negative exponent
|
|
json = ' -271.828E-2';
|
|
expected = __jso_gmt_tuple(-2.71828, 13);
|
|
actual = _jso_decode_real(json, 1);
|
|
assert_equal(expected, actual, "_jso_decode_real() failed to decode negative real number with negative exponent!");
|
|
|
|
//_jso_decode_real(): Positive integer
|
|
json = ' +1729';
|
|
expected = __jso_gmt_tuple(1729, 7);
|
|
actual = _jso_decode_real(json, 1);
|
|
assert_equal(expected, actual, "_jso_decode_real() failed to decode positive integer!");
|
|
|
|
//_jso_decode_real(): Negative integer
|
|
json = '-583';
|
|
expected = __jso_gmt_tuple(-583, 5);
|
|
actual = _jso_decode_real(json, 1);
|
|
assert_equal(expected, actual, "_jso_decode_real() failed to decode negative integer!");
|
|
|
|
//_jso_decode_integer(): Zero
|
|
json = ' 0 ';
|
|
expected = __jso_gmt_tuple(0, 3);
|
|
actual = _jso_decode_integer(json, 1);
|
|
assert_equal(expected, actual, "_jso_decode_integer() failed to decode zero!");
|
|
|
|
//_jso_decode_integer(): Positive integer
|
|
json = ' 1729 ';
|
|
expected = __jso_gmt_tuple(1729, 6);
|
|
actual = _jso_decode_integer(json, 1);
|
|
assert_equal(expected, actual, "_jso_decode_integer() failed to decode positive integer!");
|
|
|
|
//_jso_decode_integer(): Negative integer
|
|
json = ' -583';
|
|
expected = __jso_gmt_tuple(-583, 8);
|
|
actual = _jso_decode_integer(json, 1);
|
|
assert_equal(expected, actual, "_jso_decode_integer() failed to decode negative integer!");
|
|
|
|
|
|
////Data structures
|
|
|
|
//_jso_decode_map(): Empty map #1
|
|
json = '{}';
|
|
expected_structure = jso_new_map();
|
|
expected = __jso_gmt_tuple(expected_structure, 3);
|
|
actual = _jso_decode_map(json, 1);
|
|
actual_structure = __jso_gmt_elem(actual, 0);
|
|
assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), "_jso_decode_map() didn't stop at the right place! (#1)");
|
|
assert_equal(actual_structure, __jso_gmt_elem(actual, 0), "_jso_decode_map() didn't include the right prefix! (#1)");
|
|
assert_true(jso_compare_maps(expected_structure, actual_structure), "_jso_decode_map() failed to decode an empty map! (#1)");
|
|
jso_cleanup_map(expected_structure);
|
|
jso_cleanup_map(actual_structure);
|
|
|
|
//_jso_decode_map(): Empty map #2
|
|
json = ' { } ';
|
|
expected_structure = jso_new_map();
|
|
expected = __jso_gmt_tuple(expected_structure, 7);
|
|
actual = _jso_decode_map(json, 1);
|
|
actual_structure = __jso_gmt_elem(actual, 0);
|
|
assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), "_jso_decode_map() didn't stop at the right place! (#2)");
|
|
assert_equal(actual_structure, __jso_gmt_elem(actual, 0), "_jso_decode_map() didn't include the right prefix! (#2)");
|
|
assert_true(jso_compare_maps(expected_structure, actual_structure), "_jso_decode_map() failed to decode an empty map! (#2)");
|
|
jso_cleanup_map(expected_structure);
|
|
jso_cleanup_map(actual_structure);
|
|
|
|
//_jso_decode_map(): One-entry map
|
|
json = ' {"key": "value"} ';
|
|
expected_structure = jso_new_map();
|
|
expected = __jso_gmt_tuple(expected_structure, 18);
|
|
jso_map_add_string(expected_structure, "key", "value");
|
|
actual = _jso_decode_map(json, 1);
|
|
actual_structure = __jso_gmt_elem(actual, 0);
|
|
assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), "_jso_decode_map() didn't stop at the right place! (one-entry map)");
|
|
assert_equal(actual_structure, __jso_gmt_elem(actual, 0), "_jso_decode_map() didn't include the right prefix! (one-entry map)");
|
|
assert_true(jso_compare_maps(expected_structure, actual_structure), "_jso_decode_map() failed to decode a one-entry map!");
|
|
jso_cleanup_map(expected_structure);
|
|
jso_cleanup_map(actual_structure);
|
|
|
|
//_jso_decode_map(): Multi-entry map
|
|
json = ' {"key" : "value", "pi":3.14, "bool" : true} ';
|
|
expected_structure = jso_new_map();
|
|
expected = __jso_gmt_tuple(expected_structure, 48);
|
|
jso_map_add_string(expected_structure, "key", "value");
|
|
jso_map_add_real(expected_structure, "pi", 3.14);
|
|
jso_map_add_boolean(expected_structure, "bool", true);
|
|
actual = _jso_decode_map(json, 1);
|
|
actual_structure = __jso_gmt_elem(actual, 0);
|
|
assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), "_jso_decode_map() didn't stop at the right place! (multi-entry map)");
|
|
assert_equal(actual_structure, __jso_gmt_elem(actual, 0), "_jso_decode_map() didn't include the right prefix! (multi-entry map)");
|
|
assert_true(jso_compare_maps(expected_structure, actual_structure), "_jso_decode_map() failed to decode a multi-entry map!");
|
|
jso_cleanup_map(expected_structure);
|
|
jso_cleanup_map(actual_structure);
|
|
|
|
//_jso_decode_map(): Nested maps
|
|
var submap;
|
|
json = '{ "waahoo" : { "woohah" : 3 } , "woohah" : 4 }';
|
|
expected_structure = jso_new_map();
|
|
expected = __jso_gmt_tuple(expected_structure, 47);
|
|
jso_map_add_integer(expected_structure, "woohah", 4);
|
|
submap = jso_new_map();
|
|
jso_map_add_integer(submap, "woohah", 3);
|
|
jso_map_add_submap(expected_structure, "waahoo", submap);
|
|
actual = _jso_decode_map(json, 1);
|
|
actual_structure = __jso_gmt_elem(actual, 0);
|
|
assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), "_jso_decode_map() didn't stop at the right place! (nested map)");
|
|
assert_equal(actual_structure, __jso_gmt_elem(actual, 0), "_jso_decode_map() didn't include the right prefix! (nested map)");
|
|
assert_true(jso_compare_maps(expected_structure, actual_structure), "_jso_decode_map() failed to decode a nested map!");
|
|
jso_cleanup_map(expected_structure);
|
|
jso_cleanup_map(actual_structure);
|
|
|
|
//_jso_decode_map(): Map with nested lists
|
|
var sublist, subsublist;
|
|
json = '{ "waahoo" : [ "woohah", [true] ] , "woohah" : 4 }';
|
|
expected_structure = jso_new_map();
|
|
expected = __jso_gmt_tuple(expected_structure, 51);
|
|
jso_map_add_real(expected_structure, "woohah", 4);
|
|
sublist = jso_new_list();
|
|
jso_list_add_string(sublist, "woohah");
|
|
subsublist = jso_new_list();
|
|
jso_list_add_boolean(subsublist, true);
|
|
jso_list_add_sublist(sublist, subsublist);
|
|
jso_map_add_sublist(expected_structure, "waahoo", sublist);
|
|
actual = _jso_decode_map(json, 1);
|
|
actual_structure = __jso_gmt_elem(actual, 0);
|
|
assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), "_jso_decode_map() didn't stop at the right place! (map with nested lists)");
|
|
assert_equal(actual_structure, __jso_gmt_elem(actual, 0), "_jso_decode_map() didn't include the right prefix! (map with nested lists)");
|
|
assert_true(jso_compare_maps(expected_structure, actual_structure), "_jso_decode_map() failed to decode a map with nested lists!");
|
|
jso_cleanup_map(expected_structure);
|
|
jso_cleanup_map(actual_structure);
|
|
|
|
//_jso_decode_map(): Mix-up nested map
|
|
var sublist;
|
|
json = ' { "waahoo" : [{}, "a", 1] }';
|
|
expected_structure = jso_new_map();
|
|
expected = __jso_gmt_tuple(expected_structure, 30);
|
|
sublist = jso_new_list();
|
|
jso_list_add_submap(sublist, jso_new_map());
|
|
jso_list_add_string(sublist, "a");
|
|
jso_list_add_real(sublist, 1);
|
|
jso_map_add_sublist(expected_structure, "waahoo", sublist);
|
|
actual = _jso_decode_map(json, 1);
|
|
actual_structure = __jso_gmt_elem(actual, 0);
|
|
assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), "_jso_decode_map() didn't stop at the right place! (mix-up nested map)");
|
|
assert_equal(actual_structure, __jso_gmt_elem(actual, 0), "_jso_decode_map() didn't include the right prefix! (mix-up nested map)");
|
|
assert_true(jso_compare_maps(expected_structure, actual_structure), "_jso_decode_map() failed to decode a mix-up nested map!");
|
|
jso_cleanup_map(expected_structure);
|
|
jso_cleanup_map(actual_structure);
|
|
|
|
//_jso_decode_list(): Empty list #1
|
|
json = '[]';
|
|
expected_structure = jso_new_list();
|
|
expected = __jso_gmt_tuple(expected_structure, 3);
|
|
actual = _jso_decode_list(json, 1);
|
|
actual_structure = __jso_gmt_elem(actual, 0);
|
|
assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), "_jso_decode_list() didn't stop at the right place! (#1)");
|
|
assert_equal(actual_structure, __jso_gmt_elem(actual, 0), "_jso_decode_list() didn't include the right prefix! (#1)");
|
|
assert_true(jso_compare_lists(expected_structure, actual_structure), "_jso_decode_list() failed to decode an empty list! (#1)");
|
|
jso_cleanup_list(expected_structure);
|
|
jso_cleanup_list(actual_structure)
|
|
|
|
//_jso_decode_list(): Empty list #2
|
|
json = ' [ ] ';
|
|
expected_structure = jso_new_list();
|
|
expected = __jso_gmt_tuple(expected_structure, 6);
|
|
actual = _jso_decode_list(json, 1);
|
|
actual_structure = __jso_gmt_elem(actual, 0);
|
|
assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), "_jso_decode_list() didn't stop at the right place! (#2)");
|
|
assert_equal(actual_structure, __jso_gmt_elem(actual, 0), "_jso_decode_list() didn't include the right prefix! (#2)");
|
|
assert_true(jso_compare_lists(expected_structure, actual_structure), "_jso_decode_list() failed to decode an empty list! (#2)");
|
|
jso_cleanup_list(expected_structure);
|
|
jso_cleanup_list(actual_structure);
|
|
|
|
//_jso_decode_list(): One-entry list
|
|
json = '[3]';
|
|
expected_structure = jso_new_list();
|
|
expected = __jso_gmt_tuple(expected_structure, 4);
|
|
jso_list_add_integer(expected_structure, 3);
|
|
actual = _jso_decode_list(json, 1);
|
|
actual_structure = __jso_gmt_elem(actual, 0);
|
|
assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), "_jso_decode_list() didn't stop at the right place! (one-entry list)");
|
|
assert_equal(actual_structure, __jso_gmt_elem(actual, 0), "_jso_decode_list() didn't include the right prefix! (one-entry list)");
|
|
assert_true(jso_compare_lists(expected_structure, actual_structure), "_jso_decode_list() failed to decode a one-entry list!");
|
|
jso_cleanup_list(expected_structure);
|
|
jso_cleanup_list(actual_structure);
|
|
|
|
//_jso_decode_list(): Multi-entry list
|
|
json = ' [4,"multi-entry",true]';
|
|
expected_structure = jso_new_list();
|
|
expected = __jso_gmt_tuple(expected_structure, 24);
|
|
jso_list_add_real(expected_structure, 4);
|
|
jso_list_add_string(expected_structure, "multi-entry");
|
|
jso_list_add_boolean(expected_structure, true);
|
|
actual = _jso_decode_list(json, 1);
|
|
actual_structure = __jso_gmt_elem(actual, 0);
|
|
assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), "_jso_decode_list() didn't stop at the right place! (multi-entry list)");
|
|
assert_equal(actual_structure, __jso_gmt_elem(actual, 0), "_jso_decode_list() didn't include the right prefix! (multi-entry list)");
|
|
assert_true(jso_compare_lists(expected_structure, actual_structure), "_jso_decode_list() failed to decode a multi-entry list!");
|
|
jso_cleanup_list(expected_structure);
|
|
jso_cleanup_list(actual_structure);
|
|
|
|
//_jso_decode_list(): Nested list
|
|
var sublist;
|
|
json = ' [ [], 3, false, ["waahoo"]]';
|
|
expected_structure = jso_new_list();
|
|
expected = __jso_gmt_tuple(expected_structure, 29);
|
|
jso_list_add_sublist(expected_structure, jso_new_list());
|
|
jso_list_add_integer(expected_structure, 3);
|
|
jso_list_add_boolean(expected_structure, false);
|
|
sublist = jso_new_list();
|
|
jso_list_add_string(sublist, "waahoo");
|
|
jso_list_add_sublist(expected_structure, sublist);
|
|
actual = _jso_decode_list(json, 1);
|
|
actual_structure = __jso_gmt_elem(actual, 0);
|
|
assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), "_jso_decode_list() didn't stop at the right place! (nested list)");
|
|
assert_equal(actual_structure, __jso_gmt_elem(actual, 0), "_jso_decode_list() didn't include the right prefix! (nested list)");
|
|
assert_true(jso_compare_lists(expected_structure, actual_structure), "_jso_decode_list() failed to decode a nested list!");
|
|
jso_cleanup_list(expected_structure);
|
|
jso_cleanup_list(actual_structure);
|
|
|
|
//_jso_decode_list(): List with nested maps
|
|
var submap;
|
|
json = ' [3, false, { "waahoo":"woo"}]';
|
|
expected_structure = jso_new_list();
|
|
expected = __jso_gmt_tuple(expected_structure, 31);
|
|
jso_list_add_integer(expected_structure, 3);
|
|
jso_list_add_boolean(expected_structure, false);
|
|
submap = jso_new_map();
|
|
jso_map_add_string(submap, "waahoo", "woo");
|
|
jso_list_add_submap(expected_structure, submap);
|
|
actual = _jso_decode_list(json, 1);
|
|
actual_structure = __jso_gmt_elem(actual, 0);
|
|
assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), "_jso_decode_list() didn't stop at the right place! (list with nested maps)");
|
|
assert_equal(actual_structure, __jso_gmt_elem(actual, 0), "_jso_decode_list() didn't include the right prefix! (list with nested maps)");
|
|
assert_true(jso_compare_lists(expected_structure, actual_structure), "_jso_decode_list() failed to decode a list with nested maps!");
|
|
jso_cleanup_list(expected_structure);
|
|
jso_cleanup_list(actual_structure);
|
|
|
|
//_jso_decode_list(): Mix-up nested list
|
|
var submap;
|
|
json = '[{}, {"a":[]}]';
|
|
expected_structure = jso_new_list();
|
|
expected = __jso_gmt_tuple(expected_structure, 15);
|
|
jso_list_add_submap(expected_structure, jso_new_map());
|
|
submap = jso_new_map();
|
|
jso_map_add_sublist(submap, "a", jso_new_list());
|
|
jso_list_add_submap(expected_structure, submap);
|
|
actual = _jso_decode_list(json, 1);
|
|
actual_structure = __jso_gmt_elem(actual, 0);
|
|
assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), "_jso_decode_list() didn't stop at the right place! (mix-up nested list)");
|
|
assert_equal(actual_structure, __jso_gmt_elem(actual, 0), "_jso_decode_list() didn't include the right prefix! (mix-up nested list)");
|
|
assert_true(jso_compare_lists(expected_structure, actual_structure), "_jso_decode_list() failed to decode a mix-up nested list!");
|
|
jso_cleanup_list(expected_structure);
|
|
jso_cleanup_list(actual_structure);
|
|
}
|
|
|
|
#define _test_jso_compare
|
|
{
|
|
/**
|
|
_test_jso_compare(): Test basic jso_compare_*() functions.
|
|
JSOnion version: 1.0.0d
|
|
*/
|
|
var a, b;
|
|
|
|
//jso_compare_maps(): Empty maps should equal each other
|
|
a = jso_new_map();
|
|
b = jso_new_map();
|
|
assert_true(jso_compare_maps(a, b), "Empty maps should equal each other. (#1)");
|
|
assert_true(jso_compare_maps(b, a), "Empty maps should equal each other. (#2)");
|
|
jso_cleanup_map(a);
|
|
jso_cleanup_map(b);
|
|
|
|
//jso_compare_maps(): An empty map should not equal a filled map
|
|
a = jso_new_map();
|
|
b = jso_new_map();
|
|
jso_map_add_string(b, "junk", "info");
|
|
jso_map_add_integer(b, "taxi", 1729);
|
|
assert_false(jso_compare_maps(a, b), "An empty map should not equal a filled map. (#1)");
|
|
assert_false(jso_compare_maps(b, a), "An empty map should not equal a filled map. (#2)");
|
|
jso_cleanup_map(a);
|
|
jso_cleanup_map(b);
|
|
|
|
//jso_compare_maps(): Maps with same content entered in different orders should equal each other
|
|
a = jso_new_map();
|
|
b = jso_new_map();
|
|
jso_map_add_real(a, "A", 1);
|
|
jso_map_add_real(a, "B", 2);
|
|
jso_map_add_real(a, "C", 3);
|
|
jso_map_add_real(b, "C", 3);
|
|
jso_map_add_real(b, "A", 1);
|
|
jso_map_add_real(b, "B", 2);
|
|
assert_true(jso_compare_maps(a, b), "Maps with same content entered in different orders should equal each other. (#1)");
|
|
assert_true(jso_compare_maps(b, a), "Maps with same content entered in different orders should equal each other. (#2)");
|
|
jso_cleanup_map(a);
|
|
jso_cleanup_map(b);
|
|
|
|
//jso_compare_maps(): Maps with different keys should not equal each other
|
|
a = jso_new_map();
|
|
b = jso_new_map();
|
|
jso_map_add_real(a, "A", 1);
|
|
jso_map_add_real(a, "B", 2);
|
|
jso_map_add_real(a, "C", 3);
|
|
jso_map_add_real(b, "D", 3);
|
|
jso_map_add_real(b, "A", 1);
|
|
jso_map_add_real(b, "B", 2);
|
|
assert_false(jso_compare_maps(a, b), "Maps with different keys should not equal each other. (#1)");
|
|
assert_false(jso_compare_maps(b, a), "Maps with different keys should not equal each other. (#2)");
|
|
jso_cleanup_map(a);
|
|
jso_cleanup_map(b);
|
|
|
|
//jso_compare_maps(): Maps with different values should not equal each other
|
|
a = jso_new_map();
|
|
b = jso_new_map();
|
|
jso_map_add_real(a, "A", 5);
|
|
jso_map_add_real(a, "B", 6);
|
|
jso_map_add_real(a, "C", 9);
|
|
jso_map_add_real(b, "A", 5);
|
|
jso_map_add_real(b, "B", 6);
|
|
jso_map_add_real(b, "C", 8);
|
|
assert_false(jso_compare_maps(a, b), "Maps with different values should not equal each other. (#1)");
|
|
assert_false(jso_compare_maps(b, a), "Maps with different values should not equal each other. (#2)");
|
|
jso_cleanup_map(a);
|
|
jso_cleanup_map(b);
|
|
|
|
//jso_compare_maps(): Maps with corresponding values of different types should not equal each other, and should not crash.
|
|
a = jso_new_map();
|
|
b = jso_new_map();
|
|
jso_map_add_real(a, "A", 5);
|
|
jso_map_add_real(a, "B", 6);
|
|
jso_map_add_real(a, "C", 8);
|
|
jso_map_add_real(b, "A", 5);
|
|
jso_map_add_string(b, "B", "six");
|
|
jso_map_add_real(b, "C", 8);
|
|
assert_false(jso_compare_maps(a, b), "Maps with corresponding values of different types should not equal each other, and should not crash. (#1)");
|
|
assert_false(jso_compare_maps(b, a), "Maps with corresponding values of different types should not equal each other, and should not crash. (#2)");
|
|
jso_cleanup_map(a);
|
|
jso_cleanup_map(b);
|
|
|
|
//jso_compare_lists(): Empty lists should equal each other
|
|
a = jso_new_list();
|
|
b = jso_new_list();
|
|
assert_true(jso_compare_lists(a, b), "Empty lists should equal each other. (#1)");
|
|
assert_true(jso_compare_lists(b, a), "Empty lists should equal each other. (#2)");
|
|
jso_cleanup_list(a);
|
|
jso_cleanup_list(b);
|
|
|
|
//jso_compare_lists(): An empty list should not equal a filled list
|
|
a = jso_new_list();
|
|
b = jso_new_list();
|
|
jso_list_add_string(b, "junk");
|
|
jso_list_add_integer(b, 1729);
|
|
assert_false(jso_compare_lists(a, b), "An empty list should not equal a filled list. (#1)");
|
|
assert_false(jso_compare_lists(b, a), "An empty list should not equal a filled list. (#2)");
|
|
jso_cleanup_list(a);
|
|
jso_cleanup_list(b);
|
|
|
|
//jso_compare_lists(): Lists with same content entered in different orders should not equal each other
|
|
a = jso_new_list();
|
|
b = jso_new_list();
|
|
jso_list_add_real(a, 1);
|
|
jso_list_add_real(a, 2);
|
|
jso_list_add_real(a, 3);
|
|
jso_list_add_real(b, 3);
|
|
jso_list_add_real(b, 1);
|
|
jso_list_add_real(b, 2);
|
|
assert_false(jso_compare_lists(a, b), "Lists with same content entered in different orders should not equal each other. (#1)");
|
|
assert_false(jso_compare_lists(b, a), "Lists with same content entered in different orders should not equal each other. (#2)");
|
|
jso_cleanup_list(a);
|
|
jso_cleanup_list(b);
|
|
|
|
//jso_compare_lists(): Lists with corresponding entries of different types should not equal each other, should also not crash.
|
|
a = jso_new_list();
|
|
b = jso_new_list();
|
|
jso_list_add_real(a, 1);
|
|
jso_list_add_real(a, 2);
|
|
jso_list_add_real(a, 3);
|
|
jso_list_add_real(b, 1);
|
|
jso_list_add_string(b, "two");
|
|
jso_list_add_real(b, 3);
|
|
assert_false(jso_compare_lists(a, b), "Lists with corresponding entries of different types should not equal each other, should also not crash. (#1)");
|
|
assert_false(jso_compare_lists(b, a), "Lists with corresponding entries of different types should not equal each other, should also not crash. (#2)");
|
|
jso_cleanup_list(a);
|
|
jso_cleanup_list(b);
|
|
}
|
|
|
|
#define _test_jso_lookup
|
|
{
|
|
/**
|
|
_test_jso_lookup(): Test core jso_*_lookup() and jso_*_check() functions for nested structures.
|
|
JSOnion version: 1.0.0d
|
|
*/
|
|
var json, structure, expected, actual;
|
|
|
|
//jso_map_check(): Single argument --- exists
|
|
json = '{ "one" : 1, "two" : 2, "three" : 3 }';
|
|
structure = jso_decode_map(json);
|
|
assert_true(jso_map_check(structure, "one"), "jso_map_check() failed to find existing entry! (single argument)");
|
|
jso_cleanup_map(structure);
|
|
|
|
//jso_map_lookup(): Single argument --- exists
|
|
json = '{ "one" : 1, "two" : 2, "three" : 3 }';
|
|
structure = jso_decode_map(json);
|
|
expected = 1;
|
|
actual = jso_map_lookup(structure, "one")
|
|
assert_equal(expected, actual, "jso_map_lookup() found the wrong entry! (single argument)");
|
|
jso_cleanup_map(structure);
|
|
|
|
//jso_map_lookup_type(): Single argument --- exists
|
|
json = '{ "one" : -1, "two" : true, "three" : "trap" }';
|
|
structure = jso_decode_map(json);
|
|
expected = jso_type_real;
|
|
actual = jso_map_lookup_type(structure, "one")
|
|
assert_equal(expected, actual, "jso_map_lookup_type() found the wrong type! (single argument)");
|
|
jso_cleanup_map(structure);
|
|
|
|
//jso_map_check(): Single argument --- doesn't exist
|
|
json = '{ "one" : 1, "two" : 2, "three" : 3 }';
|
|
structure = jso_decode_map(json);
|
|
assert_false(jso_map_check(structure, "four"), "jso_map_check() found an inexistent entry! (single argument)");
|
|
jso_cleanup_map(structure);
|
|
|
|
//jso_map_check(): Single argument --- doesn't exist
|
|
json = '{ "one" : 1, "two" : 2, "three" : 3, "four" : { "A":true, "B":false } }';
|
|
structure = jso_decode_map(json);
|
|
assert_false(jso_map_check(structure, "A"), "jso_map_check() found an inexistent entry! (single argument, nested)");
|
|
jso_cleanup_map(structure);
|
|
|
|
//jso_map_check(): Multiple arguments (recurse) --- exists
|
|
json = '{ "one" : 1, "two" : 2, "three" : 3, "four" : { "A":true, "B":false } }';
|
|
structure = jso_decode_map(json);
|
|
assert_true(jso_map_check(structure, "four", "A"), "jso_map_check() failed to find existing entry! (multiple arguments)");
|
|
jso_cleanup_map(structure);
|
|
|
|
//jso_map_lookup(): Multiple arguments (recurse) --- exists
|
|
json = '{ "one" : 1, "two" : 2, "three" : 3, "four" : { "A":true, "B":false } }';
|
|
structure = jso_decode_map(json);
|
|
expected = true;
|
|
actual = jso_map_lookup(structure, "four", "A");
|
|
assert_equal(expected, actual, "jso_map_lookup() found the wrong entry! (multiple arguments)");
|
|
jso_cleanup_map(structure);
|
|
|
|
//jso_map_lookup_type(): Multiple arguments (recurse) --- exists
|
|
json = '{ "one" : 1, "two" : 2, "three" : 3, "four" : { "A":true, "B":"trap" } }';
|
|
structure = jso_decode_map(json);
|
|
expected = jso_type_boolean;
|
|
actual = jso_map_lookup_type(structure, "four", "A");
|
|
assert_equal(expected, actual, "jso_map_lookup_type() found the wrong type! (multiple arguments)");
|
|
jso_cleanup_map(structure);
|
|
|
|
//jso_map_check(): Multiple arguments (recurse) --- doesn't exist
|
|
json = '{ "one" : 1, "two" : 2, "three" : 3, "four" : { "A":true, "B":false } }';
|
|
structure = jso_decode_map(json);
|
|
assert_false(jso_map_check(structure, "four", "C"), "jso_map_check() found an inexistent entry! (multiple arguments, 1)");
|
|
jso_cleanup_map(structure);
|
|
|
|
//jso_map_check(): Multiple arguments (recurse) --- doesn't exist
|
|
json = '{ "one" : 1, "two" : 2, "three" : 3, "four" : { "A":true, "B":false } }';
|
|
structure = jso_decode_map(json);
|
|
assert_false(jso_map_check(structure, "three", ""), "jso_map_check() found an inexistent entry! (multiple arguments, 2)");
|
|
jso_cleanup_map(structure);
|
|
|
|
//jso_map_check(): Multiple arguments with nested list --- exists
|
|
json = '{ "one" : 1, "two" : 2, "three" : 3, "four" : [ "A", true, ["B", false] ] }';
|
|
structure = jso_decode_map(json);
|
|
assert_true(jso_map_check(structure, "four", 2, 1), "jso_map_check() failed to find an existing entry! (multiple arguments, nested)");
|
|
jso_cleanup_map(structure);
|
|
|
|
//jso_map_lookup(): Multiple arguments with nested list --- exists
|
|
json = '{ "one" : 1, "two" : 2, "three" : 3, "four" : [ "A", true, ["B", false] ] }';
|
|
structure = jso_decode_map(json);
|
|
expected = false;
|
|
actual = jso_map_lookup(structure, "four", 2, 1);
|
|
assert_equal(expected, actual, "jso_map_lookup() failed to find an existing entry! (multiple arguments, nested)");
|
|
jso_cleanup_map(structure);
|
|
|
|
//jso_map_lookup_type(): Multiple arguments with nested list --- exists
|
|
json = '{ "one" : 1, "two" : 2, "three" : 3, "four" : [ "A", true, [false, "false"] ] }';
|
|
structure = jso_decode_map(json);
|
|
expected = jso_type_string;
|
|
actual = jso_map_lookup_type(structure, "four", 2, 1);
|
|
assert_equal(expected, actual, "jso_map_lookup_type() found the wrong type! (multiple arguments, nested)");
|
|
jso_cleanup_map(structure);
|
|
|
|
//jso_map_check(): Multiple arguments with nested list --- wrong type
|
|
json = '{ "one" : 1, "two" : 2, "three" : 3, "four" : [ "A", true, ["B", false] ] }';
|
|
structure = jso_decode_map(json);
|
|
assert_false(jso_map_check(structure, "four", "A", 1), "jso_map_check() found an inexistent entry! (multiple arguments, nested, wrong type)");
|
|
jso_cleanup_map(structure);
|
|
|
|
//jso_map_check(): Multiple arguments with nested list --- index overflow
|
|
json = '{ "one" : 1, "two" : 2, "three" : 3, "four" : [ "A", true, ["B", false] ] }';
|
|
structure = jso_decode_map(json);
|
|
assert_false(jso_map_check(structure, "four", 2, 3), "jso_map_check() found an inexistent entry! (multiple arguments, nested, index overflow)");
|
|
jso_cleanup_map(structure);
|
|
|
|
//jso_list_check(): Single argument --- exists
|
|
json = '["one", 2, "three", true, 5]';
|
|
structure = jso_decode_list(json);
|
|
assert_true(jso_list_check(structure, 2), "jso_list_check() failed to find an existing index! (single argument)");
|
|
jso_cleanup_list(structure);
|
|
|
|
//jso_list_lookup(): Single argument --- exists
|
|
json = '["one", 2, "three", true, 5]';
|
|
structure = jso_decode_list(json);
|
|
expected = "three";
|
|
actual = jso_list_lookup(structure, 2);
|
|
assert_equal(expected, actual, "jso_list_lookup() found the wrong index! (single argument)");
|
|
jso_cleanup_list(structure);
|
|
|
|
//jso_list_lookup_type(): Single argument --- exists
|
|
json = '["one", 2, "three", true, 5]';
|
|
structure = jso_decode_list(json);
|
|
expected = jso_type_string;
|
|
actual = jso_list_lookup_type(structure, 2);
|
|
assert_equal(expected, actual, "jso_list_lookup_type() found the wrong type! (single argument)");
|
|
jso_cleanup_list(structure);
|
|
|
|
//jso_list_check(): Single argument --- doesn't exist
|
|
json = '["one", 2, "three", true, 5]';
|
|
structure = jso_decode_list(json);
|
|
assert_false(jso_list_check(structure, 5), "jso_list_check() found an inexistent index! (single argument)");
|
|
jso_cleanup_list(structure);
|
|
|
|
//jso_list_check(): Multiple arguments (recurse) --- exists
|
|
json = '["one", 2, ["three", 3], true, 5]';
|
|
structure = jso_decode_list(json);
|
|
assert_true(jso_list_check(structure, 2, 1), "jso_list_check() failed to find an existing index! (multiple arguments)");
|
|
jso_cleanup_list(structure);
|
|
|
|
//jso_list_lookup(): Multiple arguments (recurse) --- exists
|
|
json = '["one", 2, ["three", 3], true, 5]';
|
|
structure = jso_decode_list(json);
|
|
expected = 3;
|
|
actual = jso_list_lookup(structure, 2, 1);
|
|
assert_equal(expected, actual, "jso_list_lookup() failed to find an existing index! (multiple arguments)");
|
|
jso_cleanup_list(structure);
|
|
|
|
//jso_list_lookup_type(): Multiple arguments (recurse) --- exists
|
|
json = '["one", 2, ["three", 3], true, 5]';
|
|
structure = jso_decode_list(json);
|
|
expected = jso_type_real;
|
|
actual = jso_list_lookup_type(structure, 2, 1);
|
|
assert_equal(expected, actual, "jso_list_lookup_type() found the wrong type! (multiple arguments)");
|
|
jso_cleanup_list(structure);
|
|
|
|
//jso_list_check(): Multiple arguments (recurse) --- doesn't exist, inner index overflow
|
|
json = '["one", 2, ["three", 3], true, 5]';
|
|
structure = jso_decode_list(json);
|
|
assert_false(jso_list_check(structure, 2, 2), "jso_list_check() found an inexistent index! (multiple arguments, inner index overflow)");
|
|
jso_cleanup_list(structure);
|
|
|
|
//jso_list_check(): Multiple arguments (recurse) --- doesn't exist, trying to index single entry
|
|
json = '["one", 2, ["three", 3], true, 5]';
|
|
structure = jso_decode_list(json);
|
|
assert_false(jso_list_check(structure, 1, 0), "jso_list_check() found an inexistent index! (multiple arguments, indexing single entry)");
|
|
jso_cleanup_list(structure);
|
|
|
|
//jso_list_check(): Multiple arguments with nested map --- exists
|
|
json = '["one", 2, {"three":3}, true, 5]';
|
|
structure = jso_decode_list(json);
|
|
assert_true(jso_list_check(structure, 2, "three"), "jso_list_check() failed to find an existing entry! (multiple arguments, nested map)");
|
|
jso_cleanup_list(structure);
|
|
|
|
//jso_list_lookup(): Multiple arguments with nested map --- exists
|
|
json = '["one", 2, {"three":3}, true, 5]';
|
|
structure = jso_decode_list(json);
|
|
expected = 3;
|
|
actual = jso_list_lookup(structure, 2, "three");
|
|
assert_equal(expected, actual, "jso_list_lookup() failed to find an existing entry! (multiple arguments, nested map)");
|
|
jso_cleanup_list(structure);
|
|
|
|
//jso_list_lookup_type(): Multiple arguments with nested map --- exists
|
|
json = '["one", 2, {"three":false}, true, 5]';
|
|
structure = jso_decode_list(json);
|
|
expected = jso_type_boolean;
|
|
actual = jso_list_lookup_type(structure, 2, "three");
|
|
assert_equal(expected, actual, "jso_list_lookup_type() found the wrong type! (multiple arguments, nested map)");
|
|
jso_cleanup_list(structure);
|
|
|
|
//jso_list_exists(): Multiple arguments with nested map --- doesn't exist, key on single entry
|
|
json = '["one", 2, {"three":3}, true, 5]';
|
|
structure = jso_decode_list(json);
|
|
assert_false(jso_list_check(structure, 1, ""), "jso_list_check() found an inexistent entry! (multiple arguments, nested map, key on single entry)");
|
|
jso_cleanup_list(structure);
|
|
|
|
//jso_list_exists(): Multiple arguments with nested map --- doesn't exist, bad key
|
|
json = '["one", 2, {"three":3}, true, 5]';
|
|
structure = jso_decode_list(json);
|
|
assert_false(jso_list_check(structure, 2, ""), "jso_list_check() found an inexistent entry! (multiple arguments, nested map, bad key)");
|
|
jso_cleanup_list(structure);
|
|
}
|
|
|
|
#define _test_jso_bugs
|
|
{
|
|
/**
|
|
_test_jso_bugs(): Test reported bugs.
|
|
JSOnion version: 1.0.0d
|
|
*/
|
|
var expected, actual;
|
|
|
|
//jso_encode_map() --- One-element map
|
|
//Bug 1: Crash when encoding boolean-valued entries in maps, unknown variable jso_type_integer
|
|
var one_map;
|
|
one_map = jso_new_map();
|
|
jso_map_add_boolean(one_map, "true", true);
|
|
expected = '{"true":true}';
|
|
actual = jso_encode_map(one_map);
|
|
assert_equal(expected, actual, "jso_encode_map() failed to encode one-element map with boolean entry!");
|
|
jso_cleanup_map(one_map);
|
|
}
|
|
|