v/vlib/compiler/tests/repl/repl_test.v

105 lines
2.7 KiB
V
Raw Normal View History

module main
2019-08-18 17:21:48 +02:00
import os
import compiler.tests.repl.runner
import benchmark
2020-01-20 17:06:36 +01:00
import runtime
import sync
import filepath
fn test_the_v_compiler_can_be_invoked() {
vexec := runner.full_path_to_v(5)
println('vexecutable: $vexec')
assert vexec != ''
vcmd := '"$vexec" --version'
2019-12-30 05:23:54 +01:00
r := os.exec(vcmd) or {
panic(err)
}
// println('"$vcmd" exit_code: $r.exit_code | output: $r.output')
assert r.exit_code == 0
vcmd_error := '"$vexec" nonexisting.v'
2019-12-30 05:23:54 +01:00
r_error := os.exec(vcmd_error) or {
panic(err)
}
// println('"$vcmd_error" exit_code: $r_error.exit_code | output: $r_error.output')
assert r_error.exit_code == 1
assert r_error.output == '`nonexisting.v` does not exist'
}
2020-01-20 17:06:36 +01:00
struct Session {
mut:
options runner.RunnerOptions
bmark benchmark.Benchmark
ntask int
ntask_mtx &sync.Mutex
waitgroup &sync.WaitGroup
}
fn test_all_v_repl_files() {
2020-01-20 17:06:36 +01:00
mut session := &Session{
options: runner.new_options()
bmark: benchmark.new_benchmark()
ntask: 0
ntask_mtx: sync.new_mutex()
waitgroup: sync.new_waitgroup()
}
// warmup, and ensure that the vrepl is compiled in single threaded mode if it does not exist
runner.run_repl_file(os.cachedir(), session.options.vexec, 'vlib/compiler/tests/repl/nothing.repl') or {
panic(err)
}
session.bmark.set_total_expected_steps( session.options.files.len )
mut ncpus := 0
ncpus = runtime.nr_cpus()
2020-01-20 17:06:36 +01:00
$if windows {
// See: https://docs.microsoft.com/en-us/cpp/build/reference/fs-force-synchronous-pdb-writes?view=vs-2019
ncpus = 1
}
session.waitgroup.add( ncpus )
for i:=0; i < ncpus; i++ {
go process_in_thread(session,i)
2020-01-20 17:06:36 +01:00
}
session.waitgroup.wait()
session.bmark.stop()
println(session.bmark.total_message('total time spent running REPL files'))
}
fn process_in_thread( session mut Session, thread_id int ){
2020-01-20 17:06:36 +01:00
cdir := os.cachedir()
mut tls_bench := benchmark.new_benchmark()
tls_bench.set_total_expected_steps( session.bmark.nexpected_steps )
for {
session.ntask_mtx.lock()
session.ntask++
idx := session.ntask-1
session.ntask_mtx.unlock()
if idx >= session.options.files.len { break }
tls_bench.cstep = idx
tfolder := filepath.join( cdir, 'vrepl_tests_$idx')
if os.is_dir( tfolder ) {
os.rmdir_recursive( tfolder )
}
os.mkdir( tfolder ) or { panic(err) }
file := session.options.files[ idx ]
2020-01-20 17:06:36 +01:00
session.bmark.step()
tls_bench.step()
fres := runner.run_repl_file(tfolder, session.options.vexec, file) or {
session.bmark.fail()
tls_bench.fail()
os.rmdir_recursive( tfolder )
eprintln(tls_bench.step_message_fail(err))
assert false
continue
}
2020-01-20 17:06:36 +01:00
session.bmark.ok()
tls_bench.ok()
os.rmdir_recursive( tfolder )
println(tls_bench.step_message_ok(fres))
assert true
}
2020-01-20 17:06:36 +01:00
session.waitgroup.done()
}