220 lines
4.7 KiB
Go
220 lines
4.7 KiB
Go
package protocol_test
|
|
|
|
import (
|
|
"testing"
|
|
|
|
rpcv1 "code.icb4dc0.de/buildr/api/generated/rpc/v1"
|
|
"code.icb4dc0.de/buildr/common/protocol"
|
|
)
|
|
|
|
func TestMarshal_Bool_Success(t *testing.T) {
|
|
input := struct {
|
|
IsDeleted bool
|
|
}{
|
|
IsDeleted: true,
|
|
}
|
|
|
|
spec, err := protocol.Marshal(input)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
nameVal, ok := spec.Values["IsDeleted"]
|
|
if !ok {
|
|
t.Fatal("IsDeleted not found")
|
|
}
|
|
|
|
if nameVal.Type != rpcv1.ModuleSpec_ValueTypeSingle {
|
|
t.Fatalf("Expected single value type, got %v", nameVal.Type)
|
|
}
|
|
|
|
if s, ok := nameVal.SingleValue.(*rpcv1.ModuleSpec_Value_BoolValue); !ok {
|
|
t.Fatalf("Expected string value, got %v", nameVal.SingleValue)
|
|
} else if !s.BoolValue {
|
|
t.Errorf("Expected bool value to be true, got %t", s.BoolValue)
|
|
}
|
|
}
|
|
|
|
func TestMarshal_BoolSlice_Success(t *testing.T) {
|
|
input := struct {
|
|
IsDeleted []bool
|
|
}{
|
|
IsDeleted: []bool{true},
|
|
}
|
|
|
|
spec, err := protocol.Marshal(input)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
nameVal, ok := spec.Values["IsDeleted"]
|
|
if !ok {
|
|
t.Fatal("IsDeleted not found")
|
|
}
|
|
|
|
if nameVal.Type != rpcv1.ModuleSpec_ValueTypeBoolSlice {
|
|
t.Fatalf("Expected bool slice value type, got %v", nameVal.Type)
|
|
}
|
|
|
|
if len(nameVal.BoolValues) < 1 {
|
|
t.Fatalf("Expected at least one bool value, got %d", len(nameVal.BoolValues))
|
|
}
|
|
|
|
if !nameVal.BoolValues[0] {
|
|
t.Errorf("Expected bool value to be true, got %t", nameVal.BoolValues[0])
|
|
}
|
|
}
|
|
|
|
func TestMarshal_Int_Success(t *testing.T) {
|
|
input := struct {
|
|
Age int
|
|
}{
|
|
Age: 42,
|
|
}
|
|
|
|
spec, err := protocol.Marshal(input)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
nameVal, ok := spec.Values["Age"]
|
|
if !ok {
|
|
t.Fatal("Age not found")
|
|
}
|
|
|
|
if nameVal.Type != rpcv1.ModuleSpec_ValueTypeSingle {
|
|
t.Fatalf("Expected single value type, got %v", nameVal.Type)
|
|
}
|
|
|
|
if s, ok := nameVal.SingleValue.(*rpcv1.ModuleSpec_Value_IntValue); !ok {
|
|
t.Fatalf("Expected string value, got %v", nameVal.SingleValue)
|
|
} else if s.IntValue != 42 {
|
|
t.Errorf("Expected int value to be 42, got %d", s.IntValue)
|
|
}
|
|
}
|
|
|
|
func TestMarshal_IntSlice_Success(t *testing.T) {
|
|
input := struct {
|
|
Ages []int
|
|
}{
|
|
Ages: []int{42},
|
|
}
|
|
|
|
spec, err := protocol.Marshal(input)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
nameVal, ok := spec.Values["Ages"]
|
|
if !ok {
|
|
t.Fatal("Ages not found")
|
|
}
|
|
|
|
if nameVal.Type != rpcv1.ModuleSpec_ValueTypeIntSlice {
|
|
t.Fatalf("Expected int slice value type, got %v", nameVal.Type)
|
|
}
|
|
|
|
if len(nameVal.IntValues) < 1 {
|
|
t.Fatalf("Expected at least one bool value, got %d", len(nameVal.BoolValues))
|
|
}
|
|
|
|
if nameVal.IntValues[0] != 42 {
|
|
t.Errorf("Expected int value to be 52, got %d", nameVal.IntValues[0])
|
|
}
|
|
}
|
|
|
|
func TestMarshal_StringField_Success(t *testing.T) {
|
|
input := struct {
|
|
Name string
|
|
}{
|
|
Name: "John Doe",
|
|
}
|
|
|
|
spec, err := protocol.Marshal(input)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
nameVal, ok := spec.Values["Name"]
|
|
if !ok {
|
|
t.Fatal("Name not found")
|
|
}
|
|
|
|
if nameVal.Type != rpcv1.ModuleSpec_ValueTypeSingle {
|
|
t.Fatalf("Expected single value type, got %v", nameVal.Type)
|
|
}
|
|
|
|
if s, ok := nameVal.SingleValue.(*rpcv1.ModuleSpec_Value_StringValue); !ok {
|
|
t.Fatalf("Expected string value, got %v", nameVal.SingleValue)
|
|
} else if s.StringValue != "John Doe" {
|
|
t.Errorf("Expected string value to be John Doe, got %s", s.StringValue)
|
|
}
|
|
}
|
|
|
|
func TestMarshal_Float64_Success(t *testing.T) {
|
|
input := struct {
|
|
Pi float64
|
|
}{
|
|
Pi: 3.14,
|
|
}
|
|
|
|
spec, err := protocol.Marshal(input)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
nameVal, ok := spec.Values["Pi"]
|
|
if !ok {
|
|
t.Fatal("Pi not found")
|
|
}
|
|
|
|
if nameVal.Type != rpcv1.ModuleSpec_ValueTypeSingle {
|
|
t.Fatalf("Expected single value type, got %v", nameVal.Type)
|
|
}
|
|
|
|
if s, ok := nameVal.SingleValue.(*rpcv1.ModuleSpec_Value_DoubleValue); !ok {
|
|
t.Fatalf("Expected double value, got %v", nameVal.SingleValue)
|
|
} else if s.DoubleValue-3.14 > 0.000001 {
|
|
t.Errorf("Expected double value to be 3.14, got %f", s.DoubleValue)
|
|
}
|
|
}
|
|
|
|
func TestMarshal_NestedStruct_Success(t *testing.T) {
|
|
type Address struct {
|
|
City string
|
|
}
|
|
input := struct {
|
|
Address Address
|
|
}{
|
|
Address: Address{
|
|
City: "New York",
|
|
},
|
|
}
|
|
|
|
spec, err := protocol.Marshal(input)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
addressVal, ok := spec.Values["Address"]
|
|
if !ok {
|
|
t.Fatal("Address not found")
|
|
}
|
|
|
|
if addressVal.Type != rpcv1.ModuleSpec_ValueTypeObject {
|
|
t.Fatalf("Expected object value type, got %v", addressVal.Type)
|
|
}
|
|
|
|
cityVal, ok := addressVal.ComplexValue["City"]
|
|
if !ok {
|
|
t.Fatal("City not found")
|
|
}
|
|
|
|
if cityVal.Type != rpcv1.ModuleSpec_ValueTypeSingle {
|
|
t.Fatalf("Expected single value type, got %v", cityVal.Type)
|
|
}
|
|
|
|
if cityVal.SingleValue.(*rpcv1.ModuleSpec_Value_StringValue).StringValue != "New York" {
|
|
t.Errorf("Expected string value to be New York, got %s", cityVal.SingleValue.(*rpcv1.ModuleSpec_Value_StringValue).StringValue)
|
|
}
|
|
}
|