Skip to content

Commit

Permalink
tests: fix input tests with expect, not covering false negatives (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
ttytm committed Oct 10, 2023
1 parent a1c16a7 commit c4ee940
Show file tree
Hide file tree
Showing 15 changed files with 124 additions and 43 deletions.
8 changes: 2 additions & 6 deletions .github/workflows/linux_ci.yml
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
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
@@ -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
@@ -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
@@ -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
@@ -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.

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
@@ -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
@@ -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
@@ -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

0 comments on commit c4ee940

Please sign in to comment.