Skip to content

Commit 4f568b1

Browse files
committed
100% test coverage
1 parent c14bfb9 commit 4f568b1

12 files changed

+497
-76
lines changed

argument.go

+11-2
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ type Argument interface {
3131
func ReadArguments(typetags, data []byte) ([]Argument, error) {
3232
args := []Argument{}
3333

34+
// Strip off the prefix.
35+
if len(typetags) > 0 && typetags[0] == TypetagPrefix {
36+
typetags = typetags[1:]
37+
}
38+
3439
for i, tt := range typetags {
3540
arg, idx, err := ReadArgument(tt, data)
3641
if err != nil {
@@ -72,7 +77,7 @@ func ReadArgument(tt byte, data []byte) (Argument, int64, error) {
7277
b, bl := ReadBlob(length, data[4:])
7378
return Blob(b), bl + 4, nil
7479
default:
75-
return nil, 0, ErrInvalidTypeTag
80+
return nil, 0, errors.Wrapf(ErrInvalidTypeTag, "typetag %q", string(tt))
7681
}
7782
}
7883

@@ -227,7 +232,7 @@ type String string
227232

228233
// Bytes converts the arg to a byte slice suitable for adding to the binary representation of an OSC message.
229234
func (s String) Bytes() []byte {
230-
return OscString(string(s))
235+
return ToBytes(string(s))
231236
}
232237

233238
// Equal returns true if the argument equals the other one, false otherwise.
@@ -277,6 +282,7 @@ func (b Blob) Bytes() []byte {
277282
}, []byte{}))
278283
}
279284

