[INFO] fetching crate flt 0.1.0... [INFO] testing flt-0.1.0 against try#dec9417b8611e34e787a3e4c37686b5131f9e5c5 for pr-154210-1 [INFO] extracting crate flt 0.1.0 into /workspace/builds/worker-2-tc2/source [INFO] started tweaking crates.io crate flt 0.1.0 [INFO] removed 0 missing tests [INFO] finished tweaking crates.io crate flt 0.1.0 [INFO] tweaked toml for crates.io crate flt 0.1.0 written to /workspace/builds/worker-2-tc2/source/Cargo.toml [INFO] validating manifest of crates.io crate flt 0.1.0 on toolchain dec9417b8611e34e787a3e4c37686b5131f9e5c5 [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+dec9417b8611e34e787a3e4c37686b5131f9e5c5" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }` [INFO] crate crates.io crate flt 0.1.0 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" "+dec9417b8611e34e787a3e4c37686b5131f9e5c5" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc2/source:/opt/rustwide/workdir:ro,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" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+dec9417b8611e34e787a3e4c37686b5131f9e5c5" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }` [INFO] [stdout] 6ce00d50c70a2f318b9d1ef96c0608402ff59a3b7edda12d43db53a4bd7acfd5 [INFO] running `Command { std: "docker" "start" "-a" "6ce00d50c70a2f318b9d1ef96c0608402ff59a3b7edda12d43db53a4bd7acfd5", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "6ce00d50c70a2f318b9d1ef96c0608402ff59a3b7edda12d43db53a4bd7acfd5", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "6ce00d50c70a2f318b9d1ef96c0608402ff59a3b7edda12d43db53a4bd7acfd5", kill_on_drop: false }` [INFO] [stdout] 6ce00d50c70a2f318b9d1ef96c0608402ff59a3b7edda12d43db53a4bd7acfd5 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc2/source:/opt/rustwide/workdir:ro,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" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+dec9417b8611e34e787a3e4c37686b5131f9e5c5" "build" "--frozen" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] 1e09ec4f02e6e0149986c5ea52e4b88af2722f10c899414bffe360c6cda2bee9 [INFO] running `Command { std: "docker" "start" "-a" "1e09ec4f02e6e0149986c5ea52e4b88af2722f10c899414bffe360c6cda2bee9", kill_on_drop: false }` [INFO] [stderr] Compiling proc-macro2 v1.0.92 [INFO] [stderr] Compiling unicode-ident v1.0.14 [INFO] [stderr] Compiling libc v0.2.182 [INFO] [stderr] Compiling num-traits v0.2.19 [INFO] [stderr] Compiling regex-syntax v0.8.5 [INFO] [stderr] Compiling anstream v0.6.18 [INFO] [stderr] Compiling nix v0.30.1 [INFO] [stderr] Compiling rustix v1.1.4 [INFO] [stderr] Compiling bigdecimal v0.4.10 [INFO] [stderr] Compiling clap_lex v0.7.4 [INFO] [stderr] Compiling eyre v0.6.12 [INFO] [stderr] Compiling thiserror v2.0.9 [INFO] [stderr] Compiling clap_builder v4.5.23 [INFO] [stderr] Compiling indenter v0.3.4 [INFO] [stderr] Compiling humantime v2.1.0 [INFO] [stderr] Compiling unicode-width v0.2.0 [INFO] [stderr] Compiling quote v1.0.37 [INFO] [stderr] Compiling nom v8.0.0 [INFO] [stderr] Compiling syn v2.0.91 [INFO] [stderr] Compiling num-integer v0.1.46 [INFO] [stderr] Compiling num-bigint v0.4.6 [INFO] [stderr] Compiling dirs-sys-next v0.1.2 [INFO] [stderr] Compiling fd-lock v4.0.4 [INFO] [stderr] Compiling regex-automata v0.4.9 [INFO] [stderr] Compiling dirs-next v2.0.0 [INFO] [stderr] Compiling rustyline v17.0.2 [INFO] [stderr] Compiling thiserror-impl v2.0.9 [INFO] [stderr] Compiling clap_derive v4.5.18 [INFO] [stderr] Compiling regex v1.11.1 [INFO] [stderr] Compiling env_filter v0.1.3 [INFO] [stderr] Compiling env_logger v0.11.6 [INFO] [stderr] Compiling clap v4.5.23 [INFO] [stderr] Compiling flt v0.1.0 (/opt/rustwide/workdir) [INFO] [stderr] Finished `dev` profile [unoptimized + debuginfo] target(s) in 46.32s [INFO] running `Command { std: "docker" "inspect" "1e09ec4f02e6e0149986c5ea52e4b88af2722f10c899414bffe360c6cda2bee9", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "1e09ec4f02e6e0149986c5ea52e4b88af2722f10c899414bffe360c6cda2bee9", kill_on_drop: false }` [INFO] [stdout] 1e09ec4f02e6e0149986c5ea52e4b88af2722f10c899414bffe360c6cda2bee9 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc2/source:/opt/rustwide/workdir:ro,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" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+dec9417b8611e34e787a3e4c37686b5131f9e5c5" "test" "--frozen" "--no-run" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] 3801d361b254fe3a66b5a8d03bdb3b09820372aa7200a56dae29009f79622cf5 [INFO] running `Command { std: "docker" "start" "-a" "3801d361b254fe3a66b5a8d03bdb3b09820372aa7200a56dae29009f79622cf5", kill_on_drop: false }` [INFO] [stderr] Compiling syn v2.0.91 [INFO] [stderr] Compiling memchr v2.7.4 [INFO] [stderr] Compiling rustix v0.38.42 [INFO] [stderr] Compiling convert_case v0.10.0 [INFO] [stderr] Compiling serde v1.0.216 [INFO] [stderr] Compiling linux-raw-sys v0.4.14 [INFO] [stderr] Compiling serde_json v1.0.134 [INFO] [stderr] Compiling bytecount v0.6.8 [INFO] [stderr] Compiling ryu v1.0.18 [INFO] [stderr] Compiling either v1.13.0 [INFO] [stderr] Compiling itoa v1.0.14 [INFO] [stderr] Compiling aho-corasick v1.1.3 [INFO] [stderr] Compiling nom v8.0.0 [INFO] [stderr] Compiling bstr v1.11.1 [INFO] [stderr] Compiling crossbeam-epoch v0.9.18 [INFO] [stderr] Compiling peg-runtime v0.6.3 [INFO] [stderr] Compiling peg-macros v0.6.3 [INFO] [stderr] Compiling crossbeam-deque v0.8.6 [INFO] [stderr] Compiling terminal_size v0.4.1 [INFO] [stderr] Compiling clap_builder v4.5.23 [INFO] [stderr] Compiling anyhow v1.0.95 [INFO] [stderr] Compiling smawk v0.3.2 [INFO] [stderr] Compiling regex-automata v0.4.9 [INFO] [stderr] Compiling peg v0.6.3 [INFO] [stderr] Compiling textwrap v0.16.1 [INFO] [stderr] Compiling rustyline v17.0.2 [INFO] [stderr] Compiling parking_lot_core v0.9.10 [INFO] [stderr] Compiling itertools v0.14.0 [INFO] [stderr] Compiling nom_locate v5.0.0 [INFO] [stderr] Compiling dtor-proc-macro v0.0.6 [INFO] [stderr] Compiling regex v1.11.1 [INFO] [stderr] Compiling env_filter v0.1.3 [INFO] [stderr] Compiling globset v0.4.15 [INFO] [stderr] Compiling env_logger v0.11.6 [INFO] [stderr] Compiling inflections v1.1.1 [INFO] [stderr] Compiling dtor v0.1.1 [INFO] [stderr] Compiling parking_lot v0.12.3 [INFO] [stderr] Compiling ignore v0.4.23 [INFO] [stderr] Compiling console v0.16.2 [INFO] [stderr] Compiling signal-hook-registry v1.4.2 [INFO] [stderr] Compiling socket2 v0.5.8 [INFO] [stderr] Compiling mio v1.0.3 [INFO] [stderr] Compiling derive_more-impl v2.1.1 [INFO] [stderr] Compiling serde_derive v1.0.216 [INFO] [stderr] Compiling sealed v0.6.0 [INFO] [stderr] Compiling thiserror-impl v2.0.9 [INFO] [stderr] Compiling clap_derive v4.5.18 [INFO] [stderr] Compiling futures-macro v0.3.31 [INFO] [stderr] Compiling typed-builder-macro v0.23.2 [INFO] [stderr] Compiling synthez-core v0.4.0 [INFO] [stderr] Compiling futures-util v0.3.31 [INFO] [stderr] Compiling synthez-codegen v0.4.0 [INFO] [stderr] Compiling synthez v0.4.0 [INFO] [stderr] Compiling pin-project-internal v1.1.7 [INFO] [stderr] Compiling ref-cast-impl v1.0.25 [INFO] [stderr] Compiling thiserror v2.0.9 [INFO] [stderr] Compiling globwalk v0.9.1 [INFO] [stderr] Compiling ref-cast v1.0.25 [INFO] [stderr] Compiling typed-builder v0.23.2 [INFO] [stderr] Compiling smart-default v0.7.1 [INFO] [stderr] Compiling tokio-macros v2.4.0 [INFO] [stderr] Compiling ctor-proc-macro v0.0.7 [INFO] [stderr] Compiling inventory v0.3.16 [INFO] [stderr] Compiling bytes v1.9.0 [INFO] [stderr] Compiling ctor v0.6.3 [INFO] [stderr] Compiling clap v4.5.23 [INFO] [stderr] Compiling flt v0.1.0 (/opt/rustwide/workdir) [INFO] [stderr] Compiling tokio v1.42.0 [INFO] [stderr] Compiling pin-project v1.1.7 [INFO] [stderr] Compiling derive_more v2.1.1 [INFO] [stderr] Compiling cucumber-expressions v0.5.0 [INFO] [stderr] Compiling futures-executor v0.3.31 [INFO] [stderr] Compiling cucumber-codegen v0.22.1 [INFO] [stderr] Compiling futures v0.3.31 [INFO] [stderr] Compiling gherkin v0.15.0 [INFO] [stderr] Compiling cucumber v0.22.1 [INFO] [stderr] Finished `test` profile [unoptimized + debuginfo] target(s) in 1m 54s [INFO] running `Command { std: "docker" "inspect" "3801d361b254fe3a66b5a8d03bdb3b09820372aa7200a56dae29009f79622cf5", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "3801d361b254fe3a66b5a8d03bdb3b09820372aa7200a56dae29009f79622cf5", kill_on_drop: false }` [INFO] [stdout] 3801d361b254fe3a66b5a8d03bdb3b09820372aa7200a56dae29009f79622cf5 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc2/source:/opt/rustwide/workdir:ro,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" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+dec9417b8611e34e787a3e4c37686b5131f9e5c5" "test" "--frozen", kill_on_drop: false }` [INFO] [stdout] 30aa304e45b893a34675966700a7ca4e7afc4dbe8cc36c91b610580c5e540d45 [INFO] running `Command { std: "docker" "start" "-a" "30aa304e45b893a34675966700a7ca4e7afc4dbe8cc36c91b610580c5e540d45", kill_on_drop: false }` [INFO] [stderr] Finished `test` profile [unoptimized + debuginfo] target(s) in 0.24s [INFO] [stderr] Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/flt-758f97b49b71606a) [INFO] [stdout] [INFO] [stdout] running 138 tests [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_ident ... ok [INFO] [stdout] test ast::expr::tests::test_display_binary_expr ... ok [INFO] [stdout] test ast::expr::tests::test_display_literal_number ... ok [INFO] [stdout] test ast::expr::tests::test_display_literal_string ... ok [INFO] [stdout] test ast::expr::tests::test_display_literal_symbol ... ok [INFO] [stdout] test ast::expr::tests::test_display_nested ... 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::literal::tests::test_literal_from_i64 ... 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 eval::tests::test_eval_binary_add ... ok [INFO] [stdout] test eval::tests::test_eval_binary_concat ... ok [INFO] [stdout] test eval::tests::test_eval_binary_and ... ok [INFO] [stdout] test eval::tests::test_eval_binary_concat_chain ... ok [INFO] [stdout] test eval::tests::test_eval_binary_div_by_zero ... ok [INFO] [stdout] test eval::tests::test_eval_binary_concat_coerces_to_string ... ok [INFO] [stdout] test eval::tests::test_eval_binary_mul ... ok [INFO] [stdout] test eval::tests::test_eval_binary_eq ... ok [INFO] [stdout] test eval::tests::test_eval_binary_div ... ok [INFO] [stdout] test eval::tests::test_eval_binary_gt_lt_gte_lte ... ok [INFO] [stdout] test eval::tests::test_eval_binary_or ... ok [INFO] [stdout] test eval::tests::test_eval_binary_ne ... ok [INFO] [stdout] test eval::tests::test_eval_binary_xor ... ok [INFO] [stdout] test eval::tests::test_eval_binary_pipe_unsupported ... ok [INFO] [stdout] test eval::tests::test_eval_binary_sub ... 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_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_if_expr_without_else_returns_unit ... 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_literal_string ... ok [INFO] [stdout] test eval::tests::test_eval_literal_symbol ... 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_unary_minus ... ok [INFO] [stdout] test eval::tests::test_eval_unary_minus_invalid_type ... 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_not_true ... ok [INFO] [stdout] test eval::tests::test_eval_unary_plus ... 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 parser::array::tests::test_parse_single_element ... ok [INFO] [stdout] test parser::array::tests::test_parse_trailing_comma ... 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::boolean::tests::test_parse_true ... 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_function_call ... ok [INFO] [stdout] test parser::expr::tests::test_parse_function_call_kv_only ... ok [INFO] [stdout] test eval::tests::test_eval_one_plus_one_returns_two ... ok [INFO] [stdout] test parser::expr::tests::test_parse_if_expr_block_and_optional_else ... ok [INFO] [stdout] test parser::expr::tests::test_parse_number ... ok [INFO] [stdout] test parser::expr::tests::test_parse_function_call_with_kv_pairs ... 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::expr::tests::test_parse_parenthesized ... 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_concat ... ok [INFO] [stdout] test parser::expr::tests::test_parse_string_interpolation ... ok [INFO] [stdout] test parser::expr::tests::test_parse_symbol ... ok [INFO] [stdout] test parser::expr::tests::test_parse_unary ... ok [INFO] [stdout] test parser::function::tests::test_parse_ceil ... 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::function::tests::test_parse_round ... 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::function::tests::test_parse_with_trailing_kv_pairs ... ok [INFO] [stdout] test parser::function::tests::test_parse_without_parens_multiple_args ... ok [INFO] [stdout] test parser::function::tests::test_parse_trim ... 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::identifier::tests::test_parse_identifier ... ok [INFO] [stdout] test parser::keyword::tests::test_keyword_word_boundary ... 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::literal::tests::test_parse_boolean_literal ... ok [INFO] [stdout] test parser::literal::tests::test_parse_literal_with_remainder ... ok [INFO] [stdout] test parser::literal::tests::test_parse_number_literal ... ok [INFO] [stdout] test parser::literal::tests::test_parse_string_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::map::tests::test_parse_multiple_entries ... ok [INFO] [stdout] test parser::map::tests::test_parse_single_bare_key_number_value ... ok [INFO] [stdout] test parser::map::tests::test_parse_single_bare_key_string_value ... ok [INFO] [stdout] test parser::map::tests::test_parse_trailing_comma ... ok [INFO] [stdout] test parser::number::tests::test_parse_decimal ... 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::number::tests::test_parse_negative_decimal ... ok [INFO] [stdout] test parser::number::tests::test_parse_negative_integer ... ok [INFO] [stdout] test parser::number::tests::test_parse_number_with_remainder ... ok [INFO] [stdout] test parser::number::tests::test_parse_positive_decimal ... 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::operands::tests::test_parse_binary_op_double_char_not_consumed_as_single ... ok [INFO] [stdout] test parser::operands::tests::test_parse_binary_op_single_char ... 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_unary_op_with_remainder ... ok [INFO] [stdout] test parser::statement::tests::test_parse_assignment_without_let ... ok [INFO] [stdout] test parser::statement::tests::test_parse_expr_statement_binary_with_semicolon ... ok [INFO] [stdout] test parser::statement::tests::test_parse_expr_statement_number ... ok [INFO] [stdout] test parser::statement::tests::test_parse_let_statement ... 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::statement::tests::test_parse_two_statements_same_line ... 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::string::tests::test_parse_simple_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 parser::symbol::tests::test_parse_symbol_string ... ok [INFO] [stdout] test runtime::functions::tests::test_accepts ... ok [INFO] [stdout] test ast::expr::tests::test_display_if_expr ... ok [INFO] [stdout] test parser::symbol::tests::test_parse_symbol_identifier ... ok [INFO] [stderr] Running unittests src/bin/flt.rs (/opt/rustwide/target/debug/deps/flt-562ceff8a838b84d) [INFO] [stdout] test parser::expr::tests::test_parse_identifier ... ok [INFO] [stderr] Running tests/cli.rs (/opt/rustwide/target/debug/deps/cli-7ca3152a8998a833) [INFO] [stdout] [INFO] [stdout] test result: ok. 138 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.08s [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] [stdout] [INFO] [stdout] running 0 tests [INFO] [stdout] [INFO] [stderr] Running tests/features.rs (/opt/rustwide/target/debug/deps/features-2ee8fd989fed73b5) [INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s [INFO] [stdout] [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 { value: BigDecimal(sign=Plus, scale=0, digits=[1]) })), Add, Literal(Number(Numeric { value: 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 { value: BigDecimal(sign=Plus, scale=0, digits=[10]) })), Sub, Literal(Number(Numeric { value: 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 { value: BigDecimal(sign=Plus, scale=0, digits=[4]) })), Mul, Literal(Number(Numeric { value: 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 { value: BigDecimal(sign=Plus, scale=0, digits=[20]) })), Div, Literal(Number(Numeric { value: 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 { value: BigDecimal(sign=Plus, scale=0, digits=[1]) })), Add, BinaryExpr(Literal(Number(Numeric { value: BigDecimal(sign=Plus, scale=0, digits=[2]) })), Mul, Literal(Number(Numeric { value: 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 { value: BigDecimal(sign=Plus, scale=0, digits=[1]) })), Add, Literal(Number(Numeric { value: BigDecimal(sign=Plus, scale=0, digits=[2]) })))), Mul, Literal(Number(Numeric { value: 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 { value: 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 { value: 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 { value: BigDecimal(sign=Plus, scale=0, digits=[1]) })), Add, Literal(Number(Numeric { value: 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 { value: BigDecimal(sign=Plus, scale=0, digits=[1]) })), Literal(Number(Numeric { value: 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: 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: 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 { value: 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 { value: 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 { value: 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] 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 { value: BigDecimal(sign=Plus, scale=0, digits=[1]) })), else_branch: Some(Literal(Number(Numeric { value: 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 { value: BigDecimal(sign=Plus, scale=0, digits=[1]) })), else_branch: Some(Literal(Number(Numeric { value: 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 { value: 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 { value: BigDecimal(sign=Plus, scale=0, digits=[1]) })), else_branch: Some(Literal(Number(Numeric { value: 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] 12 features [INFO] [stdout] 68 scenarios (66 passed, 2 skipped) [INFO] [stdout] 209 steps (207 passed, 2 skipped) [INFO] [stderr] Running tests/repl.rs (/opt/rustwide/target/debug/deps/repl-545dfd84ddbd6f72) [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] [Summary] [INFO] [stdout] 1 feature [INFO] [stdout] 1 scenario (1 passed) [INFO] [stdout] 3 steps (3 passed) [INFO] [stderr] Doc-tests flt [INFO] [stdout] [INFO] [stdout] running 2 tests [INFO] [stdout] test src/lib.rs - ast (line 23) ... ok [INFO] [stdout] test src/lib.rs - ast (line 110) ... ok [INFO] [stdout] [INFO] [stdout] test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.39s [INFO] [stdout] [INFO] running `Command { std: "docker" "inspect" "30aa304e45b893a34675966700a7ca4e7afc4dbe8cc36c91b610580c5e540d45", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "30aa304e45b893a34675966700a7ca4e7afc4dbe8cc36c91b610580c5e540d45", kill_on_drop: false }` [INFO] [stdout] 30aa304e45b893a34675966700a7ca4e7afc4dbe8cc36c91b610580c5e540d45