tui-piechart 0.3.3

A customizable pie chart widget for Ratatui TUI applications
Documentation
#!/usr/bin/env nu
# Tests for the pure-logic helpers in scripts/upgrade_deps.nu
#
# Run with: nu scripts/tests/test_upgrade_deps.nu

use std/assert
use runner.nu *
use ../upgrade_deps.nu [commit_label all_passed]

# ── commit_label tests ────────────────────────────────────────────────────────

def "test commit label upgrade when toml dirty" [] {
    let label = (commit_label true true "2026-03-24")
    assert str contains $label "upgrade"
    assert str contains $label "2026-03-24"
}

def "test commit label update when only lock dirty" [] {
    let label = (commit_label false true "2026-03-24")
    assert str contains $label "update"
    assert str contains $label "2026-03-24"
    assert not ($label | str contains "upgrade")
}

def "test commit label empty when nothing dirty" [] {
    let label = (commit_label false false "2026-03-24")
    assert ($label | is-empty)
}

def "test commit label toml dirty takes precedence over lock dirty" [] {
    # When both are dirty the label should be upgrade (Cargo.toml wins)
    let label = (commit_label true true "2026-01-01")
    assert str contains $label "upgrade"
    assert not ($label | str contains "nightly dependency update 2026-01-01")
}

def "test commit label upgrade contains chore prefix" [] {
    let label = (commit_label true false "2026-03-24")
    assert ($label | str starts-with "chore:")
}

def "test commit label update contains chore prefix" [] {
    let label = (commit_label false true "2026-03-24")
    assert ($label | str starts-with "chore:")
}

def "test commit label contains full date" [] {
    let label = (commit_label false true "2099-12-31")
    assert str contains $label "2099-12-31"
}

def "test commit label upgrade message is stable" [] {
    let a = (commit_label true true "2026-03-24")
    let b = (commit_label true true "2026-03-24")
    assert equal $a $b
}

def "test commit label update message is stable" [] {
    let a = (commit_label false true "2026-03-24")
    let b = (commit_label false true "2026-03-24")
    assert equal $a $b
}

# ── all_passed tests ──────────────────────────────────────────────────────────

def "test all passed returns true when all true" [] {
    assert (all_passed [true true true])
}

def "test all passed returns false when one false" [] {
    assert not (all_passed [true false true])
}

def "test all passed returns false when all false" [] {
    assert not (all_passed [false false false])
}

def "test all passed returns true for single true" [] {
    assert (all_passed [true])
}

def "test all passed returns false for single false" [] {
    assert not (all_passed [false])
}

def "test all passed returns true for empty list" [] {
    # vacuous truth — no failures means gate passed
    assert (all_passed [])
}

def "test all passed first element false" [] {
    assert not (all_passed [false true true true])
}

def "test all passed last element false" [] {
    assert not (all_passed [true true true false])
}

def "test all passed mixed single failure" [] {
    let results = [true true true true true false true true]
    assert not (all_passed $results)
}

def "test all passed three true mirrors tui-piechart quality gate" [] {
    # Mirrors: fmt clippy tests (no cross-compile for a pure-Rust lib)
    let gate = [true true true]
    assert (all_passed $gate)
}

def "test all passed three with fmt failure" [] {
    let gate = [false true true]
    assert not (all_passed $gate)
}

def "test all passed three with test failure" [] {
    let gate = [true true false]
    assert not (all_passed $gate)
}

# ── commit_label + all_passed integration tests ───────────────────────────────

def "test no commit when gate passes but nothing dirty" [] {
    let gate_ok = (all_passed [true true true])
    let label   = (commit_label false false "2026-03-24")
    assert $gate_ok
    assert ($label | is-empty)
}

def "test full upgrade commit when gate passes and toml dirty" [] {
    let gate_ok = (all_passed [true true true])
    let label   = (commit_label true true "2026-03-24")
    assert $gate_ok
    assert str contains $label "upgrade"
}

def "test revert path when gate fails and toml dirty" [] {
    # gate_passed = false, toml_changed = true → revert + lock-only commit
    let gate_ok     = (all_passed [true false true])
    let toml_changed = true
    let should_revert = ($toml_changed and (not $gate_ok))
    assert $should_revert
}

