mirror of
https://github.com/simdjson/simdjson
synced 2026-06-08 17:27:07 +00:00
211 lines
6.2 KiB
C++
211 lines
6.2 KiB
C++
#include "simdjson.h"
|
|
#include "test_ondemand.h"
|
|
|
|
using namespace simdjson;
|
|
|
|
namespace json_package_tests {
|
|
using namespace std;
|
|
bool baby() {
|
|
TEST_START();
|
|
auto json = R"({
|
|
"name": "Daniel",
|
|
"age": 42
|
|
})"_padded;
|
|
ondemand::parser parser;
|
|
ondemand::document doc;
|
|
ASSERT_SUCCESS(parser.iterate(json).get(doc));
|
|
|
|
simdjson::ondemand::object main_object;
|
|
ASSERT_SUCCESS(doc.get_object().get(main_object));
|
|
std::string name;
|
|
ASSERT_SUCCESS(main_object["name"].get_string(name));
|
|
ASSERT_EQUAL(name, "Daniel");
|
|
uint64_t age;
|
|
ASSERT_SUCCESS(main_object["age"].get_uint64().get(age));
|
|
ASSERT_EQUAL(age, 42);
|
|
TEST_SUCCEED();
|
|
}
|
|
|
|
bool thirtysecondsofcode() {
|
|
TEST_START();
|
|
auto json = R"({
|
|
"name": "30-seconds-of-code",
|
|
"private": true,
|
|
"version": "10.0.0",
|
|
"description": "30 seconds of code website.",
|
|
"exports": "./index.js",
|
|
"author": "chalarangelo",
|
|
"type": "module",
|
|
"devDependencies": {
|
|
"@jsiqle/core": "^3.0.0",
|
|
"astro": "^3.2.0",
|
|
"chalk": "^5.3.0",
|
|
"eslint": "^8.50.0",
|
|
"eslint-config-prettier": "^9.0.0",
|
|
"front-matter": "^4.0.2",
|
|
"fs-extra": "^11.1.1",
|
|
"glob": "^10.3.10",
|
|
"hast-util-to-html": "^9.0.0",
|
|
"js-yaml": "^4.1.0",
|
|
"mdast-util-to-hast": "^13.0.2",
|
|
"prettier": "^3.0.3",
|
|
"prettier-plugin-astro": "^0.12.0",
|
|
"prismjs": "^1.29.0",
|
|
"remark": "^15.0.1",
|
|
"remark-gfm": "^4.0.0",
|
|
"sass": "^1.68.0",
|
|
"sharp": "^0.32.6",
|
|
"unist-util-select": "^5.0.0",
|
|
"unist-util-visit": "^5.0.0",
|
|
"unist-util-visit-parents": "^6.0.1",
|
|
"webfonts-generator": "^0.4.0"
|
|
},
|
|
"imports": {
|
|
"#blocks/*": "./src/blocks/*.js",
|
|
"#components/*": "./src/components/*.astro",
|
|
"#layouts/*": "./src/layouts/*.astro",
|
|
"#settings/*": "./src/settings/*.js",
|
|
"#prefabs": "./src/prefabs/index.js",
|
|
"#utils": "./src/utils/index.js",
|
|
"#utils/search": "./src/utils/search.js"
|
|
},
|
|
"scripts": {
|
|
"predev": "NODE_ENV=development node ./src/scripts/develop.js",
|
|
"dev": "astro dev --port 8000",
|
|
"start": "astro dev --port 8000",
|
|
"prebuild": "NODE_ENV=production node ./src/scripts/build.js",
|
|
"build": "astro build",
|
|
"preview": "astro preview --port 9000",
|
|
"watch": "NODE_ENV=development node ./src/scripts/watch.js",
|
|
"console": "NODE_ENV=production node ./src/scripts/console.js",
|
|
"create": "NODE_ENV=production node ./src/scripts/create.js",
|
|
"icons": "NODE_ENV=production node ./src/scripts/icons.js",
|
|
"manifest": "NODE_ENV=production node ./src/scripts/manifest.js"
|
|
},
|
|
"license": "MIT",
|
|
"repository": {
|
|
"type": "git",
|
|
"url": "https://github.com/30-seconds/30-seconds-of-code"
|
|
},
|
|
"bugs": {
|
|
"url": "https://github.com/30-seconds/30-seconds-of-code/issues"
|
|
},
|
|
"browserslist": [
|
|
"> 0.5% and last 4 versions and not dead and not ie>0 and not op_mini all and not and_uc>0 and not edge<79"
|
|
],
|
|
"engines": {
|
|
"node": ">=18.14.2"
|
|
}
|
|
})"_padded;
|
|
ondemand::parser parser;
|
|
ondemand::document doc;
|
|
ASSERT_SUCCESS(parser.iterate(json).get(doc));
|
|
|
|
simdjson::ondemand::object main_object;
|
|
ASSERT_SUCCESS(doc.get_object().get(main_object));
|
|
|
|
simdjson::ondemand::raw_json_string key;
|
|
simdjson::ondemand::value value;
|
|
|
|
for (auto field : main_object) {
|
|
// Throw error if getting key or value fails.
|
|
ASSERT_SUCCESS(field.key().get(key));
|
|
ASSERT_SUCCESS(field.value().get(value));
|
|
|
|
if (key == "name") {
|
|
std::string name;
|
|
ASSERT_SUCCESS(value.get_string(name));
|
|
ASSERT_EQUAL(name, "30-seconds-of-code");
|
|
} else if (key == "main") {
|
|
std::string main;
|
|
ASSERT_SUCCESS(value.get_string(main));
|
|
// unused
|
|
} else if (key == "exports") {
|
|
simdjson::ondemand::json_type exports_type;
|
|
if (!value.type().get(exports_type)) {
|
|
std::string_view exports;
|
|
switch (exports_type) {
|
|
case simdjson::ondemand::json_type::object: {
|
|
simdjson::ondemand::object exports_object;
|
|
if (!value.get_object().get(exports_object) &&
|
|
!exports_object.raw_json().get(exports)) {
|
|
// unused
|
|
}
|
|
break;
|
|
}
|
|
case simdjson::ondemand::json_type::array: {
|
|
simdjson::ondemand::array exports_array;
|
|
if (!value.get_array().get(exports_array) &&
|
|
!exports_array.raw_json().get(exports)) {
|
|
// unused
|
|
}
|
|
break;
|
|
}
|
|
case simdjson::ondemand::json_type::string: {
|
|
if (!value.get_string().get(exports)) {
|
|
ASSERT_EQUAL(exports, "./index.js");
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
} else if (key == "imports") {
|
|
simdjson::ondemand::json_type imports_type;
|
|
if (!value.type().get(imports_type)) {
|
|
std::string_view imports;
|
|
switch (imports_type) {
|
|
case simdjson::ondemand::json_type::object: {
|
|
simdjson::ondemand::object imports_object;
|
|
if (!value.get_object().get(imports_object) &&
|
|
!imports_object.raw_json().get(imports)) {
|
|
ASSERT_EQUAL(imports, R"({
|
|
"#blocks/*": "./src/blocks/*.js",
|
|
"#components/*": "./src/components/*.astro",
|
|
"#layouts/*": "./src/layouts/*.astro",
|
|
"#settings/*": "./src/settings/*.js",
|
|
"#prefabs": "./src/prefabs/index.js",
|
|
"#utils": "./src/utils/index.js",
|
|
"#utils/search": "./src/utils/search.js"
|
|
})");
|
|
}
|
|
break;
|
|
}
|
|
case simdjson::ondemand::json_type::array: {
|
|
simdjson::ondemand::array imports_array;
|
|
if (!value.get_array().get(imports_array) &&
|
|
!imports_array.raw_json().get(imports)) {
|
|
// unused
|
|
}
|
|
break;
|
|
}
|
|
case simdjson::ondemand::json_type::string: {
|
|
if (!value.get_string().get(imports)) {
|
|
// unused
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
} else if (key == "type") {
|
|
std::string_view type;
|
|
if (!value.get_string().get(type) &&
|
|
(type == "commonjs" || type == "module")) {
|
|
ASSERT_EQUAL(type, "module");
|
|
}
|
|
}
|
|
}
|
|
TEST_SUCCEED();
|
|
}
|
|
|
|
bool run() { return thirtysecondsofcode() && baby(); }
|
|
|
|
} // namespace json_package_tests
|
|
|
|
int main(int argc, char *argv[]) {
|
|
return test_main(argc, argv, json_package_tests::run);
|
|
}
|