[INFO] fetching crate flt 0.1.2...
[INFO] testing flt-0.1.2 against 1.100.0-beta.1+cargoflags=--release for beta-release-1.100-3
[INFO] extracting crate flt 0.1.2 into /workspace/builds/worker-0-tc2/source
[INFO] started tweaking crates.io crate flt 0.1.2
[INFO] removed 0 missing tests
[INFO] finished tweaking crates.io crate flt 0.1.2
[INFO] tweaked toml for crates.io crate flt 0.1.2 written to /workspace/builds/worker-0-tc2/source/Cargo.toml
[INFO] validating manifest of crates.io crate flt 0.1.2 on toolchain 1.100.0-beta.1
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+1.100.0-beta.1" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate crates.io crate flt 0.1.2 already has a lockfile, it will not be regenerated
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+1.100.0-beta.1" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-0-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-m" "1610612736" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:77db811e55d90add9212f6832c23229e3de5f1c1f9905e8cb07319ea15df73ac" "sleep" "infinity", kill_on_drop: false }`
[INFO] [stdout] bbac9a9617a117fe4b9439cc7342ec7ccb16ee0eb9a9eed01f03f2045c7f48dd
[INFO] running `Command { std: "docker" "start" "bbac9a9617a117fe4b9439cc7342ec7ccb16ee0eb9a9eed01f03f2045c7f48dd", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "bbac9a9617a117fe4b9439cc7342ec7ccb16ee0eb9a9eed01f03f2045c7f48dd", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-w" "/opt/rustwide/workdir" "--user" "0:0" "bbac9a9617a117fe4b9439cc7342ec7ccb16ee0eb9a9eed01f03f2045c7f48dd" "/opt/rustwide/cargo-home/bin/cargo" "+1.100.0-beta.1" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "bbac9a9617a117fe4b9439cc7342ec7ccb16ee0eb9a9eed01f03f2045c7f48dd", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "bbac9a9617a117fe4b9439cc7342ec7ccb16ee0eb9a9eed01f03f2045c7f48dd" "/opt/rustwide/cargo-home/bin/cargo" "+1.100.0-beta.1" "build" "--frozen" "--message-format=json" "--release", kill_on_drop: false }`
[INFO] [stderr]    Compiling unicode-ident v1.0.14
[INFO] [stderr]    Compiling memchr v2.8.3
[INFO] [stderr]    Compiling libc v0.2.189
[INFO] [stderr]    Compiling num-traits v0.2.19
[INFO] [stderr]    Compiling regex-syntax v0.8.11
[INFO] [stderr]    Compiling nix v0.31.3
[INFO] [stderr]    Compiling anstream v1.0.0
[INFO] [stderr]    Compiling cfg-if v1.0.5
[INFO] [stderr]    Compiling log v0.4.34
[INFO] [stderr]    Compiling proc-macro2 v1.0.107
[INFO] [stderr]    Compiling libm v0.2.16
[INFO] [stderr]    Compiling nibble_vec v0.1.0
[INFO] [stderr]    Compiling bigdecimal v0.4.11
[INFO] [stderr]    Compiling eyre v0.6.14
[INFO] [stderr]    Compiling quote v1.0.47
[INFO] [stderr]    Compiling clap_lex v1.1.1
[INFO] [stderr]    Compiling thiserror v2.0.21
[INFO] [stderr]    Compiling aho-corasick v1.1.3
[INFO] [stderr]    Compiling syn v3.0.6
[INFO] [stderr]    Compiling endian-type v0.2.0
[INFO] [stderr]    Compiling bitflags v2.13.2
[INFO] [stderr]    Compiling jiff-core v0.1.1
[INFO] [stderr]    Compiling num-integer v0.1.46
[INFO] [stderr]    Compiling radix_trie v0.3.0
[INFO] [stderr]    Compiling clap_builder v4.6.7
[INFO] [stderr]    Compiling num-bigint v0.4.6
[INFO] [stderr]    Compiling jiff v0.2.37
[INFO] [stderr]    Compiling regex-automata v0.4.18
[INFO] [stderr]    Compiling clap_derive v4.6.7
[INFO] [stderr]    Compiling thiserror-impl v2.0.21
[INFO] [stderr]    Compiling regex v1.13.1
[INFO] [stderr]    Compiling dirs-sys-next v0.1.2
[INFO] [stderr]    Compiling env_filter v2.0.0
[INFO] [stderr]    Compiling unicode-width v0.2.2
[INFO] [stderr]    Compiling home v0.5.12
[INFO] [stderr]    Compiling indenter v0.3.4
[INFO] [stderr]    Compiling rustyline v18.0.1
[INFO] [stderr]    Compiling env_logger v0.11.11
[INFO] [stderr]    Compiling dirs-next v2.0.0
[INFO] [stderr]    Compiling clap v4.6.7
[INFO] [stderr]    Compiling nom v8.0.0
[INFO] [stderr]    Compiling flt v0.1.2 (/opt/rustwide/workdir)
[INFO] [stderr] warning: unused dependency `env_logger`
[INFO] [stderr]   --> Cargo.toml:16:15
[INFO] [stderr]    |
[INFO] [stderr] 16 | [dependencies.env_logger]
[INFO] [stderr]    |               ^^^^^^^^^^^
[INFO] [stderr]    |
[INFO] [stderr]    = note: `cargo::unused_dependencies` is set to `warn` by default
[INFO] [stderr] help: consider removing the dependency on `env_logger`
[INFO] [stderr] warning: `flt` (manifest) generated 1 warning
[INFO] [stderr]     Finished `release` profile [optimized] target(s) in 1m 18s
[INFO] [stderr] warning: the following packages contain code that will be rejected by a future version of Rust: nix v0.31.3
[INFO] [stderr] note: to see what the problems were, use the option `--future-incompat-report`, or run `cargo report future-incompatibilities --id 2`
[INFO] running `Command { std: "docker" "inspect" "bbac9a9617a117fe4b9439cc7342ec7ccb16ee0eb9a9eed01f03f2045c7f48dd", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "bbac9a9617a117fe4b9439cc7342ec7ccb16ee0eb9a9eed01f03f2045c7f48dd" "/opt/rustwide/cargo-home/bin/cargo" "+1.100.0-beta.1" "test" "--frozen" "--no-run" "--message-format=json" "--release", kill_on_drop: false }`
[INFO] [stderr]    Compiling memchr v2.8.3
[INFO] [stderr]    Compiling bitflags v2.13.2
[INFO] [stderr]    Compiling rustix v1.1.4
[INFO] [stderr]    Compiling syn v2.0.119
[INFO] [stderr]    Compiling linux-raw-sys v0.12.1
[INFO] [stderr]    Compiling serde_core v1.0.229
[INFO] [stderr]    Compiling unicode-segmentation v1.12.0
[INFO] [stderr]    Compiling slab v0.4.9
[INFO] [stderr]    Compiling unicode-xid v0.2.6
[INFO] [stderr]    Compiling serde v1.0.229
[INFO] [stderr]    Compiling serde_derive v1.0.229
[INFO] [stderr]    Compiling convert_case v0.10.0
[INFO] [stderr]    Compiling pin-project-lite v0.2.15
[INFO] [stderr]    Compiling serde_json v1.0.134
[INFO] [stderr]    Compiling futures-core v0.3.34
[INFO] [stderr]    Compiling aho-corasick v1.1.3
[INFO] [stderr]    Compiling futures-sink v0.3.34
[INFO] [stderr]    Compiling nom v8.0.0
[INFO] [stderr]    Compiling futures-channel v0.3.34
[INFO] [stderr]    Compiling futures-macro v0.3.34
[INFO] [stderr]    Compiling regex-automata v0.4.18
[INFO] [stderr]    Compiling regex-syntax v0.8.11
[INFO] [stderr]    Compiling futures-task v0.3.34
[INFO] [stderr]    Compiling futures-io v0.3.34
[INFO] [stderr]    Compiling futures-util v0.3.34
[INFO] [stderr]    Compiling terminal_size v0.4.4
[INFO] [stderr]    Compiling regex v1.13.1
[INFO] [stderr]    Compiling clap_builder v4.6.7
[INFO] [stderr]    Compiling derive_more-impl v2.1.1
[INFO] [stderr]    Compiling sealed v0.6.0
[INFO] [stderr]    Compiling bstr v1.11.1
[INFO] [stderr]    Compiling synthez-core v0.4.0
[INFO] [stderr]    Compiling bytecount v0.6.8
[INFO] [stderr]    Compiling either v1.13.0
[INFO] [stderr]    Compiling peg-runtime v0.6.3
[INFO] [stderr]    Compiling walkdir v2.5.0
[INFO] [stderr]    Compiling peg-macros v0.6.3
[INFO] [stderr]    Compiling lock_api v0.4.12
[INFO] [stderr]    Compiling synthez-codegen v0.4.0
[INFO] [stderr]    Compiling clap v4.6.7
[INFO] [stderr]    Compiling globset v0.4.15
[INFO] [stderr]    Compiling gherkin v0.16.0
[INFO] [stderr]    Compiling nix v0.31.3
[INFO] [stderr]    Compiling crossbeam-deque v0.8.6
[INFO] [stderr]    Compiling parking_lot_core v0.9.10
[INFO] [stderr]    Compiling futures-executor v0.3.34
[INFO] [stderr]    Compiling typed-builder-macro v0.23.2
[INFO] [stderr]    Compiling env_filter v2.0.0
[INFO] [stderr]    Compiling nom_locate v5.0.0
[INFO] [stderr]    Compiling getrandom v0.4.3
[INFO] [stderr]    Compiling smawk v0.3.2
[INFO] [stderr]    Compiling unicode-linebreak v0.1.5
[INFO] [stderr]    Compiling derive_more v2.1.1
[INFO] [stderr]    Compiling ref-cast v1.0.25
[INFO] [stderr]    Compiling textwrap v0.16.1
[INFO] [stderr]    Compiling cucumber-expressions v0.5.0
[INFO] [stderr]    Compiling typed-builder v0.23.2
[INFO] [stderr]    Compiling peg v0.6.3
[INFO] [stderr]    Compiling env_logger v0.11.11
[INFO] [stderr]    Compiling parking_lot v0.12.3
[INFO] [stderr]    Compiling rustyline v18.0.1
[INFO] [stderr]    Compiling ignore v0.4.23
[INFO] [stderr]    Compiling synthez v0.4.0
[INFO] [stderr]    Compiling itertools v0.14.0
[INFO] [stderr]    Compiling pin-project-internal v1.1.7
[INFO] [stderr]    Compiling ref-cast-impl v1.0.25
[INFO] [stderr]    Compiling inflections v1.1.1
[INFO] [stderr]    Compiling globwalk v0.9.1
[INFO] [stderr]    Compiling pin-project v1.1.7
[INFO] [stderr]    Compiling cucumber-codegen v0.23.0
[INFO] [stderr]    Compiling futures v0.3.34
[INFO] [stderr]    Compiling smart-default v0.7.1
[INFO] [stderr]    Compiling console v0.16.2
[INFO] [stderr]    Compiling tokio-macros v2.7.2
[INFO] [stderr]    Compiling serial_test_derive v4.0.1
[INFO] [stderr]    Compiling signal-hook-registry v1.4.2
[INFO] [stderr]    Compiling mio v1.2.3
[INFO] [stderr]    Compiling socket2 v0.6.5
[INFO] [stderr]    Compiling fastrand v2.5.0
[INFO] [stderr]    Compiling linked-hash-map v0.5.6
[INFO] [stderr]    Compiling linktime-proc-macro v0.2.3
[INFO] [stderr]    Compiling inventory v0.3.16
[INFO] [stderr]    Compiling link-section v0.19.3
[INFO] [stderr]    Compiling tokio v1.53.1
[INFO] [stderr]    Compiling cucumber v0.23.0
[INFO] [stderr]    Compiling tempfile v3.27.0
[INFO] [stderr]    Compiling ctor v1.0.13
[INFO] [stderr]    Compiling serial_test v4.0.1
[INFO] [stderr]    Compiling flt v0.1.2 (/opt/rustwide/workdir)
[INFO] [stderr] warning: unused dependency `env_logger`
[INFO] [stderr]   --> Cargo.toml:16:15
[INFO] [stderr]    |
[INFO] [stderr] 16 | [dependencies.env_logger]
[INFO] [stderr]    |               ^^^^^^^^^^^
[INFO] [stderr]    |
[INFO] [stderr]    = note: `cargo::unused_dependencies` is set to `warn` by default
[INFO] [stderr] help: consider removing the dependency on `env_logger`
[INFO] [stderr] help: to still use for development builds, move to `dev-dependencies`
[INFO] [stderr] warning: `flt` (manifest) generated 1 warning
[INFO] [stderr]     Finished `release` profile [optimized] target(s) in 1m 19s
[INFO] [stderr] warning: the following packages contain code that will be rejected by a future version of Rust: nix v0.31.3
[INFO] [stderr] note: to see what the problems were, use the option `--future-incompat-report`, or run `cargo report future-incompatibilities --id 2`
[INFO] running `Command { std: "docker" "inspect" "bbac9a9617a117fe4b9439cc7342ec7ccb16ee0eb9a9eed01f03f2045c7f48dd", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "bbac9a9617a117fe4b9439cc7342ec7ccb16ee0eb9a9eed01f03f2045c7f48dd" "/opt/rustwide/cargo-home/bin/cargo" "+1.100.0-beta.1" "test" "--frozen" "--release", kill_on_drop: false }`
[INFO] [stderr] warning: unused dependency `env_logger`
[INFO] [stderr]   --> Cargo.toml:16:15
[INFO] [stderr]    |
[INFO] [stderr] 16 | [dependencies.env_logger]
[INFO] [stderr]    |               ^^^^^^^^^^^
[INFO] [stderr]    |
[INFO] [stderr]    = note: `cargo::unused_dependencies` is set to `warn` by default
[INFO] [stderr] help: consider removing the dependency on `env_logger`
[INFO] [stderr] help: to still use for development builds, move to `dev-dependencies`
[INFO] [stderr] warning: `flt` (manifest) generated 1 warning
[INFO] [stderr]     Finished `release` profile [optimized] target(s) in 0.14s
[INFO] [stderr] warning: the following packages contain code that will be rejected by a future version of Rust: nix v0.31.3
[INFO] [stderr] note: to see what the problems were, use the option `--future-incompat-report`, or run `cargo report future-incompatibilities --id 2`
[INFO] [stderr]      Running unittests src/lib.rs (/opt/rustwide/target/release/build/flt/9bfa60028b82b297/out/flt-9bfa60028b82b297)
[INFO] [stdout] 
[INFO] [stdout] running 187 tests
[INFO] [stdout] test ast::expr::tests::test_display_binary_expr ... ok
[INFO] [stdout] test ast::expr::tests::test_display_field_access ... ok
[INFO] [stdout] test ast::expr::tests::test_display_literal_boolean ... ok
[INFO] [stdout] test ast::expr::tests::test_display_function_call ... ok
[INFO] [stdout] test ast::expr::tests::test_display_literal_string ... ok
[INFO] [stdout] test ast::expr::tests::test_display_if_expr ... ok
[INFO] [stdout] test ast::identifier::tests::test_identifier_eq_str ... ok
[INFO] [stdout] test ast::literal::tests::test_literal_from_f64 ... ok
[INFO] [stdout] test ast::identifier::tests::test_identifier_validation ... ok
[INFO] [stdout] test ast::expr::tests::test_display_parenthesized ... ok
[INFO] [stdout] test ast::expr::tests::test_display_nested ... ok
[INFO] [stdout] test ast::literal::tests::test_parse_none_with_remainder ... ok
[INFO] [stdout] test ast::expr::tests::test_display_ident ... ok
[INFO] [stdout] test ast::expr::tests::test_display_literal_number ... ok
[INFO] [stdout] test ast::expr::tests::test_display_literal_symbol ... ok
[INFO] [stdout] test ast::literal::tests::test_parse_none ... ok
[INFO] [stdout] test ast::literal::tests::test_literal_from_i64 ... ok
[INFO] [stdout] test ast::expr::tests::test_display_unary_expr ... ok
[INFO] [stdout] test eval::tests::test_eval_array_literal ... ok
[INFO] [stdout] test eval::tests::test_eval_array_mixed_types ... ok
[INFO] [stdout] test eval::tests::test_eval_array_propagates_element_error ... ok
[INFO] [stdout] test ast::literal::tests::test_parse_none_rejects_other ... ok
[INFO] [stdout] test eval::tests::test_eval_binary_add ... ok
[INFO] [stdout] test eval::tests::test_eval_binary_and ... ok
[INFO] [stdout] test eval::tests::test_eval_binary_concat ... ok
[INFO] [stdout] test eval::tests::test_eval_binary_concat_chain ... ok
[INFO] [stdout] test eval::tests::test_eval_binary_concat_coerces_to_string ... ok
[INFO] [stdout] test eval::tests::test_eval_binary_div_by_zero ... ok
[INFO] [stdout] test eval::tests::test_eval_binary_div ... ok
[INFO] [stdout] test eval::tests::test_eval_binary_eq ... ok
[INFO] [stdout] test eval::tests::test_eval_binary_gt_lt_gte_lte ... ok
[INFO] [stdout] test eval::tests::test_eval_binary_ne ... ok
[INFO] [stdout] test eval::tests::test_eval_binary_or ... ok
[INFO] [stdout] test eval::tests::test_eval_binary_mul ... ok
[INFO] [stdout] test eval::tests::test_eval_binary_sub ... ok
[INFO] [stdout] test eval::tests::test_eval_binary_pipe_unsupported ... ok
[INFO] [stdout] test eval::tests::test_eval_binary_xor ... ok
[INFO] [stdout] test eval::tests::test_eval_chained_field_access ... ok
[INFO] [stdout] test eval::tests::test_eval_empty_array ... ok
[INFO] [stdout] test eval::tests::test_eval_field_access_on_map_literal ... ok
[INFO] [stdout] test eval::tests::test_eval_function_call_unsupported ... ok
[INFO] [stdout] test eval::tests::test_eval_ident_unbound ... ok
[INFO] [stdout] test eval::tests::test_eval_field_access_not_found ... ok
[INFO] [stdout] test eval::tests::test_eval_if_expr_condition_must_be_boolean ... ok
[INFO] [stdout] test eval::tests::test_eval_if_expr_with_else ... ok
[INFO] [stdout] test eval::tests::test_eval_literal_boolean ... ok
[INFO] [stdout] test eval::tests::test_eval_if_expr_without_else_returns_unit ... ok
[INFO] [stdout] test eval::tests::test_eval_literal_symbol ... ok
[INFO] [stdout] test eval::tests::test_eval_one_plus_one_returns_two ... ok
[INFO] [stdout] test eval::tests::test_eval_literal_string ... ok
[INFO] [stdout] test eval::tests::test_eval_field_access_on_non_map ... ok
[INFO] [stdout] test eval::tests::test_eval_literal_number ... ok
[INFO] [stdout] test eval::tests::test_eval_nested_array ... ok
[INFO] [stdout] test eval::tests::test_eval_typeof_array ... ok
[INFO] [stdout] test eval::tests::test_eval_typeof_arity_mismatch ... ok
[INFO] [stdout] test eval::tests::test_eval_parenthesized ... ok
[INFO] [stdout] test eval::tests::test_eval_string_interpolation ... ok
[INFO] [stdout] test eval::tests::test_eval_typeof_string ... ok
[INFO] [stdout] test eval::tests::test_eval_unary_not_true ... ok
[INFO] [stdout] test eval::tests::test_eval_unary_minus ... ok
[INFO] [stdout] test eval::tests::test_eval_unary_not_false ... ok
[INFO] [stdout] test eval::tests::test_eval_unary_not_invalid_type ... ok
[INFO] [stdout] test eval::tests::test_eval_unary_plus ... ok
[INFO] [stdout] test eval::tests::test_eval_unary_minus_invalid_type ... ok
[INFO] [stdout] test eval::tests::test_eval_typeof_number ... ok
[INFO] [stdout] test parser::array::tests::test_parse_empty_array ... ok
[INFO] [stdout] test parser::array::tests::test_parse_multiple_elements ... ok
[INFO] [stdout] test parser::boolean::tests::test_parse_boolean_with_remainder ... ok
[INFO] [stdout] test parser::array::tests::test_parse_single_element ... ok
[INFO] [stdout] test parser::boolean::tests::test_parse_true ... ok
[INFO] [stdout] test parser::boolean::tests::test_parse_false ... ok
[INFO] [stdout] test parser::array::tests::test_parse_trailing_comma ... ok
[INFO] [stdout] test parser::array::tests::test_parse_nested_expr ... ok
[INFO] [stdout] test parser::expr::tests::test_parse_binary ... ok
[INFO] [stdout] test parser::expr::tests::test_parse_binary_add_spacing_variants ... ok
[INFO] [stdout] test parser::expr::tests::test_parse_comments ... ok
[INFO] [stdout] test parser::expr::tests::test_parse_chained_field_access ... ok
[INFO] [stdout] test parser::expr::tests::test_parse_field_access ... ok
[INFO] [stdout] test parser::expr::tests::test_parse_field_access_no_whitespace_allowed ... ok
[INFO] [stdout] test parser::expr::tests::test_parse_field_access_on_map_literal ... ok
[INFO] [stdout] test parser::expr::tests::test_parse_function_call_kv_only ... ok
[INFO] [stdout] test parser::expr::tests::test_parse_function_call_with_kv_pairs ... ok
[INFO] [stdout] test parser::expr::tests::test_parse_number ... ok
[INFO] [stdout] test parser::expr::tests::test_parse_parenthesized ... ok
[INFO] [stdout] test parser::expr::tests::test_parse_identifier ... ok
[INFO] [stdout] test parser::expr::tests::test_parse_if_condition_with_field_access ... ok
[INFO] [stdout] test parser::expr::tests::test_parse_pipe ... ok
[INFO] [stdout] test parser::expr::tests::test_parse_pipe_with_function_calls ... ok
[INFO] [stdout] test parser::expr::tests::test_parse_if_expr_block_and_optional_else ... ok
[INFO] [stdout] test parser::expr::tests::test_parse_pipe_with_kv_pairs ... ok
[INFO] [stdout] test parser::expr::tests::test_parse_precedence ... ok
[INFO] [stdout] test parser::expr::tests::test_parse_if_expr_expression_branches ... ok
[INFO] [stdout] test parser::expr::tests::test_parse_string_interpolation ... ok
[INFO] [stdout] test parser::expr::tests::test_parse_string_concat ... ok
[INFO] [stdout] test parser::expr::tests::test_parse_pipe_with_function_calls_and_symbols ... ok
[INFO] [stdout] test parser::expr::tests::test_parse_unary ... ok
[INFO] [stdout] test parser::expr::tests::test_parse_symbol ... ok
[INFO] [stdout] test parser::expr::tests::test_parse_unary_binds_looser_than_dot ... ok
[INFO] [stdout] test parser::function::tests::test_parse_ceil ... ok
[INFO] [stdout] test parser::expr::tests::test_parse_function_call ... ok
[INFO] [stdout] test parser::expr::tests::test_parse_string ... ok
[INFO] [stdout] test parser::function::tests::test_parse_floor ... ok
[INFO] [stdout] test parser::function::tests::test_parse_positional_after_kv_fails ... ok
[INFO] [stdout] test parser::expr::tests::test_parse_keyword ... ok
[INFO] [stdout] test parser::function::tests::test_parse_with_only_kv_pairs ... ok
[INFO] [stdout] test parser::function::tests::test_parse_without_parens_single_arg ... ok
[INFO] [stdout] test parser::function::tests::test_parse_round ... ok
[INFO] [stdout] test parser::function::tests::test_parse_trim ... ok
[INFO] [stdout] test parser::function::tests::test_parse_with_trailing_kv_pairs ... ok
[INFO] [stdout] test parser::function::tests::test_parse_with_quoted_kv_key ... ok
[INFO] [stdout] test parser::keyword::tests::test_parse_keyword_with_remainder ... ok
[INFO] [stdout] test parser::keyword::tests::test_parse_keywords ... ok
[INFO] [stdout] test parser::function::tests::test_parse_without_parens_multiple_args ... ok
[INFO] [stdout] test parser::keyword::tests::test_keyword_word_boundary ... ok
[INFO] [stdout] test parser::function::tests::test_parse_without_parens_trailing_kv_pairs ... ok
[INFO] [stdout] test parser::literal::tests::test_parse_boolean_literal ... ok
[INFO] [stdout] test parser::identifier::tests::test_parse_identifier ... ok
[INFO] [stdout] test parser::literal::tests::test_parse_number_literal ... ok
[INFO] [stdout] test parser::map::tests::test_parse_multiple_entries ... ok
[INFO] [stdout] test parser::literal::tests::test_parse_none_literal ... ok
[INFO] [stdout] test parser::literal::tests::test_parse_literal_with_remainder ... ok
[INFO] [stdout] test parser::number::tests::test_parse_decimal ... ok
[INFO] [stdout] test parser::map::tests::test_parse_empty_map ... ok
[INFO] [stdout] test parser::literal::tests::test_parse_symbol_literal ... ok
[INFO] [stdout] test parser::literal::tests::test_parse_string_literal ... ok
[INFO] [stdout] test parser::map::tests::test_parse_quoted_key ... ok
[INFO] [stdout] test parser::number::tests::test_parse_decimal_with_zero_fractional_digits ... ok
[INFO] [stdout] test parser::number::tests::test_parse_integer ... ok
[INFO] [stdout] test parser::map::tests::test_parse_single_bare_key_string_value ... ok
[INFO] [stdout] test parser::map::tests::test_parse_single_bare_key_number_value ... ok
[INFO] [stdout] test parser::number::tests::test_parse_number_with_remainder ... ok
[INFO] [stdout] test parser::number::tests::test_parse_negative_decimal ... ok
[INFO] [stdout] test parser::map::tests::test_parse_trailing_comma ... ok
[INFO] [stdout] test parser::number::tests::test_parse_positive_decimal ... ok
[INFO] [stdout] test parser::operands::tests::test_parse_binary_op_double_char ... ok
[INFO] [stdout] test parser::number::tests::test_parse_number_with_underscores ... ok
[INFO] [stdout] test parser::number::tests::test_parse_positive_integer ... ok
[INFO] [stdout] test parser::number::tests::test_parse_negative_integer ... ok
[INFO] [stdout] test parser::operands::tests::test_parse_binary_op_double_char_not_consumed_as_single ... ok
[INFO] [stdout] test parser::operands::tests::test_parse_binary_op_with_remainder ... ok
[INFO] [stdout] test parser::operands::tests::test_parse_unary_op ... ok
[INFO] [stdout] test parser::operands::tests::test_parse_binary_op_single_char ... ok
[INFO] [stdout] test parser::statement::tests::test_parse_assignment_without_let ... ok
[INFO] [stdout] test parser::statement::tests::test_parse_let_statement_fails_without_equals ... ok
[INFO] [stdout] test parser::operands::tests::test_parse_unary_op_with_remainder ... ok
[INFO] [stdout] test parser::statement::tests::test_parse_let_statement_newline_no_semicolon_required ... ok
[INFO] [stdout] test parser::statement::tests::test_parse_let_statement_no_spaces ... ok
[INFO] [stdout] test parser::statement::tests::test_parse_let_statement ... ok
[INFO] [stdout] test parser::statement::tests::test_parse_expr_statement_binary_with_semicolon ... ok
[INFO] [stdout] test parser::statement::tests::test_parse_let_statement_optional_semicolon ... ok
[INFO] [stdout] test parser::statement::tests::test_parse_let_statement_with_expr ... ok
[INFO] [stdout] test parser::statement::tests::test_parse_expr_statement_number ... ok
[INFO] [stdout] test parser::string::tests::test_parse_empty_string ... ok
[INFO] [stdout] test parser::string::tests::test_parse_interpolated_string_consecutive ... ok
[INFO] [stdout] test parser::statement::tests::test_parse_two_statements_same_line ... ok
[INFO] [stdout] test parser::string::tests::test_parse_simple_string ... ok
[INFO] [stdout] test parser::string::tests::test_parse_interpolated_string_escaped_brace ... ok
[INFO] [stdout] test parser::symbol::tests::test_parse_symbol_identifier ... ok
[INFO] [stdout] test parser::string::tests::test_parse_interpolated_string_simple ... ok
[INFO] [stdout] test parser::symbol::tests::test_parse_symbol_string ... ok
[INFO] [stdout] test parser::string::tests::test_parse_string_with_escaped_backslash ... ok
[INFO] [stdout] test parser::string::tests::test_parse_string_with_escaped_quote ... ok
[INFO] [stdout] test repl::slash_commands::tests::test_slash_commands_lookup ... ok
[INFO] [stdout] test repl::tests::test_custom_prompt ... ok
[INFO] [stdout] test repl::tests::test_default_prompt ... ok
[INFO] [stdout] test repl::tests::test_history_path_from_env_override ... ok
[INFO] [stdout] test repl::tests::test_history_round_trip ... ok
[INFO] [stdout] test repl::tests::test_missing_history_file_is_ok ... ok
[INFO] [stdout] test runtime::functions::tests::test_accepts ... ok
[INFO] [stdout] test repl::tests::test_no_history_path_writes_nothing ... ok
[INFO] [stdout] test runtime::tests::test_builtin_typeof_arity_mismatch ... ok
[INFO] [stdout] test repl::tests::test_history_path_from_falls_back_to_default ... ok
[INFO] [stdout] test runtime::tests::test_builtin_typeof_propagates_none_error ... ok
[INFO] [stdout] test repl::tests::test_save_creates_parent_dirs ... ok
[INFO] [stdout] test runtime::functions::tests::test_builtin_function_call ... ok
[INFO] [stdout] test runtime::tests::test_builtin_typeof_returns_type ... ok
[INFO] [stdout] test runtime::tests::test_type_of_map ... ok
[INFO] [stdout] test runtime::tests::test_type_of_none_is_not_yet_implemented ... ok
[INFO] [stdout] test runtime::tests::test_type_of_number ... ok
[INFO] [stdout] test runtime::tests::test_type_of_boolean ... ok
[INFO] [stdout] test runtime::tests::test_type_of_array ... ok
[INFO] [stdout] test runtime::tests::test_type_of_string ... ok
[INFO] [stdout] test runtime::tests::test_type_of_type_is_value ... ok
[INFO] [stdout] test runtime::tests::test_type_of_unit ... ok
[INFO] [stdout] test runtime::tests::test_typeof_registered_as_builtin ... ok
[INFO] [stdout] test runtime::tests::test_type_of_symbol ... ok
[INFO] [stdout] test runtime::tests::test_value_type_display ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 187 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s
[INFO] [stdout] 
[INFO] [stderr]      Running unittests src/bin/flt.rs (/opt/rustwide/target/release/build/flt/cee697ddea8a5e1a/out/flt-cee697ddea8a5e1a)
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] [stderr]      Running tests/cli.rs (/opt/rustwide/target/release/build/flt/cdf8fb596937d244/out/cli-cdf8fb596937d244)
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] [stderr]      Running tests/features.rs (/opt/rustwide/target/release/build/flt/8feb4bb5e49938d8/out/features-8feb4bb5e49938d8)
[INFO] [stdout] Feature: Arrays
[INFO] [stdout]   Scenario: Parsing an empty array
[INFO] [stdout]    ✔  Given the input "[]"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be an empty array
[INFO] [stdout]   Scenario: Parsing an array with spaces
[INFO] [stdout]    ✔  Given the input "[  ]"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be an empty array
[INFO] [stdout]   Scenario: Parsing an array with a single number
[INFO] [stdout]    ✔  Given the input "[ 42 ]"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be an array with 1 element
[INFO] [stdout]    ✔  And the first element should be the number 42
[INFO] [stdout]   Scenario: Parsing an array with a single string
[INFO] [stdout]    ✔  Given the input '[ "hello" ]'
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be an array with 1 element
[INFO] [stdout]    ✔  And the first element should be the string "hello"
[INFO] [stdout]   Scenario: Parsing an array with multiple numbers
[INFO] [stdout]    ✔  Given the input "[ 1, 2, 3 ]"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be an array with 3 elements
[INFO] [stdout]    ✔  And the first element should be the number 1
[INFO] [stdout]    ✔  And the second element should be the number 2
[INFO] [stdout]    ✔  And the third element should be the number 3
[INFO] [stdout]   Scenario: Parsing an array with mixed types
[INFO] [stdout]    ✔  Given the input '[ 1, "two", true ]'
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be an array with 3 elements
[INFO] [stdout]    ✔  And the first element should be the number 1
[INFO] [stdout]    ✔  And the second element should be the string "two"
[INFO] [stdout]    ✔  And the third element should be the boolean true
[INFO] [stdout]   Scenario: Parsing an array with trailing comma
[INFO] [stdout]    ✔  Given the input "[ 1, ]"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be an array with 1 element
[INFO] [stdout]    ✔  And the first element should be the number 1
[INFO] [stdout]   Scenario: Parsing an array with nested expressions
[INFO] [stdout]    ✔  Given the input "[ 1 + 2, 3 * 4 ]"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be an array with 2 elements
[INFO] [stdout] Feature: AST
[INFO] [stdout]   Scenario: Parsing a number
[INFO] [stdout]    ✔  Given the input "42"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be a `Literal::Number(42)`
[INFO] [stdout]   Scenario: Parsing a string literal
[INFO] [stdout]    ✔  Given the input '"hello"'
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'Literal(String("hello"))'
[INFO] [stdout]   Scenario: Parsing a boolean literal
[INFO] [stdout]    ✔  Given the input "true"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be a `Literal::Boolean(true)`
[INFO] [stdout]   Scenario: Parsing an identifier
[INFO] [stdout]    ✔  Given the input "user_name"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be an identifier "user_name"
[INFO] [stdout]   Scenario: Parsing a symbol
[INFO] [stdout]    ✔  Given the input ":user_name"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be a `Literal::Symbol("user_name")`
[INFO] [stdout]   Scenario: Parsing a quoted symbol
[INFO] [stdout]    ✔  Given the input ':"hello world"'
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be a `Literal::Symbol("hello world")`
[INFO] [stdout]   Scenario: Parsing an identifier that starts with digits fails
[INFO] [stdout]    ✔  Given the input "123abc"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then parsing should fail
[INFO] [stdout]   Scenario: Parsing a symbol that starts with non-character fails
[INFO] [stdout]    ✔  Given the input ":_foo"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then parsing should fail
[INFO] [stdout]   Scenario: Parsing string concatenation
[INFO] [stdout]    ✔  Given the input '"foo" <> "bar"'
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should parse to string concat "foo" and "bar"
[INFO] [stdout]   Scenario: Parsing string interpolation
[INFO] [stdout]    ✔  Given the input '"Hello, {who}!"'
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should parse to interpolated string "Hello, " who "!"
[INFO] [stdout] Feature: Binary expressions
[INFO] [stdout]   Scenario: Addition
[INFO] [stdout]    ✔  Given the input "1 + 2"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'BinaryExpr(Literal(Number(Numeric(BigDecimal(sign=Plus, scale=0, digits=[1])))), Add, Literal(Number(Numeric(BigDecimal(sign=Plus, scale=0, digits=[2])))))'
[INFO] [stdout]   Scenario: Subtraction
[INFO] [stdout]    ✔  Given the input "10 - 3"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'BinaryExpr(Literal(Number(Numeric(BigDecimal(sign=Plus, scale=0, digits=[10])))), Sub, Literal(Number(Numeric(BigDecimal(sign=Plus, scale=0, digits=[3])))))'
[INFO] [stdout]   Scenario: Multiplication
[INFO] [stdout]    ✔  Given the input "4 * 5"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'BinaryExpr(Literal(Number(Numeric(BigDecimal(sign=Plus, scale=0, digits=[4])))), Mul, Literal(Number(Numeric(BigDecimal(sign=Plus, scale=0, digits=[5])))))'
[INFO] [stdout]   Scenario: Division
[INFO] [stdout]    ✔  Given the input "20 / 4"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'BinaryExpr(Literal(Number(Numeric(BigDecimal(sign=Plus, scale=0, digits=[20])))), Div, Literal(Number(Numeric(BigDecimal(sign=Plus, scale=0, digits=[4])))))'
[INFO] [stdout]   Scenario: Multiplication has higher precedence than addition
[INFO] [stdout]    ✔  Given the input "1 + 2 * 3"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'BinaryExpr(Literal(Number(Numeric(BigDecimal(sign=Plus, scale=0, digits=[1])))), Add, BinaryExpr(Literal(Number(Numeric(BigDecimal(sign=Plus, scale=0, digits=[2])))), Mul, Literal(Number(Numeric(BigDecimal(sign=Plus, scale=0, digits=[3]))))))'
[INFO] [stdout]   Scenario: Parentheses override precedence
[INFO] [stdout]    ✔  Given the input "(1 + 2) * 3"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'BinaryExpr(Parenthesized(BinaryExpr(Literal(Number(Numeric(BigDecimal(sign=Plus, scale=0, digits=[1])))), Add, Literal(Number(Numeric(BigDecimal(sign=Plus, scale=0, digits=[2])))))), Mul, Literal(Number(Numeric(BigDecimal(sign=Plus, scale=0, digits=[3])))))'
[INFO] [stdout]   Scenario: Logical and
[INFO] [stdout]    ✔  Given the input "true && false"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'BinaryExpr(Literal(Boolean(true)), And, Literal(Boolean(false)))'
[INFO] [stdout]   Scenario: Logical or
[INFO] [stdout]    ✔  Given the input "true || false"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'BinaryExpr(Literal(Boolean(true)), Or, Literal(Boolean(false)))'
[INFO] [stdout]   Scenario: Logical xor
[INFO] [stdout]    ✔  Given the input "true ^^ false"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'BinaryExpr(Literal(Boolean(true)), Xor, Literal(Boolean(false)))'
[INFO] [stdout]   Scenario: String concatenation
[INFO] [stdout]    ✔  Given the input '"foo" <> "bar"'
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'BinaryExpr(Literal(String("foo")), Concat, Literal(String("bar")))'
[INFO] [stdout]   Scenario: Pipe operator
[INFO] [stdout]    ✔  Given the input "x |> f"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'BinaryExpr(Ident("x"), Pipe, Ident("f"))'
[INFO] [stdout]   Scenario: Equality
[INFO] [stdout]    ✔  Given the input "x == 1"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'BinaryExpr(Ident("x"), Eq, Literal(Number(Numeric(BigDecimal(sign=Plus, scale=0, digits=[1])))))'
[INFO] [stdout]   Scenario: Inequality
[INFO] [stdout]    ✔  Given the input "x != 0"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'BinaryExpr(Ident("x"), Ne, Literal(Number(Numeric(BigDecimal(sign=NoSign, scale=0, digits=[])))))'
[INFO] [stdout]   Scenario: Less than
[INFO] [stdout]    ✔  Given the input "a < b"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'BinaryExpr(Ident("a"), Lt, Ident("b"))'
[INFO] [stdout]   Scenario: Greater than
[INFO] [stdout]    ✔  Given the input "a > b"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'BinaryExpr(Ident("a"), Gt, Ident("b"))'
[INFO] [stdout]   Scenario: Less than or equal
[INFO] [stdout]    ✔  Given the input "a <= b"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'BinaryExpr(Ident("a"), Lte, Ident("b"))'
[INFO] [stdout]   Scenario: Greater than or equal
[INFO] [stdout]    ✔  Given the input "a >= b"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'BinaryExpr(Ident("a"), Gte, Ident("b"))'
[INFO] [stdout] Feature: Comments
[INFO] [stdout]   Scenario: Trailing comment after expression
[INFO] [stdout]    ✔  Given the input "42 # this is the answer"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be a `Literal::Number(42)`
[INFO] [stdout]   Scenario: Leading comment before expression
[INFO] [stdout]    ✔  Given the multiline input
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be a `Literal::Number(42)`
[INFO] [stdout]   Scenario: Comment between binary operands
[INFO] [stdout]    ✔  Given the multiline input
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'BinaryExpr(Literal(Number(Numeric(BigDecimal(sign=Plus, scale=0, digits=[1])))), Add, Literal(Number(Numeric(BigDecimal(sign=Plus, scale=0, digits=[2])))))'
[INFO] [stdout]   Scenario: Comment in function call arguments
[INFO] [stdout]    ✔  Given the multiline input
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'FunctionCall(Identifier("add"), [Literal(Number(Numeric(BigDecimal(sign=Plus, scale=0, digits=[1])))), Literal(Number(Numeric(BigDecimal(sign=Plus, scale=0, digits=[2]))))])'
[INFO] [stdout]   Scenario: Comment between string concatenation operands
[INFO] [stdout]    ✔  Given the multiline input
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'BinaryExpr(Literal(String("foo")), Concat, Literal(String("bar")))'
[INFO] [stdout]   Scenario: Empty comment
[INFO] [stdout]    ✔  Given the input "true #"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be a `Literal::Boolean(true)`
[INFO] [stdout]   Scenario: Multiple consecutive comment lines
[INFO] [stdout]    ✔  Given the multiline input
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'Literal(String("hello"))'
[INFO] [stdout] Feature: Dot Access
[INFO] [stdout]   Scenario: Accessing a field on an identifier
[INFO] [stdout]    ✔  Given the input "u.foo"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be a field access with field "foo"
[INFO] [stdout]   Scenario: Chained field access
[INFO] [stdout]    ✔  Given the input "a.b.c"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be a field access with field "c"
[INFO] [stdout]   Scenario: Field access on a map literal
[INFO] [stdout]    ✔  Given the input '{ foo: "bar" }.foo'
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be a field access with field "foo"
[INFO] [stdout] Feature: Function calls
[INFO] [stdout]   Scenario: Function call with trailing key-value pairs
[INFO] [stdout]    ✔  Given the input "foo(1, optional: true)"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be a function call "foo" with 2 args
[INFO] [stdout]   Scenario: Function call with only key-value pairs
[INFO] [stdout]    ✔  Given the input 'config(format: "csv", header: true)'
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be a function call "config" with 1 args
[INFO] [stdout]   Scenario: Function call without parens and trailing key-value pairs
[INFO] [stdout]    ✔  Given the input "foo 1, optional: true"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be a function call "foo" with 2 args
[INFO] [stdout]   Scenario: Function call with positional args only still works
[INFO] [stdout]    ✔  Given the input "add(1, 2)"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be a function call "add" with 2 args
[INFO] [stdout] Feature: Maps
[INFO] [stdout]   Scenario: Parsing an empty map
[INFO] [stdout]    ✔  Given the input "{}"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be an empty map
[INFO] [stdout]   Scenario: Parsing a map with a bare key and string value
[INFO] [stdout]    ✔  Given the input '{ foo: "bar" }'
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be a map with key "foo" and string value "bar"
[INFO] [stdout]   Scenario: Parsing a map with a bare key and number value
[INFO] [stdout]    ✔  Given the input "{ abc123: 456 }"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be a map with key "abc123" and number value 456
[INFO] [stdout]   Scenario: Parsing a map with a quoted key
[INFO] [stdout]    ✔  Given the input '{ "spaced out": (1 + 1) }'
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be a map with 1 entry
[INFO] [stdout]   Scenario: Parsing a map with multiple entries
[INFO] [stdout]    ✔  Given the input '{ name: "Alice", age: 30 }'
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be a map with 2 entries
[INFO] [stdout] Feature: Types
[INFO] [stdout]   Scenario: Boolean type name parses as an identifier
[INFO] [stdout]    ✔  Given the input "Boolean"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be an identifier "Boolean"
[INFO] [stdout]   Scenario: Number type name parses as an identifier
[INFO] [stdout]    ✔  Given the input "Number"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be an identifier "Number"
[INFO] [stdout]   Scenario: String type name parses as an identifier
[INFO] [stdout]    ✔  Given the input "String"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be an identifier "String"
[INFO] [stdout]   Scenario: Symbol type name parses as an identifier
[INFO] [stdout]    ✔  Given the input "Symbol"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be an identifier "Symbol"
[INFO] [stdout]   Scenario: Map type name parses as an identifier
[INFO] [stdout]    ✔  Given the input "Map"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be an identifier "Map"
[INFO] [stdout]   Scenario: KeywordArgs type name parses as an identifier
[INFO] [stdout]    ✔  Given the input "KeywordArgs"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be an identifier "KeywordArgs"
[INFO] [stdout]   Scenario: None sentinel parses as a literal
[INFO] [stdout]    ✔  Given the input "None"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be a `Literal::None`
[INFO] [stdout]   Scenario: Comparing a value to None for Option check
[INFO] [stdout]    ✔  Given the input "compressed == None"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'BinaryExpr(Ident("compressed"), Eq, Literal(None))'
[INFO] [stdout]   Scenario: Checking an option is not None
[INFO] [stdout]    ✔  Given the input "compressed != None"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'BinaryExpr(Ident("compressed"), Ne, Literal(None))'
[INFO] [stdout]   Scenario: Map literal as a collection-typed value
[INFO] [stdout]    ✔  Given the input '{ value: 42 }'
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be a map with key "value" and number value 42
[INFO] [stdout]   Scenario: Array literal with mixed built-in types
[INFO] [stdout]    ✔  Given the input '[ 1, "two", true ]'
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be an array with 3 elements
[INFO] [stdout]    ✔  And the first element should be the number 1
[INFO] [stdout]    ✔  And the second element should be the string "two"
[INFO] [stdout]    ✔  And the third element should be the boolean true
[INFO] [stdout] Feature: Unary expressions
[INFO] [stdout]   Scenario: Logical not on boolean
[INFO] [stdout]    ✔  Given the input "!true"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'UnaryExpr(Not, Literal(Boolean(true)))'
[INFO] [stdout]   Scenario: Logical not on identifier
[INFO] [stdout]    ✔  Given the input "!x"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'UnaryExpr(Not, Ident("x"))'
[INFO] [stdout]   Scenario: Unary minus on number
[INFO] [stdout]    ✔  Given the input "-42"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'UnaryExpr(Minus, Literal(Number(Numeric(BigDecimal(sign=Plus, scale=0, digits=[42])))))'
[INFO] [stdout]   Scenario: Unary plus on number
[INFO] [stdout]    ✔  Given the input "+17"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'UnaryExpr(Plus, Literal(Number(Numeric(BigDecimal(sign=Plus, scale=0, digits=[17])))))'
[INFO] [stdout]   Scenario: Unary minus on identifier
[INFO] [stdout]    ✔  Given the input "-x"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'UnaryExpr(Minus, Ident("x"))'
[INFO] [stdout]   Scenario: Double negation
[INFO] [stdout]    ✔  Given the input "--42"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'UnaryExpr(Minus, UnaryExpr(Minus, Literal(Number(Numeric(BigDecimal(sign=Plus, scale=0, digits=[42]))))))'
[INFO] [stdout] Feature: flt version
[INFO] [stdout]   Scenario: flt version
[INFO] [stdout]    ?  When the command `flt version` is run
[INFO] [stdout]       Step skipped: features/cli.feature:4:5
[INFO] [stdout] Feature: flt repl
[INFO] [stdout]   Scenario: evaluate a simple expression
[INFO] [stdout]    ?  When the REPL is run and the user types:
[INFO] [stdout]       Step skipped: features/repl/basic.feature:4:5
[INFO] [stdout]   Scenario: parse an expression without evaluating it
[INFO] [stdout]    ?  When the REPL is run and the user types:
[INFO] [stdout]       Step skipped: features/repl/basic.feature:12:5
[INFO] [stdout]   Scenario: unknown slash command
[INFO] [stdout]    ?  When the REPL is run and the user types:
[INFO] [stdout]       Step skipped: features/repl/basic.feature:20:5
[INFO] [stdout]   Scenario: unset a bound variable
[INFO] [stdout]    ?  When the REPL is run and the user types:
[INFO] [stdout]       Step skipped: features/repl/basic.feature:28:5
[INFO] [stdout]   Scenario: inspect an unbound variable
[INFO] [stdout]    ?  When the REPL is run and the user types:
[INFO] [stdout]       Step skipped: features/repl/basic.feature:39:5
[INFO] [stdout]   Scenario: inspect a bound variable
[INFO] [stdout]    ?  When the REPL is run and the user types:
[INFO] [stdout]       Step skipped: features/repl/basic.feature:47:5
[INFO] [stdout]   Scenario: inspect a bound variable using the short alias
[INFO] [stdout]    ?  When the REPL is run and the user types:
[INFO] [stdout]       Step skipped: features/repl/basic.feature:56:5
[INFO] [stdout]   Scenario: inspect a scalar literal
[INFO] [stdout]    ?  When the REPL is run and the user types:
[INFO] [stdout]       Step skipped: features/repl/basic.feature:65:5
[INFO] [stdout]   Scenario: inspect an array literal
[INFO] [stdout]    ?  When the REPL is run and the user types:
[INFO] [stdout]       Step skipped: features/repl/basic.feature:73:5
[INFO] [stdout]   Scenario: inspect a map literal
[INFO] [stdout]    ?  When the REPL is run and the user types:
[INFO] [stdout]       Step skipped: features/repl/basic.feature:81:5
[INFO] [stdout]   Scenario: quit the REPL
[INFO] [stdout]    ?  When the REPL is run and the user types:
[INFO] [stdout]       Step skipped: features/repl/basic.feature:89:5
[INFO] [stdout]   Scenario: quit the REPL using the short alias
[INFO] [stdout]    ?  When the REPL is run and the user types:
[INFO] [stdout]       Step skipped: features/repl/basic.feature:98:5
[INFO] [stdout]   Scenario: show help
[INFO] [stdout]    ?  When the REPL is run and the user types:
[INFO] [stdout]       Step skipped: features/repl/basic.feature:107:5
[INFO] [stdout]   Scenario: show help using the short alias
[INFO] [stdout]    ?  When the REPL is run and the user types:
[INFO] [stdout]       Step skipped: features/repl/basic.feature:115:5
[INFO] [stdout]   Scenario: history is disabled with FLT_NO_HISTORY
[INFO] [stdout]    ?  When the REPL is run and the user types:
[INFO] [stdout]       Step skipped: features/repl/basic.feature:123:5
[INFO] [stdout] Feature: Assignment
[INFO] [stdout]   Scenario: Assigning a value to a variable
[INFO] [stdout]    ✔  Given the input "let x = 1;"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be a `Statement::Let(Identifier("x"), Expr::Literal(Literal::Number(1)))`
[INFO] [stdout]   Scenario: Assigning a value without a let keyword
[INFO] [stdout]    ✔  Given the input "x = 1;"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be a `Statement::Let(Identifier("x"), Expr::Literal(Literal::Number(1)))`
[INFO] [stdout] Feature: Conditionals
[INFO] [stdout]   Scenario: If with block branches and else
[INFO] [stdout]    ✔  Given the input "if true { 1 } else { 2 }"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'IfExpr { condition: Literal(Boolean(true)), then_branch: Literal(Number(Numeric(BigDecimal(sign=Plus, scale=0, digits=[1])))), else_branch: Some(Literal(Number(Numeric(BigDecimal(sign=Plus, scale=0, digits=[2]))))) }'
[INFO] [stdout]   Scenario: If with block branches and else (condition false)
[INFO] [stdout]    ✔  Given the input "if false { 1 } else { 2 }"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'IfExpr { condition: Literal(Boolean(false)), then_branch: Literal(Number(Numeric(BigDecimal(sign=Plus, scale=0, digits=[1])))), else_branch: Some(Literal(Number(Numeric(BigDecimal(sign=Plus, scale=0, digits=[2]))))) }'
[INFO] [stdout]   Scenario: If with block then-branch only (no else)
[INFO] [stdout]    ✔  Given the input "if true { 1 }"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'IfExpr { condition: Literal(Boolean(true)), then_branch: Literal(Number(Numeric(BigDecimal(sign=Plus, scale=0, digits=[1])))), else_branch: None }'
[INFO] [stdout]   Scenario: If with block then-branch only and function call (no else)
[INFO] [stdout]    ✔  Given the input "if false { do() }"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'IfExpr { condition: Literal(Boolean(false)), then_branch: FunctionCall(Identifier("do"), []), else_branch: None }'
[INFO] [stdout]   Scenario: If with expression branches (no blocks)
[INFO] [stdout]    ✔  Given the input 'if success "Ok" else ":("'
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'IfExpr { condition: Ident("success"), then_branch: Literal(String("Ok")), else_branch: Some(Literal(String(":("))) }'
[INFO] [stdout]   Scenario: If with parenthesized condition
[INFO] [stdout]    ✔  Given the input "if (true) { 1 } else { 2 }"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be 'IfExpr { condition: Parenthesized(Literal(Boolean(true))), then_branch: Literal(Number(Numeric(BigDecimal(sign=Plus, scale=0, digits=[1])))), else_branch: Some(Literal(Number(Numeric(BigDecimal(sign=Plus, scale=0, digits=[2]))))) }'
[INFO] [stdout] Feature: Expression statements
[INFO] [stdout]   Scenario: Number expression as a statement
[INFO] [stdout]    ✔  Given the input "42"
[INFO] [stdout]    ✔  When I parse the input
[INFO] [stdout]    ✔  Then the output should be a `Literal::Number(42)`
[INFO] [stdout] [Summary]
[INFO] [stdout] 14 features
[INFO] [stdout] 96 scenarios (80 passed, 16 skipped)
[INFO] [stdout] 268 steps (252 passed, 16 skipped)
[INFO] [stderr]      Running tests/repl.rs (/opt/rustwide/target/release/build/flt/c2e0ccb69466bee6/out/repl-c2e0ccb69466bee6)
[INFO] [stdout] Feature: flt repl
[INFO] [stdout]   Scenario: evaluate a simple expression
[INFO] [stdout]    ✔  When the REPL is run and the user types:
[INFO] [stdout]    ✔  Then the command should succeed
[INFO] [stdout]    ✔  And the output should contain "2"
[INFO] [stdout]   Scenario: parse an expression without evaluating it
[INFO] [stdout]    ✔  When the REPL is run and the user types:
[INFO] [stdout]    ✔  Then the command should succeed
[INFO] [stdout]    ✔  And the output should contain "BinaryExpr"
[INFO] [stdout]   Scenario: unknown slash command
[INFO] [stdout]    ✔  When the REPL is run and the user types:
[INFO] [stdout]    ✔  Then the command should succeed
[INFO] [stdout]    ✔  And the output should contain "unknown command"
[INFO] [stdout]   Scenario: unset a bound variable
[INFO] [stdout]    ✔  When the REPL is run and the user types:
[INFO] [stdout]    ✔  Then the command should succeed
[INFO] [stdout]    ✔  And the output should contain "UnboundIdentifier"
[INFO] [stdout]   Scenario: inspect an unbound variable
[INFO] [stdout]    ✔  When the REPL is run and the user types:
[INFO] [stdout]    ✔  Then the command should succeed
[INFO] [stdout]    ✔  And the output should contain "Unbound variable"
[INFO] [stdout]   Scenario: inspect a bound variable
[INFO] [stdout]    ✔  When the REPL is run and the user types:
[INFO] [stdout]    ✔  Then the command should succeed
[INFO] [stdout]    ✔  And the output should contain "(variable) 1"
[INFO] [stdout]   Scenario: inspect a bound variable using the short alias
[INFO] [stdout]    ✔  When the REPL is run and the user types:
[INFO] [stdout]    ✔  Then the command should succeed
[INFO] [stdout]    ✔  And the output should contain "(variable) 1"
[INFO] [stdout]   Scenario: inspect a scalar literal
[INFO] [stdout]    ✔  When the REPL is run and the user types:
[INFO] [stdout]    ✔  Then the command should succeed
[INFO] [stdout]    ✔  And the output should contain "Number"
[INFO] [stdout]   Scenario: inspect an array literal
[INFO] [stdout]    ✔  When the REPL is run and the user types:
[INFO] [stdout]    ✔  Then the command should succeed
[INFO] [stdout]    ✔  And the output should contain "Array"
[INFO] [stdout]   Scenario: inspect a map literal
[INFO] [stdout]    ✔  When the REPL is run and the user types:
[INFO] [stdout]    ✔  Then the command should succeed
[INFO] [stdout]    ✔  And the output should contain "Map"
[INFO] [stdout]   Scenario: quit the REPL
[INFO] [stdout]    ✔  When the REPL is run and the user types:
[INFO] [stdout]    ✔  Then the command should succeed
[INFO] [stdout]    ✔  And the output should not contain "2"
[INFO] [stdout]   Scenario: quit the REPL using the short alias
[INFO] [stdout]    ✔  When the REPL is run and the user types:
[INFO] [stdout]    ✔  Then the command should succeed
[INFO] [stdout]    ✔  And the output should not contain "2"
[INFO] [stdout]   Scenario: show help
[INFO] [stdout]    ✔  When the REPL is run and the user types:
[INFO] [stdout]    ✔  Then the command should succeed
[INFO] [stdout]    ✔  And the output should contain "/quit"
[INFO] [stdout]   Scenario: show help using the short alias
[INFO] [stdout]    ✔  When the REPL is run and the user types:
[INFO] [stdout]    ✔  Then the command should succeed
[INFO] [stdout]    ✔  And the output should contain "/quit"
[INFO] [stdout]   Scenario: history is disabled with FLT_NO_HISTORY
[INFO] [stdout]    ✔  When the REPL is run and the user types:
[INFO] [stdout]    ✔  Then the command should succeed
[INFO] [stdout]    ✔  And the output should not contain "Loading REPL history"
[INFO] [stdout] [Summary]
[INFO] [stdout] 1 feature
[INFO] [stdout] 15 scenarios (15 passed)
[INFO] [stdout] 45 steps (45 passed)
[INFO] [stderr]    Doc-tests flt
[INFO] [stdout] 
[INFO] [stdout] running 2 tests
[INFO] [stdout] test src/lib.rs - ast (line 111) ... ok
[INFO] [stdout] test src/lib.rs - ast (line 27) ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.18s
[INFO] [stdout] 
[INFO] running `Command { std: "docker" "inspect" "bbac9a9617a117fe4b9439cc7342ec7ccb16ee0eb9a9eed01f03f2045c7f48dd", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "bbac9a9617a117fe4b9439cc7342ec7ccb16ee0eb9a9eed01f03f2045c7f48dd", kill_on_drop: false }`
[INFO] [stdout] bbac9a9617a117fe4b9439cc7342ec7ccb16ee0eb9a9eed01f03f2045c7f48dd
