checker: add check against `fn test_opt() ?{}`
							parent
							
								
									9871d24929
								
							
						
					
					
						commit
						3c4b87bfec
					
				| 
						 | 
				
			
			@ -4505,16 +4505,21 @@ fn (mut c Checker) fn_decl(mut node ast.FnDecl) {
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
	// TODO c.pref.is_vet
 | 
			
		||||
	if node.language == .v && !node.is_method && node.params.len == 0 && node.return_type == table.void_type_idx &&
 | 
			
		||||
		node.name.after('.').starts_with('test_') && !c.file.path.ends_with('_test.v') {
 | 
			
		||||
		// simple heuristic
 | 
			
		||||
		for st in node.stmts {
 | 
			
		||||
			if st is ast.AssertStmt {
 | 
			
		||||
				c.warn('tests will not be run because filename does not end with `_test.v`',
 | 
			
		||||
					node.pos)
 | 
			
		||||
				break
 | 
			
		||||
	if node.language == .v && !node.is_method && node.params.len == 0 && node.name.after('.').starts_with('test_') {
 | 
			
		||||
		if !c.file.path.ends_with('_test.v') {
 | 
			
		||||
			// simple heuristic
 | 
			
		||||
			for st in node.stmts {
 | 
			
		||||
				if st is ast.AssertStmt {
 | 
			
		||||
					c.warn('tests will not be run, because filename does not end with `_test.v`',
 | 
			
		||||
						node.pos)
 | 
			
		||||
					break
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		// eprintln('> node.name: $node.name | node.return_type: $node.return_type')
 | 
			
		||||
		if node.return_type != table.void_type_idx {
 | 
			
		||||
			c.error('test functions should not return anything', node.pos)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	c.expected_type = table.void_type
 | 
			
		||||
	c.cur_fn = node
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,13 @@
 | 
			
		|||
vlib/v/checker/tests/test_functions_should_not_return_test.vv:9:1: error: test functions should not return anything
 | 
			
		||||
    7 | 
 | 
			
		||||
    8 | // should be disallowed:
 | 
			
		||||
    9 | fn test_returning_int() int {
 | 
			
		||||
      | ~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
   10 | 
 | 
			
		||||
   11 | }
 | 
			
		||||
vlib/v/checker/tests/test_functions_should_not_return_test.vv:14:1: error: test functions should not return anything
 | 
			
		||||
   12 | 
 | 
			
		||||
   13 | // should be disallowed:
 | 
			
		||||
   14 | fn test_returning_opt() ? {
 | 
			
		||||
      | ~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
			
		||||
   15 | }
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,15 @@
 | 
			
		|||
// ordinary functions can return whatever they like,
 | 
			
		||||
// since they are not called by V's testing system
 | 
			
		||||
// in the generated main():
 | 
			
		||||
fn abc() int {
 | 
			
		||||
	return 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// should be disallowed:
 | 
			
		||||
fn test_returning_int() int {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// should be disallowed:
 | 
			
		||||
fn test_returning_opt() ? {
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -8,7 +8,7 @@ fn test_vexe_is_set() {
 | 
			
		|||
	assert vexe != ''
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_pipe_to_v_run() ? {
 | 
			
		||||
fn pipe_to_v_run() ? {
 | 
			
		||||
	cat_cmd := if os.user_os() == 'windows' { 'type' } else { 'cat' }
 | 
			
		||||
	tmp_v_file := os.join_path(os.temp_dir(), 'generated_piped_program.v')
 | 
			
		||||
	os.write_file(tmp_v_file, 'println(1 + 3)\nprintln("hello")\n') ?
 | 
			
		||||
| 
						 | 
				
			
			@ -21,3 +21,9 @@ fn test_pipe_to_v_run() ? {
 | 
			
		|||
	os.rm(tmp_v_file)
 | 
			
		||||
	assert !os.exists(tmp_v_file)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_pipe_to_v_run() {
 | 
			
		||||
	pipe_to_v_run() or {
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,9 +23,7 @@ fn test_double_ptr() {
 | 
			
		|||
		(*p) = &j
 | 
			
		||||
		assert x == &j
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/////////
 | 
			
		||||
 | 
			
		||||
	// ///////
 | 
			
		||||
	mut x := &int(0)
 | 
			
		||||
	unsafe {
 | 
			
		||||
		mut p := &x
 | 
			
		||||
| 
						 | 
				
			
			@ -60,7 +58,7 @@ fn test_if_expr_unsafe() {
 | 
			
		|||
	assert *p == 4
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_unsafe_if_stmt() int {
 | 
			
		||||
fn unsafe_if_stmt() int {
 | 
			
		||||
	i := 4
 | 
			
		||||
	unsafe {
 | 
			
		||||
		if true {
 | 
			
		||||
| 
						 | 
				
			
			@ -70,6 +68,11 @@ fn test_unsafe_if_stmt() int {
 | 
			
		|||
	return i
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_unsafe_if_stmt() {
 | 
			
		||||
	x := unsafe_if_stmt()
 | 
			
		||||
	assert x == 4
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_map_address_index() {
 | 
			
		||||
	mut m := {
 | 
			
		||||
		'one': 1
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,7 +14,7 @@ fn check_cache_entry_fpath_invariants(x string, extension string) {
 | 
			
		|||
	assert a[1][0..2] == a[0]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn testsuite_begin() ? {
 | 
			
		||||
fn testsuite_begin() {
 | 
			
		||||
	os.setenv('VCACHE', vcache_folder, true)
 | 
			
		||||
	// eprintln('testsuite_begin, vcache_folder = $vcache_folder')
 | 
			
		||||
	os.rmdir_all(vcache_folder)
 | 
			
		||||
| 
						 | 
				
			
			@ -22,41 +22,62 @@ fn testsuite_begin() ? {
 | 
			
		|||
	assert os.is_dir(vcache_folder)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_save_and_load() ? {
 | 
			
		||||
fn test_save_and_load() {
 | 
			
		||||
	mut cm := vcache.new_cache_manager([])
 | 
			
		||||
	x := cm.save('.txt', 'first/cache/entry', 'hello') ?
 | 
			
		||||
	x := cm.save('.txt', 'first/cache/entry', 'hello') or {
 | 
			
		||||
		assert false
 | 
			
		||||
		''
 | 
			
		||||
	}
 | 
			
		||||
	check_cache_entry_fpath_invariants(x, '.txt')
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_different_options_should_produce_different_cache_entries_for_same_key_and_content() ? {
 | 
			
		||||
fn test_different_options_should_produce_different_cache_entries_for_same_key_and_content() {
 | 
			
		||||
	mut cm1 := vcache.new_cache_manager([])
 | 
			
		||||
	mut cm2 := vcache.new_cache_manager(['-cc tcc'])
 | 
			
		||||
	mut cm3 := vcache.new_cache_manager(['-cc gcc'])
 | 
			
		||||
	x := cm1.save('.txt', 'first/cache/entry', 'hello') ?
 | 
			
		||||
	y := cm2.save('.txt', 'first/cache/entry', 'hello') ?
 | 
			
		||||
	z := cm3.save('.txt', 'first/cache/entry', 'hello') ?
 | 
			
		||||
	x := cm1.save('.txt', 'first/cache/entry', 'hello') or {
 | 
			
		||||
		assert false
 | 
			
		||||
		''
 | 
			
		||||
	}
 | 
			
		||||
	y := cm2.save('.txt', 'first/cache/entry', 'hello') or {
 | 
			
		||||
		assert false
 | 
			
		||||
		''
 | 
			
		||||
	}
 | 
			
		||||
	z := cm3.save('.txt', 'first/cache/entry', 'hello') or {
 | 
			
		||||
		assert false
 | 
			
		||||
		''
 | 
			
		||||
	}
 | 
			
		||||
	check_cache_entry_fpath_invariants(x, '.txt')
 | 
			
		||||
	check_cache_entry_fpath_invariants(y, '.txt')
 | 
			
		||||
	check_cache_entry_fpath_invariants(z, '.txt')
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_exists() ? {
 | 
			
		||||
fn test_exists() {
 | 
			
		||||
	mut cm := vcache.new_cache_manager([])
 | 
			
		||||
	cm.exists('.o', 'abc') or {
 | 
			
		||||
		assert true
 | 
			
		||||
	}
 | 
			
		||||
	//
 | 
			
		||||
	x := cm.save('.x', 'abc', '') ?
 | 
			
		||||
	x := cm.save('.x', 'abc', '') or {
 | 
			
		||||
		assert false
 | 
			
		||||
		''
 | 
			
		||||
	}
 | 
			
		||||
	cm.exists('.o', 'abc') or {
 | 
			
		||||
		assert true
 | 
			
		||||
	}
 | 
			
		||||
	//
 | 
			
		||||
	y := cm.save('.o', 'zbc', '') ?
 | 
			
		||||
	y := cm.save('.o', 'zbc', '') or {
 | 
			
		||||
		assert false
 | 
			
		||||
		''
 | 
			
		||||
	}
 | 
			
		||||
	cm.exists('.o', 'abc') or {
 | 
			
		||||
		assert true
 | 
			
		||||
	}
 | 
			
		||||
	//
 | 
			
		||||
	z := cm.save('.o', 'abc', '') ?
 | 
			
		||||
	z := cm.save('.o', 'abc', '') or {
 | 
			
		||||
		assert false
 | 
			
		||||
		''
 | 
			
		||||
	}
 | 
			
		||||
	cm.exists('.o', 'abc') or {
 | 
			
		||||
		assert false
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -69,11 +90,14 @@ fn test_exists() ? {
 | 
			
		|||
	assert y != z
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_readme_exists_and_is_readable() ? {
 | 
			
		||||
fn test_readme_exists_and_is_readable() {
 | 
			
		||||
	vcache.new_cache_manager([])
 | 
			
		||||
	freadme := os.join_path(vcache_folder, 'README.md')
 | 
			
		||||
	assert os.is_file(freadme)
 | 
			
		||||
	x := os.read_file(freadme) ?
 | 
			
		||||
	x := os.read_file(freadme) or {
 | 
			
		||||
		assert false
 | 
			
		||||
		''
 | 
			
		||||
	}
 | 
			
		||||
	assert x.len > 0
 | 
			
		||||
	assert x.starts_with('This folder contains cached build artifacts')
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,10 +2,12 @@ import x.websocket
 | 
			
		|||
import time
 | 
			
		||||
 | 
			
		||||
// Tests with external ws & wss servers
 | 
			
		||||
fn test_ws() ? {
 | 
			
		||||
fn test_ws() {
 | 
			
		||||
	go start_server()
 | 
			
		||||
	time.sleep_ms(100)
 | 
			
		||||
	ws_test('ws://localhost:30000')?
 | 
			
		||||
	ws_test('ws://localhost:30000') or {
 | 
			
		||||
		assert false
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn start_server() ? {
 | 
			
		||||
| 
						 | 
				
			
			@ -20,7 +22,7 @@ fn start_server() ? {
 | 
			
		|||
			return false
 | 
			
		||||
		}
 | 
			
		||||
		return true
 | 
			
		||||
	})?
 | 
			
		||||
	}) ?
 | 
			
		||||
	s.on_message(fn (mut ws websocket.Client, msg &websocket.Message) ? {
 | 
			
		||||
		// payload := if msg.payload.len == 0 { '' } else { string(msg.payload, msg.payload.len) }
 | 
			
		||||
		// println('server client ($ws.id) got message: opcode: $msg.opcode, payload: $payload')
 | 
			
		||||
| 
						 | 
				
			
			@ -38,7 +40,7 @@ fn start_server() ? {
 | 
			
		|||
 | 
			
		||||
fn ws_test(uri string) ? {
 | 
			
		||||
	eprintln('connecting to $uri ...')
 | 
			
		||||
	mut ws := websocket.new_client(uri)?
 | 
			
		||||
	mut ws := websocket.new_client(uri) ?
 | 
			
		||||
	ws.on_open(fn (mut ws websocket.Client) ? {
 | 
			
		||||
		println('open!')
 | 
			
		||||
		ws.pong()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue