[INFO] cloning repository https://github.com/mpowaga/raytracer-challenge
[INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/mpowaga/raytracer-challenge" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fmpowaga%2Fraytracer-challenge", kill_on_drop: false }`
[INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fmpowaga%2Fraytracer-challenge'...
[INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }`
[INFO] [stdout] a329974ad9585845e05490a0998a109b92091173
[INFO] testing mpowaga/raytracer-challenge against beta-2026-04-21 for beta-1.96-2
[INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2Fmpowaga%2Fraytracer-challenge" "/workspace/builds/worker-4-tc2/source", kill_on_drop: false }`
[INFO] [stderr] Cloning into '/workspace/builds/worker-4-tc2/source'...
[INFO] [stderr] done.
[INFO] started tweaking git repo https://github.com/mpowaga/raytracer-challenge
[INFO] removed 0 missing tests
[INFO] finished tweaking git repo https://github.com/mpowaga/raytracer-challenge
[INFO] tweaked toml for git repo https://github.com/mpowaga/raytracer-challenge written to /workspace/builds/worker-4-tc2/source/Cargo.toml
[INFO] validating manifest of git repo https://github.com/mpowaga/raytracer-challenge on toolchain beta-2026-04-21
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+beta-2026-04-21" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate git repo https://github.com/mpowaga/raytracer-challenge 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" "+beta-2026-04-21" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-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" "+beta-2026-04-21" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] [stdout] e293e17deead661235a9a104607d928086c97dbe5793820ca49f844b8ef839ce
[INFO] running `Command { std: "docker" "start" "-a" "e293e17deead661235a9a104607d928086c97dbe5793820ca49f844b8ef839ce", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "e293e17deead661235a9a104607d928086c97dbe5793820ca49f844b8ef839ce", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "e293e17deead661235a9a104607d928086c97dbe5793820ca49f844b8ef839ce", kill_on_drop: false }`
[INFO] [stdout] e293e17deead661235a9a104607d928086c97dbe5793820ca49f844b8ef839ce
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-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=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-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" "+beta-2026-04-21" "build" "--frozen" "--message-format=json", kill_on_drop: false }`
[INFO] [stdout] 86c849c29649b2632877f03bc5bbe09c3ac9ff0ada95217e5c685b15aa4225f9
[INFO] running `Command { std: "docker" "start" "-a" "86c849c29649b2632877f03bc5bbe09c3ac9ff0ada95217e5c685b15aa4225f9", kill_on_drop: false }`
[INFO] [stderr]    Compiling memchr v2.7.2
[INFO] [stderr]    Compiling crossbeam-utils v0.8.19
[INFO] [stderr]    Compiling serde v1.0.198
[INFO] [stderr]    Compiling rustix v0.38.32
[INFO] [stderr]    Compiling bytecount v0.6.8
[INFO] [stderr]    Compiling sealed v0.5.0
[INFO] [stderr]    Compiling serde_json v1.0.116
[INFO] [stderr]    Compiling futures-core v0.3.30
[INFO] [stderr]    Compiling bitflags v2.5.0
[INFO] [stderr]    Compiling itoa v1.0.11
[INFO] [stderr]    Compiling ryu v1.0.17
[INFO] [stderr]    Compiling futures-sink v0.3.30
[INFO] [stderr]    Compiling linux-raw-sys v0.4.13
[INFO] [stderr]    Compiling either v1.11.0
[INFO] [stderr]    Compiling utf8parse v0.2.1
[INFO] [stderr]    Compiling aho-corasick v1.1.3
[INFO] [stderr]    Compiling anstyle-parse v0.2.3
[INFO] [stderr]    Compiling synthez-core v0.3.1
[INFO] [stderr]    Compiling crossbeam-epoch v0.9.18
[INFO] [stderr]    Compiling bstr v1.9.1
[INFO] [stderr]    Compiling nom v7.1.3
[INFO] [stderr]    Compiling futures-channel v0.3.30
[INFO] [stderr]    Compiling derive_more v0.99.17
[INFO] [stderr]    Compiling anstyle-query v1.0.2
[INFO] [stderr]    Compiling peg-runtime v0.6.3
[INFO] [stderr]    Compiling anstyle v1.0.6
[INFO] [stderr]    Compiling regex-syntax v0.7.5
[INFO] [stderr]    Compiling thiserror v1.0.58
[INFO] [stderr]    Compiling regex-automata v0.4.6
[INFO] [stderr]    Compiling colorchoice v1.0.0
[INFO] [stderr]    Compiling anstream v0.6.13
[INFO] [stderr]    Compiling nom_locate v4.2.0
[INFO] [stderr]    Compiling futures-util v0.3.30
[INFO] [stderr]    Compiling synthez-codegen v0.3.1
[INFO] [stderr]    Compiling peg-macros v0.6.3
[INFO] [stderr]    Compiling terminal_size v0.3.0
[INFO] [stderr]    Compiling crossbeam-deque v0.8.5
[INFO] [stderr]    Compiling typed-builder-macro v0.15.2
[INFO] [stderr]    Compiling regex v1.10.4
[INFO] [stderr]    Compiling gherkin v0.14.0
[INFO] [stderr]    Compiling globset v0.4.14
[INFO] [stderr]    Compiling thiserror-impl v1.0.58
[INFO] [stderr]    Compiling clap_lex v0.7.0
[INFO] [stderr]    Compiling smallvec v1.13.2
[INFO] [stderr]    Compiling smawk v0.3.2
[INFO] [stderr]    Compiling anyhow v1.0.82
[INFO] [stderr]    Compiling unicode-linebreak v0.1.5
[INFO] [stderr]    Compiling ignore v0.4.22
[INFO] [stderr]    Compiling textwrap v0.16.1
[INFO] [stderr]    Compiling futures-executor v0.3.30
[INFO] [stderr]    Compiling lazy-regex-proc_macros v3.1.0
[INFO] [stderr]    Compiling parking_lot_core v0.9.9
[INFO] [stderr]    Compiling clap_builder v4.5.2
[INFO] [stderr]    Compiling clap_derive v4.5.4
[INFO] [stderr]    Compiling cucumber-expressions v0.3.0
[INFO] [stderr]    Compiling typed-builder v0.15.2
[INFO] [stderr]    Compiling peg v0.6.3
[INFO] [stderr]    Compiling synthez v0.3.1
[INFO] [stderr]    Compiling itertools v0.12.1
[INFO] [stderr]    Compiling inflections v1.1.1
[INFO] [stderr]    Compiling globwalk v0.8.1
[INFO] [stderr]    Compiling console v0.15.8
[INFO] [stderr]    Compiling lazy-regex v3.1.0
[INFO] [stderr]    Compiling parking_lot v0.12.1
[INFO] [stderr]    Compiling futures v0.3.30
[INFO] [stderr]    Compiling smart-default v0.7.1
[INFO] [stderr]    Compiling async-trait v0.1.80
[INFO] [stderr]    Compiling signal-hook-registry v1.4.1
[INFO] [stderr]    Compiling mio v0.8.11
[INFO] [stderr]    Compiling cucumber-codegen v0.20.2
[INFO] [stderr]    Compiling inventory v0.3.15
[INFO] [stderr]    Compiling drain_filter_polyfill v0.1.3
[INFO] [stderr]    Compiling tokio v1.37.0
[INFO] [stderr]    Compiling clap v4.5.4
[INFO] [stderr]    Compiling cucumber v0.20.2
[INFO] [stderr]    Compiling raytracer v0.1.0 (/opt/rustwide/workdir)
[INFO] [stderr]     Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 19s
[INFO] running `Command { std: "docker" "inspect" "86c849c29649b2632877f03bc5bbe09c3ac9ff0ada95217e5c685b15aa4225f9", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "86c849c29649b2632877f03bc5bbe09c3ac9ff0ada95217e5c685b15aa4225f9", kill_on_drop: false }`
[INFO] [stdout] 86c849c29649b2632877f03bc5bbe09c3ac9ff0ada95217e5c685b15aa4225f9
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-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=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-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" "+beta-2026-04-21" "test" "--frozen" "--no-run" "--message-format=json", kill_on_drop: false }`
[INFO] [stdout] 1dc7e1f03c169bf0727a7c7619fe2d0c52833fa26f8e185bb14eef65a69c1b17
[INFO] running `Command { std: "docker" "start" "-a" "1dc7e1f03c169bf0727a7c7619fe2d0c52833fa26f8e185bb14eef65a69c1b17", kill_on_drop: false }`
[INFO] [stderr]    Compiling raytracer v0.1.0 (/opt/rustwide/workdir)
[INFO] [stderr]     Finished `test` profile [unoptimized + debuginfo] target(s) in 32.90s
[INFO] running `Command { std: "docker" "inspect" "1dc7e1f03c169bf0727a7c7619fe2d0c52833fa26f8e185bb14eef65a69c1b17", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "1dc7e1f03c169bf0727a7c7619fe2d0c52833fa26f8e185bb14eef65a69c1b17", kill_on_drop: false }`
[INFO] [stdout] 1dc7e1f03c169bf0727a7c7619fe2d0c52833fa26f8e185bb14eef65a69c1b17
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-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=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-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" "+beta-2026-04-21" "test" "--frozen", kill_on_drop: false }`
[INFO] [stdout] a30c66deaa2af6d0d8774a9978b654552b2d237d73e9630322d9da82997f8e81
[INFO] running `Command { std: "docker" "start" "-a" "a30c66deaa2af6d0d8774a9978b654552b2d237d73e9630322d9da82997f8e81", kill_on_drop: false }`
[INFO] [stderr]     Finished `test` profile [unoptimized + debuginfo] target(s) in 0.21s
[INFO] [stderr]      Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/raytracer-7757bdd41f69a0fe)
[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 unittests src/main.rs (/opt/rustwide/target/debug/deps/raytracer-ba1573125a20fc02)
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stderr]      Running tests/canvas.rs (/opt/rustwide/target/debug/deps/canvas-e4bacf2e7dd4ac01)
[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/main.rs (/opt/rustwide/target/debug/deps/main-063299ea7d2c0fac)
[INFO] [stdout] Feature: Tuples feature
[INFO] [stdout]   Scenario: A tuple with w=1 is a point
[INFO] [stdout]    ✔  Given a ← tuple(4.3, -4.2, 3.1, 1.0)
[INFO] [stdout]    ✔  Then a.x = 4.3
[INFO] [stdout]    ✔  And a.y = -4.2
[INFO] [stdout]    ✔  And a.z = 3.1
[INFO] [stdout]    ✔  And a.w = 1.0
[INFO] [stdout]    ✔  And a is a point
[INFO] [stdout]   Scenario: A tuple with w=0 is a vector
[INFO] [stdout]    ✔  Given a ← tuple(4.3, -4.2, 3.1, 0.0)
[INFO] [stdout]    ✔  Then a.x = 4.3
[INFO] [stdout]    ✔  And a.y = -4.2
[INFO] [stdout]    ✔  And a.z = 3.1
[INFO] [stdout]    ✔  And a.w = 0.0
[INFO] [stdout]    ✔  And a is not a point
[INFO] [stdout]    ✔  And a is a vector
[INFO] [stdout]   Scenario: point() creates tuples with w=1
[INFO] [stdout]    ✔  Given p ← point(4, -4, 3)
[INFO] [stdout]    ✔  Then p = tuple(4, -4, 3, 1)
[INFO] [stdout]   Scenario: vector() creates tuples with w=0
[INFO] [stdout]    ✔  Given p ← vector(4, -4, 3)
[INFO] [stdout]    ✔  Then p = tuple(4, -4, 3, 0)
[INFO] [stdout]   Scenario: Adding two tuples
[INFO] [stdout]    ✔  Given a1 ← tuple(3, -2, 5, 1)
[INFO] [stdout]    ✔  And a2 ← tuple(-2, 3, 1, 0)
[INFO] [stdout]    ✔  Then a1 + a2 = tuple(1, 1, 6, 1)
[INFO] [stdout]   Scenario: Subtracting two points
[INFO] [stdout]    ✔  Given p1 ← point(3, 2, 1)
[INFO] [stdout]    ✔  And p2 ← point(5, 6, 7)
[INFO] [stdout]    ✔  Then p1 - p2 = vector(-2, -4, -6)
[INFO] [stdout]   Scenario: Subtracting a vector from a point
[INFO] [stdout]    ✔  Given p ← point(3, 2, 1)
[INFO] [stdout]    ✔  And v ← vector(5, 6, 7)
[INFO] [stdout]    ✔  Then p - v = point(-2, -4, -6)
[INFO] [stdout]   Scenario: Subtracting two vectors
[INFO] [stdout]    ✔  Given v1 ← vector(3, 2, 1)
[INFO] [stdout]    ✔  And v2 ← vector(5, 6, 7)
[INFO] [stdout]    ✔  Then v1 - v2 = vector(-2, -4, -6)
[INFO] [stdout]   Scenario: Subtracting a vector from the zero vector
[INFO] [stdout]    ✔  Given zero ← vector(0, 0, 0)
[INFO] [stdout]    ✔  And v ← vector(1, -2, 3)
[INFO] [stdout]    ✔  Then zero - v = vector(-1, 2, -3)
[INFO] [stdout]   Scenario: Negating a tuple
[INFO] [stdout]    ✔  Given a ← tuple(1, -2, 3, -4)
[INFO] [stdout]    ✔  Then - a = tuple(-1, 2, -3, 4)
[INFO] [stdout]   Scenario: Multiplying a tuple by a scalar
[INFO] [stdout]    ✔  Given a ← tuple(1, -2, 3, -4)
[INFO] [stdout]    ✔  Then a * 3.5 = tuple(3.5, -7, 10.5, -14)
[INFO] [stdout]   Scenario: Multiplying a tuple by a fraction
[INFO] [stdout]    ✔  Given a ← tuple(1, -2, 3, -4)
[INFO] [stdout]    ✔  Then a * 0.5 = tuple(0.5, -1, 1.5, -2)
[INFO] [stdout]   Scenario: Dividing a tuple by a scalar
[INFO] [stdout]    ✔  Given a ← tuple(1, -2, 3, -4)
[INFO] [stdout]    ✔  Then a / 2 = tuple(0.5, -1, 1.5, -2)
[INFO] [stdout]   Scenario: Computing the magnitude of vector(1, 0, 0)
[INFO] [stdout]    ✔  Given v ← vector(1, 0, 0)
[INFO] [stdout]    ✔  Then magnitude(v) = 1
[INFO] [stdout]   Scenario: Computing the magnitude of vector(0, 1, 0)
[INFO] [stdout]    ✔  Given v ← vector(0, 1, 0)
[INFO] [stdout]    ✔  Then magnitude(v) = 1
[INFO] [stdout]   Scenario: Computing the magnitude of vector(0, 0, 1)
[INFO] [stdout]    ✔  Given v ← vector(0, 0, 1)
[INFO] [stdout]    ✔  Then magnitude(v) = 1
[INFO] [stdout]   Scenario: Computing the magnitude of vector(1, 2, 3)
[INFO] [stdout]    ✔  Given v ← vector(1, 2, 3)
[INFO] [stdout]    ✔  Then magnitude(v) = √14
[INFO] [stdout]   Scenario: Computing the magnitude of vector(-1, -2, -3)
[INFO] [stdout]    ✔  Given v ← vector(-1, -2, -3)
[INFO] [stdout]    ✔  Then magnitude(v) = √14
[INFO] [stdout]   Scenario: Normalizing vector(4, 0, 0) gives (1, 0, 0)
[INFO] [stdout]    ✔  Given v ← vector(4, 0, 0)
[INFO] [stdout]    ✔  Then normalize(v) = vector(1, 0, 0)
[INFO] [stdout]   Scenario: Normalizing vector(1, 2, 3)
[INFO] [stdout]    ✔  Given v ← vector(1, 2, 3)
[INFO] [stdout]    ✔  Then normalize(v) = vector(1/√14, 2/√14, 3/√14)
[INFO] [stdout]   Scenario: The magnitude of a normalized vector
[INFO] [stdout]    ✔  Given v ← vector(1, 2, 3)
[INFO] [stdout]    ✔  When norm ← normalize(v)
[INFO] [stdout]    ✔  Then magnitude(norm) = 1
[INFO] [stdout]   Scenario: The dot product of two tuples
[INFO] [stdout]    ✔  Given a ← vector(1, 2, 3)
[INFO] [stdout]    ✔  And b ← vector(2, 3, 4)
[INFO] [stdout]    ✔  Then dot(a, b) = 20
[INFO] [stdout]   Scenario: The cross product of two vectors
[INFO] [stdout]    ✔  Given a ← vector(1, 2, 3)
[INFO] [stdout]    ✔  And b ← vector(2, 3, 4)
[INFO] [stdout]    ✔  Then cross(a, b) = vector(-1, 2, -1)
[INFO] [stdout]    ✔  And cross(b, a) = vector(1, -2, 1)
[INFO] [stdout]   Scenario: Colors are (red, green, blue) tuples
[INFO] [stdout]    ✔  Given c ← color(-0.5, 0.4, 1.7)
[INFO] [stdout]    ✔  Then c.red() = -0.5
[INFO] [stdout]    ✔  And c.green() = 0.4
[INFO] [stdout]    ✔  And c.blue() = 1.7
[INFO] [stdout]   Scenario: Adding colors
[INFO] [stdout]    ✔  Given c1 ← color(0.9, 0.6, 0.75)
[INFO] [stdout]    ✔  And c2 ← color(0.7, 0.1, 0.25)
[INFO] [stdout]    ✔  Then c1 + c2 = color(1.6, 0.7, 1.0)
[INFO] [stdout]   Scenario: Subtracting colors
[INFO] [stdout]    ✔  Given c1 ← color(0.9, 0.6, 0.75)
[INFO] [stdout]    ✔  And c2 ← color(0.7, 0.1, 0.25)
[INFO] [stdout]    ✔  Then c1 - c2 = color(0.2, 0.5, 0.5)
[INFO] [stdout]   Scenario: Multiplying a color by a scalar
[INFO] [stdout]    ✔  Given c ← color(0.2, 0.3, 0.4)
[INFO] [stdout]    ✔  Then c * 2 = color(0.4, 0.6, 0.8)
[INFO] [stdout]   Scenario: Multiplying colors
[INFO] [stdout]    ✔  Given c1 ← color(1, 0.2, 0.4)
[INFO] [stdout]    ✔  And c2 ← color(0.9, 1, 0.1)
[INFO] [stdout]    ✔  Then c1 * c2 = color(0.9, 0.2, 0.04)
[INFO] [stdout] [Summary]
[INFO] [stdout] 1 feature
[INFO] [stdout] 28 scenarios (28 passed)
[INFO] [stdout] 79 steps (79 passed)
[INFO] [stdout] Feature: Canvas feature
[INFO] [stdout]   Scenario: 
[INFO] [stdout]    ✔  Given c ← canvas(10, 20)
[INFO] [stdout]    ✔  Then c.width = 10
[INFO] [stdout]    ✔  And c.height = 20
[INFO] [stdout]    ✔  And every pixel of c is color(0, 0, 0)
[INFO] [stdout]   Scenario: Writing pixels to a canvas
[INFO] [stdout]    ✔  Given c ← canvas(10, 20)
[INFO] [stdout]    ✔  And red ← color(1, 0, 0)
[INFO] [stdout]    ✔  When write_pixel(c, 2, 3, red)
[INFO] [stdout]    ✔  Then pixel_at(c, 2, 3) = red
[INFO] [stdout]   Scenario: Constructing the PPM header
[INFO] [stdout]    ✔  Given c ← canvas(5, 3)
[INFO] [stdout]    ✔  When ppm ← canvas_to_ppm(c)
[INFO] [stdout]    ✔  Then lines 1-3 of ppm are
[INFO] [stdout]   Scenario: Constructing the PPM pixel data
[INFO] [stdout]    ✔  Given c ← canvas(5, 3)
[INFO] [stdout]    ✔  And c1 ← color(1.5, 0, 0)
[INFO] [stdout]    ✔  And c2 ← color(0, 0.5, 0)
[INFO] [stdout]    ✔  And c3 ← color(-0.5, 0, 1)
[INFO] [stdout]    ✔  When write_pixel(c, 0, 0, c1)
[INFO] [stdout]    ✔  And write_pixel(c, 2, 1, c2)
[INFO] [stdout]    ✔  And write_pixel(c, 4, 2, c3)
[INFO] [stdout]    ✔  And ppm ← canvas_to_ppm(c)
[INFO] [stdout]    ✔  Then lines 4-6 of ppm are
[INFO] [stdout]   Scenario: Splitting long lines in PPM files
[INFO] [stdout]    ✔  Given c ← canvas(10, 2)
[INFO] [stdout]    ✔  When every pixel of c is set to color(1, 0.8, 0.6)
[INFO] [stdout]    ✔  And ppm ← canvas_to_ppm(c)
[INFO] [stdout]    ✔  Then lines 4-7 of ppm are
[INFO] [stdout] [Summary]
[INFO] [stdout] 1 feature
[INFO] [stdout] 5 scenarios (5 passed)
[INFO] [stdout] 24 steps (24 passed)
[INFO] [stderr]      Running tests/tuples.rs (/opt/rustwide/target/debug/deps/tuples-f8a7304e74471d8b)
[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]    Doc-tests raytracer
[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] running `Command { std: "docker" "inspect" "a30c66deaa2af6d0d8774a9978b654552b2d237d73e9630322d9da82997f8e81", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "a30c66deaa2af6d0d8774a9978b654552b2d237d73e9630322d9da82997f8e81", kill_on_drop: false }`
[INFO] [stdout] a30c66deaa2af6d0d8774a9978b654552b2d237d73e9630322d9da82997f8e81
