mirror of https://github.com/DaveGamble/cJSON.git
Max Bruckner
8 years ago
14 changed files with 458 additions and 0 deletions
@ -1 +1,18 @@ |
|||||
add_library(unity unity/src/unity.c) |
add_library(unity unity/src/unity.c) |
||||
|
|
||||
|
if(ENABLE_CJSON_TEST) |
||||
|
#copy test files |
||||
|
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/inputs") |
||||
|
file(GLOB test_files "inputs/*") |
||||
|
file(COPY ${test_files} DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/inputs/") |
||||
|
|
||||
|
set(unity_tests |
||||
|
parse_examples |
||||
|
) |
||||
|
|
||||
|
foreach(unity_test ${unity_tests}) |
||||
|
add_executable("${unity_test}" "${unity_test}.c") |
||||
|
target_link_libraries("${unity_test}" "${CJSON_LIB}" unity) |
||||
|
add_test("${unity_test}" "${unity_test}") |
||||
|
endforeach() |
||||
|
endif() |
||||
|
@ -0,0 +1,22 @@ |
|||||
|
{ |
||||
|
"glossary": { |
||||
|
"title": "example glossary", |
||||
|
"GlossDiv": { |
||||
|
"title": "S", |
||||
|
"GlossList": { |
||||
|
"GlossEntry": { |
||||
|
"ID": "SGML", |
||||
|
"SortAs": "SGML", |
||||
|
"GlossTerm": "Standard Generalized Markup Language", |
||||
|
"Acronym": "SGML", |
||||
|
"Abbrev": "ISO 8879:1986", |
||||
|
"GlossDef": { |
||||
|
"para": "A meta-markup language, used to create markup languages such as DocBook.", |
||||
|
"GlossSeeAlso": ["GML", "XML"] |
||||
|
}, |
||||
|
"GlossSee": "markup" |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,18 @@ |
|||||
|
{ |
||||
|
"menu": { |
||||
|
"id": "file", |
||||
|
"value": "File", |
||||
|
"popup": { |
||||
|
"menuitem": [{ |
||||
|
"value": "New", |
||||
|
"onclick": "CreateNewDoc()" |
||||
|
}, { |
||||
|
"value": "Open", |
||||
|
"onclick": "OpenDoc()" |
||||
|
}, { |
||||
|
"value": "Close", |
||||
|
"onclick": "CloseDoc()" |
||||
|
}] |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,28 @@ |
|||||
|
{ |
||||
|
"widget": { |
||||
|
"debug": "on", |
||||
|
"window": { |
||||
|
"title": "Sample Konfabulator Widget", |
||||
|
"name": "main_window", |
||||
|
"width": 500, |
||||
|
"height": 500 |
||||
|
}, |
||||
|
"image": { |
||||
|
"src": "Images/Sun.png", |
||||
|
"name": "sun1", |
||||
|
"hOffset": 250, |
||||
|
"vOffset": 250, |
||||
|
"alignment": "center" |
||||
|
}, |
||||
|
"text": { |
||||
|
"data": "Click Here", |
||||
|
"size": 36, |
||||
|
"style": "bold", |
||||
|
"name": "text1", |
||||
|
"hOffset": 250, |
||||
|
"vOffset": 100, |
||||
|
"alignment": "center", |
||||
|
"onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;" |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,94 @@ |
|||||
|
{ |
||||
|
"web-app": { |
||||
|
"servlet": [{ |
||||
|
"servlet-name": "cofaxCDS", |
||||
|
"servlet-class": "org.cofax.cds.CDSServlet", |
||||
|
"init-param": { |
||||
|
"configGlossary:installationAt": "Philadelphia, PA", |
||||
|
"configGlossary:adminEmail": "ksm@pobox.com", |
||||
|
"configGlossary:poweredBy": "Cofax", |
||||
|
"configGlossary:poweredByIcon": "/images/cofax.gif", |
||||
|
"configGlossary:staticPath": "/content/static", |
||||
|
"templateProcessorClass": "org.cofax.WysiwygTemplate", |
||||
|
"templateLoaderClass": "org.cofax.FilesTemplateLoader", |
||||
|
"templatePath": "templates", |
||||
|
"templateOverridePath": "", |
||||
|
"defaultListTemplate": "listTemplate.htm", |
||||
|
"defaultFileTemplate": "articleTemplate.htm", |
||||
|
"useJSP": false, |
||||
|
"jspListTemplate": "listTemplate.jsp", |
||||
|
"jspFileTemplate": "articleTemplate.jsp", |
||||
|
"cachePackageTagsTrack": 200, |
||||
|
"cachePackageTagsStore": 200, |
||||
|
"cachePackageTagsRefresh": 60, |
||||
|
"cacheTemplatesTrack": 100, |
||||
|
"cacheTemplatesStore": 50, |
||||
|
"cacheTemplatesRefresh": 15, |
||||
|
"cachePagesTrack": 200, |
||||
|
"cachePagesStore": 100, |
||||
|
"cachePagesRefresh": 10, |
||||
|
"cachePagesDirtyRead": 10, |
||||
|
"searchEngineListTemplate": "forSearchEnginesList.htm", |
||||
|
"searchEngineFileTemplate": "forSearchEngines.htm", |
||||
|
"searchEngineRobotsDb": "WEB-INF/robots.db", |
||||
|
"useDataStore": true, |
||||
|
"dataStoreClass": "org.cofax.SqlDataStore", |
||||
|
"redirectionClass": "org.cofax.SqlRedirection", |
||||
|
"dataStoreName": "cofax", |
||||
|
"dataStoreDriver": "com.microsoft.jdbc.sqlserver.SQLServerDriver", |
||||
|
"dataStoreUrl": "jdbc:microsoft:sqlserver://LOCALHOST:1433;DatabaseName=goon", |
||||
|
"dataStoreUser": "sa", |
||||
|
"dataStorePassword": "dataStoreTestQuery", |
||||
|
"dataStoreTestQuery": "SET NOCOUNT ON;select test='test';", |
||||
|
"dataStoreLogFile": "/usr/local/tomcat/logs/datastore.log", |
||||
|
"dataStoreInitConns": 10, |
||||
|
"dataStoreMaxConns": 100, |
||||
|
"dataStoreConnUsageLimit": 100, |
||||
|
"dataStoreLogLevel": "debug", |
||||
|
"maxUrlLength": 500 |
||||
|
} |
||||
|
}, { |
||||
|
"servlet-name": "cofaxEmail", |
||||
|
"servlet-class": "org.cofax.cds.EmailServlet", |
||||
|
"init-param": { |
||||
|
"mailHost": "mail1", |
||||
|
"mailHostOverride": "mail2" |
||||
|
} |
||||
|
}, { |
||||
|
"servlet-name": "cofaxAdmin", |
||||
|
"servlet-class": "org.cofax.cds.AdminServlet" |
||||
|
}, { |
||||
|
"servlet-name": "fileServlet", |
||||
|
"servlet-class": "org.cofax.cds.FileServlet" |
||||
|
}, { |
||||
|
"servlet-name": "cofaxTools", |
||||
|
"servlet-class": "org.cofax.cms.CofaxToolsServlet", |
||||
|
"init-param": { |
||||
|
"templatePath": "toolstemplates/", |
||||
|
"log": 1, |
||||
|
"logLocation": "/usr/local/tomcat/logs/CofaxTools.log", |
||||
|
"logMaxSize": "", |
||||
|
"dataLog": 1, |
||||
|
"dataLogLocation": "/usr/local/tomcat/logs/dataLog.log", |
||||
|
"dataLogMaxSize": "", |
||||
|
"removePageCache": "/content/admin/remove?cache=pages&id=", |
||||
|
"removeTemplateCache": "/content/admin/remove?cache=templates&id=", |
||||
|
"fileTransferFolder": "/usr/local/tomcat/webapps/content/fileTransferFolder", |
||||
|
"lookInContext": 1, |
||||
|
"adminGroupID": 4, |
||||
|
"betaServer": true |
||||
|
} |
||||
|
}], |
||||
|
"servlet-mapping": { |
||||
|
"cofaxCDS": "/", |
||||
|
"cofaxEmail": "/cofaxutil/aemail/*", |
||||
|
"cofaxAdmin": "/admin/*", |
||||
|
"fileServlet": "/static/*", |
||||
|
"cofaxTools": "/tools/*" |
||||
|
}, |
||||
|
"taglib": { |
||||
|
"taglib-uri": "cofax.tld", |
||||
|
"taglib-location": "/WEB-INF/tlds/cofax.tld" |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,54 @@ |
|||||
|
{ |
||||
|
"menu": { |
||||
|
"header": "SVG Viewer", |
||||
|
"items": [{ |
||||
|
"id": "Open" |
||||
|
}, { |
||||
|
"id": "OpenNew", |
||||
|
"label": "Open New" |
||||
|
}, null, { |
||||
|
"id": "ZoomIn", |
||||
|
"label": "Zoom In" |
||||
|
}, { |
||||
|
"id": "ZoomOut", |
||||
|
"label": "Zoom Out" |
||||
|
}, { |
||||
|
"id": "OriginalView", |
||||
|
"label": "Original View" |
||||
|
}, null, { |
||||
|
"id": "Quality" |
||||
|
}, { |
||||
|
"id": "Pause" |
||||
|
}, { |
||||
|
"id": "Mute" |
||||
|
}, null, { |
||||
|
"id": "Find", |
||||
|
"label": "Find..." |
||||
|
}, { |
||||
|
"id": "FindAgain", |
||||
|
"label": "Find Again" |
||||
|
}, { |
||||
|
"id": "Copy" |
||||
|
}, { |
||||
|
"id": "CopyAgain", |
||||
|
"label": "Copy Again" |
||||
|
}, { |
||||
|
"id": "CopySVG", |
||||
|
"label": "Copy SVG" |
||||
|
}, { |
||||
|
"id": "ViewSVG", |
||||
|
"label": "View SVG" |
||||
|
}, { |
||||
|
"id": "ViewSource", |
||||
|
"label": "View Source" |
||||
|
}, { |
||||
|
"id": "SaveAs", |
||||
|
"label": "Save As" |
||||
|
}, null, { |
||||
|
"id": "Help" |
||||
|
}, { |
||||
|
"id": "About", |
||||
|
"label": "About Adobe CVG Viewer..." |
||||
|
}] |
||||
|
} |
||||
|
} |
@ -0,0 +1,223 @@ |
|||||
|
/*
|
||||
|
Copyright (c) 2009-2017 Dave Gamble and cJSON contributors |
||||
|
|
||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy |
||||
|
of this software and associated documentation files (the "Software"), to deal |
||||
|
in the Software without restriction, including without limitation the rights |
||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
||||
|
copies of the Software, and to permit persons to whom the Software is |
||||
|
furnished to do so, subject to the following conditions: |
||||
|
|
||||
|
The above copyright notice and this permission notice shall be included in |
||||
|
all copies or substantial portions of the Software. |
||||
|
|
||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
||||
|
THE SOFTWARE. |
||||
|
*/ |
||||
|
|
||||
|
#include <stdio.h> |
||||
|
#include <stdlib.h> |
||||
|
#include <string.h> |
||||
|
|
||||
|
#include "unity/examples/unity_config.h" |
||||
|
#include "unity/src/unity.h" |
||||
|
#include "../cJSON.h" |
||||
|
|
||||
|
static char *read_file(const char *filename) |
||||
|
{ |
||||
|
FILE *file = NULL; |
||||
|
long length = 0; |
||||
|
char *content = NULL; |
||||
|
size_t read_chars = 0; |
||||
|
|
||||
|
/* open in read binary mode */ |
||||
|
file = fopen(filename, "rb"); |
||||
|
if (file == NULL) |
||||
|
{ |
||||
|
goto cleanup; |
||||
|
} |
||||
|
|
||||
|
/* get the length */ |
||||
|
if (fseek(file, 0, SEEK_END) != 0) |
||||
|
{ |
||||
|
goto cleanup; |
||||
|
} |
||||
|
length = ftell(file); |
||||
|
if (length < 0) |
||||
|
{ |
||||
|
goto cleanup; |
||||
|
} |
||||
|
if (fseek(file, 0, SEEK_SET) != 0) |
||||
|
{ |
||||
|
goto cleanup; |
||||
|
} |
||||
|
|
||||
|
/* allocate content buffer */ |
||||
|
content = (char*)malloc((size_t)length + sizeof('\0')); |
||||
|
if (content == NULL) |
||||
|
{ |
||||
|
goto cleanup; |
||||
|
} |
||||
|
|
||||
|
/* read the file into memory */ |
||||
|
read_chars = fread(content, sizeof(char), (size_t)length, file); |
||||
|
if ((long)read_chars != length) |
||||
|
{ |
||||
|
free(content); |
||||
|
content = NULL; |
||||
|
goto cleanup; |
||||
|
} |
||||
|
content[read_chars] = '\0'; |
||||
|
|
||||
|
|
||||
|
cleanup: |
||||
|
if (file != NULL) |
||||
|
{ |
||||
|
fclose(file); |
||||
|
} |
||||
|
|
||||
|
return content; |
||||
|
} |
||||
|
|
||||
|
static cJSON *parse_file(const char *filename) |
||||
|
{ |
||||
|
cJSON *parsed = NULL; |
||||
|
char *content = read_file(filename); |
||||
|
|
||||
|
parsed = cJSON_Parse(content); |
||||
|
|
||||
|
if (content != NULL) |
||||
|
{ |
||||
|
free(content); |
||||
|
} |
||||
|
|
||||
|
return parsed; |
||||
|
} |
||||
|
|
||||
|
static void do_test(const char *test_name) |
||||
|
{ |
||||
|
char *expected = NULL; |
||||
|
char *actual = NULL; |
||||
|
cJSON *tree = NULL; |
||||
|
|
||||
|
size_t test_name_length = 0; |
||||
|
/* path of the test input */ |
||||
|
char *test_path = NULL; |
||||
|
/* path of the expected output */ |
||||
|
char *expected_path = NULL; |
||||
|
|
||||
|
test_name_length = strlen(test_name); |
||||
|
|
||||
|
/* allocate file paths */ |
||||
|
#define TEST_DIR_PATH "inputs/" |
||||
|
test_path = (char*)malloc(sizeof(TEST_DIR_PATH) + test_name_length); |
||||
|
TEST_ASSERT_NOT_NULL_MESSAGE(test_path, "Failed to allocate test_path buffer."); |
||||
|
expected_path = (char*)malloc(sizeof(TEST_DIR_PATH) + test_name_length + sizeof(".expected")); |
||||
|
TEST_ASSERT_NOT_NULL_MESSAGE(expected_path, "Failed to allocate expected_path buffer."); |
||||
|
|
||||
|
/* create file paths */ |
||||
|
sprintf(test_path, TEST_DIR_PATH"%s", test_name); |
||||
|
sprintf(expected_path, TEST_DIR_PATH"%s.expected", test_name); |
||||
|
|
||||
|
/* read expected output */ |
||||
|
expected = read_file(expected_path); |
||||
|
TEST_ASSERT_NOT_NULL_MESSAGE(expected, "Failed to read expected output."); |
||||
|
|
||||
|
/* read and parse test */ |
||||
|
tree = parse_file(test_path); |
||||
|
TEST_ASSERT_NOT_NULL_MESSAGE(tree, "Failed to read of parse test."); |
||||
|
|
||||
|
/* print the parsed tree */ |
||||
|
actual = cJSON_Print(tree); |
||||
|
TEST_ASSERT_NOT_NULL_MESSAGE(actual, "Failed to print tree back to JSON."); |
||||
|
|
||||
|
|
||||
|
TEST_ASSERT_EQUAL_STRING(expected, actual); |
||||
|
|
||||
|
/* cleanup resources */ |
||||
|
if (expected != NULL) |
||||
|
{ |
||||
|
free(expected); |
||||
|
} |
||||
|
if (tree != NULL) |
||||
|
{ |
||||
|
cJSON_Delete(tree); |
||||
|
} |
||||
|
if (actual != NULL) |
||||
|
{ |
||||
|
free(actual); |
||||
|
} |
||||
|
if (test_path != NULL) |
||||
|
{ |
||||
|
free(test_path); |
||||
|
} |
||||
|
if (expected_path != NULL) |
||||
|
{ |
||||
|
free(expected_path); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
static void file_test1_should_be_parsed_and_printed(void) |
||||
|
{ |
||||
|
do_test("test1"); |
||||
|
} |
||||
|
|
||||
|
static void file_test2_should_be_parsed_and_printed(void) |
||||
|
{ |
||||
|
do_test("test2"); |
||||
|
} |
||||
|
|
||||
|
static void file_test3_should_be_parsed_and_printed(void) |
||||
|
{ |
||||
|
do_test("test3"); |
||||
|
} |
||||
|
|
||||
|
static void file_test4_should_be_parsed_and_printed(void) |
||||
|
{ |
||||
|
do_test("test4"); |
||||
|
} |
||||
|
|
||||
|
static void file_test5_should_be_parsed_and_printed(void) |
||||
|
{ |
||||
|
do_test("test5"); |
||||
|
} |
||||
|
|
||||
|
static void file_test6_should_not_be_parsed(void) |
||||
|
{ |
||||
|
char *test6 = NULL; |
||||
|
cJSON *tree = NULL; |
||||
|
|
||||
|
test6 = read_file("inputs/test6"); |
||||
|
TEST_ASSERT_NOT_NULL_MESSAGE(test6, "Failed to read test6 data."); |
||||
|
|
||||
|
tree = cJSON_Parse(test6); |
||||
|
TEST_ASSERT_NULL_MESSAGE(tree, "Should fail to parse what is not JSON."); |
||||
|
|
||||
|
TEST_ASSERT_EQUAL_STRING_MESSAGE(test6, cJSON_GetErrorPtr(), "Error pointer is incorrect."); |
||||
|
|
||||
|
if (test6 != NULL) |
||||
|
{ |
||||
|
free(test6); |
||||
|
} |
||||
|
if (tree != NULL) |
||||
|
{ |
||||
|
cJSON_Delete(tree); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
int main(void) |
||||
|
{ |
||||
|
UNITY_BEGIN(); |
||||
|
RUN_TEST(file_test1_should_be_parsed_and_printed); |
||||
|
RUN_TEST(file_test2_should_be_parsed_and_printed); |
||||
|
RUN_TEST(file_test3_should_be_parsed_and_printed); |
||||
|
RUN_TEST(file_test4_should_be_parsed_and_printed); |
||||
|
RUN_TEST(file_test5_should_be_parsed_and_printed); |
||||
|
RUN_TEST(file_test6_should_not_be_parsed); |
||||
|
return UNITY_END(); |
||||
|
} |
Loading…
Reference in new issue