285+
// Equal returns true if the argument equals the other one, false otherwise.
280286
func (b Blob) Equal(other Argument) bool {
281287
if other.Typetag() != TypetagBlob {
282288
return false
@@ -314,3 +320,6 @@ func (b Blob) WriteTo(w io.Writer) (int64, error) {
314320
written, err := w.Write([]byte(b))
315321
return int64(written), err
316322
}
323+
324+
// Arguments is a slice of Argument.
325+
type Arguments []Argument

argument_test.go

+25-10
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,8 @@ func TestInt(t *testing.T) {
5252

5353
func TestFloat(t *testing.T) {
5454
arg := Float(0)
55-
f, err := arg.ReadFloat32()
56-
if err != nil {
57-
t.Fatal(err)
55+
if expected, got := []byte{0x40, 0x48, 0xf5, 0xc3}, Float(3.14).Bytes(); !bytes.Equal(expected, got) {
56+
t.Fatalf("expected %x, got %x", expected, got)
5857
}
5958
if other := Float(0); !arg.Equal(other) {
6059
t.Fatal("expected %s to equal %s", arg, other)
@@ -65,9 +64,15 @@ func TestFloat(t *testing.T) {
6564
if other := String("foo"); arg.Equal(other) {
6665
t.Fatal("expected %s to not equal %s", arg, other)
6766
}
67+
68+
f, err := arg.ReadFloat32()
69+
if err != nil {
70+
t.Fatal(err)
71+
}
6872
if expected, got := float32(0), f; expected != got {
6973
t.Fatalf("expected %f, got %f", expected, got)
7074
}
75+
7176
if _, err := arg.ReadInt32(); err != ErrInvalidTypeTag {
7277
t.Fatalf("expected ErrInvalidTypeTag, got %+v", err)
7378
}
@@ -93,19 +98,24 @@ func TestFloat(t *testing.T) {
9398

9499
func TestBool(t *testing.T) {
95100
arg := Bool(false)
96-
b, err := arg.ReadBool()
97-
if err != nil {
98-
t.Fatal(err)
101+
if expected, got := []byte{}, arg.Bytes(); !bytes.Equal(expected, got) {
102+
t.Fatalf("expected %x, got %x", expected, got)
99103
}
100104
if other := Bool(false); !arg.Equal(other) {
101105
t.Fatal("expected %s to equal %s", arg, other)
102106
}
103107
if other := Int(3); arg.Equal(other) {
104108
t.Fatal("expected %s to not equal %s", arg, other)
105109
}
110+
111+
b, err := arg.ReadBool()
112+
if err != nil {
113+
t.Fatal(err)
114+
}
106115
if expected, got := false, b; expected != got {
107116
t.Fatalf("expected %f, got %f", expected, got)
108117
}
118+
109119
if _, err := arg.ReadInt32(); err != ErrInvalidTypeTag {
110120
t.Fatalf("expected ErrInvalidTypeTag, got %+v", err)
111121
}
@@ -137,19 +147,24 @@ func TestBool(t *testing.T) {
137147

138148
func TestString(t *testing.T) {
139149
arg := String("foo")
140-
s, err := arg.ReadString()
141-
if err != nil {
142-
t.Fatal(err)
150+
if expected, got := []byte{'f', 'o', 'o', 0}, arg.Bytes(); !bytes.Equal(expected, got) {
151+
t.Fatalf("expected %x, got %x", expected, got)
143152
}
144153
if other := String("foo"); !arg.Equal(other) {
145154
t.Fatalf("expected %s to equal %s", arg, other)
146155
}
147156
if other := Int(4); arg.Equal(other) {
148157
t.Fatal("expected %s to not equal %s", arg, other)
149158
}
159+
160+
s, err := arg.ReadString()
161+
if err != nil {
162+
t.Fatal(err)
163+
}
150164
if expected, got := "foo", s; expected != got {
151165
t.Fatalf("expected %s, got %s", expected, got)
152166
}
167+
153168
if _, err := arg.ReadInt32(); err != ErrInvalidTypeTag {
154169
t.Fatalf("expected ErrInvalidTypeTag, got %+v", err)
155170
}
@@ -267,7 +282,7 @@ func TestReadArgument(t *testing.T) {
267282
},
268283
{
269284
Input: Input{tt: 'Q'},
270-
Expected: Output{Err: ErrInvalidTypeTag},
285+
Expected: Output{Err: errors.Wrap(ErrInvalidTypeTag, `typetag "Q"`)},
271286
},
272287
} {
273288
a, consumed, err := ReadArgument(testcase.Input.tt, testcase.Input.data)

bundle.go

+3-13
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package osc
33
import (
44
"errors"
55
"net"
6-
"time"
76
)
87

98
// Common errors.
@@ -21,16 +20,7 @@ type Bundle struct {
2120
Sender net.Addr
2221
}
2322

24-
// NewBundle returns an OSC Bundle.
25-
func NewBundle(t time.Time, packets ...Packet) *Bundle {
26-
return &Bundle{
27-
Timetag: FromTime(t),
28-
Packets: packets,
29-
}
30-
}
31-
32-
// Contents returns the contents of the bundle as a
33-
// slice of bytes.
34-
func (b *Bundle) Contents() ([]byte, error) {
35-
return []byte{}, nil
23+
// Bytes returns the contents of the bundle as a slice of bytes.
24+
func (b Bundle) Bytes() []byte {
25+
return []byte{}
3626
}

bundle_test.go

+5
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
package osc
22

33
import (
4+
"bytes"
45
"testing"
56
)
67

78
func TestBundle(t *testing.T) {
9+
b := Bundle{}
10+
if expected, got := []byte{}, b.Bytes(); !bytes.Equal(expected, got) {
11+
t.Fatalf("expected %x, got %x", expected, got)
12+
}
813
}

dispatcher.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ type Method func(msg Message) error
1313
// Dispatcher dispatches OSC packets.
1414
type Dispatcher map[string]Method
1515

16-
// DispatchMessage dispatches OSC message.
17-
func (d Dispatcher) DispatchMessage(msg Message) error {
16+
// Dispatch dispatches OSC message.
17+
func (d Dispatcher) Dispatch(msg Message) error {
1818
for address, method := range d {
1919
matched, err := msg.Match(address)
2020
if err != nil {

dispatcher_test.go

+15-2
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,27 @@ import (
55
"testing"
66
)
77

8-
func TestDispatchMessage(t *testing.T) {
8+
func TestDispatcher(t *testing.T) {
99
d := Dispatcher{
1010
"/foo": func(msg Message) error {
1111
return errors.New("foo error")
1212
},
13+
"/bar": func(msg Message) error {
14+
return nil
15+
},
1316
}
1417
msg := Message{Address: "/foo"}
15-
if err := d.DispatchMessage(msg); err == nil {
18+
if err := d.Dispatch(msg); err == nil {
19+
t.Fatal("expected error, got nil")
20+
}
21+
badMsg := Message{Address: "/["}
22+
if err := d.Dispatch(badMsg); err == nil {
1623
t.Fatal("expected error, got nil")
1724
}
25+
if err := d.Dispatch(Message{Address: "/bar"}); err != nil {
26+
t.Fatal(err)
27+
}
28+
if err := d.Dispatch(Message{Address: "/baz"}); err != nil {
29+
t.Fatal(err)
30+
}
1831
}

message.go

+20-7
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,22 @@ type Message struct {
2727
Sender net.Addr
2828
}
2929

30+
// Equal returns true if the messages are equal, false otherwise.
31+
func (msg Message) Equal(other Message) bool {
32+
if msg.Address != other.Address {
33+
return false
34+
}
35+
if len(msg.Arguments) != len(other.Arguments) {
36+
return false
37+
}
38+
for i, a := range msg.Arguments {
39+
if !a.Equal(other.Arguments[i]) {
40+
return false
41+
}
42+
}
43+
return true
44+
}
45+
3046
// Match returns true if the address of the OSC Message matches the given address.
3147
func (msg Message) Match(address string) (bool, error) {
3248
// Verify same number of parts.
@@ -43,7 +59,7 @@ func (msg Message) Match(address string) (bool, error) {
4359
// Bytes returns the contents of the message as a slice of bytes.
4460
func (msg Message) Bytes() []byte {
4561
b := [][]byte{
46-
OscString(msg.Address),
62+
ToBytes(msg.Address),
4763
msg.Typetags(),
4864
}
4965
for _, a := range msg.Arguments {
@@ -63,7 +79,7 @@ func (msg Message) Typetags() []byte {
6379
}
6480

6581
// WriteTo writes the Message to an io.Writer.
66-
func (msg Message) Print(w io.Writer) error {
82+
func (msg Message) WriteTo(w io.Writer) error {
6783
if _, err := fmt.Fprintf(w, "%s%s", msg.Address, msg.Typetags()); err != nil {
6884
return err
6985
}
@@ -84,17 +100,14 @@ func ParseMessage(data []byte, sender net.Addr) (Message, error) {
84100
Address: address,
85101
Sender: sender,
86102
}
87-
88103
data = data[idx:]
89-
90104
typetags, idx := ReadString(data)
91-
92105
data = data[idx:]
93106

94107
// Read all arguments.
95-
args, err := ReadArguments([]byte(typetags), data[idx:])
108+
args, err := ReadArguments([]byte(typetags), data)
96109
if err != nil {
97-
return Message{}, err
110+
return Message{}, errors.Wrap(err, "parse message")
98111
}
99112
msg.Arguments = args
100113

0 commit comments

Comments
 (0)