status-go/vendor/github.com/robertkrimen/otto/testing_test.go

136 lines
2.4 KiB
Go

package otto
import (
"./terst"
"errors"
"strings"
"testing"
"time"
)
func tt(t *testing.T, arguments ...func()) {
halt := errors.New("A test was taking too long")
timer := time.AfterFunc(2*time.Second, func() {
panic(halt)
})
defer func() {
timer.Stop()
}()
terst.Terst(t, arguments...)
}
func is(arguments ...interface{}) bool {
var got, expect interface{}
switch len(arguments) {
case 0, 1:
return terst.Is(arguments...)
case 2:
got, expect = arguments[0], arguments[1]
default:
got, expect = arguments[0], arguments[2]
}
switch value := got.(type) {
case Value:
if value.value != nil {
got = value.value
}
case *Error:
if value != nil {
got = value.Error()
}
if expect == nil {
// FIXME This is weird
expect = ""
}
}
if len(arguments) == 2 {
arguments[0] = got
arguments[1] = expect
} else {
arguments[0] = got
arguments[2] = expect
}
return terst.Is(arguments...)
}
func test(arguments ...interface{}) (func(string, ...interface{}) Value, *_tester) {
tester := newTester()
if len(arguments) > 0 {
tester.test(arguments[0].(string))
}
return tester.test, tester
}
type _tester struct {
vm *Otto
}
func newTester() *_tester {
return &_tester{
vm: New(),
}
}
func (self *_tester) Get(name string) (Value, error) {
return self.vm.Get(name)
}
func (self *_tester) Set(name string, value interface{}) Value {
err := self.vm.Set(name, value)
is(err, nil)
if err != nil {
terst.Caller().T().FailNow()
}
return self.vm.getValue(name)
}
func (self *_tester) Run(src interface{}) (Value, error) {
return self.vm.Run(src)
}
func (self *_tester) test(name string, expect ...interface{}) Value {
vm := self.vm
raise := false
defer func() {
if caught := recover(); caught != nil {
if exception, ok := caught.(*_exception); ok {
caught = exception.eject()
}
if raise {
if len(expect) > 0 {
is(caught, expect[0])
}
} else {
dbg("Panic, caught:", caught)
panic(caught)
}
}
}()
var value Value
var err error
if isIdentifier(name) {
value = vm.getValue(name)
} else {
source := name
index := strings.Index(source, "raise:")
if index == 0 {
raise = true
source = source[6:]
source = strings.TrimLeft(source, " ")
}
value, err = vm.runtime.cmpl_run(source, nil)
if err != nil {
panic(err)
}
}
value = value.resolve()
if len(expect) > 0 {
is(value, expect[0])
}
return value
}