Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test: fix input tests with expect not covering false negatives #19518

Merged
merged 7 commits into from
Oct 10, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 2 additions & 6 deletions .github/workflows/linux_ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -99,13 +99,9 @@ jobs:
./v3 version
./v3 -o tetris -usecache examples/tetris/tetris.v
- name: Test password input
run: |
./v examples/password
./v examples/password/password_ci.vsh
run: ./v test examples/password/
- name: Test readline
run: |
./v examples/readline/readline_ci.v
./v examples/readline/readline.vsh
run: ./v test examples/readline/

ubuntu-tcc-boehm-gc:
runs-on: ubuntu-20.04
Expand Down
8 changes: 2 additions & 6 deletions .github/workflows/macos_ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -113,10 +113,6 @@ jobs:
run: |
./v -o v2 -parallel-cc cmd/v
- name: Test password input
run: |
./v examples/password
./v examples/password/password_ci.vsh
run: ./v test examples/password/
- name: Test readline
run: |
./v examples/readline/readline_ci.v
./v examples/readline/readline.vsh
run: ./v test examples/readline/
8 changes: 0 additions & 8 deletions examples/password/correct.expect

This file was deleted.

8 changes: 0 additions & 8 deletions examples/password/incorrect.expect

This file was deleted.

3 changes: 0 additions & 3 deletions examples/password/password_ci.vsh

This file was deleted.

27 changes: 27 additions & 0 deletions examples/password/password_test.v
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import os

const (
// Expect has to be installed for the test.
expect_exe = os.find_abs_path_of_executable('expect') or {
eprintln('skipping test, since expect is missing')
exit(0)
}
// Directory that contains the Expect scripts used in the test.
expect_tests_path = os.join_path(@VMODROOT, 'examples', 'password', 'tests')
)

fn test_password_input() {
correct := os.execute(os.join_path(expect_tests_path, 'correct.expect'))
assert correct.exit_code == 0, correct.output

incorrect := os.execute(os.join_path(expect_tests_path, 'incorrect.expect'))
assert incorrect.exit_code == 0, incorrect.output

expected_out := 'Enter your password : '
mut res := os.execute('${os.join_path(expect_tests_path, 'output_from_expect_arg.expect')} "${expected_out}"')
assert res.exit_code == 0, res.output

not_exptectd_out := 'Enter your passwords : '
res = os.execute('${os.join_path(expect_tests_path, 'output_from_expect_arg.expect')} "${not_exptectd_out}"')
assert res.exit_code == 1, res.output
}
12 changes: 12 additions & 0 deletions examples/password/tests/correct.expect
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#!/usr/bin/expect

set timeout 3
set v_root [exec sh -c "git rev-parse --show-toplevel"]

spawn $v_root/v run $v_root/examples/password/password.v

expect "Enter your password : " { send "Sample\r" } timeout { exit 1 }
expect "Confirm password : " { send "Sample\r" } timeout { exit 1 }
expect "Password confirmed! You entered: Sample ." {} timeout { exit 1 }

expect eof
12 changes: 12 additions & 0 deletions examples/password/tests/incorrect.expect
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#!/usr/bin/expect

set timeout 3
set v_root [exec sh -c "git rev-parse --show-toplevel"]

spawn $v_root/v run $v_root/examples/password/password.v

expect "Enter your password : " { send "Sample123\r" } timeout { exit 1 }
expect "Confirm password : " { send "Sample234\r" } timeout { exit 1 }
expect "Passwords do not match ." {} timeout { exit 1 }

expect eof
12 changes: 12 additions & 0 deletions examples/password/tests/output_from_expect_arg.expect
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#!/usr/bin/expect

set timeout 3
set v_root [exec sh -c "git rev-parse --show-toplevel"]
# Send expected output as arg to re-use the script for testing incorrect values.
set expect_ [lindex $argv 0]

spawn $v_root/v run $v_root/examples/password/password.v

expect $expect_ {} timeout { exit 1 }

expect eof
9 changes: 0 additions & 9 deletions examples/readline/correct.expect

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@ fn main() {

fn run() ! {
$if windows {
eprintln('skipping test on windows for now')
eprintln('skipping on Windows, since raw mode and read_char are not yet implemented.')
return
} $else {
// Explicit comptime block for other OSes than Windows is required to not break compilation on Windows.
mut r := readline.Readline{}
r.enable_raw_mode_nosig()
defer {
Expand Down
2 changes: 0 additions & 2 deletions examples/readline/readline.vsh

This file was deleted.

26 changes: 26 additions & 0 deletions examples/readline/readline_test.v
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import os

const (
// Expect has to be installed for the test.
expect_exe = os.find_abs_path_of_executable('expect') or {
eprintln('skipping test, since expect is missing')
exit(0)
}
// Directory that contains the Expect scripts used in the test.
expect_tests_path = os.join_path(@VMODROOT, 'examples', 'readline', 'tests')
)

fn test_password_input() {
correct := os.execute(os.join_path(expect_tests_path, 'readline.expect'))
assert correct.exit_code == 0, correct.output

send_a := 'a'
expect_a := 'got 97' // readline output for `a`
a_res := os.execute('${os.join_path(expect_tests_path, 'readline_from_expect_arg.expect')} ${send_a} "${expect_a}"')
assert a_res.exit_code == 0, a_res.output

send_b := 'b'
b_res := os.execute('${os.join_path(expect_tests_path, 'readline_from_expect_arg.expect')} ${send_b} "${expect_a}"')
assert b_res.exit_code == 1, b_res.output
assert b_res.output.contains('got 98')
}
15 changes: 15 additions & 0 deletions examples/readline/tests/readline.expect
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#!/usr/bin/expect

set timeout 3
set v_root [exec sh -c "git rev-parse --show-toplevel"]

spawn $v_root/v run $v_root/examples/readline/readline.v

send "a"
expect "got 97" {} timeout { exit 1 }
send "1"
expect "got 49" {} timeout { exit 1 }
send "q"
expect "Goodbye." {} timeout { exit 1 }

expect eof
14 changes: 14 additions & 0 deletions examples/readline/tests/readline_from_expect_arg.expect
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#!/usr/bin/expect

set timeout 3
set v_root [exec sh -c "git rev-parse --show-toplevel"]
# Use input arguments for send and expect.
set send_ [lindex $argv 0]
set expect_ [lindex $argv 1]

spawn $v_root/v run $v_root/examples/readline/readline.v

send $send_
expect $expect_ {} timeout { exit 1 }

expect eof
Loading