150 lines
3.0 KiB
Go
150 lines
3.0 KiB
Go
package gojs_test
|
|
|
|
import (
|
|
"apigo.cloud/git/apigo/gojs"
|
|
"apigo.cloud/git/apigo/plugin"
|
|
"fmt"
|
|
"github.com/ssgo/log"
|
|
"github.com/ssgo/u"
|
|
"runtime"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
|
|
type Object struct {
|
|
id string
|
|
}
|
|
|
|
func (obj *Object) GetId() string {
|
|
return obj.id
|
|
}
|
|
|
|
func init() {
|
|
defaultObject := Object{id: "o-00"}
|
|
plugin.Register(plugin.Plugin{
|
|
Id: "obj",
|
|
Name: "test obj plugin",
|
|
Objects: map[string]interface{}{
|
|
"getId": defaultObject.GetId,
|
|
"new": func(id string) interface{} {
|
|
return &Object{id: id}
|
|
},
|
|
"echo": func(text string, echoFunc func(text string) string) interface{} {
|
|
return echoFunc(text)
|
|
},
|
|
"echoTimes": func(echoFunc func(text string)) {
|
|
for i := 0; i < 5; i++ {
|
|
//time.Sleep(100 * time.Millisecond)
|
|
echoFunc(fmt.Sprint(i))
|
|
}
|
|
},
|
|
},
|
|
})
|
|
}
|
|
|
|
func test(t *testing.T, name string, check bool, extArgs ...interface{}) {
|
|
if check {
|
|
fmt.Println(u.Green(name), u.BGreen("[OK]"))
|
|
} else {
|
|
fmt.Println(u.Red(name), u.BRed("[Failed]"), fmt.Sprintln(extArgs...))
|
|
t.Error(name)
|
|
}
|
|
}
|
|
|
|
func TestGlobal(t *testing.T) {
|
|
code := `
|
|
log('test', 'name', 'log')
|
|
return plus(number,2)
|
|
`
|
|
globals := map[string]interface{}{
|
|
"number": 9,
|
|
"log": log.DefaultLogger.Info,
|
|
"plus": func(i, j int) int { return i + j },
|
|
}
|
|
|
|
r := gojs.Run(code, globals, log.DefaultLogger)
|
|
test(t, "call", u.Int(r) == 11, r)
|
|
}
|
|
|
|
func TestPlugin(t *testing.T) {
|
|
r := gojs.Run("return obj.getId()", nil, log.DefaultLogger)
|
|
test(t, "obj.getId()", u.String(r) == "o-00", r)
|
|
|
|
r = gojs.Run(`
|
|
o = obj.new('o-01')
|
|
return o.getId()
|
|
`, nil, log.DefaultLogger)
|
|
test(t, "new obj.getId()", u.String(r) == "o-01", r)
|
|
|
|
t1 := time.Now()
|
|
r = gojs.Run(`
|
|
out = ''
|
|
obj.echo('123', function(text){
|
|
out = text
|
|
})
|
|
return out
|
|
`, nil, log.DefaultLogger)
|
|
t2 := time.Now()
|
|
fmt.Println("time:", t2.UnixMicro() - t1.UnixMicro())
|
|
test(t, "callback", u.String(r) == "123", r)
|
|
|
|
t1 = time.Now()
|
|
r = gojs.Run(`
|
|
out = ''
|
|
obj.echoTimes(function(text){
|
|
out += text
|
|
})
|
|
return out
|
|
`, nil, log.DefaultLogger)
|
|
t2 = time.Now()
|
|
fmt.Println("time:", t2.UnixMicro() - t1.UnixMicro())
|
|
test(t, "callbacks", u.String(r) == "01234", r)
|
|
}
|
|
|
|
|
|
func BenchmarkEcho(tb *testing.B) {
|
|
tb.StopTimer()
|
|
ms1 := runtime.MemStats{}
|
|
runtime.ReadMemStats(&ms1)
|
|
tb.StartTimer()
|
|
for i := 0; i < tb.N; i++ {
|
|
gojs.Run(`return 1`, nil, log.DefaultLogger)
|
|
}
|
|
tb.StopTimer()
|
|
|
|
ms2 := runtime.MemStats{}
|
|
runtime.ReadMemStats(&ms2)
|
|
|
|
runtime.GC()
|
|
ms3 := runtime.MemStats{}
|
|
runtime.ReadMemStats(&ms3)
|
|
fmt.Println(">>", ms1.HeapInuse, ms2.HeapInuse, ms3.HeapInuse)
|
|
}
|
|
|
|
|
|
func BenchmarkCallback(tb *testing.B) {
|
|
tb.StopTimer()
|
|
ms1 := runtime.MemStats{}
|
|
runtime.ReadMemStats(&ms1)
|
|
tb.StartTimer()
|
|
for i := 0; i < tb.N; i++ {
|
|
gojs.Run(`
|
|
out = ''
|
|
obj.echoTimes(function(text){
|
|
out += text
|
|
})
|
|
return out
|
|
`, nil, log.DefaultLogger)
|
|
}
|
|
tb.StopTimer()
|
|
|
|
ms2 := runtime.MemStats{}
|
|
runtime.ReadMemStats(&ms2)
|
|
|
|
runtime.GC()
|
|
ms3 := runtime.MemStats{}
|
|
runtime.ReadMemStats(&ms3)
|
|
fmt.Println(">>", ms1.HeapInuse, ms2.HeapInuse, ms3.HeapInuse)
|
|
}
|