// Copyright 2019 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 "tools/kazoo/outputs.h"
#include "tools/kazoo/syscall_library.h"
#include "tools/kazoo/test.h"
#include "tools/kazoo/test_ir_test_go_reserved_words.test.h"
#include "tools/kazoo/test_ir_test_selection.test.h"

namespace {

TEST(GoSyscallsStubs, Selection) {
  SyscallLibrary library;
  ASSERT_TRUE(SyscallLibraryLoader::FromJson(k_test_selection, &library));

  Writer writer;
  ASSERT_TRUE(GoSyscallsStubs(library, &writer));

  EXPECT_EQ(writer.Out(),
            R"(// Copyright 2019 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.

// WARNING: THIS FILE IS MACHINE GENERATED BY //tools/kazoo. DO NOT EDIT.

package zx

import "unsafe"

//go:noescape
//go:nosplit
func Sys_selection_futex_requeue(value_ptr *int32, wake_count uint32, current_value int32, requeue_ptr *int32, requeue_count uint32, new_requeue_owner Handle) Status

//go:noescape
//go:nosplit
func Sys_selection_object_wait_one(handle Handle, signals Signals, deadline Time, observed *Signals) Status

//go:noescape
//go:nosplit
func Sys_selection_ktrace_read(handle Handle, data unsafe.Pointer, offset uint32, data_size uint, actual *uint) Status

//go:noescape
//go:nosplit
func Sys_selection_pci_cfg_pio_rw(handle Handle, bus uint8, dev uint8, funk uint8, offset uint8, val *uint32, width uint, write uint32) Status

//go:noescape
//go:nosplit
func Sys_selection_job_set_policy(handle Handle, options uint32, topic uint32, policy unsafe.Pointer, policy_size uint32) Status

//go:noescape
//go:nosplit
func Sys_selection_clock_get(clock_id uint32, out *Time) Status

)");
}

TEST(GoSyscallsStubs, ReservedWords) {
  SyscallLibrary library;
  ASSERT_TRUE(SyscallLibraryLoader::FromJson(k_test_go_reserved_words, &library));

  Writer writer;
  ASSERT_TRUE(GoSyscallsStubs(library, &writer));

  EXPECT_EQ(writer.Out(),
            R"(// Copyright 2019 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.

// WARNING: THIS FILE IS MACHINE GENERATED BY //tools/kazoo. DO NOT EDIT.

package zx

import "unsafe"

//go:noescape
//go:nosplit
func Sys_reservedwords_my_func(typ uint32, funk uint32, g_ uint32) Status

//go:noescape
//go:nosplit
func Sys_reservedwords_pci_types(bar *uintptr, initarg *uintptr, device_info *uintptr) Status

)");
}

TEST(GoSyscallsAsm, Selection) {
  SyscallLibrary library;
  ASSERT_TRUE(SyscallLibraryLoader::FromJson(k_test_selection, &library));

  Writer writer;
  ASSERT_TRUE(GoSyscallsAsm(library, &writer));

  EXPECT_EQ(writer.Out(),
            R"(// Copyright 2019 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.

// WARNING: THIS FILE IS MACHINE GENERATED BY //tools/kazoo. DO NOT EDIT.

#include "textflag.h"

// func Sys_selection_futex_requeue(value_ptr *int32, wake_count uint32, current_value int32, requeue_ptr *int32, requeue_count uint32, new_requeue_owner Handle) Status
TEXT ·Sys_selection_futex_requeue(SB),NOSPLIT,$0
	JMP runtime·vdsoCall_zx_selection_futex_requeue(SB)

// func Sys_selection_object_wait_one(handle Handle, signals Signals, deadline Time, observed *Signals) Status
TEXT ·Sys_selection_object_wait_one(SB),NOSPLIT,$0
	JMP runtime·vdsoCall_zx_selection_object_wait_one(SB)

// func Sys_selection_ktrace_read(handle Handle, data unsafe.Pointer, offset uint32, data_size uint, actual *uint) Status
TEXT ·Sys_selection_ktrace_read(SB),NOSPLIT,$0
	JMP runtime·vdsoCall_zx_selection_ktrace_read(SB)

// func Sys_selection_pci_cfg_pio_rw(handle Handle, bus uint8, dev uint8, funk uint8, offset uint8, val *uint32, width uint, write uint32) Status
TEXT ·Sys_selection_pci_cfg_pio_rw(SB),NOSPLIT,$0
	JMP runtime·vdsoCall_zx_selection_pci_cfg_pio_rw(SB)

// func Sys_selection_job_set_policy(handle Handle, options uint32, topic uint32, policy unsafe.Pointer, policy_size uint32) Status
TEXT ·Sys_selection_job_set_policy(SB),NOSPLIT,$0
	JMP runtime·vdsoCall_zx_selection_job_set_policy(SB)

// func Sys_selection_clock_get(clock_id uint32, out *Time) Status
TEXT ·Sys_selection_clock_get(SB),NOSPLIT,$0
	JMP runtime·vdsoCall_zx_selection_clock_get(SB)

)");
}

}  // namespace
