| package main |
| |
| import . "director_exception" |
| |
| type Exception struct { |
| msg string |
| } |
| |
| func NewException(a, b string) *Exception { |
| return &Exception{a + b} |
| } |
| |
| type MyFoo struct{} // From Foo |
| func (p *MyFoo) Ping() string { |
| panic("MyFoo::ping() EXCEPTION") |
| } |
| |
| type MyFoo2 struct{} // From Foo |
| func (p *MyFoo2) Ping() bool { |
| return true // should return a string |
| } |
| |
| type MyFoo3 struct{} // From Foo |
| func (p *MyFoo3) Ping() string { |
| panic(NewException("foo", "bar")) |
| } |
| |
| func main() { |
| // Check that the NotImplementedError raised by MyFoo.ping() |
| // is returned by MyFoo.pong(). |
| ok := false |
| a := NewDirectorFoo(&MyFoo{}) |
| b := Launder(a) |
| func() { |
| defer func() { |
| e := recover() |
| if e.(string) == "MyFoo::ping() EXCEPTION" { |
| ok = true |
| } else { |
| panic("Unexpected error message: " + e.(string)) |
| } |
| }() |
| b.Pong() |
| }() |
| if !ok { |
| panic(0) |
| } |
| |
| // Check that if the method has the wrong return type it is |
| // not called. |
| ok = false |
| a = NewDirectorFoo(&MyFoo2{}) |
| b = Launder(a) |
| e := b.Pong() |
| if e != "Foo::pong();"+"Foo::ping()" { |
| panic(e) |
| } |
| |
| // Check that the director can return an exception which |
| // requires two arguments to the constructor, without mangling |
| // it. |
| ok = false |
| a = NewDirectorFoo(&MyFoo3{}) |
| b = Launder(a) |
| func() { |
| defer func() { |
| e := recover() |
| if e.(*Exception).msg == "foobar" { |
| ok = true |
| } else { |
| panic("Unexpected error message: " + e.(string)) |
| } |
| }() |
| b.Pong() |
| }() |
| if !ok { |
| panic(0) |
| } |
| |
| func() { |
| defer func() { |
| e := recover() |
| _ = e.(Exception2) |
| }() |
| panic(NewException2()) |
| }() |
| |
| func() { |
| defer func() { |
| e := recover() |
| _ = e.(Exception1) |
| }() |
| panic(NewException1()) |
| }() |
| } |