@scriptc/runtime 0.0.0 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/package.json +16 -6
- package/src/scr_array.c +488 -0
- package/src/scr_assert.c +1393 -0
- package/src/scr_async.c +2593 -0
- package/src/scr_async_dyn.c +607 -0
- package/src/scr_bytes.c +1425 -0
- package/src/scr_bytes_io.c +161 -0
- package/src/scr_child.c +3587 -0
- package/src/scr_closure.c +214 -0
- package/src/scr_console.c +143 -0
- package/src/scr_cycle.c +218 -0
- package/src/scr_dc.c +805 -0
- package/src/scr_dgram.c +1007 -0
- package/src/scr_dyn_handle.c +154 -0
- package/src/scr_dyn_invoke.c +644 -0
- package/src/scr_error.c +332 -0
- package/src/scr_events.c +714 -0
- package/src/scr_events_emitter.c +699 -0
- package/src/scr_exception.c +242 -0
- package/src/scr_fetch.c +1130 -0
- package/src/scr_fetch_curl.c +654 -0
- package/src/scr_http.c +3482 -0
- package/src/scr_http2.c +3030 -0
- package/src/scr_inspect.c +803 -0
- package/src/scr_inspect_island.c +51 -0
- package/src/scr_island.c +9363 -0
- package/src/scr_json.c +2151 -0
- package/src/scr_lib.c +3612 -0
- package/src/scr_loop_epoll.c +241 -0
- package/src/scr_loop_kqueue.c +121 -0
- package/src/scr_loop_wsapoll.c +208 -0
- package/src/scr_map.c +591 -0
- package/src/scr_net.c +3017 -0
- package/src/scr_net_island.c +458 -0
- package/src/scr_number.c +115 -0
- package/src/scr_object.c +25 -0
- package/src/scr_path.c +1266 -0
- package/src/scr_platform.h +119 -0
- package/src/scr_readline.c +287 -0
- package/src/scr_regex.c +1080 -0
- package/src/scr_runtime.h +5046 -0
- package/src/scr_stream.c +2877 -0
- package/src/scr_string.c +1264 -0
- package/src/scr_symbol.c +132 -0
- package/src/scr_test.c +662 -0
- package/src/scr_tls.c +1520 -0
- package/src/scr_union.c +105 -0
- package/src/scr_url.c +911 -0
- package/src/scr_url_internal.h +29 -0
- package/src/scr_url_params.c +561 -0
- package/src/scr_watch.c +568 -0
- package/src/scr_web.c +1778 -0
- package/src/scr_win.c +76 -0
- package/src/scr_zlib.c +197 -0
- package/src/scr_zlib_island.c +15 -0
- package/vendor/README.md +52 -0
- package/vendor/curl/COPYRIGHT +534 -0
- package/vendor/curl/include/curl/curl.h +3214 -0
- package/vendor/curl/include/curl/curlver.h +79 -0
- package/vendor/curl/include/curl/easy.h +125 -0
- package/vendor/curl/include/curl/header.h +74 -0
- package/vendor/curl/include/curl/mprintf.h +52 -0
- package/vendor/curl/include/curl/multi.h +460 -0
- package/vendor/curl/include/curl/options.h +70 -0
- package/vendor/curl/include/curl/stdcheaders.h +35 -0
- package/vendor/curl/include/curl/system.h +508 -0
- package/vendor/curl/include/curl/typecheck-gcc.h +716 -0
- package/vendor/curl/include/curl/urlapi.h +149 -0
- package/vendor/curl/include/curl/websockets.h +84 -0
- package/vendor/mbedtls/LICENSE +553 -0
- package/vendor/mbedtls/include/CMakeLists.txt +22 -0
- package/vendor/mbedtls/include/mbedtls/aes.h +631 -0
- package/vendor/mbedtls/include/mbedtls/aria.h +343 -0
- package/vendor/mbedtls/include/mbedtls/asn1.h +642 -0
- package/vendor/mbedtls/include/mbedtls/asn1write.h +390 -0
- package/vendor/mbedtls/include/mbedtls/base64.h +82 -0
- package/vendor/mbedtls/include/mbedtls/bignum.h +1088 -0
- package/vendor/mbedtls/include/mbedtls/block_cipher.h +76 -0
- package/vendor/mbedtls/include/mbedtls/build_info.h +194 -0
- package/vendor/mbedtls/include/mbedtls/camellia.h +305 -0
- package/vendor/mbedtls/include/mbedtls/ccm.h +526 -0
- package/vendor/mbedtls/include/mbedtls/chacha20.h +209 -0
- package/vendor/mbedtls/include/mbedtls/chachapoly.h +351 -0
- package/vendor/mbedtls/include/mbedtls/check_config.h +1149 -0
- package/vendor/mbedtls/include/mbedtls/cipher.h +1250 -0
- package/vendor/mbedtls/include/mbedtls/cmac.h +246 -0
- package/vendor/mbedtls/include/mbedtls/compat-2.x.h +46 -0
- package/vendor/mbedtls/include/mbedtls/config_adjust_legacy_crypto.h +578 -0
- package/vendor/mbedtls/include/mbedtls/config_adjust_legacy_from_psa.h +873 -0
- package/vendor/mbedtls/include/mbedtls/config_adjust_psa_from_legacy.h +359 -0
- package/vendor/mbedtls/include/mbedtls/config_adjust_psa_superset_legacy.h +145 -0
- package/vendor/mbedtls/include/mbedtls/config_adjust_ssl.h +91 -0
- package/vendor/mbedtls/include/mbedtls/config_adjust_x509.h +35 -0
- package/vendor/mbedtls/include/mbedtls/config_psa.h +61 -0
- package/vendor/mbedtls/include/mbedtls/constant_time.h +36 -0
- package/vendor/mbedtls/include/mbedtls/ctr_drbg.h +596 -0
- package/vendor/mbedtls/include/mbedtls/debug.h +156 -0
- package/vendor/mbedtls/include/mbedtls/des.h +385 -0
- package/vendor/mbedtls/include/mbedtls/dhm.h +972 -0
- package/vendor/mbedtls/include/mbedtls/ecdh.h +455 -0
- package/vendor/mbedtls/include/mbedtls/ecdsa.h +674 -0
- package/vendor/mbedtls/include/mbedtls/ecjpake.h +298 -0
- package/vendor/mbedtls/include/mbedtls/ecp.h +1517 -0
- package/vendor/mbedtls/include/mbedtls/entropy.h +274 -0
- package/vendor/mbedtls/include/mbedtls/error.h +201 -0
- package/vendor/mbedtls/include/mbedtls/gcm.h +387 -0
- package/vendor/mbedtls/include/mbedtls/hkdf.h +124 -0
- package/vendor/mbedtls/include/mbedtls/hmac_drbg.h +434 -0
- package/vendor/mbedtls/include/mbedtls/lms.h +440 -0
- package/vendor/mbedtls/include/mbedtls/mbedtls_config.h +4446 -0
- package/vendor/mbedtls/include/mbedtls/md.h +526 -0
- package/vendor/mbedtls/include/mbedtls/md5.h +190 -0
- package/vendor/mbedtls/include/mbedtls/memory_buffer_alloc.h +142 -0
- package/vendor/mbedtls/include/mbedtls/net_sockets.h +299 -0
- package/vendor/mbedtls/include/mbedtls/nist_kw.h +166 -0
- package/vendor/mbedtls/include/mbedtls/oid.h +727 -0
- package/vendor/mbedtls/include/mbedtls/pem.h +160 -0
- package/vendor/mbedtls/include/mbedtls/pk.h +1303 -0
- package/vendor/mbedtls/include/mbedtls/pkcs12.h +186 -0
- package/vendor/mbedtls/include/mbedtls/pkcs5.h +198 -0
- package/vendor/mbedtls/include/mbedtls/pkcs7.h +252 -0
- package/vendor/mbedtls/include/mbedtls/platform.h +516 -0
- package/vendor/mbedtls/include/mbedtls/platform_time.h +79 -0
- package/vendor/mbedtls/include/mbedtls/platform_util.h +247 -0
- package/vendor/mbedtls/include/mbedtls/poly1305.h +168 -0
- package/vendor/mbedtls/include/mbedtls/private_access.h +20 -0
- package/vendor/mbedtls/include/mbedtls/psa_util.h +207 -0
- package/vendor/mbedtls/include/mbedtls/ripemd160.h +136 -0
- package/vendor/mbedtls/include/mbedtls/rsa.h +1170 -0
- package/vendor/mbedtls/include/mbedtls/sha1.h +219 -0
- package/vendor/mbedtls/include/mbedtls/sha256.h +200 -0
- package/vendor/mbedtls/include/mbedtls/sha3.h +172 -0
- package/vendor/mbedtls/include/mbedtls/sha512.h +208 -0
- package/vendor/mbedtls/include/mbedtls/ssl.h +5887 -0
- package/vendor/mbedtls/include/mbedtls/ssl_cache.h +187 -0
- package/vendor/mbedtls/include/mbedtls/ssl_ciphersuites.h +482 -0
- package/vendor/mbedtls/include/mbedtls/ssl_cookie.h +106 -0
- package/vendor/mbedtls/include/mbedtls/ssl_ticket.h +199 -0
- package/vendor/mbedtls/include/mbedtls/threading.h +167 -0
- package/vendor/mbedtls/include/mbedtls/timing.h +94 -0
- package/vendor/mbedtls/include/mbedtls/version.h +78 -0
- package/vendor/mbedtls/include/mbedtls/x509.h +500 -0
- package/vendor/mbedtls/include/mbedtls/x509_crl.h +184 -0
- package/vendor/mbedtls/include/mbedtls/x509_crt.h +1208 -0
- package/vendor/mbedtls/include/mbedtls/x509_csr.h +382 -0
- package/vendor/mbedtls/include/psa/build_info.h +20 -0
- package/vendor/mbedtls/include/psa/crypto.h +4998 -0
- package/vendor/mbedtls/include/psa/crypto_adjust_auto_enabled.h +31 -0
- package/vendor/mbedtls/include/psa/crypto_adjust_config_dependencies.h +51 -0
- package/vendor/mbedtls/include/psa/crypto_adjust_config_key_pair_types.h +101 -0
- package/vendor/mbedtls/include/psa/crypto_adjust_config_synonyms.h +49 -0
- package/vendor/mbedtls/include/psa/crypto_builtin_composites.h +214 -0
- package/vendor/mbedtls/include/psa/crypto_builtin_key_derivation.h +118 -0
- package/vendor/mbedtls/include/psa/crypto_builtin_primitives.h +114 -0
- package/vendor/mbedtls/include/psa/crypto_compat.h +230 -0
- package/vendor/mbedtls/include/psa/crypto_config.h +145 -0
- package/vendor/mbedtls/include/psa/crypto_driver_common.h +44 -0
- package/vendor/mbedtls/include/psa/crypto_driver_contexts_composites.h +151 -0
- package/vendor/mbedtls/include/psa/crypto_driver_contexts_key_derivation.h +52 -0
- package/vendor/mbedtls/include/psa/crypto_driver_contexts_primitives.h +105 -0
- package/vendor/mbedtls/include/psa/crypto_extra.h +2145 -0
- package/vendor/mbedtls/include/psa/crypto_legacy.h +88 -0
- package/vendor/mbedtls/include/psa/crypto_platform.h +102 -0
- package/vendor/mbedtls/include/psa/crypto_se_driver.h +1383 -0
- package/vendor/mbedtls/include/psa/crypto_sizes.h +1319 -0
- package/vendor/mbedtls/include/psa/crypto_struct.h +527 -0
- package/vendor/mbedtls/include/psa/crypto_types.h +508 -0
- package/vendor/mbedtls/include/psa/crypto_values.h +2782 -0
- package/vendor/mbedtls/library/aes.c +2294 -0
- package/vendor/mbedtls/library/aesce.c +624 -0
- package/vendor/mbedtls/library/aesce.h +136 -0
- package/vendor/mbedtls/library/aesni.c +846 -0
- package/vendor/mbedtls/library/aesni.h +162 -0
- package/vendor/mbedtls/library/alignment.h +704 -0
- package/vendor/mbedtls/library/aria.c +969 -0
- package/vendor/mbedtls/library/asn1parse.c +468 -0
- package/vendor/mbedtls/library/asn1write.c +440 -0
- package/vendor/mbedtls/library/base64.c +322 -0
- package/vendor/mbedtls/library/base64_internal.h +45 -0
- package/vendor/mbedtls/library/bignum.c +2583 -0
- package/vendor/mbedtls/library/bignum_core.c +1240 -0
- package/vendor/mbedtls/library/bignum_core.h +872 -0
- package/vendor/mbedtls/library/bignum_core_invasive.h +38 -0
- package/vendor/mbedtls/library/bignum_internal.h +122 -0
- package/vendor/mbedtls/library/bignum_mod.c +394 -0
- package/vendor/mbedtls/library/bignum_mod.h +452 -0
- package/vendor/mbedtls/library/bignum_mod_raw.c +276 -0
- package/vendor/mbedtls/library/bignum_mod_raw.h +416 -0
- package/vendor/mbedtls/library/bignum_mod_raw_invasive.h +34 -0
- package/vendor/mbedtls/library/block_cipher.c +207 -0
- package/vendor/mbedtls/library/block_cipher_internal.h +99 -0
- package/vendor/mbedtls/library/bn_mul.h +1094 -0
- package/vendor/mbedtls/library/camellia.c +1058 -0
- package/vendor/mbedtls/library/ccm.c +777 -0
- package/vendor/mbedtls/library/chacha20.c +563 -0
- package/vendor/mbedtls/library/chacha20_internal.h +23 -0
- package/vendor/mbedtls/library/chachapoly.c +487 -0
- package/vendor/mbedtls/library/check_crypto_config.h +136 -0
- package/vendor/mbedtls/library/cipher.c +1712 -0
- package/vendor/mbedtls/library/cipher_invasive.h +28 -0
- package/vendor/mbedtls/library/cipher_wrap.c +2482 -0
- package/vendor/mbedtls/library/cipher_wrap.h +178 -0
- package/vendor/mbedtls/library/cmac.c +1067 -0
- package/vendor/mbedtls/library/common.h +487 -0
- package/vendor/mbedtls/library/constant_time.c +247 -0
- package/vendor/mbedtls/library/constant_time_impl.h +541 -0
- package/vendor/mbedtls/library/constant_time_internal.h +579 -0
- package/vendor/mbedtls/library/ctr.h +35 -0
- package/vendor/mbedtls/library/ctr_drbg.c +1016 -0
- package/vendor/mbedtls/library/debug.c +475 -0
- package/vendor/mbedtls/library/debug_internal.h +185 -0
- package/vendor/mbedtls/library/des.c +1042 -0
- package/vendor/mbedtls/library/dhm.c +700 -0
- package/vendor/mbedtls/library/ecdh.c +696 -0
- package/vendor/mbedtls/library/ecdsa.c +858 -0
- package/vendor/mbedtls/library/ecjpake.c +1216 -0
- package/vendor/mbedtls/library/ecp.c +3674 -0
- package/vendor/mbedtls/library/ecp_curves.c +6125 -0
- package/vendor/mbedtls/library/ecp_curves_new.c +9 -0
- package/vendor/mbedtls/library/ecp_internal_alt.h +287 -0
- package/vendor/mbedtls/library/ecp_invasive.h +305 -0
- package/vendor/mbedtls/library/entropy.c +680 -0
- package/vendor/mbedtls/library/entropy_poll.c +233 -0
- package/vendor/mbedtls/library/entropy_poll.h +64 -0
- package/vendor/mbedtls/library/error.c +878 -0
- package/vendor/mbedtls/library/gcm.c +1330 -0
- package/vendor/mbedtls/library/hkdf.c +161 -0
- package/vendor/mbedtls/library/hmac_drbg.c +633 -0
- package/vendor/mbedtls/library/lmots.c +789 -0
- package/vendor/mbedtls/library/lmots.h +288 -0
- package/vendor/mbedtls/library/lms.c +778 -0
- package/vendor/mbedtls/library/md.c +1108 -0
- package/vendor/mbedtls/library/md5.c +426 -0
- package/vendor/mbedtls/library/md_psa.h +26 -0
- package/vendor/mbedtls/library/md_wrap.h +46 -0
- package/vendor/mbedtls/library/memory_buffer_alloc.c +751 -0
- package/vendor/mbedtls/library/mps_common.h +181 -0
- package/vendor/mbedtls/library/mps_error.h +89 -0
- package/vendor/mbedtls/library/mps_reader.c +538 -0
- package/vendor/mbedtls/library/mps_reader.h +366 -0
- package/vendor/mbedtls/library/mps_trace.c +112 -0
- package/vendor/mbedtls/library/mps_trace.h +154 -0
- package/vendor/mbedtls/library/net_sockets.c +694 -0
- package/vendor/mbedtls/library/nist_kw.c +729 -0
- package/vendor/mbedtls/library/oid.c +1166 -0
- package/vendor/mbedtls/library/padlock.c +157 -0
- package/vendor/mbedtls/library/padlock.h +111 -0
- package/vendor/mbedtls/library/pem.c +554 -0
- package/vendor/mbedtls/library/pk.c +1602 -0
- package/vendor/mbedtls/library/pk_ecc.c +261 -0
- package/vendor/mbedtls/library/pk_internal.h +241 -0
- package/vendor/mbedtls/library/pk_wrap.c +1618 -0
- package/vendor/mbedtls/library/pk_wrap.h +138 -0
- package/vendor/mbedtls/library/pkcs12.c +437 -0
- package/vendor/mbedtls/library/pkcs5.c +500 -0
- package/vendor/mbedtls/library/pkcs7.c +787 -0
- package/vendor/mbedtls/library/pkparse.c +1392 -0
- package/vendor/mbedtls/library/pkwrite.c +631 -0
- package/vendor/mbedtls/library/pkwrite.h +121 -0
- package/vendor/mbedtls/library/platform.c +402 -0
- package/vendor/mbedtls/library/platform_util.c +258 -0
- package/vendor/mbedtls/library/poly1305.c +492 -0
- package/vendor/mbedtls/library/psa_crypto.c +9532 -0
- package/vendor/mbedtls/library/psa_crypto_aead.c +646 -0
- package/vendor/mbedtls/library/psa_crypto_aead.h +499 -0
- package/vendor/mbedtls/library/psa_crypto_cipher.c +747 -0
- package/vendor/mbedtls/library/psa_crypto_cipher.h +316 -0
- package/vendor/mbedtls/library/psa_crypto_client.c +22 -0
- package/vendor/mbedtls/library/psa_crypto_core.h +983 -0
- package/vendor/mbedtls/library/psa_crypto_core_common.h +52 -0
- package/vendor/mbedtls/library/psa_crypto_driver_wrappers.h +2896 -0
- package/vendor/mbedtls/library/psa_crypto_driver_wrappers_no_static.c +256 -0
- package/vendor/mbedtls/library/psa_crypto_driver_wrappers_no_static.h +31 -0
- package/vendor/mbedtls/library/psa_crypto_ecp.c +594 -0
- package/vendor/mbedtls/library/psa_crypto_ecp.h +267 -0
- package/vendor/mbedtls/library/psa_crypto_ffdh.c +361 -0
- package/vendor/mbedtls/library/psa_crypto_ffdh.h +131 -0
- package/vendor/mbedtls/library/psa_crypto_hash.c +470 -0
- package/vendor/mbedtls/library/psa_crypto_hash.h +211 -0
- package/vendor/mbedtls/library/psa_crypto_invasive.h +92 -0
- package/vendor/mbedtls/library/psa_crypto_its.h +131 -0
- package/vendor/mbedtls/library/psa_crypto_mac.c +505 -0
- package/vendor/mbedtls/library/psa_crypto_mac.h +264 -0
- package/vendor/mbedtls/library/psa_crypto_pake.c +571 -0
- package/vendor/mbedtls/library/psa_crypto_pake.h +159 -0
- package/vendor/mbedtls/library/psa_crypto_random.c +181 -0
- package/vendor/mbedtls/library/psa_crypto_random.h +72 -0
- package/vendor/mbedtls/library/psa_crypto_random_impl.h +200 -0
- package/vendor/mbedtls/library/psa_crypto_rsa.c +714 -0
- package/vendor/mbedtls/library/psa_crypto_rsa.h +321 -0
- package/vendor/mbedtls/library/psa_crypto_se.c +373 -0
- package/vendor/mbedtls/library/psa_crypto_se.h +192 -0
- package/vendor/mbedtls/library/psa_crypto_slot_management.c +1137 -0
- package/vendor/mbedtls/library/psa_crypto_slot_management.h +344 -0
- package/vendor/mbedtls/library/psa_crypto_storage.c +481 -0
- package/vendor/mbedtls/library/psa_crypto_storage.h +392 -0
- package/vendor/mbedtls/library/psa_its_file.c +254 -0
- package/vendor/mbedtls/library/psa_util.c +614 -0
- package/vendor/mbedtls/library/psa_util_internal.h +100 -0
- package/vendor/mbedtls/library/ripemd160.c +490 -0
- package/vendor/mbedtls/library/rsa.c +3121 -0
- package/vendor/mbedtls/library/rsa_alt_helpers.c +455 -0
- package/vendor/mbedtls/library/rsa_alt_helpers.h +209 -0
- package/vendor/mbedtls/library/rsa_internal.h +188 -0
- package/vendor/mbedtls/library/sha1.c +480 -0
- package/vendor/mbedtls/library/sha256.c +983 -0
- package/vendor/mbedtls/library/sha3.c +721 -0
- package/vendor/mbedtls/library/sha512.c +1115 -0
- package/vendor/mbedtls/library/ssl_cache.c +410 -0
- package/vendor/mbedtls/library/ssl_ciphersuites.c +2050 -0
- package/vendor/mbedtls/library/ssl_ciphersuites_internal.h +154 -0
- package/vendor/mbedtls/library/ssl_client.c +1023 -0
- package/vendor/mbedtls/library/ssl_client.h +22 -0
- package/vendor/mbedtls/library/ssl_cookie.c +384 -0
- package/vendor/mbedtls/library/ssl_debug_helpers.h +85 -0
- package/vendor/mbedtls/library/ssl_debug_helpers_generated.c +251 -0
- package/vendor/mbedtls/library/ssl_misc.h +3198 -0
- package/vendor/mbedtls/library/ssl_msg.c +6619 -0
- package/vendor/mbedtls/library/ssl_ticket.c +556 -0
- package/vendor/mbedtls/library/ssl_tls.c +10234 -0
- package/vendor/mbedtls/library/ssl_tls12_client.c +3688 -0
- package/vendor/mbedtls/library/ssl_tls12_server.c +4311 -0
- package/vendor/mbedtls/library/ssl_tls13_client.c +3208 -0
- package/vendor/mbedtls/library/ssl_tls13_generic.c +1793 -0
- package/vendor/mbedtls/library/ssl_tls13_invasive.h +23 -0
- package/vendor/mbedtls/library/ssl_tls13_keys.c +1918 -0
- package/vendor/mbedtls/library/ssl_tls13_keys.h +668 -0
- package/vendor/mbedtls/library/ssl_tls13_server.c +3624 -0
- package/vendor/mbedtls/library/threading.c +193 -0
- package/vendor/mbedtls/library/threading_internal.h +28 -0
- package/vendor/mbedtls/library/timing.c +152 -0
- package/vendor/mbedtls/library/version.c +32 -0
- package/vendor/mbedtls/library/version_features.c +856 -0
- package/vendor/mbedtls/library/x509.c +1776 -0
- package/vendor/mbedtls/library/x509_create.c +570 -0
- package/vendor/mbedtls/library/x509_crl.c +708 -0
- package/vendor/mbedtls/library/x509_crt.c +3311 -0
- package/vendor/mbedtls/library/x509_csr.c +648 -0
- package/vendor/mbedtls/library/x509_internal.h +101 -0
- package/vendor/mbedtls/library/x509write.c +174 -0
- package/vendor/mbedtls/library/x509write_crt.c +688 -0
- package/vendor/mbedtls/library/x509write_csr.c +336 -0
- package/vendor/quickjs-ng/CMakeLists.txt +566 -0
- package/vendor/quickjs-ng/LICENSE +24 -0
- package/vendor/quickjs-ng/README.md +24 -0
- package/vendor/quickjs-ng/api-test.c +1195 -0
- package/vendor/quickjs-ng/builtin-array-fromasync.h +119 -0
- package/vendor/quickjs-ng/builtin-iterator-zip-keyed.h +332 -0
- package/vendor/quickjs-ng/builtin-iterator-zip.h +337 -0
- package/vendor/quickjs-ng/cutils.h +1998 -0
- package/vendor/quickjs-ng/dtoa.c +1619 -0
- package/vendor/quickjs-ng/dtoa.h +87 -0
- package/vendor/quickjs-ng/gen/function_source.c +81 -0
- package/vendor/quickjs-ng/gen/hello.c +53 -0
- package/vendor/quickjs-ng/gen/hello_module.c +106 -0
- package/vendor/quickjs-ng/gen/repl.c +3036 -0
- package/vendor/quickjs-ng/gen/standalone.c +323 -0
- package/vendor/quickjs-ng/gen/test_fib.c +81 -0
- package/vendor/quickjs-ng/libregexp-opcode.h +73 -0
- package/vendor/quickjs-ng/libregexp.c +3474 -0
- package/vendor/quickjs-ng/libregexp.h +101 -0
- package/vendor/quickjs-ng/libunicode-table.h +5173 -0
- package/vendor/quickjs-ng/libunicode.c +2069 -0
- package/vendor/quickjs-ng/libunicode.h +172 -0
- package/vendor/quickjs-ng/list.h +107 -0
- package/vendor/quickjs-ng/lre-test.c +52 -0
- package/vendor/quickjs-ng/qjs.c +762 -0
- package/vendor/quickjs-ng/qjsc.c +673 -0
- package/vendor/quickjs-ng/quickjs-atom.h +280 -0
- package/vendor/quickjs-ng/quickjs-c-atomics.h +54 -0
- package/vendor/quickjs-ng/quickjs-libc.c +5037 -0
- package/vendor/quickjs-ng/quickjs-libc.h +87 -0
- package/vendor/quickjs-ng/quickjs-opcode.h +377 -0
- package/vendor/quickjs-ng/quickjs.c +64041 -0
- package/vendor/quickjs-ng/quickjs.h +1447 -0
- package/vendor/quickjs-ng/run-test262.c +2374 -0
- package/vendor/quickjs-ng/unicode_gen.c +3121 -0
- package/vendor/quickjs-ng/unicode_gen_def.h +310 -0
- package/vendor/ryu/LICENSE-Boost +23 -0
- package/vendor/ryu/common.h +114 -0
- package/vendor/ryu/d2s.c +509 -0
- package/vendor/ryu/d2s_full_table.h +367 -0
- package/vendor/ryu/d2s_intrinsics.h +357 -0
- package/vendor/ryu/d2s_small_table.h +186 -0
- package/vendor/ryu/digit_table.h +35 -0
- package/vendor/ryu/ryu.h +46 -0
- package/vendor/zlib/LICENSE +22 -0
- package/vendor/zlib/adler32.c +164 -0
- package/vendor/zlib/compress.c +75 -0
- package/vendor/zlib/crc32.c +1049 -0
- package/vendor/zlib/crc32.h +9446 -0
- package/vendor/zlib/deflate.c +2139 -0
- package/vendor/zlib/deflate.h +377 -0
- package/vendor/zlib/gzclose.c +23 -0
- package/vendor/zlib/gzguts.h +214 -0
- package/vendor/zlib/gzlib.c +582 -0
- package/vendor/zlib/gzread.c +602 -0
- package/vendor/zlib/gzwrite.c +631 -0
- package/vendor/zlib/infback.c +628 -0
- package/vendor/zlib/inffast.c +320 -0
- package/vendor/zlib/inffast.h +11 -0
- package/vendor/zlib/inffixed.h +94 -0
- package/vendor/zlib/inflate.c +1526 -0
- package/vendor/zlib/inflate.h +126 -0
- package/vendor/zlib/inftrees.c +299 -0
- package/vendor/zlib/inftrees.h +62 -0
- package/vendor/zlib/trees.c +1117 -0
- package/vendor/zlib/trees.h +128 -0
- package/vendor/zlib/uncompr.c +85 -0
- package/vendor/zlib/zconf.h +543 -0
- package/vendor/zlib/zlib.h +1938 -0
- package/vendor/zlib/zutil.c +299 -0
- package/vendor/zlib/zutil.h +254 -0
- package/README.md +0 -3
- package/index.js +0 -2
package/src/scr_test.c
ADDED
|
@@ -0,0 +1,662 @@
|
|
|
1
|
+
/* node:test — the in-process test runner (linked only when the program
|
|
2
|
+
* imports node:test; cc.ts gates on moduleUsesNodeTest like dgram/net).
|
|
3
|
+
*
|
|
4
|
+
* Registration (test/it/describe/suite/hooks) builds a tree under an
|
|
5
|
+
* implicit root while the module bodies run: describe callbacks execute
|
|
6
|
+
* IMMEDIATELY at registration (Node runs suite bodies during collection),
|
|
7
|
+
* test callbacks are stored. The FIRST registration spawns the runner
|
|
8
|
+
* fiber, whose first act is one microtask hop (scr_await_hop) — so it
|
|
9
|
+
* parks on the ready queue and runs only after main returns and
|
|
10
|
+
* scr_loop_run drains microtasks: Node's "tests start after the file's
|
|
11
|
+
* synchronous body completes" scheduling, ahead of any main-registered
|
|
12
|
+
* timers. Tests run SEQUENTIALLY on that fiber (Node's default
|
|
13
|
+
* concurrency 1): sync bodies are called directly (the fiber's own
|
|
14
|
+
* exception cell isolates their throws), async bodies run via their spawn
|
|
15
|
+
* wrappers and the runner awaits the promise — timers/io inside test
|
|
16
|
+
* bodies interleave through the ordinary loop while the runner is parked.
|
|
17
|
+
*
|
|
18
|
+
* Reporting reproduces Node v24's SPEC reporter (the default on every
|
|
19
|
+
* stream since v20 made it universal): ✔/✖/﹣/⚠ result lines with
|
|
20
|
+
* per-test durations, # SKIP/# TODO directives, ▶ suite headers printed
|
|
21
|
+
* lazily when the first child reports, the ℹ summary block, and the
|
|
22
|
+
* "✖ failing tests:" section (test-at location, result line, the error
|
|
23
|
+
* message indented two spaces — no stack frames: the harness strips
|
|
24
|
+
* Node's, SEMANTICS.md numbers the divergence). Durations are real
|
|
25
|
+
* elapsed milliseconds and thus NONDETERMINISTIC — the differential
|
|
26
|
+
* harness normalizes them on both lanes; the suite runner only reads
|
|
27
|
+
* exit codes. One deliberate divergence: reporter lines write to stdout
|
|
28
|
+
* synchronously as results land, where Node's reporter stream lags
|
|
29
|
+
* console output racily — programs that interleave console.log with the
|
|
30
|
+
* reporter cannot be byte-compared under Node itself.
|
|
31
|
+
*
|
|
32
|
+
* Exit code: main asks scr_test_exit_code() after the loop drains —
|
|
33
|
+
* 1 when any non-todo test failed (todo failures print ⚠ and list in the
|
|
34
|
+
* failing section but exit 0, Node's contract), else 0. */
|
|
35
|
+
#include "scr_platform.h"
|
|
36
|
+
#include "scr_runtime.h"
|
|
37
|
+
|
|
38
|
+
#include <math.h>
|
|
39
|
+
#include <stdio.h>
|
|
40
|
+
#include <stdlib.h>
|
|
41
|
+
#include <string.h>
|
|
42
|
+
|
|
43
|
+
#ifndef _WIN32
|
|
44
|
+
#include <unistd.h>
|
|
45
|
+
#else
|
|
46
|
+
#include <direct.h>
|
|
47
|
+
#define getcwd _getcwd
|
|
48
|
+
#endif
|
|
49
|
+
|
|
50
|
+
static void scr_test_oom(void) {
|
|
51
|
+
fputs("scriptc: out of memory\n", stderr);
|
|
52
|
+
abort();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* mode values (the frontend's literals) */
|
|
56
|
+
enum { SCR_TEST_RUN = 0, SCR_TEST_SKIP = 1, SCR_TEST_TODO = 2 };
|
|
57
|
+
/* flags bitmask */
|
|
58
|
+
enum { SCR_TEST_F_ASYNC = 1, SCR_TEST_F_CTX = 2, SCR_TEST_F_ONLY = 4 };
|
|
59
|
+
/* hook kinds */
|
|
60
|
+
enum { SCR_HOOK_BEFORE = 0, SCR_HOOK_AFTER = 1, SCR_HOOK_BEFORE_EACH = 2, SCR_HOOK_AFTER_EACH = 3 };
|
|
61
|
+
/* outcome states */
|
|
62
|
+
enum {
|
|
63
|
+
SCR_TS_PENDING = 0,
|
|
64
|
+
SCR_TS_PASS,
|
|
65
|
+
SCR_TS_FAIL, /* own body threw (or a hook failed it) */
|
|
66
|
+
SCR_TS_CHILDFAIL, /* own body passed; a descendant failed */
|
|
67
|
+
SCR_TS_SKIPPED,
|
|
68
|
+
SCR_TS_TODO_PASS,
|
|
69
|
+
SCR_TS_TODO_FAIL,
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
typedef struct {
|
|
73
|
+
ScrClosure *cb;
|
|
74
|
+
int flags;
|
|
75
|
+
} ScrTestHook;
|
|
76
|
+
|
|
77
|
+
typedef struct {
|
|
78
|
+
ScrTestHook *v;
|
|
79
|
+
size_t n, cap;
|
|
80
|
+
} ScrTestHooks;
|
|
81
|
+
|
|
82
|
+
struct ScrTestCtx {
|
|
83
|
+
size_t rc;
|
|
84
|
+
ScrStr *name; /* owned */
|
|
85
|
+
ScrStr *msg; /* directive message, owned; NULL = bare SKIP/TODO */
|
|
86
|
+
ScrStr *at; /* "file:line:col" (absolute file), owned; NULL for suites */
|
|
87
|
+
ScrClosure *cb; /* owned; NULL = fn-less test (Node: counts as pass) */
|
|
88
|
+
int mode;
|
|
89
|
+
int flags;
|
|
90
|
+
bool is_suite;
|
|
91
|
+
int state;
|
|
92
|
+
bool started_line; /* the "▶ name" header printed */
|
|
93
|
+
double dur_ms;
|
|
94
|
+
ScrCaught *err; /* owned; the own-body failure payload */
|
|
95
|
+
ScrStr **diags; /* owned t.diagnostic strings, printed after the line */
|
|
96
|
+
size_t ndiags, dcap;
|
|
97
|
+
struct ScrTestCtx *parent; /* borrowed back-edge */
|
|
98
|
+
struct ScrTestCtx **children; /* owned refs */
|
|
99
|
+
size_t nchildren, ccap;
|
|
100
|
+
ScrTestHooks hooks[4]; /* suites and root only */
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
static ScrTestCtx *scr_test_root = NULL;
|
|
104
|
+
/* Where registrations attach: the suite body being collected or the test
|
|
105
|
+
* currently running (its nested test()/t.test() calls are subtests). */
|
|
106
|
+
static ScrTestCtx *scr_test_reg_parent = NULL;
|
|
107
|
+
static bool scr_test_runner_spawned = false;
|
|
108
|
+
static bool scr_test_run_done = false;
|
|
109
|
+
static long scr_test_ct_tests = 0, scr_test_ct_suites = 0, scr_test_ct_pass = 0,
|
|
110
|
+
scr_test_ct_fail = 0, scr_test_ct_skipped = 0, scr_test_ct_todo = 0;
|
|
111
|
+
static double scr_test_t0 = 0;
|
|
112
|
+
static bool scr_test_suite_hook_failed = false;
|
|
113
|
+
|
|
114
|
+
#ifdef SCR_RC_AUDIT
|
|
115
|
+
static long scr_testctx_live = 0;
|
|
116
|
+
long scr_testctx_live_count(void) { return scr_testctx_live; }
|
|
117
|
+
#endif
|
|
118
|
+
|
|
119
|
+
ScrTestCtx *scr_testctx_retain(ScrTestCtx *t) {
|
|
120
|
+
if (t) t->rc++;
|
|
121
|
+
return t;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
static void scr_test_hooks_free(ScrTestHooks *h) {
|
|
125
|
+
for (size_t i = 0; i < h->n; i++) scr_closure_release(h->v[i].cb);
|
|
126
|
+
free(h->v);
|
|
127
|
+
h->v = NULL;
|
|
128
|
+
h->n = h->cap = 0;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
void scr_testctx_release(ScrTestCtx *t) {
|
|
132
|
+
if (!t || --t->rc > 0) return;
|
|
133
|
+
scr_str_release(t->name);
|
|
134
|
+
scr_str_release(t->msg);
|
|
135
|
+
scr_str_release(t->at);
|
|
136
|
+
scr_closure_release(t->cb);
|
|
137
|
+
scr_caught_release(t->err);
|
|
138
|
+
for (size_t i = 0; i < t->ndiags; i++) scr_str_release(t->diags[i]);
|
|
139
|
+
free(t->diags);
|
|
140
|
+
for (size_t i = 0; i < t->nchildren; i++) scr_testctx_release(t->children[i]);
|
|
141
|
+
free(t->children);
|
|
142
|
+
for (int k = 0; k < 4; k++) scr_test_hooks_free(&t->hooks[k]);
|
|
143
|
+
#ifdef SCR_RC_AUDIT
|
|
144
|
+
scr_testctx_live--;
|
|
145
|
+
#endif
|
|
146
|
+
free(t);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
void *scr_testctx_retain_v(void *t) { return scr_testctx_retain(t); }
|
|
150
|
+
void scr_testctx_release_v(void *t) { scr_testctx_release(t); }
|
|
151
|
+
|
|
152
|
+
static ScrTestCtx *scr_test_node_new(ScrStr *name /*borrowed*/, int mode,
|
|
153
|
+
ScrStr *msg /*borrowed, may be empty*/,
|
|
154
|
+
ScrClosure *cb /*moves, may be NULL*/,
|
|
155
|
+
int flags, ScrStr *at /*borrowed, may be NULL*/,
|
|
156
|
+
bool is_suite) {
|
|
157
|
+
ScrTestCtx *t = calloc(1, sizeof *t);
|
|
158
|
+
if (!t) scr_test_oom();
|
|
159
|
+
t->rc = 1;
|
|
160
|
+
t->name = name ? scr_str_retain(name) : NULL;
|
|
161
|
+
t->msg = (msg && msg->len > 0) ? scr_str_retain(msg) : NULL;
|
|
162
|
+
t->at = (at && at->len > 0) ? scr_str_retain(at) : NULL;
|
|
163
|
+
t->cb = cb;
|
|
164
|
+
t->mode = mode;
|
|
165
|
+
t->flags = flags;
|
|
166
|
+
t->is_suite = is_suite;
|
|
167
|
+
#ifdef SCR_RC_AUDIT
|
|
168
|
+
scr_testctx_live++;
|
|
169
|
+
#endif
|
|
170
|
+
return t;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
static void scr_test_child_add(ScrTestCtx *parent, ScrTestCtx *child /*moves*/) {
|
|
174
|
+
if (parent->nchildren == parent->ccap) {
|
|
175
|
+
parent->ccap = parent->ccap ? parent->ccap * 2 : 4;
|
|
176
|
+
parent->children = realloc(parent->children, parent->ccap * sizeof *parent->children);
|
|
177
|
+
if (!parent->children) scr_test_oom();
|
|
178
|
+
}
|
|
179
|
+
child->parent = parent;
|
|
180
|
+
parent->children[parent->nchildren++] = child;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
static ScrTestCtx *scr_test_ensure_root(void) {
|
|
184
|
+
if (!scr_test_root) {
|
|
185
|
+
scr_test_root = scr_test_node_new(NULL, SCR_TEST_RUN, NULL, NULL, 0, NULL, true);
|
|
186
|
+
scr_test_reg_parent = scr_test_root;
|
|
187
|
+
}
|
|
188
|
+
return scr_test_root;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/* ── reporting (Node v24 spec reporter) ──────────────────────────────── */
|
|
192
|
+
|
|
193
|
+
static int scr_test_depth(const ScrTestCtx *t) {
|
|
194
|
+
int d = 0;
|
|
195
|
+
for (const ScrTestCtx *p = t->parent; p && p->parent; p = p->parent) d++;
|
|
196
|
+
return d;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
static void scr_test_indent(int depth) {
|
|
200
|
+
for (int i = 0; i < depth; i++) fputs(" ", stdout);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/* "(1.234567ms)" — durations print microsecond-rounded (Node's hrtime
|
|
204
|
+
* granularity), not with double noise. */
|
|
205
|
+
static void scr_test_print_dur(double ms) {
|
|
206
|
+
char num[32];
|
|
207
|
+
fputs(" (", stdout);
|
|
208
|
+
size_t n = scr_f64_to_str(round(ms * 1e6) / 1e6, num);
|
|
209
|
+
fwrite(num, 1, n, stdout);
|
|
210
|
+
fputs("ms)", stdout);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
static const char *scr_test_symbol(int state) {
|
|
214
|
+
switch (state) {
|
|
215
|
+
case SCR_TS_PASS:
|
|
216
|
+
case SCR_TS_TODO_PASS: return "\xE2\x9C\x94"; /* ✔ */
|
|
217
|
+
case SCR_TS_FAIL:
|
|
218
|
+
case SCR_TS_CHILDFAIL: return "\xE2\x9C\x96"; /* ✖ */
|
|
219
|
+
case SCR_TS_SKIPPED: return "\xEF\xB9\xA3"; /* ﹣ */
|
|
220
|
+
case SCR_TS_TODO_FAIL: return "\xE2\x9A\xA0"; /* ⚠ */
|
|
221
|
+
default: return "?";
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
static void scr_test_print_str(const ScrStr *s) {
|
|
226
|
+
if (s) fwrite(s->data, 1, s->len, stdout);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/* Ancestors print their "▶ name" headers before the first descendant
|
|
230
|
+
* result line lands — Node's reporter defers the arrow until a child
|
|
231
|
+
* reports, so empty suites never print one. */
|
|
232
|
+
static void scr_test_ensure_started(ScrTestCtx *t) {
|
|
233
|
+
if (!t || !t->parent || t->started_line) return;
|
|
234
|
+
scr_test_ensure_started(t->parent);
|
|
235
|
+
t->started_line = true;
|
|
236
|
+
scr_test_indent(scr_test_depth(t));
|
|
237
|
+
fputs("\xE2\x96\xB6 ", stdout); /* ▶ */
|
|
238
|
+
scr_test_print_str(t->name);
|
|
239
|
+
fputc('\n', stdout);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/* "<sym> <name> (<dur>ms)[ # directive]" + queued ℹ diagnostics. */
|
|
243
|
+
static void scr_test_report_result(ScrTestCtx *t) {
|
|
244
|
+
scr_test_ensure_started(t->parent);
|
|
245
|
+
int depth = scr_test_depth(t);
|
|
246
|
+
scr_test_indent(depth);
|
|
247
|
+
fputs(scr_test_symbol(t->state), stdout);
|
|
248
|
+
fputc(' ', stdout);
|
|
249
|
+
scr_test_print_str(t->name);
|
|
250
|
+
scr_test_print_dur(t->dur_ms);
|
|
251
|
+
if (t->state == SCR_TS_SKIPPED) {
|
|
252
|
+
fputs(" # ", stdout);
|
|
253
|
+
if (t->msg) scr_test_print_str(t->msg);
|
|
254
|
+
else fputs("SKIP", stdout);
|
|
255
|
+
} else if (t->state == SCR_TS_TODO_PASS || t->state == SCR_TS_TODO_FAIL) {
|
|
256
|
+
fputs(" # ", stdout);
|
|
257
|
+
if (t->msg) scr_test_print_str(t->msg);
|
|
258
|
+
else fputs("TODO", stdout);
|
|
259
|
+
}
|
|
260
|
+
fputc('\n', stdout);
|
|
261
|
+
for (size_t i = 0; i < t->ndiags; i++) {
|
|
262
|
+
scr_test_indent(depth);
|
|
263
|
+
fputs("\xE2\x84\xB9 ", stdout); /* ℹ */
|
|
264
|
+
scr_test_print_str(t->diags[i]);
|
|
265
|
+
fputc('\n', stdout);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/* ── running ─────────────────────────────────────────────────────────── */
|
|
270
|
+
|
|
271
|
+
/* Call one stored closure by its lowering-pinned shape; async shapes are
|
|
272
|
+
* awaited (the runner is a fiber). `ctx` is passed +1 when the body takes
|
|
273
|
+
* the TestContext. Returns with the fiber's exception cell holding any
|
|
274
|
+
* failure. */
|
|
275
|
+
static void scr_test_call(ScrClosure *cb, int flags, ScrTestCtx *ctx) {
|
|
276
|
+
bool takes_ctx = (flags & SCR_TEST_F_CTX) != 0;
|
|
277
|
+
if (flags & SCR_TEST_F_ASYNC) {
|
|
278
|
+
ScrPromise *p =
|
|
279
|
+
takes_ctx
|
|
280
|
+
? ((ScrPromise * (*)(ScrClosure *, ScrTestCtx *)) cb->fn)(cb, scr_testctx_retain(ctx))
|
|
281
|
+
: ((ScrPromise * (*)(ScrClosure *)) cb->fn)(cb);
|
|
282
|
+
if (!scr_exc_pending() && p) scr_await_void(p);
|
|
283
|
+
scr_promise_release(p);
|
|
284
|
+
} else if (takes_ctx) {
|
|
285
|
+
((void (*)(ScrClosure *, ScrTestCtx *))cb->fn)(cb, scr_testctx_retain(ctx));
|
|
286
|
+
} else {
|
|
287
|
+
((void (*)(ScrClosure *))cb->fn)(cb);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/* Run `which` hooks up (beforeEach: outermost suite first) or down
|
|
292
|
+
* (afterEach: innermost first) the ancestor chain. A hook throw fails the
|
|
293
|
+
* test with the hook's error (Node cancels harder — SEMANTICS.md). */
|
|
294
|
+
static void scr_test_run_hooks_of(ScrTestCtx *owner, int which) {
|
|
295
|
+
for (size_t i = 0; i < owner->hooks[which].n && !scr_exc_pending(); i++) {
|
|
296
|
+
scr_test_call(owner->hooks[which].v[i].cb, owner->hooks[which].v[i].flags, NULL);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
static void scr_test_run_each_hooks(ScrTestCtx *t, int which, bool outermost_first) {
|
|
301
|
+
ScrTestCtx *chain[64];
|
|
302
|
+
int n = 0;
|
|
303
|
+
for (ScrTestCtx *p = t->parent; p && n < 64; p = p->parent) chain[n++] = p;
|
|
304
|
+
if (outermost_first) {
|
|
305
|
+
for (int i = n - 1; i >= 0; i--) scr_test_run_hooks_of(chain[i], which);
|
|
306
|
+
} else {
|
|
307
|
+
for (int i = 0; i < n; i++) scr_test_run_hooks_of(chain[i], which);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
static bool scr_test_any_only(ScrTestCtx *parent) {
|
|
312
|
+
for (size_t i = 0; i < parent->nchildren; i++) {
|
|
313
|
+
if (parent->children[i]->flags & SCR_TEST_F_ONLY) return true;
|
|
314
|
+
}
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
static void scr_test_run_node(ScrTestCtx *t);
|
|
319
|
+
|
|
320
|
+
static void scr_test_run_children(ScrTestCtx *t) {
|
|
321
|
+
/* `only: true` among the siblings: run only the marked ones — the
|
|
322
|
+
* others are dropped entirely (Node reports nothing for them). */
|
|
323
|
+
bool only = scr_test_any_only(t);
|
|
324
|
+
for (size_t i = 0; i < t->nchildren; i++) {
|
|
325
|
+
ScrTestCtx *c = t->children[i];
|
|
326
|
+
if (only && !(c->flags & SCR_TEST_F_ONLY)) {
|
|
327
|
+
continue; /* filtered: never run, never reported, never counted */
|
|
328
|
+
}
|
|
329
|
+
/* Subtests t.test already ran INLINE at their call site. */
|
|
330
|
+
if (c->state != SCR_TS_PENDING) continue;
|
|
331
|
+
scr_test_run_node(c);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
static bool scr_test_subtree_failed(const ScrTestCtx *t) {
|
|
336
|
+
for (size_t i = 0; i < t->nchildren; i++) {
|
|
337
|
+
int s = t->children[i]->state;
|
|
338
|
+
if (s == SCR_TS_FAIL || s == SCR_TS_CHILDFAIL) return true;
|
|
339
|
+
}
|
|
340
|
+
return false;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
static void scr_test_run_node(ScrTestCtx *t) {
|
|
344
|
+
double start = scr_now_ms();
|
|
345
|
+
if (t->mode == SCR_TEST_SKIP) {
|
|
346
|
+
t->dur_ms = scr_now_ms() - start;
|
|
347
|
+
t->state = SCR_TS_SKIPPED;
|
|
348
|
+
scr_test_report_result(t);
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
if (t->is_suite) {
|
|
352
|
+
/* The body already ran at registration (children collected). A hook
|
|
353
|
+
* throw fails the SUITE with that error — before-failures skip the
|
|
354
|
+
* children (Node cancels them; SEMANTICS.md numbers the difference). */
|
|
355
|
+
scr_test_run_hooks_of(t, SCR_HOOK_BEFORE);
|
|
356
|
+
if (scr_exc_pending()) {
|
|
357
|
+
t->err = scr_exc_take();
|
|
358
|
+
} else {
|
|
359
|
+
scr_test_run_children(t);
|
|
360
|
+
scr_test_run_hooks_of(t, SCR_HOOK_AFTER);
|
|
361
|
+
if (scr_exc_pending()) t->err = scr_exc_take();
|
|
362
|
+
}
|
|
363
|
+
t->dur_ms = scr_now_ms() - start;
|
|
364
|
+
if (t->err) scr_test_suite_hook_failed = true;
|
|
365
|
+
t->state = t->err ? SCR_TS_FAIL
|
|
366
|
+
: scr_test_subtree_failed(t) ? SCR_TS_CHILDFAIL
|
|
367
|
+
: SCR_TS_PASS;
|
|
368
|
+
scr_test_report_result(t);
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
/* A test: beforeEach chain, the body, subtests it queued (t.test runs
|
|
372
|
+
* them inline; bare nested test() calls queued unrun run now), the
|
|
373
|
+
* afterEach chain. */
|
|
374
|
+
ScrTestCtx *prev_parent = scr_test_reg_parent;
|
|
375
|
+
scr_test_reg_parent = t;
|
|
376
|
+
scr_test_run_each_hooks(t, SCR_HOOK_BEFORE_EACH, true);
|
|
377
|
+
bool failed = false;
|
|
378
|
+
if (scr_exc_pending()) {
|
|
379
|
+
t->err = scr_exc_take();
|
|
380
|
+
failed = true;
|
|
381
|
+
} else if (t->cb) {
|
|
382
|
+
scr_test_call(t->cb, t->flags, t);
|
|
383
|
+
if (scr_exc_pending()) {
|
|
384
|
+
t->err = scr_exc_take();
|
|
385
|
+
failed = true;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
/* Children a passing body registered without running (bare test() in
|
|
389
|
+
* the body): run them now, before the parent completes — Node holds
|
|
390
|
+
* the parent open for its pending subtests. */
|
|
391
|
+
if (!failed) scr_test_run_children(t);
|
|
392
|
+
scr_test_run_each_hooks(t, SCR_HOOK_AFTER_EACH, false);
|
|
393
|
+
if (scr_exc_pending()) {
|
|
394
|
+
if (!failed && !t->err) {
|
|
395
|
+
t->err = scr_exc_take();
|
|
396
|
+
failed = true;
|
|
397
|
+
} else {
|
|
398
|
+
scr_exc_clear();
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
scr_test_reg_parent = prev_parent;
|
|
402
|
+
t->dur_ms = scr_now_ms() - start;
|
|
403
|
+
if (t->mode == SCR_TEST_SKIP) {
|
|
404
|
+
/* t.skip() marked it mid-body. */
|
|
405
|
+
t->state = SCR_TS_SKIPPED;
|
|
406
|
+
} else if (t->mode == SCR_TEST_TODO) {
|
|
407
|
+
t->state = failed ? SCR_TS_TODO_FAIL : SCR_TS_TODO_PASS;
|
|
408
|
+
} else if (failed) {
|
|
409
|
+
t->state = SCR_TS_FAIL;
|
|
410
|
+
} else {
|
|
411
|
+
t->state = scr_test_subtree_failed(t) ? SCR_TS_CHILDFAIL : SCR_TS_PASS;
|
|
412
|
+
}
|
|
413
|
+
scr_test_report_result(t);
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
/* ── the summary + failing-tests section ─────────────────────────────── */
|
|
417
|
+
|
|
418
|
+
static void scr_test_count(const ScrTestCtx *t) {
|
|
419
|
+
for (size_t i = 0; i < t->nchildren; i++) {
|
|
420
|
+
const ScrTestCtx *c = t->children[i];
|
|
421
|
+
if (c->state == SCR_TS_PENDING) continue; /* only-filtered / never ran */
|
|
422
|
+
if (c->is_suite) {
|
|
423
|
+
scr_test_ct_suites++;
|
|
424
|
+
} else {
|
|
425
|
+
scr_test_ct_tests++;
|
|
426
|
+
switch (c->state) {
|
|
427
|
+
case SCR_TS_PASS: scr_test_ct_pass++; break;
|
|
428
|
+
case SCR_TS_FAIL:
|
|
429
|
+
case SCR_TS_CHILDFAIL: scr_test_ct_fail++; break;
|
|
430
|
+
case SCR_TS_SKIPPED: scr_test_ct_skipped++; break;
|
|
431
|
+
case SCR_TS_TODO_PASS:
|
|
432
|
+
case SCR_TS_TODO_FAIL: scr_test_ct_todo++; break;
|
|
433
|
+
default: break;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
scr_test_count(c);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
static void scr_test_info_line(const char *label, double value) {
|
|
441
|
+
char num[32];
|
|
442
|
+
fputs("\xE2\x84\xB9 ", stdout);
|
|
443
|
+
fputs(label, stdout);
|
|
444
|
+
fputc(' ', stdout);
|
|
445
|
+
size_t n = scr_f64_to_str(value, num);
|
|
446
|
+
fwrite(num, 1, n, stdout);
|
|
447
|
+
fputc('\n', stdout);
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/* The failing-tests detail: "test at <file>:<line>:<col>" (the file
|
|
451
|
+
* relative to the working directory when it lies underneath, Node's
|
|
452
|
+
* rendering), the result line at column 0, the error message indented two
|
|
453
|
+
* spaces per line. Node appends the stack frames and an inspect property
|
|
454
|
+
* block; this runtime stops at the message (SEMANTICS.md — the harness
|
|
455
|
+
* strips both sides). */
|
|
456
|
+
static void scr_test_print_at(const ScrStr *at) {
|
|
457
|
+
fputs("test at ", stdout);
|
|
458
|
+
char cwd[4096];
|
|
459
|
+
if (getcwd(cwd, sizeof cwd)) {
|
|
460
|
+
size_t cl = strlen(cwd);
|
|
461
|
+
if (at->len > cl + 1 && memcmp(at->data, cwd, cl) == 0 && at->data[cl] == '/') {
|
|
462
|
+
fwrite(at->data + cl + 1, 1, at->len - cl - 1, stdout);
|
|
463
|
+
fputc('\n', stdout);
|
|
464
|
+
return;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
fwrite(at->data, 1, at->len, stdout);
|
|
468
|
+
fputc('\n', stdout);
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
static void scr_test_print_failure(ScrTestCtx *t) {
|
|
472
|
+
fputc('\n', stdout);
|
|
473
|
+
if (t->at) scr_test_print_at(t->at);
|
|
474
|
+
fputs(scr_test_symbol(t->state), stdout);
|
|
475
|
+
fputc(' ', stdout);
|
|
476
|
+
scr_test_print_str(t->name);
|
|
477
|
+
scr_test_print_dur(t->dur_ms);
|
|
478
|
+
if (t->state == SCR_TS_TODO_FAIL) {
|
|
479
|
+
fputs(" # ", stdout);
|
|
480
|
+
if (t->msg) scr_test_print_str(t->msg);
|
|
481
|
+
else fputs("TODO", stdout);
|
|
482
|
+
}
|
|
483
|
+
fputc('\n', stdout);
|
|
484
|
+
if (t->err) {
|
|
485
|
+
ScrStr *msg = scr_caught_to_string(t->err);
|
|
486
|
+
if (msg) {
|
|
487
|
+
const char *p = msg->data;
|
|
488
|
+
const char *end = msg->data + msg->len;
|
|
489
|
+
while (p <= end) {
|
|
490
|
+
const char *nl = memchr(p, '\n', (size_t)(end - p));
|
|
491
|
+
size_t linelen = nl ? (size_t)(nl - p) : (size_t)(end - p);
|
|
492
|
+
fputs(" ", stdout);
|
|
493
|
+
fwrite(p, 1, linelen, stdout);
|
|
494
|
+
fputc('\n', stdout);
|
|
495
|
+
if (!nl) break;
|
|
496
|
+
p = nl + 1;
|
|
497
|
+
}
|
|
498
|
+
scr_str_release(msg);
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
/* Own-body failures in declaration order — Node lists the tests whose
|
|
504
|
+
* bodies threw (todo throwers included); parents failed by descendants
|
|
505
|
+
* and suites never appear. */
|
|
506
|
+
static void scr_test_print_failures(ScrTestCtx *t, bool *any) {
|
|
507
|
+
for (size_t i = 0; i < t->nchildren; i++) {
|
|
508
|
+
ScrTestCtx *c = t->children[i];
|
|
509
|
+
if (!c->is_suite && (c->state == SCR_TS_FAIL || c->state == SCR_TS_TODO_FAIL) && c->err) {
|
|
510
|
+
if (!*any) {
|
|
511
|
+
*any = true;
|
|
512
|
+
fputs("\n\xE2\x9C\x96 failing tests:\n", stdout);
|
|
513
|
+
}
|
|
514
|
+
scr_test_print_failure(c);
|
|
515
|
+
}
|
|
516
|
+
scr_test_print_failures(c, any);
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
/* ── the runner fiber ────────────────────────────────────────────────── */
|
|
521
|
+
|
|
522
|
+
static void scr_test_runner_entry(ScrFiber *self, void *argpack) {
|
|
523
|
+
(void)self;
|
|
524
|
+
(void)argpack;
|
|
525
|
+
/* Park until main returns and the loop drains microtasks — Node starts
|
|
526
|
+
* the first test only after the file's synchronous body completes. */
|
|
527
|
+
scr_await_hop();
|
|
528
|
+
ScrTestCtx *root = scr_test_root;
|
|
529
|
+
scr_test_run_children(root);
|
|
530
|
+
scr_test_run_done = true;
|
|
531
|
+
scr_test_count(root);
|
|
532
|
+
scr_test_info_line("tests", (double)scr_test_ct_tests);
|
|
533
|
+
scr_test_info_line("suites", (double)scr_test_ct_suites);
|
|
534
|
+
scr_test_info_line("pass", (double)scr_test_ct_pass);
|
|
535
|
+
scr_test_info_line("fail", (double)scr_test_ct_fail);
|
|
536
|
+
scr_test_info_line("cancelled", 0);
|
|
537
|
+
scr_test_info_line("skipped", (double)scr_test_ct_skipped);
|
|
538
|
+
scr_test_info_line("todo", (double)scr_test_ct_todo);
|
|
539
|
+
scr_test_info_line("duration_ms", round((scr_now_ms() - scr_test_t0) * 1e6) / 1e6);
|
|
540
|
+
bool any = false;
|
|
541
|
+
scr_test_print_failures(root, &any);
|
|
542
|
+
/* The tree is done reporting: release it (test bodies may still hold
|
|
543
|
+
* their TestContext refs — the boxes stay alive through those). */
|
|
544
|
+
scr_test_reg_parent = NULL;
|
|
545
|
+
scr_test_root = NULL;
|
|
546
|
+
scr_testctx_release(root);
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
static void scr_test_ensure_runner(void) {
|
|
550
|
+
if (scr_test_runner_spawned) return;
|
|
551
|
+
scr_test_runner_spawned = true;
|
|
552
|
+
scr_test_t0 = scr_now_ms();
|
|
553
|
+
ScrPromise *p = scr_async_spawn(scr_test_runner_entry, NULL);
|
|
554
|
+
scr_promise_release(p);
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
/* ── the registration surface (libCall targets) ──────────────────────── */
|
|
558
|
+
|
|
559
|
+
void scr_test_register(ScrStr *name /*borrowed*/, double mode, ScrStr *msg /*borrowed*/,
|
|
560
|
+
ScrClosure *cb /*moves, may be NULL*/, double flags,
|
|
561
|
+
ScrStr *at /*borrowed*/) {
|
|
562
|
+
scr_test_ensure_root();
|
|
563
|
+
scr_test_ensure_runner();
|
|
564
|
+
if (scr_test_run_done) {
|
|
565
|
+
/* Registration after the run completed (a late timer callback):
|
|
566
|
+
* Node throws ERR_TEST_FAILURE; this runtime drops it (SEMANTICS). */
|
|
567
|
+
scr_closure_release(cb);
|
|
568
|
+
return;
|
|
569
|
+
}
|
|
570
|
+
ScrTestCtx *t = scr_test_node_new(name, (int)mode, msg, cb, (int)flags, at, false);
|
|
571
|
+
scr_test_child_add(scr_test_reg_parent, t);
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
void scr_test_suite(ScrStr *name /*borrowed*/, double mode, ScrStr *msg /*borrowed*/,
|
|
575
|
+
ScrClosure *cb /*moves, may be NULL*/, ScrStr *at /*borrowed*/) {
|
|
576
|
+
scr_test_ensure_root();
|
|
577
|
+
scr_test_ensure_runner();
|
|
578
|
+
if (scr_test_run_done) {
|
|
579
|
+
scr_closure_release(cb);
|
|
580
|
+
return;
|
|
581
|
+
}
|
|
582
|
+
ScrTestCtx *t = scr_test_node_new(name, (int)mode, msg, NULL, 0, at, true);
|
|
583
|
+
scr_test_child_add(scr_test_reg_parent, t);
|
|
584
|
+
/* The suite body runs NOW (Node's collection phase) — its test()/it()
|
|
585
|
+
* calls attach here. Skipped suites keep their bodies unrun. */
|
|
586
|
+
if (cb && (int)mode != SCR_TEST_SKIP) {
|
|
587
|
+
ScrTestCtx *prev = scr_test_reg_parent;
|
|
588
|
+
scr_test_reg_parent = t;
|
|
589
|
+
((void (*)(ScrClosure *))cb->fn)(cb);
|
|
590
|
+
scr_test_reg_parent = prev;
|
|
591
|
+
}
|
|
592
|
+
scr_closure_release(cb);
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
void scr_test_hook(double which, ScrClosure *cb /*moves*/, double flags) {
|
|
596
|
+
scr_test_ensure_root();
|
|
597
|
+
ScrTestCtx *owner = scr_test_reg_parent;
|
|
598
|
+
ScrTestHooks *h = &owner->hooks[(int)which];
|
|
599
|
+
if (h->n == h->cap) {
|
|
600
|
+
h->cap = h->cap ? h->cap * 2 : 2;
|
|
601
|
+
h->v = realloc(h->v, h->cap * sizeof *h->v);
|
|
602
|
+
if (!h->v) scr_test_oom();
|
|
603
|
+
}
|
|
604
|
+
h->v[h->n].cb = cb;
|
|
605
|
+
h->v[h->n].flags = (int)flags;
|
|
606
|
+
h->n++;
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
/* t.test(...): registers under `t` and — because subtests run inline on
|
|
610
|
+
* the runner fiber at their call site (Node's awaited-subtest ordering) —
|
|
611
|
+
* runs it immediately. Returns the settled promise `await t.test(...)`
|
|
612
|
+
* consumes. */
|
|
613
|
+
ScrPromise *scr_test_sub(ScrTestCtx *t, ScrStr *name /*borrowed*/, double mode,
|
|
614
|
+
ScrStr *msg /*borrowed*/, ScrClosure *cb /*moves, may be NULL*/,
|
|
615
|
+
double flags, ScrStr *at /*borrowed*/) {
|
|
616
|
+
ScrTestCtx *sub = scr_test_node_new(name, (int)mode, msg, cb, (int)flags, at, false);
|
|
617
|
+
scr_test_child_add(t, sub);
|
|
618
|
+
scr_test_run_node(sub);
|
|
619
|
+
return scr_promise_settled_void();
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
void scr_test_ctx_skip(ScrTestCtx *t, ScrStr *msg /*borrowed*/) {
|
|
623
|
+
t->mode = SCR_TEST_SKIP;
|
|
624
|
+
if (msg && msg->len > 0) {
|
|
625
|
+
scr_str_release(t->msg);
|
|
626
|
+
t->msg = scr_str_retain(msg);
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
void scr_test_ctx_todo(ScrTestCtx *t, ScrStr *msg /*borrowed*/) {
|
|
631
|
+
t->mode = SCR_TEST_TODO;
|
|
632
|
+
if (msg && msg->len > 0) {
|
|
633
|
+
scr_str_release(t->msg);
|
|
634
|
+
t->msg = scr_str_retain(msg);
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
void scr_test_ctx_diagnostic(ScrTestCtx *t, ScrStr *msg /*borrowed*/) {
|
|
639
|
+
if (t->ndiags == t->dcap) {
|
|
640
|
+
t->dcap = t->dcap ? t->dcap * 2 : 2;
|
|
641
|
+
t->diags = realloc(t->diags, t->dcap * sizeof *t->diags);
|
|
642
|
+
if (!t->diags) scr_test_oom();
|
|
643
|
+
}
|
|
644
|
+
t->diags[t->ndiags++] = scr_str_retain(msg);
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
ScrStr *scr_test_ctx_name(ScrTestCtx *t) {
|
|
648
|
+
return t->name ? scr_str_retain(t->name) : scr_str_new("", 0);
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
int scr_test_exit_code(void) {
|
|
652
|
+
/* The runner never finished: a test awaited a promise nobody settles
|
|
653
|
+
* and the loop exhausted (Node cancels the test and exits 1 — the
|
|
654
|
+
* summary it prints there is not reproduced; SEMANTICS.md). Never a
|
|
655
|
+
* silent pass. */
|
|
656
|
+
if (scr_test_runner_spawned && !scr_test_run_done) {
|
|
657
|
+
fflush(stdout);
|
|
658
|
+
fputs("scriptc: node:test runner never finished (a test awaited a promise nobody settles)\n", stderr);
|
|
659
|
+
return 1;
|
|
660
|
+
}
|
|
661
|
+
return (scr_test_ct_fail > 0 || scr_test_suite_hook_failed) ? 1 : 0;
|
|
662
|
+
}
|