From f9330364d1da308dc04fd22a3c50b70f05020cbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Szikszai=20Guszt=C3=A1v?= Date: Tue, 19 Sep 2023 17:50:21 +0200 Subject: [PATCH 1/3] Added `--watch` flag for test command. Fixes #644 --- src/commands/test.cr | 26 ++++-- src/render/terminal.cr | 4 + src/test_runner.cr | 103 +++++++++++++++------- src/test_runner.ecr | 3 + src/test_runner/documentation_reporter.cr | 3 + src/test_runner/dot_reporter.cr | 4 + src/test_runner/reporter.cr | 1 + 7 files changed, 106 insertions(+), 38 deletions(-) diff --git a/src/commands/test.cr b/src/commands/test.cr index d238fa320..08ee705a2 100644 --- a/src/commands/test.cr +++ b/src/commands/test.cr @@ -48,14 +48,30 @@ module Mint description: "Will use supplied runtime path instead of the default distribution", required: false - define_argument test : String + define_flag watch : Bool, + description: "Watch files for changes and rerun tests", + required: false + + define_argument test : String, + description: "The path to the test file to run" def run - succeeded = nil - execute "Running Tests" do - succeeded = TestRunner.new(flags, arguments).run + MintJson.parse_current.check_dependencies! + + runner = + TestRunner.new(flags, arguments) + + if flags.watch + runner.watch + else + succeeded = nil + + execute "Running Tests" do + succeeded = runner.run + end + + exit(1) unless succeeded end - exit(1) unless succeeded end end end diff --git a/src/render/terminal.cr b/src/render/terminal.cr index 1dce912a0..769df69c6 100644 --- a/src/render/terminal.cr +++ b/src/render/terminal.cr @@ -247,6 +247,10 @@ module Mint print contents.to_s end + def reset + print "\ec" + end + def puts(contents = nil) print contents if contents print "\n" diff --git a/src/test_runner.cr b/src/test_runner.cr index d8b377942..e4d493727 100644 --- a/src/test_runner.cr +++ b/src/test_runner.cr @@ -5,6 +5,7 @@ module Mint class Message include JSON::Serializable + property id : String property type : String property name : String? property suite : String? @@ -31,8 +32,10 @@ module Mint @reporter : Reporter @browser_path : String? @script : String? + @browser : {Process, String}? = nil @failed = [] of Message + @test_id = Random::Secure.hex @succeeded = 0 def initialize(@flags : Cli::Test::Flags, @arguments : Cli::Test::Arguments) @@ -46,14 +49,45 @@ module Mint @succeeded = 0 end - def run : Bool - MintJson.parse_current.check_dependencies! + def watch + workspace = Workspace.current + workspace.on "change" { |result| run_tests } + workspace.watch + + setup_kemal + run_tests + + Server.run "Test", @flags.host, @flags.port + end - ast = terminal.measure "#{COG} Compiling tests..." do + def compile + terminal.measure "#{COG} Compiling tests..." do compile_ast.tap do |a| @script = compile_script(a) end end + end + + def run_tests + @test_id = Random::Secure.hex + cleanup_browser + terminal.reset + + begin + @reporter.reset + compile + open_page + rescue error : Error + terminal.reset + terminal.puts error.to_terminal + rescue error + terminal.reset + terminal.puts error.to_s + end + end + + def run : Bool + ast = compile if ast.try(&.suites.empty?) terminal.puts @@ -186,13 +220,17 @@ module Mint begin process = open_process(browser_path, profile_directory) - at_exit do - process.signal(:kill) rescue nil - FileUtils.rm_rf(profile_directory) - end + @browser = {process, profile_directory} + at_exit { cleanup_browser } @channel.receive ensure - process.try &.signal(:kill) rescue nil + cleanup_browser + end + end + + def cleanup_browser + @browser.try do |(process, profile_directory)| + process.signal(:kill) rescue nil FileUtils.rm_rf(profile_directory) end end @@ -206,9 +244,6 @@ module Mint ws_url = "ws://#{@flags.browser_host}:#{@flags.browser_port}/" - page_source = - ECR.render("#{__DIR__}/test_runner.ecr") - runtime = if runtime_path = @flags.runtime Cli.runtime_file_not_found(runtime_path) unless File.exists?(runtime_path) @@ -219,7 +254,7 @@ module Mint get "/" do reset - page_source + ECR.render("#{__DIR__}/test_runner.ecr") end get "/external-javascripts.js" do |env| @@ -277,26 +312,28 @@ module Mint end def handle_message(data : Message) : Nil - case data.type - when "LOG" - terminal.puts data.result - when "SUITE" - @reporter.suite data.suite - when "SUCCEEDED" - @reporter.succeeded data.name - @succeeded += 1 - when "FAILED" - @reporter.failed data.name, data.result - @failed << data - when "ERRORED" - @reporter.errored data.name, data.result - @failed << data - when "CRASHED" - @reporter.crashed data.result - @failed << data - - @reporter.done - stop_server + if data.id == @test_id + case data.type + when "LOG" + terminal.puts data.result + when "SUITE" + @reporter.suite data.suite + when "SUCCEEDED" + @reporter.succeeded data.name + @succeeded += 1 + when "FAILED" + @reporter.failed data.name, data.result + @failed << data + when "ERRORED" + @reporter.errored data.name, data.result + @failed << data + when "CRASHED" + @reporter.crashed data.result + @failed << data + + @reporter.done + stop_server unless @flags.watch + end end end @@ -335,7 +372,7 @@ module Mint end end - stop_server + stop_server unless @flags.watch end def stop_server diff --git a/src/test_runner.ecr b/src/test_runner.ecr index 10f270f95..45f7d4ef7 100644 --- a/src/test_runner.ecr +++ b/src/test_runner.ecr @@ -8,6 +8,8 @@