// Copyright 2017, The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE.md file.

package testprotos

func Equal(x, y Message) bool {
	if x == nil || y == nil {
		return x == nil && y == nil
	}
	return x.String() == y.String()
}

type Message interface {
	Proto()
	String() string
}

type proto interface {
	Proto()
}

type notComparable struct {
	unexportedField func()
}

type Stringer struct{ X string }

func (s *Stringer) String() string { return s.X }

// Project1 protocol buffers
type (
	Eagle_States         int
	Eagle_MissingCalls   int
	Dreamer_States       int
	Dreamer_MissingCalls int
	Slap_States          int
	Goat_States          int
	Donkey_States        int
	SummerType           int

	Eagle struct {
		proto
		notComparable
		Stringer
	}
	Dreamer struct {
		proto
		notComparable
		Stringer
	}
	Slap struct {
		proto
		notComparable
		Stringer
	}
	Goat struct {
		proto
		notComparable
		Stringer
	}
	Donkey struct {
		proto
		notComparable
		Stringer
	}
)

// Project2 protocol buffers
type (
	Germ struct {
		proto
		notComparable
		Stringer
	}
	Dish struct {
		proto
		notComparable
		Stringer
	}
)

// Project3 protocol buffers
type (
	Dirt struct {
		proto
		notComparable
		Stringer
	}
	Wizard struct {
		proto
		notComparable
		Stringer
	}
	Sadistic struct {
		proto
		notComparable
		Stringer
	}
)

// Project4 protocol buffers
type (
	HoneyStatus int
	PoisonType  int
	MetaData    struct {
		proto
		notComparable
		Stringer
	}
	Restrictions struct {
		proto
		notComparable
		Stringer
	}
)
