blob: 5e18753e25829e4742b7108b7aa58eea17a93381 [file] [log] [blame]
Rob Pikeaaa3a622010-03-20 22:32:34 -07001// Go support for Protocol Buffers - Google's data interchange format
2//
3// Copyright 2010 Google Inc. All rights reserved.
4// http://code.google.com/p/goprotobuf/
5//
6// Redistribution and use in source and binary forms, with or without
7// modification, are permitted provided that the following conditions are
8// met:
9//
10// * Redistributions of source code must retain the above copyright
11// notice, this list of conditions and the following disclaimer.
12// * Redistributions in binary form must reproduce the above
13// copyright notice, this list of conditions and the following disclaimer
14// in the documentation and/or other materials provided with the
15// distribution.
16// * Neither the name of Google Inc. nor the names of its
17// contributors may be used to endorse or promote products derived from
18// this software without specific prior written permission.
19//
20// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
32package proto_test
33
34import (
35 "bytes"
36 . "goprotobuf.googlecode.com/hg/proto"
37 . "./testdata/_obj/test_proto"
38 "testing"
39)
40
41func newTestMessage() *MyMessage {
42 return &MyMessage{
43 Count: Int32(42),
Rob Pike9caa5b92010-05-11 16:04:57 -070044 Name: String("Dave"),
Rob Pikeaaa3a622010-03-20 22:32:34 -070045 Quote: String(`"I didn't want to go."`),
Rob Pike9caa5b92010-05-11 16:04:57 -070046 Pet: []string{"bunny", "kitty", "horsey"},
Rob Pikeaaa3a622010-03-20 22:32:34 -070047 Inner: &InnerMessage{
Rob Pike9caa5b92010-05-11 16:04:57 -070048 Host: String("footrest.syd"),
49 Port: Int32(7001),
Rob Pikeaaa3a622010-03-20 22:32:34 -070050 Connected: Bool(true),
51 },
52 Others: []*OtherMessage{
53 &OtherMessage{
Rob Pike9caa5b92010-05-11 16:04:57 -070054 Key: Int64(0xdeadbeef),
Rob Pikeaaa3a622010-03-20 22:32:34 -070055 Value: []byte{1, 65, 7, 12},
56 },
57 &OtherMessage{
58 Weight: Float32(6.022),
59 Inner: &InnerMessage{
60 Host: String("lesha.mtv"),
61 Port: Int32(8002),
62 },
63 },
64 },
65 Bikeshed: NewMyMessage_Color(MyMessage_BLUE),
66 }
67}
68
69const text = `count: 42
70name: "Dave"
71quote: "\"I didn't want to go.\""
72pet: "bunny"
73pet: "kitty"
74pet: "horsey"
75inner: <
76 host: "footrest.syd"
77 port: 7001
78 connected: true
79>
80others: <
81 key: 3735928559
82 value: "\x01A\a\f"
83>
84others: <
85 weight: 6.022
86 inner: <
87 host: "lesha.mtv"
88 port: 8002
89 >
90>
91bikeshed: BLUE
92`
93
94func TestMarshalTextFull(t *testing.T) {
95 buf := new(bytes.Buffer)
96 MarshalText(buf, newTestMessage())
97 s := buf.String()
98 if s != text {
99 t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v===\n", s, text)
100 }
101}
102
103func compact(src string) string {
104 // ,s/[ \n]+/ /g; s/ $//;
105 dst := make([]byte, len(src))
106 space := false
107 j := 0
108 for i := 0; i < len(src); i++ {
109 c := src[i]
110 if c == ' ' || c == '\n' {
111 space = true
112 continue
113 }
114 if j > 0 && (dst[j-1] == ':' || dst[j-1] == '<') {
115 space = false
116 }
117 if space {
118 dst[j] = ' '
119 j++
120 space = false
121 }
122 dst[j] = c
123 j++
124 }
125 if space {
126 dst[j] = ' '
127 j++
128 }
129 return string(dst[0:j])
130}
131
132var compactText = compact(text)
133
134func TestCompactText(t *testing.T) {
135 s := CompactTextString(newTestMessage())
136 if s != compactText {
137 t.Errorf("Got:\n===\n%v===\nExpected:\n===\n%v===\n", s, compactText)
138 }
139}