fish-shell/tests/pexpects/postexec.py

148 lines
4.2 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
from pexpect_helper import SpawnedProc
sp = SpawnedProc()
sendline, expect_prompt, expect_str = sp.sendline, sp.expect_prompt, sp.expect_str
# Test fish_postexec and $status_generation for interactive shells.
expect_prompt()
2020-11-22 21:39:48 +08:00
sendline(
"function test_fish_postexec --on-event fish_postexec; printf 'pipestatus:%s, generation:%d, command:%s\\n' (string join '|' $pipestatus) $status_generation $argv; end"
)
expect_prompt()
generation = 1
# fish_postexec is called when foreground job ends.
sendline("true")
generation += 1
expect_str("pipestatus:0, generation:%d, command:true" % generation)
expect_prompt()
# Command has multiple jobs.
sendline("true;false")
generation += 1
expect_str("pipestatus:1, generation:%d, command:true;false" % generation)
expect_prompt()
# Command is a pipeline.
sendline("true|false")
generation += 1
expect_str("pipestatus:0|1, generation:%d, command:true|false" % generation)
expect_prompt()
# Does not increment $status_generation for background jobs.
# status, pipestatus remain unchanged
sendline("sleep 1000 &")
expect_str("pipestatus:0|1, generation:%d, command:sleep 1000 &" % generation)
expect_prompt()
# multiple backgrounded jobs
sendline("sleep 1000 &; sleep 2000 &")
2020-11-22 21:39:48 +08:00
expect_str(
"pipestatus:0|1, generation:%d, command:sleep 1000 &; sleep 2000 &" % generation
)
expect_prompt()
# valid variable assignment
sendline("set foo bar")
expect_str("pipestatus:0|1, generation:%d, command:set foo bar" % generation)
expect_prompt()
# valid variable assignment with background job
sendline("set foo bar; sleep 1000 &")
2020-11-22 21:39:48 +08:00
expect_str(
"pipestatus:0|1, generation:%d, command:set foo bar; sleep 1000 &" % generation
)
expect_prompt()
# Increments $status_generation if any job was foreground.
sendline("false|true; sleep 1000 &")
generation += 1
2020-11-22 21:39:48 +08:00
expect_str(
"pipestatus:1|0, generation:%d, command:false|true; sleep 1000 &" % generation
)
expect_prompt()
sendline("sleep 1000 &; true|false|true")
generation += 1
2020-11-22 21:39:48 +08:00
expect_str(
"pipestatus:0|1|0, generation:%d, command:sleep 1000 &; true|false|true"
% generation
)
expect_prompt()
# Increments $status_generation for empty if/while blocks.
sendline("if true;end")
generation += 1
expect_str("pipestatus:0, generation:%d, command:if true;end" % generation)
expect_prompt()
sendline("while false;end")
generation += 1
expect_str("pipestatus:0, generation:%d, command:while false;end" % generation)
expect_prompt()
# or non-matching if.
sendline("if false;false;end")
generation += 1
expect_str("pipestatus:0, generation:%d, command:if false;false;end" % generation)
expect_prompt()
# or a function definition.
# This is an implementation detail, but the test case should prevent regressions.
sendline("function fail; false; end")
generation += 1
2020-11-22 21:39:48 +08:00
expect_str(
"pipestatus:0, generation:%d, command:function fail; false; end" % generation
)
expect_prompt()
# or an invalid variable assignment
sendline("set '!@#$' value")
generation += 1
expect_str("pipestatus:2, generation:%d, command:set '!@#$' value" % generation)
expect_prompt()
# or a variable query
sendline("set -q fish_pid")
generation += 1
expect_str("pipestatus:0, generation:%d, command:set -q fish_pid" % generation)
expect_prompt()
# This is just to set a memorable pipestatus.
sendline("true|false|true")
generation += 1
expect_str("pipestatus:0|1|0")
expect_prompt()
# Does not increment $status_generation for empty begin/end block.
sendline("begin;end")
expect_str("pipestatus:0|1|0, generation:%d, command:begin;end" % generation)
expect_prompt()
# Or begin/end block with only backgrounded jobs.
sendline("begin; sleep 200 &; sleep 400 &; end")
2020-11-22 21:39:48 +08:00
expect_str(
"pipestatus:0|1|0, generation:%d, command:begin; sleep 200 &; sleep 400 &; end"
% generation
)
expect_prompt()
# Or a combination of begin/end block and backgrounded job.
sendline("begin; sleep 200 &; end; sleep 400 &")
2020-11-22 21:39:48 +08:00
expect_str(
"pipestatus:0|1|0, generation:%d, command:begin; sleep 200 &; end; sleep 400 &"
% generation
)
expect_prompt()
# Or a combination with variable assignments
sendline("begin; set foo bar; sleep 1000 &; end; set bar baz; sleep 2000 &")
2020-11-22 21:39:48 +08:00
expect_str(
"pipestatus:0|1|0, generation:%d, command:begin; set foo bar; sleep 1000 &; end; set bar baz; sleep 2000 &"
% generation
)
expect_prompt()