aboutsummaryrefslogtreecommitdiffstats
path: root/modules/packages/rubygems/marshal_test.go
blob: e5963ebcd632c85992f81742a68081f4a54b6f8f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
// Copyright 2021 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.

package rubygems

import (
	"bytes"
	"testing"

	"github.com/stretchr/testify/assert"
)

func TestMinimalEncoder(t *testing.T) {
	cases := []struct {
		Value    interface{}
		Expected []byte
		Error    error
	}{
		{
			Value:    nil,
			Expected: []byte{4, 8, 0x30},
		},
		{
			Value:    true,
			Expected: []byte{4, 8, 'T'},
		},
		{
			Value:    false,
			Expected: []byte{4, 8, 'F'},
		},
		{
			Value:    0,
			Expected: []byte{4, 8, 'i', 0},
		},
		{
			Value:    1,
			Expected: []byte{4, 8, 'i', 6},
		},
		{
			Value:    -1,
			Expected: []byte{4, 8, 'i', 0xfa},
		},
		{
			Value:    0x1fffffff,
			Expected: []byte{4, 8, 'i', 4, 0xff, 0xff, 0xff, 0x1f},
		},
		{
			Value: 0x41000000,
			Error: ErrInvalidIntRange,
		},
		{
			Value:    "test",
			Expected: []byte{4, 8, 'I', '"', 9, 't', 'e', 's', 't', 6, ':', 6, 'E', 'T'},
		},
		{
			Value:    []int{1, 2},
			Expected: []byte{4, 8, '[', 7, 'i', 6, 'i', 7},
		},
		{
			Value: &RubyUserMarshal{
				Name:  "Test",
				Value: 4,
			},
			Expected: []byte{4, 8, 'U', ':', 9, 'T', 'e', 's', 't', 'i', 9},
		},
		{
			Value: &RubyUserDef{
				Name:  "Test",
				Value: 4,
			},
			Expected: []byte{4, 8, 'u', ':', 9, 'T', 'e', 's', 't', 9, 4, 8, 'i', 9},
		},
		{
			Value: &RubyObject{
				Name: "Test",
				Member: map[string]interface{}{
					"test": 4,
				},
			},
			Expected: []byte{4, 8, 'o', ':', 9, 'T', 'e', 's', 't', 6, ':', 9, 't', 'e', 's', 't', 'i', 9},
		},
		{
			Value: &struct {
				Name string
			}{
				"test",
			},
			Error: ErrUnsupportedType,
		},
	}

	for i, c := range cases {
		var b bytes.Buffer
		err := NewMarshalEncoder(&b).Encode(c.Value)
		assert.ErrorIs(t, err, c.Error)
		assert.Equal(t, c.Expected, b.Bytes(), "case %d", i)
	}
}