tests: test more edge cases for interfaces (#5292)

pull/12582/head
Sandro Martini 2021-11-26 10:10:03 +01:00 committed by GitHub
parent cf274f262c
commit 85633fe546
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 95 additions and 18 deletions

View File

@ -58,13 +58,50 @@ fn (mut d Dog) set_breed(new string) {
} }
// do not add to Dog the utility function 'str', so the default one will be used, as a sample // do not add to Dog the utility function 'str', so the default one will be used, as a sample
fn test_todo() {
if true { struct Bird {
} else { mut:
} breed string
}
fn (b Bird) speak(s string) {
println('tweet')
}
fn (b Bird) name() string {
return b.breed
}
fn (b Bird) name_detailed(pet_name string) string {
return '$pet_name the ${typeof(b).name}, breed:$b.breed'
}
fn (mut b Bird) set_breed(new string) {
println('canary')
b.breed = new
}
// do not add to Bird the utility function 'str', so the default one will be used, as a sample
fn is_dog_or_cat(a Animal) bool {
is_dog := a is Dog
is_cat := a is Cat
println('Animal is Dog or Cat: is a Dog: $is_dog, is a Cat: $is_cat')
// return is_dog || is_cat
// shorter syntax
is_dog_or_cat := if (a is Dog) || (a is Cat) { true } else { false }
println('Animal is Dog or Cat: $is_dog_or_cat')
return is_dog_or_cat
}
fn is_dog_or_cat_or_bird(a Animal) bool {
ret := a is Dog || a is Cat || a is Bird
println('Animal is Dog or Cat or Bird: $ret')
return ret
} }
fn perform_speak(a Animal) { fn perform_speak(a Animal) {
println('---- ${@FN}, given Animal: $a ----')
a.speak('Hi !') a.speak('Hi !')
assert true assert true
name := a.name() name := a.name()
@ -77,9 +114,11 @@ fn perform_speak(a Animal) {
println(a.name()) println(a.name())
println('Got animal of type: ${typeof(a).name}') // TODO: get implementation type (if possible) println('Got animal of type: ${typeof(a).name}') // TODO: get implementation type (if possible)
assert a is Dog || a is Cat assert a is Dog || a is Cat
assert is_dog_or_cat(a)
} }
fn perform_speak_on_ptr(a &Animal) { fn perform_speak_on_ptr(a &Animal) {
println('---- ${@FN}, given &Animal: $a ----')
a.speak('Hi !') a.speak('Hi !')
assert true assert true
name := a.name() name := a.name()
@ -90,9 +129,11 @@ fn perform_speak_on_ptr(a &Animal) {
println(a.name()) println(a.name())
println('Got animal of type: ${typeof(a).name}') // TODO: get implementation type (if possible) println('Got animal of type: ${typeof(a).name}') // TODO: get implementation type (if possible)
assert a is Dog || a is Cat assert a is Dog || a is Cat
assert is_dog_or_cat(a)
} }
fn test_perform_speak() { fn test_perform_speak() {
println('---- ${@FN} ----')
dog := Dog{ dog := Dog{
breed: 'Labrador Retriever' breed: 'Labrador Retriever'
} }
@ -112,11 +153,6 @@ fn test_perform_speak() {
}) })
perform_speak_on_ptr(new_cat('Persian')) perform_speak_on_ptr(new_cat('Persian'))
handle_animals([dog, cat]) handle_animals([dog, cat])
/*
f := Foo {
speaker: dog
}
*/
} }
fn change_animal_breed(mut a Animal, new string) { fn change_animal_breed(mut a Animal, new string) {
@ -124,10 +160,10 @@ fn change_animal_breed(mut a Animal, new string) {
} }
fn test_interface_ptr_modification() { fn test_interface_ptr_modification() {
println('---- ${@FN} ----')
mut cat := Cat{ mut cat := Cat{
breed: 'Persian' breed: 'Persian'
} }
// TODO Should fail and require `mut cat`
change_animal_breed(mut cat, 'Siamese') change_animal_breed(mut cat, 'Siamese')
assert cat.breed == 'Siamese' assert cat.breed == 'Siamese'
} }
@ -139,6 +175,7 @@ fn perform_name_detailed(a Animal) {
} }
fn test_perform_name_detailed() { fn test_perform_name_detailed() {
println('---- ${@FN} ----')
dog := Dog{ dog := Dog{
breed: 'Labrador Retriever' breed: 'Labrador Retriever'
} }
@ -187,6 +224,7 @@ fn handle_reg(r Register) {
} }
fn test_register() { fn test_register() {
println('---- ${@FN} ----')
f := RegTest{} f := RegTest{}
f.register() f.register()
handle_reg(f) handle_reg(f)
@ -256,6 +294,7 @@ mut:
} }
fn test_interface_array() { fn test_interface_array() {
println('---- ${@FN} ----')
println('Test on array of animals ...') println('Test on array of animals ...')
mut animals := []Animal{} mut animals := []Animal{}
animals = [Cat{}, Dog{ animals = [Cat{}, Dog{
@ -264,13 +303,15 @@ fn test_interface_array() {
assert true assert true
animals << Cat{} animals << Cat{}
assert true assert true
// TODO .str() from the real types should be called animals << Bird{}
assert true
// println('Animals array contains: ${animals.str()}') // explicit call to 'str' function // println('Animals array contains: ${animals.str()}') // explicit call to 'str' function
// println('Animals array contains: ${animals}') // implicit call to 'str' function println('Animals array contains: $animals') // implicit call to 'str' function
assert animals.len == 3 assert animals.len == 4
} }
fn test_interface_ptr_array() { fn test_interface_ptr_array() {
println('---- ${@FN} ----')
mut animals := []&Animal{} mut animals := []&Animal{}
animals = [Cat{}, Dog{ animals = [Cat{}, Dog{
breed: 'Labrador Retriever' breed: 'Labrador Retriever'
@ -278,15 +319,20 @@ fn test_interface_ptr_array() {
assert true assert true
animals << Cat{} animals << Cat{}
assert true assert true
assert animals.len == 3 animals << Bird{}
assert true
// println('Animals array contains: ${animals.str()}') // explicit call to 'str' function
println('Animals array contains: $animals') // implicit call to 'str' function
assert animals.len == 4
} }
fn test_is() { fn test_is() {
println('---- ${@FN} ----')
dog := Dog{} dog := Dog{}
assert foo2(dog) == 1 assert is_dog_int(dog) == 1
} }
fn foo2(a Animal) int { fn is_dog_int(a Animal) int {
if a is Dog { if a is Dog {
return 1 return 1
} else { } else {
@ -294,6 +340,36 @@ fn foo2(a Animal) int {
} }
} }
fn test_is_bool() {
println('---- ${@FN} ----')
dog := Dog{}
assert is_dog(dog) == true
assert is_dog_or_cat(dog)
cat := Cat{}
assert is_dog(cat) == false
assert is_dog_or_cat(cat)
bird := Bird{}
assert is_dog(bird) == false
assert !is_dog_or_cat(bird)
assert is_dog_or_cat_or_bird(bird)
}
fn is_dog(a Animal) bool {
println("Got animal: '$a'") // implicit call to 'str' function of implementations
println('with type: ${typeof(a).name}') // get implementation type (if possible)
// sample (additional checks) here
is_dog_or_cat := if (a is Dog) || (a is Cat) { true } else { false }
println('Animal is Dog or Cat: $is_dog_or_cat')
// use/test even another syntax
if a is Dog {
return true
} else {
return false
}
}
fn new_animal() Animal { fn new_animal() Animal {
dog := Dog{} dog := Dog{}
return dog return dog
@ -309,7 +385,7 @@ fn animal_match(a Animal) {
match a { match a {
Dog { println('(dog)') } Dog { println('(dog)') }
Cat { println('(cat)') } Cat { println('(cat)') }
else {} else { println('(other)' }
} }
} }
*/ */
@ -354,7 +430,8 @@ fn get_animal_name(mut a Animal2) string {
return a.get_name() return a.get_name()
} }
fn main() { fn test_aa() {
println('---- ${@FN} ----')
mut aa := AA{} mut aa := AA{}
mut ii := II(aa) mut ii := II(aa)
assert ii.my_field == 0 assert ii.my_field == 0