From a0ba82ab3815d692d045427fc20cec2d3860552f Mon Sep 17 00:00:00 2001 From: Nathan McCarty Date: Wed, 1 Jan 2025 02:57:02 -0500 Subject: [PATCH 1/2] Add example --- examples/testy/.gitignore | 2 + examples/testy/pack.toml | 10 ++++ examples/testy/src/Testy.idr | 11 +++++ examples/testy/test/src/Main.idr | 19 ++++++++ .../testy/test/src/TestModule/Booleans.idr | 9 ++++ examples/testy/test/test.ipkg | 48 +++++++++++++++++++ examples/testy/testy.ipkg | 47 ++++++++++++++++++ 7 files changed, 146 insertions(+) create mode 100644 examples/testy/.gitignore create mode 100644 examples/testy/pack.toml create mode 100644 examples/testy/src/Testy.idr create mode 100644 examples/testy/test/src/Main.idr create mode 100644 examples/testy/test/src/TestModule/Booleans.idr create mode 100644 examples/testy/test/test.ipkg create mode 100644 examples/testy/testy.ipkg diff --git a/examples/testy/.gitignore b/examples/testy/.gitignore new file mode 100644 index 0000000..2784b39 --- /dev/null +++ b/examples/testy/.gitignore @@ -0,0 +1,2 @@ +build/ +*.*~ diff --git a/examples/testy/pack.toml b/examples/testy/pack.toml new file mode 100644 index 0000000..ae5f38f --- /dev/null +++ b/examples/testy/pack.toml @@ -0,0 +1,10 @@ +[custom.all.testy] +type = "local" +path = "." +ipkg = "testy.ipkg" +test = "test/test.ipkg" + +[custom.all.testy-test] +type = "local" +path = "test" +ipkg = "test.ipkg" \ No newline at end of file diff --git a/examples/testy/src/Testy.idr b/examples/testy/src/Testy.idr new file mode 100644 index 0000000..54de3c2 --- /dev/null +++ b/examples/testy/src/Testy.idr @@ -0,0 +1,11 @@ +module Testy + +import System +import Data.String + +-- @@test Hello World non-null +helloNonNull : IO () +helloNonNull = + if null "Hello World" + then exitFailure + else exitSuccess diff --git a/examples/testy/test/src/Main.idr b/examples/testy/test/src/Main.idr new file mode 100644 index 0000000..8d2910f --- /dev/null +++ b/examples/testy/test/src/Main.idr @@ -0,0 +1,19 @@ +module Main + +import System + +-- @@test Main Test +main : IO () +main = putStrLn "Test successful!" + +-- @@test Failing integration with error message +ohNo : IO () +ohNo = do + putStrLn "Something horrible has happened" + exitFailure + +-- @@test Passing integration with output +ohYes : IO () +ohYes = do + putStrLn "Something amazing has happened" + exitSuccess diff --git a/examples/testy/test/src/TestModule/Booleans.idr b/examples/testy/test/src/TestModule/Booleans.idr new file mode 100644 index 0000000..9545eb7 --- /dev/null +++ b/examples/testy/test/src/TestModule/Booleans.idr @@ -0,0 +1,9 @@ +module TestModule.Booleans + +-- @@test Boolean Integration passes +passes : IO Bool +passes = pure True + +-- @@test Boolean Integration fails +fails : IO Bool +fails = pure False diff --git a/examples/testy/test/test.ipkg b/examples/testy/test/test.ipkg new file mode 100644 index 0000000..dadcbeb --- /dev/null +++ b/examples/testy/test/test.ipkg @@ -0,0 +1,48 @@ +package testytest +version = 0.1.0 +authors = "Nathan McCarty" +-- maintainers = +-- license = +-- brief = +-- readme = +-- homepage = +-- sourceloc = +-- bugtracker = + +-- the Idris2 version required (e.g. langversion >= 0.5.1) +-- langversion + +-- packages to add to search path +depends = testy + +-- modules to install +modules = Main + , TestModule.Booleans + +-- main file (i.e. file to load at REPL) +main = Main + +-- name of executable +executable = "testy-test" +-- opts = +sourcedir = "src" +-- builddir = +-- outputdir = + +-- script to run before building +-- prebuild = + +-- script to run after building +-- postbuild = + +-- script to run after building, before installing +-- preinstall = + +-- script to run after installing +-- postinstall = + +-- script to run before cleaning +-- preclean = + +-- script to run after cleaning +-- postclean = diff --git a/examples/testy/testy.ipkg b/examples/testy/testy.ipkg new file mode 100644 index 0000000..fa5f6a8 --- /dev/null +++ b/examples/testy/testy.ipkg @@ -0,0 +1,47 @@ +package testy +version = 0.1.0 +authors = "Nathan McCarty" +-- maintainers = +-- license = +-- brief = +-- readme = +-- homepage = +-- sourceloc = +-- bugtracker = + +-- the Idris2 version required (e.g. langversion >= 0.5.1) +-- langversion + +-- packages to add to search path +-- depends = + +-- modules to install +modules = Testy + +-- main file (i.e. file to load at REPL) +-- main = + +-- name of executable +-- executable = +-- opts = +sourcedir = "src" +-- builddir = +-- outputdir = + +-- script to run before building +-- prebuild = + +-- script to run after building +-- postbuild = + +-- script to run after building, before installing +-- preinstall = + +-- script to run after installing +-- postinstall = + +-- script to run before cleaning +-- preclean = + +-- script to run after cleaning +-- postclean = From b28b91d5d2c98fdc0ddb4e873441c6818248dd01 Mon Sep 17 00:00:00 2001 From: Nathan McCarty Date: Thu, 2 Jan 2025 00:00:13 -0500 Subject: [PATCH 2/2] Working idris2 error detection Idris 2 doesn't have a failing exit code in this context when it fails to compile an expr given at the command line, we need to check for an error message in the output --- examples/testy/test/src/TestModule/Booleans.idr | 10 ++++++---- lib/IUtils/Compiler.rakumod | 6 +++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/examples/testy/test/src/TestModule/Booleans.idr b/examples/testy/test/src/TestModule/Booleans.idr index 9545eb7..8fbc4a0 100644 --- a/examples/testy/test/src/TestModule/Booleans.idr +++ b/examples/testy/test/src/TestModule/Booleans.idr @@ -1,9 +1,11 @@ module TestModule.Booleans +import System + -- @@test Boolean Integration passes -passes : IO Bool -passes = pure True +doesWork : IO Bool +doesWork = pure True -- @@test Boolean Integration fails -fails : IO Bool -fails = pure False +dontWork : IO Bool +dontWork = pure False diff --git a/lib/IUtils/Compiler.rakumod b/lib/IUtils/Compiler.rakumod index 6aad5de..14cb559 100644 --- a/lib/IUtils/Compiler.rakumod +++ b/lib/IUtils/Compiler.rakumod @@ -51,6 +51,8 @@ class IdrisError is Exception { qq:to/END/; Error running idris command: $.command Command exited with $.exit-code + StdOut: + {$.out.lines.map(*.indent: 2).join("\n")} END } } @@ -75,7 +77,7 @@ sub idris-run(*@cmd) is export { my $proc = run "idris2", @cmd, :out, :err; my $out = $proc.out.slurp(:close); my $err = $proc.err.slurp(:close); - unless $proc { + if !$proc || $out.contains("Error:") { IdrisError.new( out => $out, err => $err, exit-code => $proc.exitcode, command => @cmd.Str) @@ -117,5 +119,7 @@ sub idris-exec($expr, $file, $output-type? = Unit) is export { exit-code => $proc.exitcode, expr => $expr ).throw; } + # Remove the output file + 'build/exec/iutils_out'.IO.unlink; return $out; }