fn test_empty_string_access() {
	mut res := ''
	a := ''
	if a[0] or { `0` } == `1` {
		res = 'good'
	} else {
		res = 'bad'
	}
	assert res == 'bad'
}

fn test_good_string_access() {
	mut res := ''
	a := 'abcd'
	if a[2] or { `0` } == `c` {
		res = 'good'
	} else {
		res = 'bad'
	}
	assert res == 'good'
}

fn test_if_guard_bad() {
	mut res := 'bad'
	a := 'xy'
	if z := a[2] {
		res = '${z:c}'
	}
	assert res == 'bad'
}

fn test_if_guard_good() {
	mut res := 'bad'
	a := 'xy123'
	if z := a[2] {
		res = '${z:c}'
	}
	assert res == '1'
}

fn get_propagate(s string, i int) !string {
	c := s[i]!
	return 'got `${c:c}`'
}

fn test_propagation() {
	s := 'abcd'
	x := get_propagate(s, 2) or { '${err}' }
	y := get_propagate(s, 5) or { '${err}' }
	assert x == 'got `c`'
	assert y == 'none'
}
