711 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
711 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
712 } |
712 } |
713 cx_testing_allocator_destroy(&talloc); |
713 cx_testing_allocator_destroy(&talloc); |
714 } |
714 } |
715 |
715 |
716 CX_TEST(test_json_write_default_format) { |
716 |
717 CxTestingAllocator talloc; |
717 CX_TEST_SUBROUTINE(test_json_write_sub, |
718 cx_testing_allocator_init(&talloc); |
|
719 CxAllocator *allocator = &talloc.base; |
|
720 CX_TEST_DO { |
|
721 // expected value |
|
722 cxstring expected = CX_STR("{\"bool\":false,\"nested\":{\"floats\":[3.1415,47.11,8.15],\"ints\":[4,8,15,16,23,42],\"literals\":[true,null,false],\"string\":\"test\"},\"num\":47.11,\"strings\":[\"hello\",\"world\"]}"); |
|
723 |
|
724 // create the value |
|
725 CxJsonValue *obj = cxJsonCreateObj(allocator); |
|
726 cxJsonObjPutLiteral(obj, CX_STR("bool"), CX_JSON_FALSE); |
|
727 cxJsonObjPutNumber(obj, CX_STR("num"), 47.11); |
|
728 CxJsonValue *strings = cxJsonObjPutArr(obj, CX_STR("strings")); |
|
729 cxJsonArrAddCxStrings(strings, (cxstring[]) {CX_STR("hello"), CX_STR("world")}, 2); |
|
730 CxJsonValue *nested = cxJsonObjPutObj(obj, CX_STR("nested")); |
|
731 cxJsonObjPutString(nested, CX_STR("string"), "test"); |
|
732 cxJsonArrAddNumbers(cxJsonObjPutArr(nested, CX_STR("floats")), |
|
733 (double[]){3.1415, 47.11, 8.15}, 3); |
|
734 cxJsonArrAddLiterals(cxJsonObjPutArr(nested, CX_STR("literals")), |
|
735 (CxJsonLiteral[]){CX_JSON_TRUE, CX_JSON_NULL, CX_JSON_FALSE}, 3); |
|
736 cxJsonArrAddIntegers(cxJsonObjPutArr(nested, CX_STR("ints")), |
|
737 (int64_t[]){4, 8, 15, 16, 23, 42}, 6); |
|
738 |
|
739 // write it to a buffer |
|
740 CxBuffer buf; |
|
741 cxBufferInit(&buf, NULL, 256, NULL, CX_BUFFER_DEFAULT); |
|
742 int result = cxJsonWrite(&buf, obj, (cx_write_func) cxBufferWrite, NULL); |
|
743 cxBufferTerminate(&buf); // makes debugging easier |
|
744 CX_TEST_ASSERT(result == 0); |
|
745 |
|
746 // compare the string |
|
747 CX_TEST_ASSERT(0 == cx_strcmp(cx_strn(buf.space, buf.size), expected)); |
|
748 |
|
749 // destroy everything |
|
750 cxBufferDestroy(&buf); |
|
751 cxJsonValueFree(obj); |
|
752 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
|
753 } |
|
754 cx_testing_allocator_destroy(&talloc); |
|
755 } |
|
756 |
|
757 |
|
758 CX_TEST_SUBROUTINE(test_json_write_pretty_default_sub, |
|
759 const CxAllocator *allocator, |
718 const CxAllocator *allocator, |
760 cxstring expected, |
719 cxstring expected, |
761 bool use_spaces |
720 const CxJsonWriter *writer |
762 ) { |
721 ) { |
763 // create the value |
722 // create the value |
764 CxJsonValue *obj = cxJsonCreateObj(allocator); |
723 CxJsonValue *obj = cxJsonCreateObj(allocator); |
765 cxJsonObjPutLiteral(obj, CX_STR("bool"), CX_JSON_FALSE); |
724 cxJsonObjPutLiteral(obj, CX_STR("bool"), CX_JSON_FALSE); |
766 cxJsonObjPutNumber(obj, CX_STR("int"), 47); // purposely use PutNumber to put an int |
725 cxJsonObjPutNumber(obj, CX_STR("int"), 47); // purposely use PutNumber to put an int |
786 cxJsonArrAddIntegers(ints, (int64_t[]){42}, 1); |
745 cxJsonArrAddIntegers(ints, (int64_t[]){42}, 1); |
787 |
746 |
788 // write it to a buffer |
747 // write it to a buffer |
789 CxBuffer buf; |
748 CxBuffer buf; |
790 cxBufferInit(&buf, NULL, 512, NULL, CX_BUFFER_DEFAULT); |
749 cxBufferInit(&buf, NULL, 512, NULL, CX_BUFFER_DEFAULT); |
791 CxJsonWriter writer = cxJsonWriterPretty(use_spaces); |
750 int result = cxJsonWrite(&buf, obj, (cx_write_func) cxBufferWrite, writer); |
792 int result = cxJsonWrite(&buf, obj, (cx_write_func) cxBufferWrite, &writer); |
|
793 cxBufferTerminate(&buf); // makes debugging easier |
751 cxBufferTerminate(&buf); // makes debugging easier |
794 CX_TEST_ASSERT(result == 0); |
752 CX_TEST_ASSERT(result == 0); |
795 |
753 |
796 // compare the string |
754 // compare the string |
797 CX_TEST_ASSERT(0 == cx_strcmp(cx_strn(buf.space, buf.size), expected)); |
755 CX_TEST_ASSERT(0 == cx_strcmp(cx_strn(buf.space, buf.size), expected)); |
798 |
756 |
799 // destroy everything |
757 // destroy everything |
800 cxBufferDestroy(&buf); |
758 cxBufferDestroy(&buf); |
801 cxJsonValueFree(obj); |
759 cxJsonValueFree(obj); |
|
760 } |
|
761 |
|
762 CX_TEST(test_json_write_default_format) { |
|
763 CxTestingAllocator talloc; |
|
764 cx_testing_allocator_init(&talloc); |
|
765 CxAllocator *allocator = &talloc.base; |
|
766 CX_TEST_DO { |
|
767 // expected value |
|
768 cxstring expected = CX_STR( |
|
769 "{\"bool\":false," |
|
770 "\"int\":47," |
|
771 "\"nested\":{" |
|
772 "\"floats\":[3.1415,47.11,8.15]," |
|
773 "\"ints\":[4,8,15,[16,23],42]," |
|
774 "\"literals\":[true,null,false]," |
|
775 "\"objects\":[{" |
|
776 "\"name1\":1," |
|
777 "\"name2\":3" |
|
778 "},{" |
|
779 "\"name1\":3," |
|
780 "\"name2\":7" |
|
781 "}]" |
|
782 "}," |
|
783 "\"strings\":[\"hello\",\"world\"]" |
|
784 "}" |
|
785 ); |
|
786 |
|
787 CxJsonWriter writer = cxJsonWriterCompact(); |
|
788 CX_TEST_CALL_SUBROUTINE(test_json_write_sub, allocator, expected, &writer); |
|
789 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
|
790 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
|
791 } |
|
792 cx_testing_allocator_destroy(&talloc); |
802 } |
793 } |
803 |
794 |
804 CX_TEST(test_json_write_pretty_default_spaces) { |
795 CX_TEST(test_json_write_pretty_default_spaces) { |
805 CxTestingAllocator talloc; |
796 CxTestingAllocator talloc; |
806 cx_testing_allocator_init(&talloc); |
797 cx_testing_allocator_init(&talloc); |
807 CxAllocator *allocator = &talloc.base; |
798 CxAllocator *allocator = &talloc.base; |
808 CX_TEST_DO { |
799 CX_TEST_DO { |
809 // expected value |
|
810 cxstring expected = CX_STR( |
800 cxstring expected = CX_STR( |
811 "{\n" |
801 "{\n" |
812 " \"bool\": false,\n" |
802 " \"bool\": false,\n" |
813 " \"int\": 47,\n" |
803 " \"int\": 47,\n" |
814 " \"nested\": {\n" |
804 " \"nested\": {\n" |