// Copyright (c) Shenyang Leading Edge Intelligent Technology Co., Ltd. All rights reserved.
|
|
|
|
package rpc
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"reflect"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
const (
|
|
float64v1 float64 = 1
|
|
float64v2 float64 = 2
|
|
float64v3 float64 = 3
|
|
float64v4 float64 = 4
|
|
float64v5 float64 = 5
|
|
float64v6 float64 = 6
|
|
float64v123 float64 = 123
|
|
float64v123dot123 float64 = 123.123
|
|
float64v456 float64 = 456
|
|
float64v10086 float64 = 10086
|
|
)
|
|
|
|
type Parameter1 struct {
|
|
StringValue1 string
|
|
IntegerValue1 int
|
|
BooleanValue1 bool
|
|
}
|
|
|
|
type TestService interface {
|
|
ME1(string) error
|
|
ME2(string) (string, error)
|
|
M1(string) error
|
|
M2(string, string) error
|
|
M3(int) error
|
|
M4(bool) error
|
|
M5(string, int, bool) error
|
|
M6(string, []int) error
|
|
M7(int, []string) error
|
|
M8([5]int, [4]string) error
|
|
M9(*bool, *[2]string, *[]int) error
|
|
M10(Parameter1, *Parameter1) error
|
|
M11([]Parameter1) error
|
|
M12(map[string]Parameter1) error
|
|
}
|
|
|
|
type TestImpl struct {
|
|
err error
|
|
stringValue1 string
|
|
stringValue2 string
|
|
integerValue1 int
|
|
booleanValue1 bool
|
|
integerSliceValue1 []int
|
|
stringSliceValue1 []string
|
|
integerArray5Value1 [5]int
|
|
stringArray4Value1 [4]string
|
|
boolPointer1 *bool
|
|
stringArray2Pointer1 *[2]string
|
|
integerSlicePointer1 *[]int
|
|
structValue1 Parameter1
|
|
structPointer1 *Parameter1
|
|
structArray1 []Parameter1
|
|
structMap1 map[string]Parameter1
|
|
}
|
|
|
|
func (impl *TestImpl) Clear() {
|
|
|
|
impl.err = nil
|
|
impl.stringValue1 = ""
|
|
impl.stringValue2 = ""
|
|
impl.integerValue1 = 0
|
|
impl.booleanValue1 = false
|
|
impl.integerSliceValue1 = nil
|
|
impl.stringSliceValue1 = nil
|
|
impl.integerArray5Value1 = [5]int{0, 0, 0, 0, 0}
|
|
impl.stringArray4Value1 = [4]string{"", "", "", ""}
|
|
impl.boolPointer1 = nil
|
|
impl.stringArray2Pointer1 = nil
|
|
impl.integerSlicePointer1 = nil
|
|
}
|
|
|
|
func (impl *TestImpl) ME1(p1 string) error {
|
|
|
|
impl.stringValue1 = p1
|
|
return impl.err
|
|
}
|
|
|
|
func (impl *TestImpl) ME2(p1 string) (string, error) {
|
|
|
|
impl.stringValue1 = p1
|
|
return "", impl.err
|
|
}
|
|
|
|
func (impl *TestImpl) M1(p1 string) error {
|
|
|
|
impl.stringValue1 = p1
|
|
return nil
|
|
}
|
|
|
|
func (impl *TestImpl) M2(p1 string, p2 string) error {
|
|
|
|
impl.stringValue1 = p1
|
|
impl.stringValue2 = p2
|
|
return nil
|
|
}
|
|
|
|
func (impl *TestImpl) M3(p1 int) error {
|
|
|
|
impl.integerValue1 = p1
|
|
return nil
|
|
}
|
|
|
|
func (impl *TestImpl) M4(p1 bool) error {
|
|
|
|
impl.booleanValue1 = p1
|
|
return nil
|
|
}
|
|
|
|
func (impl *TestImpl) M5(p1 string, p2 int, p3 bool) error {
|
|
|
|
impl.stringValue1 = p1
|
|
impl.integerValue1 = p2
|
|
impl.booleanValue1 = p3
|
|
return nil
|
|
}
|
|
|
|
func (impl *TestImpl) M6(p1 string, p2 []int) error {
|
|
|
|
impl.stringValue1 = p1
|
|
impl.integerSliceValue1 = p2
|
|
return nil
|
|
}
|
|
|
|
func (impl *TestImpl) M7(p1 int, p2 []string) error {
|
|
|
|
impl.integerValue1 = p1
|
|
impl.stringSliceValue1 = p2
|
|
return nil
|
|
}
|
|
|
|
func (impl *TestImpl) M8(p1 [5]int, p2 [4]string) error {
|
|
|
|
impl.integerArray5Value1 = p1
|
|
impl.stringArray4Value1 = p2
|
|
return nil
|
|
}
|
|
|
|
func (impl *TestImpl) M9(p1 *bool, p2 *[2]string, p3 *[]int) error {
|
|
|
|
impl.boolPointer1 = p1
|
|
impl.stringArray2Pointer1 = p2
|
|
impl.integerSlicePointer1 = p3
|
|
return nil
|
|
}
|
|
|
|
func (impl *TestImpl) M10(p1 Parameter1, p2 *Parameter1) error {
|
|
|
|
impl.structValue1 = p1
|
|
impl.structPointer1 = p2
|
|
return nil
|
|
}
|
|
|
|
func (impl *TestImpl) M11(p1 []Parameter1) error {
|
|
|
|
impl.structArray1 = p1
|
|
return nil
|
|
}
|
|
|
|
func (impl *TestImpl) M12(p1 map[string]Parameter1) error {
|
|
|
|
impl.structMap1 = p1
|
|
return nil
|
|
}
|
|
|
|
var testImpl = &TestImpl{}
|
|
|
|
var methodInvokerBuilder = &MethodInvokerBuilder{&ValueParserBuilder{}, map[reflect.Type]ValueParser{}}
|
|
|
|
func NewTestService() TestService {
|
|
return testImpl
|
|
}
|
|
|
|
var serviceValue = reflect.ValueOf(testImpl)
|
|
var serviceType = reflect.ValueOf(NewTestService).Type().Out(0)
|
|
|
|
func getInvoker(methodName string) (Handler, error) {
|
|
|
|
method, ok := serviceType.MethodByName(methodName)
|
|
if !ok {
|
|
return nil, errors.New(fmt.Sprintf("未找到方法!"))
|
|
}
|
|
serviceName := strings.ToLower(fmt.Sprintf("%s.%s", serviceType.Name(), methodName))
|
|
methodInvoker, err := methodInvokerBuilder.buildMethodInvoker(serviceName, method.Type, serviceValue.MethodByName(methodName).Call)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return methodInvoker, nil
|
|
}
|
|
|
|
func getInvokerMapping() (map[string]Handler, error) {
|
|
|
|
mapping := make(map[string]Handler, serviceType.NumMethod())
|
|
for i := 0; i < serviceType.NumMethod(); i++ {
|
|
method := serviceType.Method(i)
|
|
methodInvoker, err := getInvoker(method.Name)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
mapping[strings.ToLower(fmt.Sprintf("/testservice/%s", method.Name))] = methodInvoker
|
|
}
|
|
return mapping, nil
|
|
}
|
|
|
|
func TestError(t *testing.T) {
|
|
|
|
invokerMapping, err := getInvokerMapping()
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
{
|
|
testImpl.Clear()
|
|
testImpl.err = errors.New("error1")
|
|
parameters := []interface{}{
|
|
"small",
|
|
}
|
|
_, err := invokerMapping["/testservice/me1"].Process(parameters)
|
|
if err != testImpl.err {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
}
|
|
{
|
|
testImpl.Clear()
|
|
testImpl.err = errors.New("error2")
|
|
parameters := []interface{}{
|
|
"small",
|
|
}
|
|
_, err := invokerMapping["/testservice/me2"].Process(parameters)
|
|
if err != testImpl.err {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestParameterCount(t *testing.T) {
|
|
|
|
invokerMapping, err := getInvokerMapping()
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
{
|
|
testImpl.Clear()
|
|
parameters := []interface{}{
|
|
"small",
|
|
"big",
|
|
}
|
|
_, err := invokerMapping["/testservice/m1"].Process(parameters)
|
|
if err == nil {
|
|
t.Fatalf("意外的没有错误!")
|
|
}
|
|
if err.Error() != "参数长度错误!" {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestString(t *testing.T) {
|
|
|
|
invokerMapping, err := getInvokerMapping()
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
{
|
|
testImpl.Clear()
|
|
parameters := []interface{}{
|
|
"small",
|
|
}
|
|
_, err := invokerMapping["/testservice/m1"].Process(parameters)
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
if testImpl.stringValue1 != "small" {
|
|
t.Fatalf("stringValue1实际值为:%s", testImpl.stringValue1)
|
|
}
|
|
}
|
|
{
|
|
testImpl.Clear()
|
|
parameters := []interface{}{
|
|
"small",
|
|
"big",
|
|
}
|
|
_, err := invokerMapping["/testservice/m2"].Process(parameters)
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
if testImpl.stringValue1 != "small" {
|
|
t.Fatalf("stringValue1实际值为:%s", testImpl.stringValue1)
|
|
}
|
|
if testImpl.stringValue2 != "big" {
|
|
t.Fatalf("stringValue2实际值为:%s", testImpl.stringValue1)
|
|
}
|
|
}
|
|
{
|
|
testImpl.Clear()
|
|
parameters := []interface{}{
|
|
"small",
|
|
nil,
|
|
}
|
|
_, err := invokerMapping["/testservice/m2"].Process(parameters)
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
if testImpl.stringValue1 != "small" {
|
|
t.Fatalf("stringValue1实际值为:%s", testImpl.stringValue1)
|
|
}
|
|
if testImpl.stringValue2 != "" {
|
|
t.Fatalf("stringValue2实际值为:%s", testImpl.stringValue1)
|
|
}
|
|
}
|
|
{
|
|
testImpl.Clear()
|
|
parameters := []interface{}{
|
|
"small",
|
|
[]interface{}{},
|
|
}
|
|
_, err := invokerMapping["/testservice/m2"].Process(parameters)
|
|
if err == nil {
|
|
t.Fatal("意外没有错误!")
|
|
}
|
|
if err.Error() != "#2 无法解析!源类型:[]interface {},目标类型:String." {
|
|
t.Fatalf("意外错误%s", err.Error())
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestNumber(t *testing.T) {
|
|
|
|
invokerMapping, err := getInvokerMapping()
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
{
|
|
testImpl.Clear()
|
|
parameters := []interface{}{
|
|
float64v123,
|
|
}
|
|
_, err := invokerMapping["/testservice/m3"].Process(parameters)
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
if testImpl.integerValue1 != 123 {
|
|
t.Fatalf("integerValue1实际值为:%d", testImpl.integerValue1)
|
|
}
|
|
}
|
|
{
|
|
testImpl.Clear()
|
|
mapping := []interface{}{
|
|
float64v123dot123,
|
|
}
|
|
_, err := invokerMapping["/testservice/m3"].Process(mapping)
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
if testImpl.integerValue1 != 123 {
|
|
t.Fatalf("integerValue1实际值为:%d", testImpl.integerValue1)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestBoolean(t *testing.T) {
|
|
|
|
invokerMapping, err := getInvokerMapping()
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
{
|
|
testImpl.Clear()
|
|
parameters := []interface{}{
|
|
true,
|
|
}
|
|
_, err := invokerMapping["/testservice/m4"].Process(parameters)
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
if !testImpl.booleanValue1 {
|
|
t.Fatalf("booleanValue1实际值为:%t", testImpl.booleanValue1)
|
|
}
|
|
}
|
|
{
|
|
testImpl.Clear()
|
|
parameters := []interface{}{
|
|
false,
|
|
}
|
|
_, err := invokerMapping["/testservice/m4"].Process(parameters)
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
if testImpl.booleanValue1 {
|
|
t.Fatalf("booleanValue1实际值为:%t", testImpl.booleanValue1)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestSimpleValue(t *testing.T) {
|
|
|
|
invokerMapping, err := getInvokerMapping()
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
{
|
|
testImpl.Clear()
|
|
parameters := []interface{}{
|
|
"small",
|
|
float64v123,
|
|
true,
|
|
}
|
|
_, err := invokerMapping["/testservice/m5"].Process(parameters)
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
if testImpl.stringValue1 != "small" {
|
|
t.Fatalf("stringValue1实际值为:%s", testImpl.stringValue1)
|
|
}
|
|
if testImpl.integerValue1 != 123 {
|
|
t.Fatalf("integerValue1实际值为:%d", testImpl.integerValue1)
|
|
}
|
|
if !testImpl.booleanValue1 {
|
|
t.Fatalf("booleanValue1实际值为:%t", testImpl.booleanValue1)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestSlice(t *testing.T) {
|
|
|
|
invokerMapping, err := getInvokerMapping()
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
{
|
|
testImpl.Clear()
|
|
parameters := []interface{}{
|
|
"small",
|
|
[]interface{}{
|
|
float64v1,
|
|
float64v2,
|
|
float64v3,
|
|
},
|
|
}
|
|
_, err := invokerMapping["/testservice/m6"].Process(parameters)
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
if testImpl.stringValue1 != "small" {
|
|
t.Fatalf("stringValue1实际值为:%s", testImpl.stringValue1)
|
|
}
|
|
if len(testImpl.integerSliceValue1) != 3 {
|
|
t.Fatalf("integerSliceValue1实际长度为:%d", len(testImpl.integerSliceValue1))
|
|
}
|
|
if testImpl.integerSliceValue1[0] != 1 {
|
|
t.Fatalf("integerSliceValue1#0实际值为:%d", testImpl.integerSliceValue1[0])
|
|
}
|
|
if testImpl.integerSliceValue1[1] != 2 {
|
|
t.Fatalf("integerSliceValue1#1实际值为:%d", testImpl.integerSliceValue1[1])
|
|
}
|
|
if testImpl.integerSliceValue1[2] != 3 {
|
|
t.Fatalf("integerSliceValue1#2实际值为:%d", testImpl.integerSliceValue1[2])
|
|
}
|
|
}
|
|
{
|
|
testImpl.Clear()
|
|
parameters := []interface{}{
|
|
float64v10086,
|
|
[]interface{}{
|
|
"small",
|
|
"big",
|
|
},
|
|
}
|
|
_, err := invokerMapping["/testservice/m7"].Process(parameters)
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
if testImpl.integerValue1 != 10086 {
|
|
t.Fatalf("stringValue1实际值为:%d", testImpl.integerValue1)
|
|
}
|
|
if len(testImpl.stringSliceValue1) != 2 {
|
|
t.Fatalf("istringSliceValue1实际长度为:%d", len(testImpl.stringSliceValue1))
|
|
}
|
|
if testImpl.stringSliceValue1[0] != "small" {
|
|
t.Fatalf("stringSliceValue1#0实际值为:%s", testImpl.stringSliceValue1[0])
|
|
}
|
|
if testImpl.stringSliceValue1[1] != "big" {
|
|
t.Fatalf("stringSliceValue1#1实际值为:%s", testImpl.stringSliceValue1[1])
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestArray(t *testing.T) {
|
|
|
|
invokerMapping, err := getInvokerMapping()
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
{
|
|
testImpl.Clear()
|
|
parameters := []interface{}{
|
|
[]interface{}{
|
|
float64v5,
|
|
float64v4,
|
|
float64v3,
|
|
float64v2,
|
|
float64v1,
|
|
},
|
|
[]interface{}{
|
|
"A",
|
|
"B",
|
|
"C",
|
|
"D",
|
|
},
|
|
}
|
|
_, err := invokerMapping["/testservice/m8"].Process(parameters)
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
if testImpl.integerArray5Value1[0] != 5 {
|
|
t.Fatalf("integerArray5Value1#0实际值为:%d", testImpl.integerArray5Value1[0])
|
|
}
|
|
if testImpl.integerArray5Value1[1] != 4 {
|
|
t.Fatalf("integerArray5Value1#1实际值为:%d", testImpl.integerArray5Value1[1])
|
|
}
|
|
if testImpl.integerArray5Value1[2] != 3 {
|
|
t.Fatalf("integerArray5Value1#2实际值为:%d", testImpl.integerArray5Value1[2])
|
|
}
|
|
if testImpl.integerArray5Value1[3] != 2 {
|
|
t.Fatalf("integerArray5Value1#3实际值为:%d", testImpl.integerArray5Value1[3])
|
|
}
|
|
if testImpl.integerArray5Value1[4] != 1 {
|
|
t.Fatalf("integerArray5Value1#4实际值为:%d", testImpl.integerArray5Value1[4])
|
|
}
|
|
if testImpl.stringArray4Value1[0] != "A" {
|
|
t.Fatalf("stringArray4Value1#1实际值为:%s", testImpl.stringArray4Value1[0])
|
|
}
|
|
if testImpl.stringArray4Value1[1] != "B" {
|
|
t.Fatalf("stringArray4Value1#2实际值为:%s", testImpl.stringArray4Value1[1])
|
|
}
|
|
if testImpl.stringArray4Value1[2] != "C" {
|
|
t.Fatalf("stringArray4Value1#3实际值为:%s", testImpl.stringArray4Value1[2])
|
|
}
|
|
if testImpl.stringArray4Value1[3] != "D" {
|
|
t.Fatalf("stringArray4Value1#4实际值为:%s", testImpl.stringArray4Value1[3])
|
|
}
|
|
}
|
|
{
|
|
testImpl.Clear()
|
|
parameters := []interface{}{
|
|
[]interface{}{
|
|
float64v6,
|
|
float64v5,
|
|
float64v4,
|
|
float64v3,
|
|
float64v2,
|
|
float64v1,
|
|
},
|
|
[]interface{}{
|
|
"A",
|
|
"B",
|
|
"C",
|
|
"D",
|
|
},
|
|
}
|
|
_, err := invokerMapping["/testservice/m8"].Process(parameters)
|
|
if err == nil {
|
|
t.Fatal("意外没有错误!")
|
|
}
|
|
if err.Error() != "#1 数组长度匹配!期望长度:5,实际长度:6." {
|
|
t.Fatalf("意外错误%s", err.Error())
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestPointer(t *testing.T) {
|
|
|
|
invokerMapping, err := getInvokerMapping()
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
{
|
|
testImpl.Clear()
|
|
parameters := []interface{}{
|
|
[]interface{}{
|
|
float64v5,
|
|
float64v4,
|
|
float64v3,
|
|
float64v2,
|
|
float64v1,
|
|
},
|
|
[]interface{}{
|
|
"A",
|
|
"B",
|
|
"C",
|
|
"D",
|
|
},
|
|
}
|
|
_, err := invokerMapping["/testservice/m8"].Process(parameters)
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
if testImpl.integerArray5Value1[0] != 5 {
|
|
t.Fatalf("integerArray5Value1#0实际值为:%d", testImpl.integerArray5Value1[0])
|
|
}
|
|
if testImpl.integerArray5Value1[1] != 4 {
|
|
t.Fatalf("integerArray5Value1#1实际值为:%d", testImpl.integerArray5Value1[1])
|
|
}
|
|
if testImpl.integerArray5Value1[2] != 3 {
|
|
t.Fatalf("integerArray5Value1#2实际值为:%d", testImpl.integerArray5Value1[2])
|
|
}
|
|
if testImpl.integerArray5Value1[3] != 2 {
|
|
t.Fatalf("integerArray5Value1#3实际值为:%d", testImpl.integerArray5Value1[3])
|
|
}
|
|
if testImpl.integerArray5Value1[4] != 1 {
|
|
t.Fatalf("integerArray5Value1#4实际值为:%d", testImpl.integerArray5Value1[4])
|
|
}
|
|
if testImpl.stringArray4Value1[0] != "A" {
|
|
t.Fatalf("stringArray4Value1#1实际值为:%s", testImpl.stringArray4Value1[0])
|
|
}
|
|
if testImpl.stringArray4Value1[1] != "B" {
|
|
t.Fatalf("stringArray4Value1#2实际值为:%s", testImpl.stringArray4Value1[1])
|
|
}
|
|
if testImpl.stringArray4Value1[2] != "C" {
|
|
t.Fatalf("stringArray4Value1#3实际值为:%s", testImpl.stringArray4Value1[2])
|
|
}
|
|
if testImpl.stringArray4Value1[3] != "D" {
|
|
t.Fatalf("stringArray4Value1#4实际值为:%s", testImpl.stringArray4Value1[3])
|
|
}
|
|
}
|
|
{
|
|
testImpl.Clear()
|
|
parameters := []interface{}{
|
|
false,
|
|
[]interface{}{
|
|
"A",
|
|
"B",
|
|
},
|
|
[]interface{}{
|
|
float64v123,
|
|
float64v456,
|
|
},
|
|
}
|
|
_, err := invokerMapping["/testservice/m9"].Process(parameters)
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
if testImpl.boolPointer1 == nil {
|
|
t.Fatal("boolPointer1不应为空!")
|
|
}
|
|
if *testImpl.boolPointer1 {
|
|
t.Fatalf("booleanValue1实际值为:%t", *testImpl.boolPointer1)
|
|
}
|
|
if testImpl.integerSlicePointer1 == nil {
|
|
t.Fatal("integerSlicePointer1不应为空!")
|
|
}
|
|
stringArray2 := *testImpl.stringArray2Pointer1
|
|
if stringArray2[0] != "A" {
|
|
t.Fatalf("stringArray2Pointer1#0实际值为:%s", stringArray2[0])
|
|
}
|
|
if stringArray2[1] != "B" {
|
|
t.Fatalf("stringArray2Pointer1#1实际值为:%s", stringArray2[1])
|
|
}
|
|
if testImpl.stringArray2Pointer1 == nil {
|
|
t.Fatal("tringArray2Pointer1不应为空!")
|
|
}
|
|
integerSlic := *testImpl.integerSlicePointer1
|
|
if integerSlic[0] != 123 {
|
|
t.Fatalf("integerSlicePointer1#0实际值为:%d", integerSlic[0])
|
|
}
|
|
if integerSlic[1] != 456 {
|
|
t.Fatalf("integerSlicePointer1#1实际值为:%d", integerSlic[1])
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestNil(t *testing.T) {
|
|
|
|
invokerMapping, err := getInvokerMapping()
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
{
|
|
testImpl.Clear()
|
|
parameters := []interface{}{
|
|
nil,
|
|
[]interface{}{
|
|
"A",
|
|
"B",
|
|
},
|
|
nil,
|
|
}
|
|
_, err := invokerMapping["/testservice/m9"].Process(parameters)
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
if testImpl.boolPointer1 != nil {
|
|
t.Fatal("boolPointer1应当为空!")
|
|
}
|
|
if testImpl.stringArray2Pointer1 == nil {
|
|
t.Fatal("stringArray2Pointer1不应为空!")
|
|
}
|
|
stringArray2 := *testImpl.stringArray2Pointer1
|
|
if stringArray2[0] != "A" {
|
|
t.Fatalf("stringArray2Pointer1#0实际值为:%s", stringArray2[0])
|
|
}
|
|
if stringArray2[1] != "B" {
|
|
t.Fatalf("stringArray2Pointer1#1实际值为:%s", stringArray2[1])
|
|
}
|
|
if testImpl.integerSlicePointer1 != nil {
|
|
t.Fatal("integerSlicePointer1不应为空!")
|
|
}
|
|
}
|
|
{
|
|
testImpl.Clear()
|
|
parameters := []interface{}{
|
|
nil,
|
|
[]interface{}{
|
|
"A",
|
|
"B",
|
|
},
|
|
nil,
|
|
}
|
|
_, err := invokerMapping["/testservice/m9"].Process(parameters)
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
if testImpl.boolPointer1 != nil {
|
|
t.Fatal("boolPointer1应当为空!")
|
|
}
|
|
if testImpl.stringArray2Pointer1 == nil {
|
|
t.Fatal("stringArray2Pointer1不应为空!")
|
|
}
|
|
stringArray2 := *testImpl.stringArray2Pointer1
|
|
if stringArray2[0] != "A" {
|
|
t.Fatalf("stringArray2Pointer1#0实际值为:%s", stringArray2[0])
|
|
}
|
|
if stringArray2[1] != "B" {
|
|
t.Fatalf("stringArray2Pointer1#1实际值为:%s", stringArray2[1])
|
|
}
|
|
if testImpl.integerSlicePointer1 != nil {
|
|
t.Fatal("integerSlicePointer1不应为空!")
|
|
}
|
|
}
|
|
{
|
|
testImpl.Clear()
|
|
parameters := []interface{}{
|
|
float64v10086,
|
|
nil,
|
|
}
|
|
_, err := invokerMapping["/testservice/m7"].Process(parameters)
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
if testImpl.integerValue1 != 10086 {
|
|
t.Fatalf("stringValue1实际值为:%d", testImpl.integerValue1)
|
|
}
|
|
if testImpl.stringSliceValue1 != nil {
|
|
t.Fatal("boolPointer1应当为空!")
|
|
}
|
|
}
|
|
{
|
|
testImpl.Clear()
|
|
parameters := []interface{}{
|
|
float64v10086,
|
|
nil,
|
|
}
|
|
_, err := invokerMapping["/testservice/m7"].Process(parameters)
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
if testImpl.integerValue1 != 10086 {
|
|
t.Fatalf("stringValue1实际值为:%d", testImpl.integerValue1)
|
|
}
|
|
if testImpl.stringSliceValue1 != nil {
|
|
t.Fatal("boolPointer1应当为空!")
|
|
}
|
|
}
|
|
{
|
|
testImpl.Clear()
|
|
parameters := []interface{}{
|
|
nil,
|
|
}
|
|
_, err := invokerMapping["/testservice/m4"].Process(parameters)
|
|
if err == nil {
|
|
t.Fatal("意外没有错误!")
|
|
}
|
|
if err.Error() != "#1 不能为空!" {
|
|
t.Fatalf("意外错误%s", err.Error())
|
|
}
|
|
}
|
|
{
|
|
testImpl.Clear()
|
|
parameters := []interface{}{
|
|
nil,
|
|
}
|
|
_, err := invokerMapping["/testservice/m3"].Process(parameters)
|
|
if err == nil {
|
|
t.Fatal("意外没有错误!")
|
|
}
|
|
if err.Error() != "#1 不能为空!" {
|
|
t.Fatalf("意外错误%s", err.Error())
|
|
}
|
|
}
|
|
{
|
|
testImpl.Clear()
|
|
parameters := []interface{}{
|
|
[]interface{}{
|
|
float64v5,
|
|
float64v4,
|
|
float64v3,
|
|
float64v2,
|
|
float64v1,
|
|
},
|
|
nil,
|
|
}
|
|
_, err := invokerMapping["/testservice/m8"].Process(parameters)
|
|
if err == nil {
|
|
t.Fatal("意外没有错误!")
|
|
}
|
|
if err.Error() != "#2 不能为空!" {
|
|
t.Fatalf("意外错误%s", err.Error())
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestStruct(t *testing.T) {
|
|
|
|
invokerMapping, err := getInvokerMapping()
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
{
|
|
testImpl.Clear()
|
|
parameters := []interface{}{
|
|
map[string]interface{}{
|
|
"StringValue1": "A",
|
|
"IntegerValue1": float64v1,
|
|
"BooleanValue1": true,
|
|
},
|
|
map[string]interface{}{
|
|
"StringValue1": "B",
|
|
"IntegerValue1": float64v2,
|
|
"BooleanValue1": false,
|
|
},
|
|
}
|
|
_, err := invokerMapping["/testservice/m10"].Process(parameters)
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
if testImpl.structValue1.StringValue1 != "A" {
|
|
t.Fatalf("structValue1.StringValue1实际值为:%s", testImpl.structValue1.StringValue1)
|
|
}
|
|
if testImpl.structValue1.IntegerValue1 != 1 {
|
|
t.Fatalf("structValue1.IntegerValue1实际值为:%d", testImpl.structValue1.IntegerValue1)
|
|
}
|
|
if !testImpl.structValue1.BooleanValue1 {
|
|
t.Fatalf("structValue1.BooleanValue1实际值为:%t", testImpl.structValue1.BooleanValue1)
|
|
}
|
|
if testImpl.structPointer1.StringValue1 != "B" {
|
|
t.Fatalf("structPointer1.StringValue1实际值为:%s", testImpl.structPointer1.StringValue1)
|
|
}
|
|
if testImpl.structPointer1.IntegerValue1 != 2 {
|
|
t.Fatalf("structPointer1.IntegerValue1实际值为:%d", testImpl.structPointer1.IntegerValue1)
|
|
}
|
|
if testImpl.structPointer1.BooleanValue1 {
|
|
t.Fatalf("structPointer1.BooleanValue1实际值为:%t", testImpl.structPointer1.BooleanValue1)
|
|
}
|
|
}
|
|
{
|
|
testImpl.Clear()
|
|
parameters := []interface{}{
|
|
map[string]interface{}{
|
|
"StringValue1": "A",
|
|
"IntegerValue1": float64v1,
|
|
"BooleanValue1": true,
|
|
},
|
|
nil,
|
|
}
|
|
_, err := invokerMapping["/testservice/m10"].Process(parameters)
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
if testImpl.structValue1.StringValue1 != "A" {
|
|
t.Fatalf("structValue1.StringValue1实际值为:%s", testImpl.structValue1.StringValue1)
|
|
}
|
|
if testImpl.structValue1.IntegerValue1 != 1 {
|
|
t.Fatalf("structValue1.IntegerValue1实际值为:%d", testImpl.structValue1.IntegerValue1)
|
|
}
|
|
if !testImpl.structValue1.BooleanValue1 {
|
|
t.Fatalf("structValue1.BooleanValue1实际值为:%t", testImpl.structValue1.BooleanValue1)
|
|
}
|
|
if testImpl.structPointer1 != nil {
|
|
t.Fatal("structPointer1应当为空!")
|
|
}
|
|
}
|
|
{
|
|
testImpl.Clear()
|
|
parameters := []interface{}{
|
|
nil,
|
|
map[string]interface{}{
|
|
"StringValue1": "B",
|
|
"IntegerValue1": float64v2,
|
|
"BooleanValue1": false,
|
|
},
|
|
}
|
|
_, err := invokerMapping["/testservice/m10"].Process(parameters)
|
|
if err == nil {
|
|
t.Fatal("意外没有错误!")
|
|
}
|
|
if err.Error() != "#1 不能为空!" {
|
|
t.Fatalf("意外错误%s", err.Error())
|
|
}
|
|
}
|
|
{
|
|
testImpl.Clear()
|
|
parameters := []interface{}{
|
|
[]interface{}{
|
|
map[string]interface{}{
|
|
"StringValue1": "A",
|
|
"IntegerValue1": float64v1,
|
|
"BooleanValue1": true,
|
|
},
|
|
map[string]interface{}{
|
|
"StringValue1": "B",
|
|
"IntegerValue1": float64v2,
|
|
"BooleanValue1": false,
|
|
},
|
|
},
|
|
}
|
|
_, err := invokerMapping["/testservice/m11"].Process(parameters)
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
if testImpl.structArray1 == nil {
|
|
t.Fatal("structArray1不应为空!")
|
|
}
|
|
if len(testImpl.structArray1) != 2 {
|
|
t.Fatalf("structArray1实际长度为:%d", len(testImpl.integerSliceValue1))
|
|
}
|
|
if testImpl.structArray1[0].StringValue1 != "A" {
|
|
t.Fatalf("structArray1[0].StringValue1实际值为:%s", testImpl.structPointer1.StringValue1)
|
|
}
|
|
if testImpl.structArray1[0].IntegerValue1 != 1 {
|
|
t.Fatalf("structArray1[0].IntegerValue1实际值为:%d", testImpl.structValue1.IntegerValue1)
|
|
}
|
|
if !testImpl.structArray1[0].BooleanValue1 {
|
|
t.Fatalf("structArray1[0].BooleanValue1实际值为:%t", testImpl.structValue1.BooleanValue1)
|
|
}
|
|
if testImpl.structArray1[1].StringValue1 != "B" {
|
|
t.Fatalf("structArray1[1].StringValue1实际值为:%s", testImpl.structPointer1.StringValue1)
|
|
}
|
|
if testImpl.structArray1[1].IntegerValue1 != 2 {
|
|
t.Fatalf("structArray1[1].IntegerValue1实际值为:%d", testImpl.structPointer1.IntegerValue1)
|
|
}
|
|
if testImpl.structArray1[1].BooleanValue1 {
|
|
t.Fatalf("structArray1[1].BooleanValue1实际值为:%t", testImpl.structPointer1.BooleanValue1)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestMap(t *testing.T) {
|
|
|
|
invokerMapping, err := getInvokerMapping()
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
{
|
|
testImpl.Clear()
|
|
parameters := []interface{}{
|
|
map[string]interface{}{
|
|
"key1": map[string]interface{}{
|
|
"StringValue1": "A",
|
|
"IntegerValue1": float64v1,
|
|
"BooleanValue1": true,
|
|
},
|
|
"key2": map[string]interface{}{
|
|
"StringValue1": "B",
|
|
"IntegerValue1": float64v2,
|
|
"BooleanValue1": false,
|
|
},
|
|
},
|
|
}
|
|
_, err := invokerMapping["/testservice/m12"].Process(parameters)
|
|
if err != nil {
|
|
t.Fatalf("意外错误:%s", err.Error())
|
|
}
|
|
if testImpl.structMap1 == nil {
|
|
t.Fatal("structMap1不应为空!")
|
|
}
|
|
if len(testImpl.structMap1) != 2 {
|
|
t.Fatalf("structMap1实际长度为:%d", len(testImpl.integerSliceValue1))
|
|
}
|
|
if testImpl.structMap1["key1"].StringValue1 != "A" {
|
|
t.Fatalf("structMap1[\"key1\"].StringValue1实际值为:%s", testImpl.structPointer1.StringValue1)
|
|
}
|
|
if testImpl.structMap1["key1"].IntegerValue1 != 1 {
|
|
t.Fatalf("structMap1[\"key1\"].IntegerValue1实际值为:%d", testImpl.structValue1.IntegerValue1)
|
|
}
|
|
if !testImpl.structMap1["key1"].BooleanValue1 {
|
|
t.Fatalf("structMap1[\"key1\"].BooleanValue1实际值为:%t", testImpl.structValue1.BooleanValue1)
|
|
}
|
|
if testImpl.structMap1["key2"].StringValue1 != "B" {
|
|
t.Fatalf("structMap1[\"key2\"].StringValue1实际值为:%s", testImpl.structPointer1.StringValue1)
|
|
}
|
|
if testImpl.structMap1["key2"].IntegerValue1 != 2 {
|
|
t.Fatalf("structMap1[\"key2\"].IntegerValue1实际值为:%d", testImpl.structPointer1.IntegerValue1)
|
|
}
|
|
if testImpl.structMap1["key2"].BooleanValue1 {
|
|
t.Fatalf("structMap1[\"key2\"].BooleanValue1实际值为:%t", testImpl.structPointer1.BooleanValue1)
|
|
}
|
|
}
|
|
}
|