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
 | 
						// TODO c.pref.is_vet
 | 
				
			||||||
	if node.language == .v && !node.is_method && node.params.len == 0 && node.return_type == table.void_type_idx &&
 | 
						if node.language == .v && !node.is_method && node.params.len == 0 && node.name.after('.').starts_with('test_') {
 | 
				
			||||||
		node.name.after('.').starts_with('test_') && !c.file.path.ends_with('_test.v') {
 | 
							if !c.file.path.ends_with('_test.v') {
 | 
				
			||||||
		// simple heuristic
 | 
								// simple heuristic
 | 
				
			||||||
		for st in node.stmts {
 | 
								for st in node.stmts {
 | 
				
			||||||
			if st is ast.AssertStmt {
 | 
									if st is ast.AssertStmt {
 | 
				
			||||||
				c.warn('tests will not be run because filename does not end with `_test.v`',
 | 
										c.warn('tests will not be run, because filename does not end with `_test.v`',
 | 
				
			||||||
					node.pos)
 | 
											node.pos)
 | 
				
			||||||
				break
 | 
										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.expected_type = table.void_type
 | 
				
			||||||
	c.cur_fn = node
 | 
						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 != ''
 | 
						assert vexe != ''
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn test_pipe_to_v_run() ? {
 | 
					fn pipe_to_v_run() ? {
 | 
				
			||||||
	cat_cmd := if os.user_os() == 'windows' { 'type' } else { 'cat' }
 | 
						cat_cmd := if os.user_os() == 'windows' { 'type' } else { 'cat' }
 | 
				
			||||||
	tmp_v_file := os.join_path(os.temp_dir(), 'generated_piped_program.v')
 | 
						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') ?
 | 
						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)
 | 
						os.rm(tmp_v_file)
 | 
				
			||||||
	assert !os.exists(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
 | 
							(*p) = &j
 | 
				
			||||||
		assert x == &j
 | 
							assert x == &j
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						// ///////
 | 
				
			||||||
	/////////
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	mut x := &int(0)
 | 
						mut x := &int(0)
 | 
				
			||||||
	unsafe {
 | 
						unsafe {
 | 
				
			||||||
		mut p := &x
 | 
							mut p := &x
 | 
				
			||||||
| 
						 | 
					@ -60,7 +58,7 @@ fn test_if_expr_unsafe() {
 | 
				
			||||||
	assert *p == 4
 | 
						assert *p == 4
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn test_unsafe_if_stmt() int {
 | 
					fn unsafe_if_stmt() int {
 | 
				
			||||||
	i := 4
 | 
						i := 4
 | 
				
			||||||
	unsafe {
 | 
						unsafe {
 | 
				
			||||||
		if true {
 | 
							if true {
 | 
				
			||||||
| 
						 | 
					@ -70,6 +68,11 @@ fn test_unsafe_if_stmt() int {
 | 
				
			||||||
	return i
 | 
						return i
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn test_unsafe_if_stmt() {
 | 
				
			||||||
 | 
						x := unsafe_if_stmt()
 | 
				
			||||||
 | 
						assert x == 4
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn test_map_address_index() {
 | 
					fn test_map_address_index() {
 | 
				
			||||||
	mut m := {
 | 
						mut m := {
 | 
				
			||||||
		'one': 1
 | 
							'one': 1
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@ fn check_cache_entry_fpath_invariants(x string, extension string) {
 | 
				
			||||||
	assert a[1][0..2] == a[0]
 | 
						assert a[1][0..2] == a[0]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn testsuite_begin() ? {
 | 
					fn testsuite_begin() {
 | 
				
			||||||
	os.setenv('VCACHE', vcache_folder, true)
 | 
						os.setenv('VCACHE', vcache_folder, true)
 | 
				
			||||||
	// eprintln('testsuite_begin, vcache_folder = $vcache_folder')
 | 
						// eprintln('testsuite_begin, vcache_folder = $vcache_folder')
 | 
				
			||||||
	os.rmdir_all(vcache_folder)
 | 
						os.rmdir_all(vcache_folder)
 | 
				
			||||||
| 
						 | 
					@ -22,41 +22,62 @@ fn testsuite_begin() ? {
 | 
				
			||||||
	assert os.is_dir(vcache_folder)
 | 
						assert os.is_dir(vcache_folder)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn test_save_and_load() ? {
 | 
					fn test_save_and_load() {
 | 
				
			||||||
	mut cm := vcache.new_cache_manager([])
 | 
						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')
 | 
						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 cm1 := vcache.new_cache_manager([])
 | 
				
			||||||
	mut cm2 := vcache.new_cache_manager(['-cc tcc'])
 | 
						mut cm2 := vcache.new_cache_manager(['-cc tcc'])
 | 
				
			||||||
	mut cm3 := vcache.new_cache_manager(['-cc gcc'])
 | 
						mut cm3 := vcache.new_cache_manager(['-cc gcc'])
 | 
				
			||||||
	x := cm1.save('.txt', 'first/cache/entry', 'hello') ?
 | 
						x := cm1.save('.txt', 'first/cache/entry', 'hello') or {
 | 
				
			||||||
	y := cm2.save('.txt', 'first/cache/entry', 'hello') ?
 | 
							assert false
 | 
				
			||||||
	z := cm3.save('.txt', 'first/cache/entry', 'hello') ?
 | 
							''
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						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(x, '.txt')
 | 
				
			||||||
	check_cache_entry_fpath_invariants(y, '.txt')
 | 
						check_cache_entry_fpath_invariants(y, '.txt')
 | 
				
			||||||
	check_cache_entry_fpath_invariants(z, '.txt')
 | 
						check_cache_entry_fpath_invariants(z, '.txt')
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn test_exists() ? {
 | 
					fn test_exists() {
 | 
				
			||||||
	mut cm := vcache.new_cache_manager([])
 | 
						mut cm := vcache.new_cache_manager([])
 | 
				
			||||||
	cm.exists('.o', 'abc') or {
 | 
						cm.exists('.o', 'abc') or {
 | 
				
			||||||
		assert true
 | 
							assert true
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
	x := cm.save('.x', 'abc', '') ?
 | 
						x := cm.save('.x', 'abc', '') or {
 | 
				
			||||||
 | 
							assert false
 | 
				
			||||||
 | 
							''
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	cm.exists('.o', 'abc') or {
 | 
						cm.exists('.o', 'abc') or {
 | 
				
			||||||
		assert true
 | 
							assert true
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
	y := cm.save('.o', 'zbc', '') ?
 | 
						y := cm.save('.o', 'zbc', '') or {
 | 
				
			||||||
 | 
							assert false
 | 
				
			||||||
 | 
							''
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	cm.exists('.o', 'abc') or {
 | 
						cm.exists('.o', 'abc') or {
 | 
				
			||||||
		assert true
 | 
							assert true
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	//
 | 
						//
 | 
				
			||||||
	z := cm.save('.o', 'abc', '') ?
 | 
						z := cm.save('.o', 'abc', '') or {
 | 
				
			||||||
 | 
							assert false
 | 
				
			||||||
 | 
							''
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	cm.exists('.o', 'abc') or {
 | 
						cm.exists('.o', 'abc') or {
 | 
				
			||||||
		assert false
 | 
							assert false
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -69,11 +90,14 @@ fn test_exists() ? {
 | 
				
			||||||
	assert y != z
 | 
						assert y != z
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn test_readme_exists_and_is_readable() ? {
 | 
					fn test_readme_exists_and_is_readable() {
 | 
				
			||||||
	vcache.new_cache_manager([])
 | 
						vcache.new_cache_manager([])
 | 
				
			||||||
	freadme := os.join_path(vcache_folder, 'README.md')
 | 
						freadme := os.join_path(vcache_folder, 'README.md')
 | 
				
			||||||
	assert os.is_file(freadme)
 | 
						assert os.is_file(freadme)
 | 
				
			||||||
	x := os.read_file(freadme) ?
 | 
						x := os.read_file(freadme) or {
 | 
				
			||||||
 | 
							assert false
 | 
				
			||||||
 | 
							''
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	assert x.len > 0
 | 
						assert x.len > 0
 | 
				
			||||||
	assert x.starts_with('This folder contains cached build artifacts')
 | 
						assert x.starts_with('This folder contains cached build artifacts')
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,10 +2,12 @@ import x.websocket
 | 
				
			||||||
import time
 | 
					import time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Tests with external ws & wss servers
 | 
					// Tests with external ws & wss servers
 | 
				
			||||||
fn test_ws() ? {
 | 
					fn test_ws() {
 | 
				
			||||||
	go start_server()
 | 
						go start_server()
 | 
				
			||||||
	time.sleep_ms(100)
 | 
						time.sleep_ms(100)
 | 
				
			||||||
	ws_test('ws://localhost:30000')?
 | 
						ws_test('ws://localhost:30000') or {
 | 
				
			||||||
 | 
							assert false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn start_server() ? {
 | 
					fn start_server() ? {
 | 
				
			||||||
| 
						 | 
					@ -20,7 +22,7 @@ fn start_server() ? {
 | 
				
			||||||
			return false
 | 
								return false
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return true
 | 
							return true
 | 
				
			||||||
	})?
 | 
						}) ?
 | 
				
			||||||
	s.on_message(fn (mut ws websocket.Client, msg &websocket.Message) ? {
 | 
						s.on_message(fn (mut ws websocket.Client, msg &websocket.Message) ? {
 | 
				
			||||||
		// payload := if msg.payload.len == 0 { '' } else { string(msg.payload, msg.payload.len) }
 | 
							// 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')
 | 
							// println('server client ($ws.id) got message: opcode: $msg.opcode, payload: $payload')
 | 
				
			||||||
| 
						 | 
					@ -38,7 +40,7 @@ fn start_server() ? {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn ws_test(uri string) ? {
 | 
					fn ws_test(uri string) ? {
 | 
				
			||||||
	eprintln('connecting to $uri ...')
 | 
						eprintln('connecting to $uri ...')
 | 
				
			||||||
	mut ws := websocket.new_client(uri)?
 | 
						mut ws := websocket.new_client(uri) ?
 | 
				
			||||||
	ws.on_open(fn (mut ws websocket.Client) ? {
 | 
						ws.on_open(fn (mut ws websocket.Client) ? {
 | 
				
			||||||
		println('open!')
 | 
							println('open!')
 | 
				
			||||||
		ws.pong()
 | 
							ws.pong()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue