[INFO] fetching crate flt 0.1.2... [INFO] testing flt-0.1.2 against 1.99.0-beta.8+cargoflags=--release for beta-release-1.100-2 [INFO] extracting crate flt 0.1.2 into /workspace/builds/worker-7-tc1/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-7-tc1/source/Cargo.toml [INFO] validating manifest of crates.io crate flt 0.1.2 on toolchain 1.99.0-beta.8 [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+1.99.0-beta.8" "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.99.0-beta.8" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] [stderr] Updating crates.io index [INFO] [stderr] Blocking waiting for file lock on package cache [INFO] [stderr] Downloading crates ... [INFO] [stderr] Downloaded serial_test v4.0.1 [INFO] [stderr] Downloaded redox_syscall v0.5.8 [INFO] [stderr] Downloaded synthez-codegen v0.4.0 [INFO] [stderr] Downloaded endian-type v0.2.0 [INFO] [stderr] Downloaded smart-default v0.7.1 [INFO] [stderr] Downloaded smawk v0.3.2 [INFO] [stderr] Downloaded peg v0.6.3 [INFO] [stderr] Downloaded synthez v0.4.0 [INFO] [stderr] Downloaded sealed v0.6.0 [INFO] [stderr] Downloaded inventory v0.3.16 [INFO] [stderr] Downloaded serial_test_derive v4.0.1 [INFO] [stderr] Downloaded peg-runtime v0.6.3 [INFO] [stderr] Downloaded peg-macros v0.6.3 [INFO] [stderr] Downloaded cucumber-expressions v0.5.0 [INFO] [stderr] Downloaded bytecount v0.6.8 [INFO] [stderr] Downloaded synthez-core v0.4.0 [INFO] [stderr] Downloaded pin-project-internal v1.1.7 [INFO] [stderr] Downloaded globset v0.4.15 [INFO] [stderr] Downloaded cucumber-codegen v0.23.0 [INFO] [stderr] Downloaded linktime-proc-macro v0.2.3 [INFO] [stderr] Downloaded gherkin v0.16.0 [INFO] [stderr] Downloaded ctor v1.0.13 [INFO] [stderr] Downloaded eyre v0.6.14 [INFO] [stderr] Downloaded ignore v0.4.23 [INFO] [stderr] Downloaded console v0.16.2 [INFO] [stderr] Downloaded textwrap v0.16.1 [INFO] [stderr] Downloaded pin-project v1.1.7 [INFO] [stderr] Downloaded anyhow v1.0.95 [INFO] [stderr] Downloaded link-section v0.19.3 [INFO] [stderr] Downloaded radix_trie v0.3.0 [INFO] [stderr] Downloaded bigdecimal v0.4.11 [INFO] [stderr] Downloaded rustyline v18.0.1 [INFO] [stderr] Downloaded serde_json v1.0.134 [INFO] [stderr] Downloaded cucumber v0.23.0 [INFO] [stderr] Downloaded bstr v1.11.1 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-7-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-7-tc1/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] cd37981729045c458c09515eaf106795962ffc4a0e5409f79e67dd57e08f4fca [INFO] running `Command { std: "docker" "start" "cd37981729045c458c09515eaf106795962ffc4a0e5409f79e67dd57e08f4fca", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "cd37981729045c458c09515eaf106795962ffc4a0e5409f79e67dd57e08f4fca", 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" "cd37981729045c458c09515eaf106795962ffc4a0e5409f79e67dd57e08f4fca" "/opt/rustwide/cargo-home/bin/cargo" "+1.99.0-beta.8" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "cd37981729045c458c09515eaf106795962ffc4a0e5409f79e67dd57e08f4fca", 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" "cd37981729045c458c09515eaf106795962ffc4a0e5409f79e67dd57e08f4fca" "/opt/rustwide/cargo-home/bin/cargo" "+1.99.0-beta.8" "build" "--frozen" "--message-format=json" "--release", kill_on_drop: false }` [INFO] [stderr] Compiling unicode-ident v1.0.14 [INFO] [stderr] Compiling libc v0.2.189 [INFO] [stderr] Compiling num-traits v0.2.19 [INFO] [stderr] Compiling cfg_aliases v0.2.1 [INFO] [stderr] Compiling smallvec v1.13.2 [INFO] [stderr] Compiling log v0.4.34 [INFO] [stderr] Compiling aho-corasick v1.1.3 [INFO] [stderr] Compiling bigdecimal v0.4.11 [INFO] [stderr] Compiling eyre v0.6.14 [INFO] [stderr] Compiling bitflags v2.13.2 [INFO] [stderr] Compiling endian-type v0.2.0 [INFO] [stderr] Compiling anstream v1.0.0 [INFO] [stderr] Compiling jiff-core v0.1.1 [INFO] [stderr] Compiling home v0.5.12 [INFO] [stderr] Compiling unicode-segmentation v1.12.0 [INFO] [stderr] Compiling indenter v0.3.4 [INFO] [stderr] Compiling nix v0.31.3 [INFO] [stderr] Compiling proc-macro2 v1.0.107 [INFO] [stderr] Compiling nom v8.0.0 [INFO] [stderr] Compiling nibble_vec v0.1.0 [INFO] [stderr] Compiling quote v1.0.47 [INFO] [stderr] Compiling radix_trie v0.3.0 [INFO] [stderr] Compiling clap_builder v4.6.7 [INFO] [stderr] Compiling syn v3.0.6 [INFO] [stderr] Compiling num-integer v0.1.46 [INFO] [stderr] Compiling num-bigint v0.4.6 [INFO] [stderr] Compiling regex-automata v0.4.18 [INFO] [stderr] Compiling jiff v0.2.37 [INFO] [stderr] Compiling dirs-sys-next v0.1.2 [INFO] [stderr] Compiling dirs-next v2.0.0 [INFO] [stderr] Compiling rustyline v18.0.1 [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 env_filter v2.0.0 [INFO] [stderr] Compiling thiserror v2.0.21 [INFO] [stderr] Compiling env_logger v0.11.11 [INFO] [stderr] Compiling clap v4.6.7 [INFO] [stderr] Compiling flt v0.1.2 (/opt/rustwide/workdir) [INFO] [stderr] Finished `release` profile [optimized] target(s) in 45.00s [INFO] running `Command { std: "docker" "inspect" "cd37981729045c458c09515eaf106795962ffc4a0e5409f79e67dd57e08f4fca", 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" "cd37981729045c458c09515eaf106795962ffc4a0e5409f79e67dd57e08f4fca" "/opt/rustwide/cargo-home/bin/cargo" "+1.99.0-beta.8" "test" "--frozen" "--no-run" "--message-format=json" "--release", kill_on_drop: false }` [INFO] [stderr] Compiling syn v2.0.119 [INFO] [stderr] Compiling memchr v2.8.3 [INFO] [stderr] Compiling rustix v1.1.4 [INFO] [stderr] Compiling convert_case v0.10.0 [INFO] [stderr] Compiling serde_core v1.0.229 [INFO] [stderr] Compiling slab v0.4.9 [INFO] [stderr] Compiling crossbeam-utils v0.8.21 [INFO] [stderr] Compiling serde v1.0.229 [INFO] [stderr] Compiling serde_derive v1.0.229 [INFO] [stderr] Compiling futures-sink v0.3.34 [INFO] [stderr] Compiling serde_json v1.0.134 [INFO] [stderr] Compiling futures-macro v0.3.34 [INFO] [stderr] Compiling itoa v1.0.14 [INFO] [stderr] Compiling peg-runtime v0.6.3 [INFO] [stderr] Compiling either v1.13.0 [INFO] [stderr] Compiling futures-channel v0.3.34 [INFO] [stderr] Compiling bytecount v0.6.8 [INFO] [stderr] Compiling nix v0.31.3 [INFO] [stderr] Compiling parking_lot_core v0.9.10 [INFO] [stderr] Compiling ref-cast v1.0.25 [INFO] [stderr] Compiling anyhow v1.0.95 [INFO] [stderr] Compiling peg-macros v0.6.3 [INFO] [stderr] Compiling unicode-linebreak v0.1.5 [INFO] [stderr] Compiling smawk v0.3.2 [INFO] [stderr] Compiling unicode-width v0.1.14 [INFO] [stderr] Compiling aho-corasick v1.1.3 [INFO] [stderr] Compiling nom v8.0.0 [INFO] [stderr] Compiling textwrap v0.16.1 [INFO] [stderr] Compiling itertools v0.14.0 [INFO] [stderr] Compiling parking_lot v0.12.3 [INFO] [stderr] Compiling inflections v1.1.1 [INFO] [stderr] Compiling crossbeam-epoch v0.9.18 [INFO] [stderr] Compiling regex-automata v0.4.18 [INFO] [stderr] Compiling bstr v1.11.1 [INFO] [stderr] Compiling futures-util v0.3.34 [INFO] [stderr] Compiling crossbeam-deque v0.8.6 [INFO] [stderr] Compiling peg v0.6.3 [INFO] [stderr] Compiling getrandom v0.4.3 [INFO] [stderr] Compiling console v0.16.2 [INFO] [stderr] Compiling socket2 v0.6.5 [INFO] [stderr] Compiling mio v1.2.3 [INFO] [stderr] Compiling signal-hook-registry v1.4.2 [INFO] [stderr] Compiling serial_test_derive v4.0.1 [INFO] [stderr] Compiling tokio-macros v2.7.2 [INFO] [stderr] Compiling bytes v1.9.0 [INFO] [stderr] Compiling linktime-proc-macro v0.2.3 [INFO] [stderr] Compiling link-section v0.19.3 [INFO] [stderr] Compiling inventory v0.3.16 [INFO] [stderr] Compiling nom_locate v5.0.0 [INFO] [stderr] Compiling rustyline v18.0.1 [INFO] [stderr] Compiling tokio v1.53.1 [INFO] [stderr] Compiling ctor v1.0.13 [INFO] [stderr] Compiling terminal_size v0.4.4 [INFO] [stderr] Compiling tempfile v3.27.0 [INFO] [stderr] Compiling clap_builder v4.6.7 [INFO] [stderr] Compiling regex v1.13.1 [INFO] [stderr] Compiling derive_more-impl v2.1.1 [INFO] [stderr] Compiling sealed v0.6.0 [INFO] [stderr] Compiling typed-builder-macro v0.23.2 [INFO] [stderr] Compiling pin-project-internal v1.1.7 [INFO] [stderr] Compiling ref-cast-impl v1.0.25 [INFO] [stderr] Compiling smart-default v0.7.1 [INFO] [stderr] Compiling synthez-core v0.4.0 [INFO] [stderr] Compiling gherkin v0.16.0 [INFO] [stderr] Compiling futures-executor v0.3.34 [INFO] [stderr] Compiling futures v0.3.34 [INFO] [stderr] Compiling serial_test v4.0.1 [INFO] [stderr] Compiling synthez-codegen v0.4.0 [INFO] [stderr] Compiling pin-project v1.1.7 [INFO] [stderr] Compiling globset v0.4.15 [INFO] [stderr] Compiling synthez v0.4.0 [INFO] [stderr] Compiling typed-builder v0.23.2 [INFO] [stderr] Compiling ignore v0.4.23 [INFO] [stderr] Compiling env_filter v2.0.0 [INFO] [stderr] Compiling clap v4.6.7 [INFO] [stderr] Compiling env_logger v0.11.11 [INFO] [stderr] Compiling globwalk v0.9.1 [INFO] [stderr] Compiling flt v0.1.2 (/opt/rustwide/workdir) [INFO] [stderr] Compiling derive_more v2.1.1 [INFO] [stderr] Compiling cucumber-expressions v0.5.0 [INFO] [stderr] Compiling cucumber-codegen v0.23.0 [INFO] [stderr] Compiling cucumber v0.23.0 [INFO] [stderr] Finished `release` profile [optimized] target(s) in 1m 54s [INFO] running `Command { std: "docker" "inspect" "cd37981729045c458c09515eaf106795962ffc4a0e5409f79e67dd57e08f4fca", 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" "cd37981729045c458c09515eaf106795962ffc4a0e5409f79e67dd57e08f4fca" "/opt/rustwide/cargo-home/bin/cargo" "+1.99.0-beta.8" "test" "--frozen" "--release", kill_on_drop: false }` [INFO] [stderr] Finished `release` profile [optimized] target(s) in 0.26s [INFO] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/release/deps/flt-9bfa60028b82b297) [INFO] [stdout] [INFO] [stdout] running 187 tests [INFO] [stdout] test ast::literal::tests::test_literal_from_f64 ... ok [INFO] [stdout] test ast::expr::tests::test_display_parenthesized ... ok [INFO] [stdout] test ast::expr::tests::test_display_unary_expr ... ok [INFO] [stdout] test ast::identifier::tests::test_identifier_validation ... ok [INFO] [stdout] test ast::expr::tests::test_display_binary_expr ... ok [INFO] [stdout] test ast::identifier::tests::test_identifier_eq_str ... ok [INFO] [stdout] test ast::expr::tests::test_display_field_access ... ok [INFO] [stdout] test ast::literal::tests::test_parse_none ... ok [INFO] [stdout] test ast::expr::tests::test_display_if_expr ... ok [INFO] [stdout] test eval::tests::test_eval_binary_and ... ok [INFO] [stdout] test eval::tests::test_eval_binary_add ... ok [INFO] [stdout] test ast::expr::tests::test_display_function_call ... ok [INFO] [stdout] test ast::expr::tests::test_display_ident ... ok [INFO] [stdout] test ast::expr::tests::test_display_literal_boolean ... ok [INFO] [stdout] test ast::expr::tests::test_display_literal_number ... ok [INFO] [stdout] test ast::literal::tests::test_literal_from_i64 ... 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 ast::literal::tests::test_parse_none_with_remainder ... ok [INFO] [stdout] test ast::literal::tests::test_parse_none_rejects_other ... 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 ast::expr::tests::test_display_literal_symbol ... ok [INFO] [stdout] test eval::tests::test_eval_binary_mul ... ok [INFO] [stdout] test eval::tests::test_eval_array_literal ... ok [INFO] [stdout] test eval::tests::test_eval_binary_concat ... ok [INFO] [stdout] test eval::tests::test_eval_binary_or ... ok [INFO] [stdout] test eval::tests::test_eval_array_mixed_types ... ok [INFO] [stdout] test eval::tests::test_eval_binary_pipe_unsupported ... ok [INFO] [stdout] test eval::tests::test_eval_array_propagates_element_error ... ok [INFO] [stdout] test eval::tests::test_eval_binary_sub ... ok [INFO] [stdout] test ast::expr::tests::test_display_nested ... ok [INFO] [stdout] test ast::expr::tests::test_display_literal_string ... ok [INFO] [stdout] test eval::tests::test_eval_if_expr_without_else_returns_unit ... ok [INFO] [stdout] test eval::tests::test_eval_empty_array ... ok [INFO] [stdout] test eval::tests::test_eval_literal_boolean ... ok [INFO] [stdout] test eval::tests::test_eval_literal_number ... ok [INFO] [stdout] test eval::tests::test_eval_binary_ne ... ok [INFO] [stdout] test eval::tests::test_eval_ident_unbound ... ok [INFO] [stdout] test eval::tests::test_eval_binary_xor ... 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_parenthesized ... ok [INFO] [stdout] test eval::tests::test_eval_string_interpolation ... ok [INFO] [stdout] test eval::tests::test_eval_field_access_on_map_literal ... ok [INFO] [stdout] test eval::tests::test_eval_field_access_on_non_map ... ok [INFO] [stdout] test eval::tests::test_eval_function_call_unsupported ... ok [INFO] [stdout] test eval::tests::test_eval_chained_field_access ... ok [INFO] [stdout] test eval::tests::test_eval_field_access_not_found ... ok [INFO] [stdout] test eval::tests::test_eval_unary_not_invalid_type ... ok [INFO] [stdout] test eval::tests::test_eval_unary_not_true ... ok [INFO] [stdout] test eval::tests::test_eval_literal_string ... ok [INFO] [stdout] test eval::tests::test_eval_typeof_arity_mismatch ... ok [INFO] [stdout] test eval::tests::test_eval_unary_not_false ... ok [INFO] [stdout] test eval::tests::test_eval_typeof_array ... 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::array::tests::test_parse_nested_expr ... ok [INFO] [stdout] test eval::tests::test_eval_typeof_string ... ok [INFO] [stdout] test eval::tests::test_eval_unary_minus ... ok [INFO] [stdout] test eval::tests::test_eval_unary_plus ... ok [INFO] [stdout] test eval::tests::test_eval_literal_symbol ... ok [INFO] [stdout] test eval::tests::test_eval_nested_array ... ok [INFO] [stdout] test eval::tests::test_eval_typeof_number ... ok [INFO] [stdout] test eval::tests::test_eval_one_plus_one_returns_two ... ok [INFO] [stdout] test eval::tests::test_eval_unary_minus_invalid_type ... ok [INFO] [stdout] test parser::boolean::tests::test_parse_true ... ok [INFO] [stdout] test parser::expr::tests::test_parse_binary ... ok [INFO] [stdout] test parser::expr::tests::test_parse_function_call_kv_only ... ok [INFO] [stdout] test parser::expr::tests::test_parse_chained_field_access ... ok [INFO] [stdout] test parser::array::tests::test_parse_single_element ... 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_with_kv_pairs ... ok [INFO] [stdout] test parser::array::tests::test_parse_trailing_comma ... ok [INFO] [stdout] test parser::expr::tests::test_parse_function_call ... ok [INFO] [stdout] test parser::expr::tests::test_parse_identifier ... ok [INFO] [stdout] test parser::boolean::tests::test_parse_boolean_with_remainder ... ok [INFO] [stdout] test parser::boolean::tests::test_parse_false ... ok [INFO] [stdout] test parser::expr::tests::test_parse_binary_add_spacing_variants ... ok [INFO] [stdout] test parser::expr::tests::test_parse_field_access ... ok [INFO] [stdout] test parser::expr::tests::test_parse_if_condition_with_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_comments ... 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_pipe_with_function_calls_and_symbols ... 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_string ... ok [INFO] [stdout] test parser::expr::tests::test_parse_string_interpolation ... ok [INFO] [stdout] test parser::expr::tests::test_parse_if_expr_block_and_optional_else ... ok [INFO] [stdout] test parser::function::tests::test_parse_floor ... ok [INFO] [stdout] test parser::expr::tests::test_parse_if_expr_expression_branches ... ok [INFO] [stdout] test parser::expr::tests::test_parse_keyword ... ok [INFO] [stdout] test parser::function::tests::test_parse_without_parens_multiple_args ... ok [INFO] [stdout] test parser::function::tests::test_parse_without_parens_single_arg ... ok [INFO] [stdout] test parser::function::tests::test_parse_without_parens_trailing_kv_pairs ... ok [INFO] [stdout] test parser::function::tests::test_parse_with_trailing_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_symbol ... ok [INFO] [stdout] test parser::expr::tests::test_parse_string_concat ... ok [INFO] [stdout] test parser::expr::tests::test_parse_unary ... 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::literal::tests::test_parse_literal_with_remainder ... ok [INFO] [stdout] test parser::literal::tests::test_parse_none_literal ... ok [INFO] [stdout] test parser::literal::tests::test_parse_symbol_literal ... ok [INFO] [stdout] test parser::map::tests::test_parse_empty_map ... ok [INFO] [stdout] test parser::identifier::tests::test_parse_identifier ... ok [INFO] [stdout] test parser::map::tests::test_parse_quoted_key ... ok [INFO] [stdout] test parser::map::tests::test_parse_multiple_entries ... ok [INFO] [stdout] test parser::keyword::tests::test_parse_keyword_with_remainder ... ok [INFO] [stdout] test parser::map::tests::test_parse_single_bare_key_string_value ... ok [INFO] [stdout] test parser::literal::tests::test_parse_number_literal ... ok [INFO] [stdout] test parser::map::tests::test_parse_single_bare_key_number_value ... ok [INFO] [stdout] test parser::map::tests::test_parse_trailing_comma ... ok [INFO] [stdout] test parser::literal::tests::test_parse_string_literal ... ok [INFO] [stdout] test parser::function::tests::test_parse_trim ... ok [INFO] [stdout] test parser::keyword::tests::test_parse_keywords ... ok [INFO] [stdout] test parser::function::tests::test_parse_with_only_kv_pairs ... ok [INFO] [stdout] test parser::function::tests::test_parse_with_quoted_kv_key ... ok [INFO] [stdout] test parser::literal::tests::test_parse_boolean_literal ... ok [INFO] [stdout] test parser::keyword::tests::test_keyword_word_boundary ... ok [INFO] [stdout] test parser::number::tests::test_parse_positive_decimal ... ok [INFO] [stdout] test parser::number::tests::test_parse_decimal ... ok [INFO] [stdout] test parser::number::tests::test_parse_negative_integer ... ok [INFO] [stdout] test parser::number::tests::test_parse_decimal_with_zero_fractional_digits ... ok [INFO] [stdout] test parser::operands::tests::test_parse_binary_op_single_char ... ok [INFO] [stdout] test parser::number::tests::test_parse_negative_decimal ... ok [INFO] [stdout] test parser::number::tests::test_parse_number_with_remainder ... ok [INFO] [stdout] test parser::operands::tests::test_parse_unary_op_with_remainder ... ok [INFO] [stdout] test parser::statement::tests::test_parse_assignment_without_let ... 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::statement::tests::test_parse_let_statement_fails_without_equals ... 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_optional_semicolon ... ok [INFO] [stdout] test parser::statement::tests::test_parse_let_statement_with_expr ... 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::operands::tests::test_parse_binary_op_double_char ... ok [INFO] [stdout] test parser::statement::tests::test_parse_two_statements_same_line ... ok [INFO] [stdout] test parser::operands::tests::test_parse_binary_op_double_char_not_consumed_as_single ... 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::string::tests::test_parse_interpolated_string_escaped_brace ... 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_quote ... ok [INFO] [stdout] test parser::statement::tests::test_parse_let_statement ... ok [INFO] [stdout] test parser::symbol::tests::test_parse_symbol_identifier ... ok [INFO] [stdout] test repl::tests::test_custom_prompt ... ok [INFO] [stdout] test repl::tests::test_history_path_from_env_override ... ok [INFO] [stdout] test repl::tests::test_default_prompt ... ok [INFO] [stdout] test repl::tests::test_history_path_from_falls_back_to_default ... ok [INFO] [stdout] test parser::string::tests::test_parse_string_with_escaped_backslash ... ok [INFO] [stdout] test repl::tests::test_history_round_trip ... ok [INFO] [stdout] test repl::slash_commands::tests::test_slash_commands_lookup ... ok [INFO] [stdout] test parser::statement::tests::test_parse_expr_statement_binary_with_semicolon ... ok [INFO] [stdout] test runtime::functions::tests::test_builtin_function_call ... ok [INFO] [stdout] test parser::statement::tests::test_parse_expr_statement_number ... ok [INFO] [stdout] test repl::tests::test_no_history_path_writes_nothing ... ok [INFO] [stdout] test repl::tests::test_save_creates_parent_dirs ... ok [INFO] [stdout] test runtime::functions::tests::test_accepts ... ok [INFO] [stdout] test parser::string::tests::test_parse_simple_string ... ok [INFO] [stdout] test repl::tests::test_missing_history_file_is_ok ... ok [INFO] [stdout] test runtime::tests::test_builtin_typeof_returns_type ... ok [INFO] [stdout] test runtime::tests::test_builtin_typeof_propagates_none_error ... ok [INFO] [stdout] test runtime::tests::test_builtin_typeof_arity_mismatch ... ok [INFO] [stdout] test runtime::tests::test_type_of_array ... ok [INFO] [stdout] test runtime::tests::test_type_of_number ... 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_string ... ok [INFO] [stdout] test runtime::tests::test_type_of_boolean ... ok [INFO] [stdout] test runtime::tests::test_type_of_symbol ... ok [INFO] [stdout] test runtime::tests::test_typeof_registered_as_builtin ... ok [INFO] [stdout] test runtime::tests::test_type_of_type_is_value ... ok [INFO] [stdout] test runtime::tests::test_value_type_display ... ok [INFO] [stderr] Running unittests src/bin/flt.rs (/opt/rustwide/target/release/deps/flt-cee697ddea8a5e1a) [INFO] [stdout] test eval::tests::test_eval_binary_div ... ok [INFO] [stdout] test eval::tests::test_eval_binary_div_by_zero ... ok [INFO] [stdout] test parser::function::tests::test_parse_positional_after_kv_fails ... ok [INFO] [stdout] test parser::function::tests::test_parse_round ... ok [INFO] [stdout] test parser::number::tests::test_parse_integer ... ok [INFO] [stdout] test runtime::tests::test_type_of_unit ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 187 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.06s [INFO] [stdout] [INFO] [stdout] [INFO] [stderr] Running tests/cli.rs (/opt/rustwide/target/release/deps/cli-cdf8fb596937d244) [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] [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/deps/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/deps/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 27) ... ok [INFO] [stdout] test src/lib.rs - ast (line 111) ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.34s [INFO] [stdout] [INFO] running `Command { std: "docker" "inspect" "cd37981729045c458c09515eaf106795962ffc4a0e5409f79e67dd57e08f4fca", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "cd37981729045c458c09515eaf106795962ffc4a0e5409f79e67dd57e08f4fca", kill_on_drop: false }` [INFO] [stdout] cd37981729045c458c09515eaf106795962ffc4a0e5409f79e67dd57e08f4fca