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

package fidlgen_cpp

import (
	"testing"

	"github.com/google/go-cmp/cmp"
)

var mockProtocol = protocolInner{
	Methods: []Method{
		methodInner{
			Name:        "OneWay",
			HasRequest:  true,
			HasResponse: false,
		}.build(),
		methodInner{
			Name:        "TwoWay",
			HasRequest:  true,
			HasResponse: true,
		}.build(),
		methodInner{
			Name:        "Event",
			HasRequest:  false,
			HasResponse: true,
		}.build(),
	},
}.build()

func toNames(methods []Method) []string {
	var s []string
	for _, m := range methods {
		s = append(s, m.Name)
	}
	return s
}

func assertEmpty(t *testing.T, diff string) {
	t.Helper()
	if len(diff) > 0 {
		t.Fatalf("Expected empty diff, got %s", diff)
	}
}

func TestMatchOneWayMethods(t *testing.T) {
	assertEmpty(t, cmp.Diff(toNames(mockProtocol.OneWayMethods), []string{"OneWay"}))
}

func TestMatchTwoWayMethods(t *testing.T) {
	assertEmpty(t, cmp.Diff(toNames(mockProtocol.TwoWayMethods), []string{"TwoWay"}))
}

func TestMatchClientMethods(t *testing.T) {
	assertEmpty(t, cmp.Diff(toNames(mockProtocol.ClientMethods), []string{"OneWay", "TwoWay"}))
}

func TestMatchEvents(t *testing.T) {
	assertEmpty(t, cmp.Diff(toNames(mockProtocol.Events), []string{"Event"}))
}
