1package ndr
2
3import (
4	"bytes"
5	"encoding/hex"
6	"testing"
7
8	"github.com/stretchr/testify/assert"
9)
10
11const (
12	testUnionSelected1Enc    = "0100000001"
13	testUnionSelected2Enc    = "020000000200"
14	testUnionSelected1NonEnc = "010000000100000001"
15	testUnionSelected2NonEnc = "02000000020000000200"
16)
17
18type testUnionEncapsulated struct {
19	Tag    uint32 `ndr:"unionTag,encapsulated"`
20	Value1 uint8  `ndr:"unionField"`
21	Value2 uint16 `ndr:"unionField"`
22}
23
24type testUnionNonEncapsulated struct {
25	Tag    uint32 `ndr:"unionTag"`
26	Value1 uint8  `ndr:"unionField"`
27	Value2 uint16 `ndr:"unionField"`
28}
29
30func (u testUnionEncapsulated) SwitchFunc(tag interface{}) string {
31	t := tag.(uint32)
32	switch t {
33	case 1:
34		return "Value1"
35	case 2:
36		return "Value2"
37	}
38	return ""
39}
40
41func (u testUnionNonEncapsulated) SwitchFunc(tag interface{}) string {
42	t := tag.(uint32)
43	switch t {
44	case 1:
45		return "Value1"
46	case 2:
47		return "Value2"
48	}
49	return ""
50}
51
52func Test_readUnionEncapsulated(t *testing.T) {
53	var tests = []struct {
54		Hex string
55		Tag uint32
56		V1  uint8
57		V2  uint16
58	}{
59		{testUnionSelected1Enc, uint32(1), uint8(1), uint16(0)},
60		{testUnionSelected2Enc, uint32(2), uint8(0), uint16(2)},
61	}
62
63	for i, test := range tests {
64		a := new(testUnionEncapsulated)
65		hexStr := TestHeader + test.Hex
66		b, _ := hex.DecodeString(hexStr)
67		dec := NewDecoder(bytes.NewReader(b))
68		err := dec.Decode(a)
69		if err != nil {
70			t.Fatalf("test %d: %v", i+1, err)
71		}
72		assert.Equal(t, test.Tag, a.Tag, "Tag value not as expected for test: %d", i+1)
73		assert.Equal(t, test.V1, a.Value1, "Value1 not as expected for test: %d", i+1)
74		assert.Equal(t, test.V2, a.Value2, "Value2 value not as expected for test: %d", i+1)
75
76	}
77}
78
79func Test_readUnionNonEncapsulated(t *testing.T) {
80	var tests = []struct {
81		Hex string
82		Tag uint32
83		V1  uint8
84		V2  uint16
85	}{
86		{testUnionSelected1NonEnc, uint32(1), uint8(1), uint16(0)},
87		{testUnionSelected2NonEnc, uint32(2), uint8(0), uint16(2)},
88	}
89
90	for i, test := range tests {
91		a := new(testUnionNonEncapsulated)
92		hexStr := TestHeader + test.Hex
93		b, _ := hex.DecodeString(hexStr)
94		dec := NewDecoder(bytes.NewReader(b))
95		err := dec.Decode(a)
96		if err != nil {
97			t.Fatalf("test %d: %v", i+1, err)
98		}
99		assert.Equal(t, test.Tag, a.Tag, "Tag value not as expected for test: %d", i+1)
100		assert.Equal(t, test.V1, a.Value1, "Value1 not as expected for test: %d", i+1)
101		assert.Equal(t, test.V2, a.Value2, "Value2 value not as expected for test: %d", i+1)
102
103	}
104}
105