{{/*
// Copyright 2022 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.
*/}}

#include <zxtest/zxtest.h>

#include <test/conformance/cpp/fidl.h>
#include <ctf/tests/pkg/fidl/cpp/test/test_util.h>

#ifdef __Fuchsia__
#include <ctf/tests/pkg/fidl/cpp/test/handle_util.h>
#include <zircon/syscalls.h>
#endif

{{ range .EncodeSuccessCases }}
{{- if .FuchsiaOnly }}
#ifdef __Fuchsia__
{{- end }}
TEST(Conformance, {{ .Name }}_Encode) {
  {{- if .HandleDefs }}
  const auto handle_defs = {{ .HandleDefs }};
  {{- end }}
  {{ .ValueBuild }}
  const auto expected_bytes = {{ .Bytes }};
  const auto expected_handles = {{ .Handles }};
  {{/* Must use a variable because macros don't understand commas in template args. */ -}}
  const auto result =
    fidl::test::util::ValueToBytes<{{ .ValueType }}>(
      {{ .WireFormat }}, {{ .ValueVar }}, expected_bytes, expected_handles, {{ .CheckRights }});
  EXPECT_TRUE(result);
  {{- /* The handles are closed by the fidl::Message destructor in ValueToBytes. */}}
}
{{- if .FuchsiaOnly }}
#endif  // __Fuchsia__
{{- end }}
{{ end }}

{{ range .DecodeSuccessCases }}
{{- if .FuchsiaOnly }}
#ifdef __Fuchsia__
{{- end }}
TEST(Conformance, {{ .Name }}_Decode) {
  {{- if .HandleDefs }}
  const auto handle_defs = {{ .HandleDefs }};
  std::vector<zx_koid_t> {{ .HandleKoidVectorName }};
  for (zx_handle_info_t def : handle_defs) {
    zx_info_handle_basic_t info;
    ASSERT_OK(zx_object_get_info(def.handle, ZX_INFO_HANDLE_BASIC, &info, sizeof(info), nullptr, nullptr));
    {{ .HandleKoidVectorName }}.push_back(info.koid);
  }
  {{- end }}
  auto bytes = {{ .Bytes }};
  auto handles = {{ .Handles }};
  auto {{ .ActualValueVar }} =
      fidl::test::util::DecodedBytes<{{ .ValueType }}>({{ .WireFormat }}, std::move(bytes), std::move(handles));
  {{ .EqualityCheck }}
}
{{- if .FuchsiaOnly }}
#endif  // __Fuchsia__
{{- end }}
{{ end }}

{{ range .EncodeFailureCases }}
{{- if .FuchsiaOnly }}
#ifdef __Fuchsia__
{{- end }}
TEST(Conformance, {{ .Name }}_Encode_Failure) {
  {{- if .HandleDefs }}
  const auto handle_defs = {{ .HandleDefs }};
  {{- end }}
  {{ .ValueBuild }}
  fidl::test::util::CheckEncodeFailure<{{ .ValueType }}>(
    {{ .WireFormat }}, {{ .ValueVar }}, {{ .ErrorCode }});
  {{- if .HandleDefs }}
  for (const auto handle_def : handle_defs) {
    EXPECT_EQ(ZX_ERR_BAD_HANDLE, zx_object_get_info(
      handle_def, ZX_INFO_HANDLE_VALID, nullptr, 0, nullptr, nullptr));
  }
  {{- end }}
}
{{- if .FuchsiaOnly }}
#endif  // __Fuchsia__
{{- end }}
{{ end }}

{{ range .DecodeFailureCases }}
{{- if .FuchsiaOnly }}
#ifdef __Fuchsia__
{{- end }}
TEST(Conformance, {{ .Name }}_Decode_Failure) {
  {{- if .HandleDefs }}
  const auto handle_defs = {{ .HandleDefs }};
  {{- end }}
  auto bytes = {{ .Bytes }};
  auto handles = {{ .Handles }};
  fidl::test::util::CheckDecodeFailure<{{ .ValueType }}>({{ .WireFormat }}, std::move(bytes), std::move(handles), {{ .ErrorCode }});
  {{- if .HandleDefs }}
  for (const auto handle_def : handle_defs) {
    EXPECT_EQ(ZX_ERR_BAD_HANDLE, zx_object_get_info(
      handle_def.handle, ZX_INFO_HANDLE_VALID, nullptr, 0, nullptr, nullptr));
  }
  {{- end }}
}
{{- if .FuchsiaOnly }}
#endif  // __Fuchsia__
{{- end }}
{{ end }}
