github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/golang/protobuf/proto/equal_test.go (about)

     1  // Go support for Protocol Buffers - Google's data interchange format
     2  //
     3  // Copyright 2011 The Go Authors.  All rights reserved.
     4  // https://yougam/libraries/golang/protobuf
     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  
    32  package proto_test
    33  
    34  import (
    35  	"testing"
    36  
    37  	. "github.com/insionng/yougam/libraries/golang/protobuf/proto"
    38  	proto3pb "github.com/insionng/yougam/libraries/golang/protobuf/proto/proto3_proto"
    39  	pb "github.com/insionng/yougam/libraries/golang/protobuf/proto/testdata"
    40  )
    41  
    42  // Four identical base messages.
    43  // The init function adds extensions to some of them.
    44  var messageWithoutExtension = &pb.MyMessage{Count: Int32(7)}
    45  var messageWithExtension1a = &pb.MyMessage{Count: Int32(7)}
    46  var messageWithExtension1b = &pb.MyMessage{Count: Int32(7)}
    47  var messageWithExtension2 = &pb.MyMessage{Count: Int32(7)}
    48  
    49  // Two messages with non-message extensions.
    50  var messageWithInt32Extension1 = &pb.MyMessage{Count: Int32(8)}
    51  var messageWithInt32Extension2 = &pb.MyMessage{Count: Int32(8)}
    52  
    53  func init() {
    54  	ext1 := &pb.Ext{Data: String("Kirk")}
    55  	ext2 := &pb.Ext{Data: String("Picard")}
    56  
    57  	// messageWithExtension1a has ext1, but never marshals it.
    58  	if err := SetExtension(messageWithExtension1a, pb.E_Ext_More, ext1); err != nil {
    59  		panic("SetExtension on 1a failed: " + err.Error())
    60  	}
    61  
    62  	// messageWithExtension1b is the unmarshaled form of messageWithExtension1a.
    63  	if err := SetExtension(messageWithExtension1b, pb.E_Ext_More, ext1); err != nil {
    64  		panic("SetExtension on 1b failed: " + err.Error())
    65  	}
    66  	buf, err := Marshal(messageWithExtension1b)
    67  	if err != nil {
    68  		panic("Marshal of 1b failed: " + err.Error())
    69  	}
    70  	messageWithExtension1b.Reset()
    71  	if err := Unmarshal(buf, messageWithExtension1b); err != nil {
    72  		panic("Unmarshal of 1b failed: " + err.Error())
    73  	}
    74  
    75  	// messageWithExtension2 has ext2.
    76  	if err := SetExtension(messageWithExtension2, pb.E_Ext_More, ext2); err != nil {
    77  		panic("SetExtension on 2 failed: " + err.Error())
    78  	}
    79  
    80  	if err := SetExtension(messageWithInt32Extension1, pb.E_Ext_Number, Int32(23)); err != nil {
    81  		panic("SetExtension on Int32-1 failed: " + err.Error())
    82  	}
    83  	if err := SetExtension(messageWithInt32Extension1, pb.E_Ext_Number, Int32(24)); err != nil {
    84  		panic("SetExtension on Int32-2 failed: " + err.Error())
    85  	}
    86  }
    87  
    88  var EqualTests = []struct {
    89  	desc string
    90  	a, b Message
    91  	exp  bool
    92  }{
    93  	{"different types", &pb.GoEnum{}, &pb.GoTestField{}, false},
    94  	{"equal empty", &pb.GoEnum{}, &pb.GoEnum{}, true},
    95  	{"nil vs nil", nil, nil, true},
    96  	{"typed nil vs typed nil", (*pb.GoEnum)(nil), (*pb.GoEnum)(nil), true},
    97  	{"typed nil vs empty", (*pb.GoEnum)(nil), &pb.GoEnum{}, false},
    98  	{"different typed nil", (*pb.GoEnum)(nil), (*pb.GoTestField)(nil), false},
    99  
   100  	{"one set field, one unset field", &pb.GoTestField{Label: String("foo")}, &pb.GoTestField{}, false},
   101  	{"one set field zero, one unset field", &pb.GoTest{Param: Int32(0)}, &pb.GoTest{}, false},
   102  	{"different set fields", &pb.GoTestField{Label: String("foo")}, &pb.GoTestField{Label: String("bar")}, false},
   103  	{"equal set", &pb.GoTestField{Label: String("foo")}, &pb.GoTestField{Label: String("foo")}, true},
   104  
   105  	{"repeated, one set", &pb.GoTest{F_Int32Repeated: []int32{2, 3}}, &pb.GoTest{}, false},
   106  	{"repeated, different length", &pb.GoTest{F_Int32Repeated: []int32{2, 3}}, &pb.GoTest{F_Int32Repeated: []int32{2}}, false},
   107  	{"repeated, different value", &pb.GoTest{F_Int32Repeated: []int32{2}}, &pb.GoTest{F_Int32Repeated: []int32{3}}, false},
   108  	{"repeated, equal", &pb.GoTest{F_Int32Repeated: []int32{2, 4}}, &pb.GoTest{F_Int32Repeated: []int32{2, 4}}, true},
   109  	{"repeated, nil equal nil", &pb.GoTest{F_Int32Repeated: nil}, &pb.GoTest{F_Int32Repeated: nil}, true},
   110  	{"repeated, nil equal empty", &pb.GoTest{F_Int32Repeated: nil}, &pb.GoTest{F_Int32Repeated: []int32{}}, true},
   111  	{"repeated, empty equal nil", &pb.GoTest{F_Int32Repeated: []int32{}}, &pb.GoTest{F_Int32Repeated: nil}, true},
   112  
   113  	{
   114  		"nested, different",
   115  		&pb.GoTest{RequiredField: &pb.GoTestField{Label: String("foo")}},
   116  		&pb.GoTest{RequiredField: &pb.GoTestField{Label: String("bar")}},
   117  		false,
   118  	},
   119  	{
   120  		"nested, equal",
   121  		&pb.GoTest{RequiredField: &pb.GoTestField{Label: String("wow")}},
   122  		&pb.GoTest{RequiredField: &pb.GoTestField{Label: String("wow")}},
   123  		true,
   124  	},
   125  
   126  	{"bytes", &pb.OtherMessage{Value: []byte("foo")}, &pb.OtherMessage{Value: []byte("foo")}, true},
   127  	{"bytes, empty", &pb.OtherMessage{Value: []byte{}}, &pb.OtherMessage{Value: []byte{}}, true},
   128  	{"bytes, empty vs nil", &pb.OtherMessage{Value: []byte{}}, &pb.OtherMessage{Value: nil}, false},
   129  	{
   130  		"repeated bytes",
   131  		&pb.MyMessage{RepBytes: [][]byte{[]byte("sham"), []byte("wow")}},
   132  		&pb.MyMessage{RepBytes: [][]byte{[]byte("sham"), []byte("wow")}},
   133  		true,
   134  	},
   135  	// In proto3, []byte{} and []byte(nil) are equal.
   136  	{"proto3 bytes, empty vs nil", &proto3pb.Message{Data: []byte{}}, &proto3pb.Message{Data: nil}, true},
   137  
   138  	{"extension vs. no extension", messageWithoutExtension, messageWithExtension1a, false},
   139  	{"extension vs. same extension", messageWithExtension1a, messageWithExtension1b, true},
   140  	{"extension vs. different extension", messageWithExtension1a, messageWithExtension2, false},
   141  
   142  	{"int32 extension vs. itself", messageWithInt32Extension1, messageWithInt32Extension1, true},
   143  	{"int32 extension vs. a different int32", messageWithInt32Extension1, messageWithInt32Extension2, false},
   144  
   145  	{
   146  		"message with group",
   147  		&pb.MyMessage{
   148  			Count: Int32(1),
   149  			Somegroup: &pb.MyMessage_SomeGroup{
   150  				GroupField: Int32(5),
   151  			},
   152  		},
   153  		&pb.MyMessage{
   154  			Count: Int32(1),
   155  			Somegroup: &pb.MyMessage_SomeGroup{
   156  				GroupField: Int32(5),
   157  			},
   158  		},
   159  		true,
   160  	},
   161  
   162  	{
   163  		"map same",
   164  		&pb.MessageWithMap{NameMapping: map[int32]string{1: "Ken"}},
   165  		&pb.MessageWithMap{NameMapping: map[int32]string{1: "Ken"}},
   166  		true,
   167  	},
   168  	{
   169  		"map different entry",
   170  		&pb.MessageWithMap{NameMapping: map[int32]string{1: "Ken"}},
   171  		&pb.MessageWithMap{NameMapping: map[int32]string{2: "Rob"}},
   172  		false,
   173  	},
   174  	{
   175  		"map different key only",
   176  		&pb.MessageWithMap{NameMapping: map[int32]string{1: "Ken"}},
   177  		&pb.MessageWithMap{NameMapping: map[int32]string{2: "Ken"}},
   178  		false,
   179  	},
   180  	{
   181  		"map different value only",
   182  		&pb.MessageWithMap{NameMapping: map[int32]string{1: "Ken"}},
   183  		&pb.MessageWithMap{NameMapping: map[int32]string{1: "Rob"}},
   184  		false,
   185  	},
   186  	{
   187  		"oneof same",
   188  		&pb.Communique{Union: &pb.Communique_Number{41}},
   189  		&pb.Communique{Union: &pb.Communique_Number{41}},
   190  		true,
   191  	},
   192  	{
   193  		"oneof one nil",
   194  		&pb.Communique{Union: &pb.Communique_Number{41}},
   195  		&pb.Communique{},
   196  		false,
   197  	},
   198  	{
   199  		"oneof different",
   200  		&pb.Communique{Union: &pb.Communique_Number{41}},
   201  		&pb.Communique{Union: &pb.Communique_Name{"Bobby Tables"}},
   202  		false,
   203  	},
   204  }
   205  
   206  func TestEqual(t *testing.T) {
   207  	for _, tc := range EqualTests {
   208  		if res := Equal(tc.a, tc.b); res != tc.exp {
   209  			t.Errorf("%v: Equal(%v, %v) = %v, want %v", tc.desc, tc.a, tc.b, res, tc.exp)
   210  		}
   211  	}
   212  }