Skip to content

fix: use PASS/FAIL prefixes in integration test vector output #267

fix: use PASS/FAIL prefixes in integration test vector output

fix: use PASS/FAIL prefixes in integration test vector output #267

Workflow file for this run

name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
jobs:
# ---------------------------------------------------------------------------
# Compilers — build, unit test, upload artifacts
# ---------------------------------------------------------------------------
ts-compiler:
name: TypeScript Compiler
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
- uses: actions/setup-go@v5
with:
go-version: '1.24'
cache-dependency-path: compilers/go/go.sum
- uses: dtolnay/rust-toolchain@stable
- name: Build Rust compiler (for cross-compiler tests)
run: cd compilers/rust && cargo build --release
- run: pnpm install --frozen-lockfile
- run: pnpm run build
- run: pnpm run test
- name: Example tests (TS + Sol + Move)
run: npx vitest run examples/ts/ examples/sol/ examples/move/
- run: pnpm run typecheck
go-compiler:
name: Go Compiler
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: '1.24'
cache-dependency-path: compilers/go/go.sum
- run: cd compilers/go && go build ./...
- run: cd compilers/go && go build -o runar-go .
- run: cd compilers/go && go test -race -v ./...
- uses: actions/upload-artifact@v4
with:
name: runar-go
path: compilers/go/runar-go
rust-compiler:
name: Rust Compiler
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- run: cd compilers/rust && cargo build --release
- run: cd compilers/rust && cargo test
- uses: actions/upload-artifact@v4
with:
name: runar-rust
path: compilers/rust/target/release/runar-compiler-rust
python-compiler:
name: Python Compiler
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- run: pip install pytest
- run: cd compilers/python && python -m pytest tests/ -v
zig-compiler:
name: Zig Compiler
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: mlugg/setup-zig@v2
with:
version: 0.15.0
- run: cd compilers/zig && zig build test
- name: Zig conformance tests
run: cd compilers/zig && zig build conformance
- name: Build release binary
run: cd compilers/zig && zig build -Doptimize=ReleaseFast
- uses: actions/upload-artifact@v4
with:
name: runar-zig
path: compilers/zig/zig-out/bin/runar-zig
ruby-compiler:
name: Ruby Compiler
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: ruby/setup-ruby@v1
with:
ruby-version: '3.3'
- name: Ruby compiler conformance (IR → hex)
run: |
fail=0
for test in conformance/tests/*/expected-ir.json; do
dir=$(dirname "$test")
name=$(basename "$dir")
expected=$(tr -d '[:space:]' < "$dir/expected-script.hex" | tr '[:upper:]' '[:lower:]')
actual=$(ruby compilers/ruby/bin/runar-compiler-ruby --ir "$test" --hex --disable-constant-folding 2>&1 | tr -d '[:space:]' | tr '[:upper:]' '[:lower:]')
if [ "$expected" = "$actual" ]; then
echo "PASS $name"
else
echo "FAIL $name"
fail=1
fi
done
exit $fail
- name: Ruby compiler source conformance (.runar.ts → hex)
run: |
fail=0
for dir in conformance/tests/*/; do
name=$(basename "$dir")
ts_file="$dir/$name.runar.ts"
[ -f "$ts_file" ] || continue
expected=$(tr -d '[:space:]' < "$dir/expected-script.hex" | tr '[:upper:]' '[:lower:]')
actual=$(ruby compilers/ruby/bin/runar-compiler-ruby --source "$ts_file" --hex --disable-constant-folding 2>&1 | tr -d '[:space:]' | tr '[:upper:]' '[:lower:]')
if [ "$expected" = "$actual" ]; then
echo "PASS $name (.runar.ts)"
else
echo "FAIL $name (.runar.ts)"
fail=1
fi
done
exit $fail
- name: Ruby compiler source conformance (.runar.rb → hex)
run: |
fail=0
for dir in conformance/tests/*/; do
name=$(basename "$dir")
rb_file=$(find "$dir" -name "*.runar.rb" | head -1)
[ -n "$rb_file" ] || continue
expected=$(tr -d '[:space:]' < "$dir/expected-script.hex" | tr '[:upper:]' '[:lower:]')
actual=$(ruby compilers/ruby/bin/runar-compiler-ruby --source "$rb_file" --hex --disable-constant-folding 2>&1 | tr -d '[:space:]' | tr '[:upper:]' '[:lower:]')
if [ "$expected" = "$actual" ]; then
echo "PASS $name (.runar.rb)"
else
echo "FAIL $name (.runar.rb)"
fail=1
fi
done
exit $fail
# ---------------------------------------------------------------------------
# SDKs — package tests + example tests
# ---------------------------------------------------------------------------
go-sdk:
name: Go SDK
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: '1.24'
cache-dependency-path: packages/runar-go/go.sum
- name: SDK tests
run: cd packages/runar-go && go test ./...
- name: Example tests
run: cd examples/go && go test ./...
rust-sdk:
name: Rust SDK
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: SDK tests
run: cd packages/runar-rs && cargo test
- name: Example tests
run: cd examples/rust && cargo test
python-sdk:
name: Python SDK
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- run: pip install pytest
- name: SDK tests
run: cd packages/runar-py && python -m pytest
- name: Example tests
run: cd examples/python && PYTHONPATH=../../packages/runar-py python -m pytest
zig-sdk:
name: Zig SDK
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: mlugg/setup-zig@v2
with:
version: 0.15.0
- name: SDK tests
run: cd packages/runar-zig && zig build test
- name: Example tests
run: cd examples/zig && zig build test
ruby-sdk:
name: Ruby SDK
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: ruby/setup-ruby@v1
with:
ruby-version: '3.3'
bundler-cache: true
working-directory: packages/runar-rb
- name: SDK tests
run: cd packages/runar-rb && bundle exec rspec
- name: Example tests
run: |
cd examples/ruby
bundle install
bundle exec rspec **/*_spec.rb
# ---------------------------------------------------------------------------
# Conformance — cross-compiler + SDK output
# ---------------------------------------------------------------------------
conformance:
name: Conformance Tests
needs: [ts-compiler, go-compiler, rust-compiler, python-compiler, zig-compiler, ruby-compiler]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
name: runar-go
- uses: actions/download-artifact@v4
with:
name: runar-rust
- uses: actions/download-artifact@v4
with:
name: runar-zig
- uses: ruby/setup-ruby@v1
with:
ruby-version: '3.3'
- run: chmod +x runar-go runar-compiler-rust runar-zig
- name: Run conformance tests
run: |
fail=0
for test in conformance/tests/*/expected-ir.json; do
dir=$(dirname "$test")
name=$(basename "$dir")
echo -n "=== $name === "
go_hex=$(./runar-go --ir "$test" --hex)
rust_hex=$(./runar-compiler-rust --ir "$test" --hex)
zig_hex=$(./runar-zig compile-ir "$test" --hex 2>/dev/null | head -1)
ruby_hex=$(ruby compilers/ruby/bin/runar-compiler-ruby --ir "$test" --hex --disable-constant-folding 2>&1 | tr -d '[:space:]')
if [ "$go_hex" != "$rust_hex" ]; then
echo "MISMATCH Go vs Rust"
fail=1
elif [ "$go_hex" != "$zig_hex" ]; then
echo "MISMATCH Go vs Zig"
fail=1
elif [ "$go_hex" != "$ruby_hex" ]; then
echo "MISMATCH Go vs Ruby"
fail=1
else
echo "OK (${#go_hex} hex chars)"
fi
done
exit $fail
- name: Ruby format conformance (source → hex)
run: |
fail=0
for dir in conformance/tests/*/; do
name=$(basename "$dir")
rb_file="$dir/$name.runar.rb"
[ -f "$rb_file" ] || continue
expected_file="$dir/expected-script.hex"
[ -f "$expected_file" ] || continue
expected=$(tr -d '[:space:]' < "$expected_file" | tr '[:upper:]' '[:lower:]')
go_hex=$(./runar-go --source "$rb_file" --hex --disable-constant-folding 2>/dev/null | tr -d '[:space:]' | tr '[:upper:]' '[:lower:]')
rust_hex=$(./runar-compiler-rust --source "$rb_file" --hex --disable-constant-folding 2>/dev/null | tr -d '[:space:]' | tr '[:upper:]' '[:lower:]')
if [ "$go_hex" != "$rust_hex" ]; then
echo "MISMATCH $name: Go vs Rust differ"
fail=1
elif [ "$go_hex" != "$expected" ]; then
echo "MISMATCH $name: output differs from golden file"
fail=1
else
echo "OK $name (.runar.rb)"
fi
done
exit $fail
sdk-conformance:
name: SDK Output Conformance
needs: [ts-compiler, go-sdk, rust-sdk, python-sdk, zig-sdk, ruby-sdk]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
- uses: actions/setup-go@v5
with:
go-version: '1.24'
cache-dependency-path: packages/runar-go/go.sum
- uses: dtolnay/rust-toolchain@stable
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- uses: ruby/setup-ruby@v1
with:
ruby-version: '3.3'
bundler-cache: true
working-directory: packages/runar-rb
- uses: mlugg/setup-zig@v2
with:
version: 0.15.0
- run: pnpm install --frozen-lockfile
- run: pnpm run build
- name: Build Rust SDK tool
run: cd conformance/sdk-output/tools/rs-sdk-tool && cargo build --release
- name: Build Zig SDK tool
run: cd conformance/sdk-output/tools/zig-sdk-tool && zig build -Doptimize=ReleaseFast
- name: Run SDK output conformance (39 contracts x 6 SDKs)
run: cd conformance/sdk-output && npx tsx runner/sdk-runner.ts
# ---------------------------------------------------------------------------
# Integration — regtest node tests
# ---------------------------------------------------------------------------
integration:
name: Integration Tests
needs:
- ts-compiler
- go-compiler
- rust-compiler
- python-compiler
- zig-compiler
- zig-sdk
- ruby-compiler
- ruby-sdk
runs-on: ubuntu-latest
env:
RPC_URL: http://localhost:18332
RPC_USER: regtest
RPC_PASS: regtest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
- uses: actions/setup-go@v5
with:
go-version: '1.24'
cache-dependency-path: compilers/go/go.sum
- uses: dtolnay/rust-toolchain@stable
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- run: pip install pytest bsv-sdk
- uses: ruby/setup-ruby@v1
with:
ruby-version: '3.3'
bundler-cache: true
working-directory: integration/ruby
- uses: mlugg/setup-zig@v2
with:
version: 0.15.0
- run: pnpm install --frozen-lockfile
- run: pnpm run build
- name: Pre-create regtest node config with test credentials
run: |
mkdir -p integration/regtest-data/n1
printf '%s\n' \
'port=18333' 'rpcbind=0.0.0.0' 'rpcport=18332' \
'rpcuser=regtest' 'rpcpassword=regtest' 'rpcallowip=0.0.0.0/0' \
'dnsseed=0' 'listenonion=0' 'listen=1' 'server=1' 'rest=1' 'regtest=1' \
'usecashaddr=0' 'txindex=1' 'excessiveblocksize=1000000000' \
'maxstackmemoryusageconsensus=100000000' 'maxscriptsizepolicy=0' \
'maxscriptnumlengthpolicy=0' 'maxstackmemoryusagepolicy=100000000' \
'maxtxsizepolicy=0' 'genesisactivationheight=1' 'minminingtxfee=0.00000001' \
> integration/regtest-data/n1/bitcoin.conf
- name: Start BSV regtest node
run: cd integration && ./regtest.sh start
- name: Go integration tests
run: cd integration/go && go test -tags integration -v -timeout 600s
- name: TypeScript integration tests
run: cd integration/ts && npx vitest run
- name: Rust integration tests
run: cd integration/rust && cargo test --release -- --ignored
timeout-minutes: 10
- name: Python integration tests
run: cd integration/python && PYTHONPATH=../../compilers/python:../../packages/runar-py pytest -v
- name: Ruby integration tests
run: cd integration/ruby && bundle exec rspec --format documentation
- name: Zig integration tests
run: cd integration/zig && zig build test
timeout-minutes: 5
- name: Ruby end-to-end example tests
run: |
cd end2end-example/ruby
bundle install
bundle exec rspec price_bet_spec.rb --format documentation
- name: Stop regtest node
if: always()
run: cd integration && ./regtest.sh stop