def "test lock only commit after revert" [] {
    # After revert: toml_dirty = false, lock_dirty = true
    let label = (commit_label false true "2026-03-24")
    assert str contains $label "update"
    assert not ($label | str contains "upgrade")
}

def "test no revert needed when gate fails but toml not changed" [] {
    let gate_ok      = (all_passed [false true true])
    let toml_changed = false
    let should_revert = ($toml_changed and (not $gate_ok))
    assert not $should_revert
}

def "test gate passes but only lock changed gives update label" [] {
    let gate_ok = (all_passed [true true true])
    let label   = (commit_label false true "2026-03-24")
    assert $gate_ok
    assert not ($label | is-empty)
    assert str contains $label "update"
}

# ── Crate invariant checks ───────────────────────────────────────────────────
# These tests verify properties of the tui-piechart crate that must hold after
# any dependency upgrade: valid TOML, resolution succeeds, no dupes, etc.

def "test cargo toml is valid toml" [] {
    # Verify the real Cargo.toml can be parsed as TOML
    let data = (open Cargo.toml)
    assert ($data | get package.version | is-not-empty)
}

def "test dependencies section exists" [] {
    let data = (open Cargo.toml)
    assert ($data | get dependencies | is-not-empty)
}

def "test cargo metadata resolves without errors" [] {
    # A fast check that the crate is in a consistent state:
    # all deps resolve, no missing features, no version conflicts.
    let result = (do { run-external "cargo" "metadata" "--no-deps" "--format-version" "1" } | complete)
    assert equal $result.exit_code 0 "cargo metadata must succeed — dependency resolution is broken"
}

def "test dependencies have no duplicate entries" [] {
    let content = (open Cargo.toml --raw)
    let dep_section = ($content | lines
        | reduce --fold { in_deps: false, lines: [] } { |line, acc|
            let entering = ($line =~ '^\[dependencies\]')
            let leaving = if $acc.in_deps {
                ($line =~ '^\[') and (not $entering)
            } else {
                false
            }
            let new_in = if $entering { true } else if $leaving { false } else { $acc.in_deps }
            let new_lines = if ($acc.in_deps and ($line =~ '^\w')) {
                $acc.lines | append $line
            } else {
                $acc.lines
            }
            { in_deps: $new_in, lines: $new_lines }
        }
        | get lines)

    let names = ($dep_section | each { |l|
        $l | parse --regex '(?P<n>[\w-]+)\s*=' | get n | first
    })
    let unique = ($names | uniq)
    assert equal ($names | length) ($unique | length) "dependencies must not have duplicate entries"
}

def "test dev-dependencies have no duplicate entries" [] {
    let content = (open Cargo.toml --raw)
    let dep_section = ($content | lines
        | reduce --fold { in_deps: false, lines: [] } { |line, acc|
            let entering = ($line =~ '^\[dev-dependencies\]')
            let leaving = if $acc.in_deps {
                ($line =~ '^\[') and (not $entering)
            } else {
                false
            }
            let new_in = if $entering { true } else if $leaving { false } else { $acc.in_deps }
            let new_lines = if ($acc.in_deps and ($line =~ '^\w')) {
                $acc.lines | append $line
            } else {
                $acc.lines
            }
            { in_deps: $new_in, lines: $new_lines }
        }
        | get lines)

    let names = ($dep_section | each { |l|
        $l | parse --regex '(?P<n>[\w-]+)\s*=' | get n | first
    })
    let unique = ($names | uniq)
    assert equal ($names | length) ($unique | length) "dev-dependencies must not have duplicate entries"
}

def "test package name is tui-piechart" [] {
    let data = (open Cargo.toml)
    assert equal ($data | get package.name) "tui-piechart"
}

def "test ratatui is a dependency" [] {
    let data = (open Cargo.toml)
    assert ($data | get dependencies.ratatui | is-not-empty) "ratatui must be listed in [dependencies]"
}

# ── Runner ────────────────────────────────────────────────────────────────────

def main [] {
    print $"(ansi cyan)═══ test_upgrade_deps.nu ═══(ansi reset)"
    run-tests
}