136 lines
3.3 KiB
Go
136 lines
3.3 KiB
Go
|
|
package main
|
||
|
|
|
||
|
|
import "fmt"
|
||
|
|
import . "swigtests/director_classic"
|
||
|
|
|
||
|
|
type TargetLangPerson struct{} // From Person
|
||
|
|
func (p *TargetLangPerson) Id() string {
|
||
|
|
return "TargetLangPerson"
|
||
|
|
}
|
||
|
|
|
||
|
|
type TargetLangChild struct{} // Form Child
|
||
|
|
func (p *TargetLangChild) Id() string {
|
||
|
|
return "TargetLangChild"
|
||
|
|
}
|
||
|
|
|
||
|
|
type TargetLangGrandChild struct{} // From Grandchild
|
||
|
|
func (p *TargetLangGrandChild) Id() string {
|
||
|
|
return "TargetLangGrandChild"
|
||
|
|
}
|
||
|
|
|
||
|
|
// Semis - don't override id() in target language
|
||
|
|
|
||
|
|
type TargetLangSemiPerson struct{} // From Person
|
||
|
|
|
||
|
|
type TargetLangSemiChild struct{} // From Child
|
||
|
|
|
||
|
|
type TargetLangSemiGrandChild struct{} // From GrandChild
|
||
|
|
|
||
|
|
// Orphans - don't override id() in C++
|
||
|
|
|
||
|
|
type TargetLangOrphanPerson struct{} // From OrphanPerson
|
||
|
|
func (p *TargetLangOrphanPerson) Id() string {
|
||
|
|
return "TargetLangOrphanPerson"
|
||
|
|
}
|
||
|
|
|
||
|
|
type TargetLangOrphanChild struct{} // From OrphanChild
|
||
|
|
func (p *TargetLangOrphanChild) Id() string {
|
||
|
|
return "TargetLangOrphanChild"
|
||
|
|
}
|
||
|
|
|
||
|
|
func check(person Person, expected string) {
|
||
|
|
debug := false
|
||
|
|
|
||
|
|
// Normal target language polymorphic call
|
||
|
|
ret := person.Id()
|
||
|
|
if debug {
|
||
|
|
fmt.Println(ret)
|
||
|
|
}
|
||
|
|
if ret != expected {
|
||
|
|
panic("Failed. Received: " + ret + " Expected: " + expected)
|
||
|
|
}
|
||
|
|
|
||
|
|
// Polymorphic call from C++
|
||
|
|
caller := NewCaller()
|
||
|
|
caller.SetCallback(person)
|
||
|
|
ret = caller.Call()
|
||
|
|
if debug {
|
||
|
|
fmt.Println(ret)
|
||
|
|
}
|
||
|
|
if ret != expected {
|
||
|
|
panic("Failed. Received: " + ret + " Expected: " + expected)
|
||
|
|
}
|
||
|
|
|
||
|
|
// Polymorphic call of object created in target language and
|
||
|
|
// passed to C++ and back again
|
||
|
|
baseclass := caller.BaseClass()
|
||
|
|
ret = baseclass.Id()
|
||
|
|
if debug {
|
||
|
|
fmt.Println(ret)
|
||
|
|
}
|
||
|
|
if ret != expected {
|
||
|
|
panic("Failed. Received: " + ret + " Expected: " + expected)
|
||
|
|
}
|
||
|
|
|
||
|
|
caller.ResetCallback()
|
||
|
|
if debug {
|
||
|
|
fmt.Println("----------------------------------------")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func main() {
|
||
|
|
person := NewPerson()
|
||
|
|
check(person, "Person")
|
||
|
|
DeletePerson(person)
|
||
|
|
|
||
|
|
person = NewChild()
|
||
|
|
check(person, "Child")
|
||
|
|
DeletePerson(person)
|
||
|
|
|
||
|
|
person = NewGrandChild()
|
||
|
|
check(person, "GrandChild")
|
||
|
|
DeletePerson(person)
|
||
|
|
|
||
|
|
person = NewDirectorPerson(&TargetLangPerson{})
|
||
|
|
check(person, "TargetLangPerson")
|
||
|
|
DeleteDirectorPerson(person)
|
||
|
|
|
||
|
|
person = NewDirectorChild(&TargetLangChild{})
|
||
|
|
check(person, "TargetLangChild")
|
||
|
|
DeleteDirectorChild(person.(Child))
|
||
|
|
|
||
|
|
person = NewDirectorGrandChild(&TargetLangGrandChild{})
|
||
|
|
check(person, "TargetLangGrandChild")
|
||
|
|
DeleteDirectorGrandChild(person.(GrandChild))
|
||
|
|
|
||
|
|
// Semis - don't override id() in target language
|
||
|
|
person = NewDirectorPerson(&TargetLangSemiPerson{})
|
||
|
|
check(person, "Person")
|
||
|
|
DeleteDirectorPerson(person)
|
||
|
|
|
||
|
|
person = NewDirectorChild(&TargetLangSemiChild{})
|
||
|
|
check(person, "Child")
|
||
|
|
DeleteDirectorChild(person.(Child))
|
||
|
|
|
||
|
|
person = NewDirectorGrandChild(&TargetLangSemiGrandChild{})
|
||
|
|
check(person, "GrandChild")
|
||
|
|
DeleteDirectorGrandChild(person.(GrandChild))
|
||
|
|
|
||
|
|
// Orphans - don't override id() in C++
|
||
|
|
person = NewOrphanPerson()
|
||
|
|
check(person, "Person")
|
||
|
|
DeleteOrphanPerson(person.(OrphanPerson))
|
||
|
|
|
||
|
|
person = NewOrphanChild()
|
||
|
|
check(person, "Child")
|
||
|
|
DeleteOrphanChild(person.(OrphanChild))
|
||
|
|
|
||
|
|
person = NewDirectorOrphanPerson(&TargetLangOrphanPerson{})
|
||
|
|
check(person, "TargetLangOrphanPerson")
|
||
|
|
DeleteDirectorOrphanPerson(person.(OrphanPerson))
|
||
|
|
|
||
|
|
person = NewDirectorOrphanChild(&TargetLangOrphanChild{})
|
||
|
|
check(person, "TargetLangOrphanChild")
|
||
|
|
DeleteDirectorOrphanChild(person.(OrphanChild))
|
||
|
|
}
|