Draft: pretty-printer tests with random generated AST Expressions #1883
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Tact CI | |
env: | |
HUSKY: 0 | |
on: | |
pull_request: | |
branches: ["**"] | |
workflow_dispatch: | |
jobs: | |
test: | |
strategy: | |
fail-fast: false | |
matrix: | |
node-version: [22] | |
os: [ubuntu-latest, windows-latest, macos-latest] | |
runs-on: ${{ matrix.os }} | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Setup Node.js 18 for backwards compat tests | |
uses: actions/setup-node@v4 | |
with: | |
node-version: 18 | |
# without caching | |
- name: Backwards compat tests | |
run: | | |
# Temporarily ignore engines | |
yarn config set ignore-engines true | |
# Install dependencies, gen and build the compiler | |
yarn install | |
yarn clean | |
yarn gen | |
yarn build | |
# Test some specific things for backwards compatibility. | |
# It's important to restrain from using too much of Node.js 22+ features | |
# until it goes into maintenance LTS state and majority of users catches up | |
yarn jest -t 'isSubsetOf' | |
# Clean-up | |
yarn cleanall | |
yarn config delete ignore-engines | |
- name: Setup Node.js ${{ matrix.node-version }} | |
uses: actions/setup-node@v4 | |
with: | |
node-version: ${{ matrix.node-version }} | |
cache: "yarn" | |
- name: Install dependencies | |
run: | | |
corepack enable | |
yarn install | |
- name: List installed packages | |
run: | | |
yarn list | |
- name: Print some environment info | |
run: | | |
yarn cross-env echo $NODE_ENV | |
- name: Build Tact compiler | |
run: | | |
yarn clean | |
yarn gen | |
yarn build | |
- name: Check there are no errors to be fixed in package.json and no uncommited changes | |
run: | | |
npm pkg fix && git diff --exit-code | |
- name: Test Tact compiler | |
run: | | |
yarn coverage | |
- name: Check there are no errors reported by ESLint | |
run: | | |
yarn lint | |
- name: Check formatting with Prettier | |
run: | | |
yarn fmt:check | |
- name: Check that tact.config.json adheres to the JSON schema | |
run: | | |
yarn lint:schema | |
- name: Spellcheck code base | |
run: | | |
yarn spell | |
- name: Check there are no unused dependencies | |
run: | | |
yarn knip | |
- name: Run ShellCheck | |
uses: ludeeus/action-shellcheck@master | |
if: runner.os != 'Windows' | |
with: | |
scandir: "./scripts" | |
- name: Show an example .pkg file on Windows | |
if: runner.os == 'Windows' | |
run: | | |
type examples\output\echo_Echo.pkg | |
- name: Link Tact yarn package | |
run: | | |
yarn link | |
- name: CLI Test | Check tact --version | |
if: runner.os != 'Windows' | |
run: | | |
tact --version | |
- name: CLI Test | Compare Tact version from CLI flag `--version` against package.json | |
if: runner.os != 'Windows' | |
run: | | |
if [ "$(tact --version | head -n1)" != "$(jq -r '.version' < package.json)" ]; | |
then false | |
fi | |
- name: CLI Test | Check single-contract compilation | |
if: runner.os != 'Windows' | |
run: | | |
tact --check bin/test/success.tact | |
tact --func bin/test/success.tact | |
tact bin/test/success.tact | |
tact --with-decompilation bin/test/success.tact | |
- name: CLI Test | Check compilation via `--config` | |
if: runner.os != 'Windows' | |
run: | | |
# should output complete results | |
tact --config bin/test/success.config.json | |
# should output complete result + decompile binary code | |
tact --config bin/test/success.config.with.decompilation.json | |
# should only run the syntax and type checking | |
tact --config bin/test/success.config.json --check | |
- name: CLI Test | Check parsing of mutually exclusive flags - 1 | |
if: runner.os != 'Windows' | |
run: | | |
! tact --func --check bin/test/success.config.json | |
- name: CLI Test | Check parsing of mutually exclusive flags - 2 | |
if: runner.os != 'Windows' | |
run: | | |
! tact --with-decompilation --check bin/test/success.config.json | |
- name: CLI Test | Check parsing of mutually exclusive flags - 3 | |
if: runner.os != 'Windows' | |
run: | | |
! tact --func --with-decompilation bin/test/success.config.json | |
- name: CLI Test | Check parsing of a non-existing CLI flag | |
if: runner.os != 'Windows' | |
run: | | |
! tact --nonexistentoption bin/test/success.config.json | |
- name: CLI Test | tact executable return non-zero exit code if compilation fails | |
if: runner.os != 'Windows' | |
run: | | |
! tact --config bin/test/fail.config.json | |
- name: CLI Test | Evaluate expression | |
if: runner.os != 'Windows' | |
run: | | |
tact -e '(1 + 2 * (pow(3,4) - 2) << 1 & 0x54 | 33 >> 1) * 2 + 2' | |
- name: CLI Test | Check TVM disassembler flag | |
if: runner.os != 'Windows' | |
run: | | |
tact bin/test/success.tact | |
unboc bin/test/success_HelloWorld.code.boc | |
- name: Test compatibility with tact-template | |
run: | | |
git clone https://github.com/tact-lang/tact-template.git | |
cd tact-template | |
yarn install | |
yarn link @tact-lang/compiler | |
yarn build | |
yarn test | |
test-blueprint: | |
strategy: | |
fail-fast: false | |
matrix: | |
node-version: [22] | |
os: [ubuntu-latest, windows-latest, macos-latest] | |
package-manager: [npm, yarn, pnpm, bun] | |
# follow-up ifs are for ensuring clean state at all times | |
runs-on: ${{ matrix.os }} | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v3 | |
- name: Setup Node.js ${{ matrix.node-version }} | |
uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ matrix.node-version }} | |
cache: "yarn" # dependency caching only | |
- uses: oven-sh/setup-bun@v2 | |
if: ${{ matrix.package-manager == 'bun' }} | |
- name: Prepare Tact compiler | |
run: | | |
# There are issues with corepack + it disallows the use of pnpm for linkage later on | |
# It's only useful for making sure that Tact compiler developers use the same version of Yarn | |
# https://github.com/nodejs/corepack/issues/112 | |
# corepack enable | |
yarn install | |
yarn clean | |
yarn gen | |
yarn build | |
- name: (npm) Test creation of new Blueprint projects | |
if: ${{ matrix.package-manager == 'npm' }} | |
run: | | |
npm link | |
# for end-users 'npm create ton@latest' works fine even in PowerShell, | |
# but it fails on Windows in GitHub Actions because of weird -- expansion | |
npx create-ton@latest test-project --type tact-counter --contractName Counter | |
cd test-project | |
npm link @tact-lang/compiler | |
npm run build | |
npm run test | |
- name: (npm) Test Tact and Blueprint installs in existing projects | |
if: ${{ matrix.package-manager == 'npm' }} | |
run: | | |
# Out of the box, only npm experiences issues | |
# with lifecycle scripts of installed dependencies | |
mkdir npm-test && cd npm-test | |
npm init -y | |
npm i ../ # installing compiler relatively | |
npm i @ton/blueprint | |
- name: (yarn) Test creation of new Blueprint projects | |
if: ${{ matrix.package-manager == 'yarn' }} | |
run: | | |
yarn link | |
yarn create ton test-project --type tact-counter --contractName Counter | |
cd test-project | |
yarn link @tact-lang/compiler | |
yarn build | |
yarn test | |
- name: (pnpm) Test creation of new Blueprint projects | |
if: ${{ matrix.package-manager == 'pnpm' }} | |
run: | | |
# Installing the specific pnpm version to work around https://github.com/pnpm/pnpm/issues/5000 | |
# and not fail suddenly when a release comes that fixes this | |
# NOTE: revisit and simplify this step if/when those bugs with pnpm are resolved | |
npm i -g [email protected] | |
# To help pnpm recognize the shell (they cannot do it themselves sometimes...) | |
${{ matrix.os != 'windows-latest' && 'export SHELL=bash' || 'echo windows_noop' }} | |
pnpm setup -f | |
# To source .bashrc on Linux: | |
${{ matrix.os == 'ubuntu-latest' && 'source ~/.bashrc' || 'echo noop' }} | |
# To expose stuff for pnpm directly on macOS (because otherwise the pre-installed Node.js version gets used): | |
${{ matrix.os == 'macos-latest' && 'export PNPM_HOME=~/Library/pnpm; export PATH=$PNPM_HOME:$PATH' || 'echo noop' }} | |
pnpm link -g | |
cd .. | |
pnpm create ton@latest test-project --type tact-counter --contractName Counter | |
cd test-project | |
pnpm link -g @tact-lang/compiler | |
pnpm build | |
pnpm test | |
- name: (bun) Test creation of new Blueprint projects | |
if: ${{ matrix.package-manager == 'bun' }} | |
run: | | |
bun link | |
bun create ton@latest test-project --type tact-counter --contractName Counter | |
cd test-project | |
bun link @tact-lang/compiler | |
bun run build # without 'run' Bun will use its own bundler | |
bun run test # without 'run' Bun will use its own test runner |