blob: 146e9c7b415c38cf74d9010facf56017fcaa4271 [file] [log] [blame]
// Copyright (c) 2016 ~ 2019, Alex Stocks.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package hessian
import (
"reflect"
"testing"
)
type Department struct {
Name string
}
func (Department) JavaClassName() string {
return "com.bdt.info.Department"
}
type WorkerInfo struct {
Name string
Addrress string
Age int
Salary float32
Payload map[string]int32
FalimyMemebers []string
Dpt Department
}
func (WorkerInfo) JavaClassName() string {
return "com.bdt.info.WorkerInfo"
}
func TestEncEmptyStruct(t *testing.T) {
var (
w WorkerInfo
err error
e *Encoder
d *Decoder
res interface{}
)
e = NewEncoder()
w = WorkerInfo{
Name: "Trump",
Addrress: "W,D.C.",
Age: 72,
Salary: 21000.03,
Payload: map[string]int32{"Number": 2017061118},
FalimyMemebers: []string{"m1", "m2", "m3"},
// Dpt: Department{
// Name: "Adm",
// },
}
e.Encode(w)
d = NewDecoder(e.Buffer())
res, err = d.Decode()
if err != nil {
t.Errorf("Decode() = %v", err)
}
t.Logf("decode(%v) = %v, %v\n", w, res, err)
reflect.DeepEqual(w, res)
}
func TestEncStruct(t *testing.T) {
var (
w WorkerInfo
err error
e *Encoder
d *Decoder
res interface{}
)
e = NewEncoder()
w = WorkerInfo{
Name: "Trump",
Addrress: "W,D.C.",
Age: 72,
Salary: 21000.03,
Payload: map[string]int32{"Number": 2017061118},
FalimyMemebers: []string{"m1", "m2", "m3"},
Dpt: Department{
Name: "Adm",
},
}
e.Encode(w)
d = NewDecoder(e.Buffer())
res, err = d.Decode()
if err != nil {
t.Errorf("Decode() = %v", err)
}
t.Logf("decode(%v) = %v, %v\n", w, res, err)
res = res.(reflect.Value).Interface()
w2, ok := res.(*WorkerInfo)
if !ok {
t.Fatalf("res:%T is not of type WorkerInfo", w2)
}
if !reflect.DeepEqual(w, *w2) {
t.Fatalf("w:%#v != w2:%#v", w, w2)
}
}
type UserName struct {
FirstName string
LastName string
}
func (UserName) JavaClassName() string {
return "com.bdt.info.UserName"
}
type Person struct {
UserName
Age int32
Sex bool
}
func (Person) JavaClassName() string {
return "com.bdt.info.Person"
}
type JOB struct {
Title string
Company string
}
func (JOB) JavaClassName() string {
return "com.bdt.info.JOB"
}
type Worker struct {
Person
CurJob JOB
Jobs []JOB
}
func (Worker) JavaClassName() string {
return "com.bdt.info.Worker"
}
func TestIssue6(t *testing.T) {
name := UserName{
FirstName: "John",
LastName: "Doe",
}
person := Person{
UserName: name,
Age: 18,
Sex: true,
}
worker := &Worker{
Person: person,
CurJob: JOB{Title: "cto", Company: "facebook"},
Jobs: []JOB{
JOB{Title: "manager", Company: "google"},
JOB{Title: "ceo", Company: "microsoft"},
},
}
e := NewEncoder()
err := e.Encode(worker)
if err != nil {
t.Fatalf("encode(worker:%#v) = error:%s", worker, err)
}
bytes := e.Buffer()
d := NewDecoder(bytes)
res, err := d.Decode()
if err != nil {
t.Error(err)
t.FailNow()
}
t.Logf("type of decode object:%v", reflect.TypeOf(res))
res = res.(reflect.Value).Interface()
worker2, ok := res.(*Worker)
if !ok {
t.Fatalf("res:%#v is not of type Worker", res)
}
if !reflect.DeepEqual(worker, worker2) {
t.Fatalf("worker:%#v != worker2:%#v", worker, worker2)
}
}