strykelang 0.9.1

A highly parallel Perl 5 interpreter written in Rust
Documentation
//! Builtins: digests, uuid, base64, hex, gzip/zstd, datetime, toml/yaml, URL encoding.

use crate::common::*;

#[test]
fn sha256_builtin_matches_vector() {
    assert_eq!(
        eval_string(r#"sha256("abc")"#),
        "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
    );
}

#[test]
fn md5_sha1_builtins_match_vectors() {
    assert_eq!(
        eval_string(r#"md5("")"#),
        "d41d8cd98f00b204e9800998ecf8427e"
    );
    assert_eq!(
        eval_string(r#"sha1("abc")"#),
        "a9993e364706816aba3e25717850c26c9cd0d89d"
    );
}

#[test]
fn sha224_known_vector() {
    assert_eq!(
        eval_string(r#"sha224("hello")"#),
        "ea09ae9cc6768c50fcee903ed054556e5bfc8347907f12598aa24193"
    );
}

#[test]
fn sha384_known_vector() {
    assert_eq!(
        eval_string(r#"sha384("hello")"#),
        "59e1748777448c69de6b800d7a33bbfb9ff1b463e44354c3553bcdb9c666fa90125a3c79f90397bdf5f6a13de828684f"
    );
}

#[test]
fn sha512_known_vector() {
    assert_eq!(
        eval_string(r#"sha512("hello")"#),
        "9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043"
    );
}

#[test]
fn hmac_sha256_known_vector() {
    assert_eq!(
        eval_string(r#"hmac_sha256("key", "The quick brown fox")"#),
        "203d1e5cedd2d18f8c5a3beff0bd9c1ebcb97097dfcb288c46b00c9227fde2c0"
    );
}

#[test]
fn uuid_is_rfc4122_shape() {
    let s = eval_string(r#"uuid()"#);
    assert_eq!(s.len(), 36);
    assert_eq!(s.matches('-').count(), 4);
}

#[test]
fn base64_hex_roundtrip() {
    assert_eq!(eval_string(r#"hex_decode(hex_encode("hello"))"#), "hello");
    assert_eq!(
        eval_string(r#"base64_decode(base64_encode("binary" . chr(0)))"#),
        eval_string(r#""binary" . chr(0)"#)
    );
}

#[test]
fn gzip_gunzip_roundtrip() {
    assert_eq!(eval_string(r#"gunzip(gzip("payload"))"#), "payload");
}

#[test]
fn zstd_roundtrip() {
    assert_eq!(eval_string(r#"zstd_decode(zstd("z data"))"#), "z data");
}

#[test]
fn datetime_parse_and_strftime() {
    let v = eval_string(r#"int(datetime_parse_rfc3339("2020-01-02T00:00:00Z"))"#);
    assert_eq!(v, "1577923200");
    assert_eq!(
        eval_string(r#"datetime_strftime(1577923200, "%Y-%m-%d")"#),
        "2020-01-02"
    );
}

#[test]
fn datetime_iana_parse_and_format_roundtrip() {
    assert_eq!(
        eval_string(
            r#"datetime_format_tz(datetime_parse_local("2024-06-15 12:00:00", "America/New_York"), "America/New_York", "%Y-%m-%d %H:%M:%S")"#
        ),
        "2024-06-15 12:00:00"
    );
    assert_eq!(eval_string(r#"int(datetime_add_seconds(100, 2.5))"#), "102");
}

#[test]
fn toml_and_yaml_decode() {
    assert_eq!(
        eval_string(r#"my $h = toml_decode("x = 7"); $h->{"x"}"#),
        "7"
    );
    assert_eq!(
        eval_string(r#"my $y = yaml_decode("k: v\n"); $y->{"k"}"#),
        "v"
    );
}

#[test]
fn toml_yaml_encode_roundtrip() {
    assert_eq!(
        eval_string(r#"my $h = { x => 1, k => "v" }; toml_decode(toml_encode($h))->{"x"}"#),
        "1"
    );
    assert_eq!(
        eval_string(r#"my $h = { x => 1, k => "v" }; yaml_decode(yaml_encode($h))->{"k"}"#),
        "v"
    );
}

#[test]
fn url_escape_aliases_and_roundtrip() {
    assert_eq!(eval_string(r#"url_decode(url_encode("a b"))"#), "a b");
    assert_eq!(eval_string(r#"uri_unescape(uri_escape("c+d"))"#), "c+d");
}