diff --git a/test/assert/.gitignore b/test/assert/.gitignore new file mode 100644 index 000000000..378eac25d --- /dev/null +++ b/test/assert/.gitignore @@ -0,0 +1 @@ +build diff --git a/test/assert/Makefile b/test/assert/Makefile new file mode 100644 index 000000000..78b70132e --- /dev/null +++ b/test/assert/Makefile @@ -0,0 +1,4 @@ +.PHONY: test-all +test-all: + @echo test/assert + @./run_tests.sh diff --git a/test/assert/gleam.toml b/test/assert/gleam.toml new file mode 100644 index 000000000..ac6389381 --- /dev/null +++ b/test/assert/gleam.toml @@ -0,0 +1,6 @@ +name = "project" +version = "1.0.0" +description = "A Gleam project" + +[dependencies] +gleam_stdlib = ">= 0.58.0 and < 2.0.0" diff --git a/test/assert/manifest.toml b/test/assert/manifest.toml new file mode 100644 index 000000000..ccd1121bf --- /dev/null +++ b/test/assert/manifest.toml @@ -0,0 +1,9 @@ +# This file was generated by Gleam +# You typically do not need to edit this file + +packages = [ + { name = "gleam_stdlib", version = "0.58.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "091F2D2C4A3A4E2047986C47E2C2C9D728A4E068ABB31FDA17B0D347E6248467" }, +] + +[requirements] +gleam_stdlib = { version = ">= 0.58.0 and < 2.0.0" } diff --git a/test/assert/run_tests.sh b/test/assert/run_tests.sh new file mode 100755 index 000000000..fbe5918d5 --- /dev/null +++ b/test/assert/run_tests.sh @@ -0,0 +1,54 @@ +#/usr/bin/env sh + +set -eu + +should_succeed() { + echo + echo Running: "$@" + + EXIT_CODE=0 + cargo run -- $@ > /dev/null 2>&1 || EXIT_CODE=$? + if [ $EXIT_CODE -ne 0 ] + then + echo ERROR: Command should have succeeded + exit 1 + else + echo Test Passed '(command run successfully)' + fi +} + +should_fail() { + echo + echo Running: "$@" + + EXIT_CODE=0 + cargo run -- $@ > /dev/null 2>&1 || EXIT_CODE=$? + + if [ $EXIT_CODE -eq 0 ] + then + echo ERROR: Command should have failed + exit 1 + else + echo Test Passed '(command errored as expected)' + fi +} + +all_targets() { + $@ --target erlang + $@ --target javascript --runtime nodejs + $@ --target javascript --runtime deno + $@ --target javascript --runtime bun +} + +# Ensure the project builds correctly +should_succeed build --target erlang +should_succeed build --target javascript + +all_targets should_succeed run --module passing + +# Since a single failing `assert` will exit immediately, we must test each +# failing case individually as separate modules. +all_targets should_fail run --module failing1 +all_targets should_fail run --module failing2 +all_targets should_fail run --module failing3 +all_targets should_fail run --module failing4 diff --git a/test/assert/src/failing1.gleam b/test/assert/src/failing1.gleam new file mode 100644 index 000000000..802e9f087 --- /dev/null +++ b/test/assert/src/failing1.gleam @@ -0,0 +1,4 @@ +pub fn main() { + let x = True + assert !x +} diff --git a/test/assert/src/failing2.gleam b/test/assert/src/failing2.gleam new file mode 100644 index 000000000..507898269 --- /dev/null +++ b/test/assert/src/failing2.gleam @@ -0,0 +1,5 @@ +import gleam/int + +pub fn main() { + assert int.is_even(47) +} diff --git a/test/assert/src/failing3.gleam b/test/assert/src/failing3.gleam new file mode 100644 index 000000000..0faa89ab3 --- /dev/null +++ b/test/assert/src/failing3.gleam @@ -0,0 +1,6 @@ +import gleam/bool +import gleam/result + +pub fn main() { + assert bool.negate(False) && result.is_ok(Error(81)) +} diff --git a/test/assert/src/failing4.gleam b/test/assert/src/failing4.gleam new file mode 100644 index 000000000..833f40c36 --- /dev/null +++ b/test/assert/src/failing4.gleam @@ -0,0 +1,5 @@ +import gleam/int + +pub fn main() { + assert int.add(4, 5) > int.absolute_value(-11) +} diff --git a/test/assert/src/passing.gleam b/test/assert/src/passing.gleam new file mode 100644 index 000000000..9cd06eb0d --- /dev/null +++ b/test/assert/src/passing.gleam @@ -0,0 +1,25 @@ +import gleam/bool +import gleam/int +import gleam/result + +/// All these assertions should succeed +pub fn main() { + let x = True + assert x + assert case x && False { + True -> False + False -> True + } + + assert result.is_ok(Ok(10)) + assert result.is_error(Error("Hello")) + + assert int.add(5, 6) == 11 + assert int.add(1, 4) < 9 + assert int.add(8, 12) >= 20 + assert bool.negate(False) && result.is_ok(Ok(42)) + assert int.is_even(3) || int.is_even(4) + + // This should short-circuit so we don't panic here + assert True || panic +}