// SPDX-License-Identifier: GPL-2.0
/*
 * Example KUnit test to show how to use KUnit.
 *
 * Copyright (C) 2018, Google LLC.
 * Author: Brendan Higgins <brendanhiggins@google.com>
 */

#include <kunit/test.h>
#include <test/mock.h>

struct example {
	int (*foo)(struct example *example, int num);
};

static int example_bar(struct example *example, int num)
{
	return example->foo(example, num);
}

DECLARE_STRUCT_CLASS_MOCK_PREREQS(example);

DEFINE_STRUCT_CLASS_MOCK(METHOD(foo), CLASS(example),
			 RETURNS(int),
			 PARAMS(struct example *, int));

static int example_init(struct MOCK(example) *mock_example)
{
	struct example *example = mock_get_trgt(mock_example);

	example->foo = foo;
	return 0;
}

DEFINE_STRUCT_CLASS_MOCK_INIT(example, example_init);

static void example_simple_test(struct KUNIT_T *test)
{
	KUNIT_EXPECT_EQ(test, 1, 1);
}

static void example_mock_test(struct KUNIT_T *test)
{
	struct MOCK(example) *mock_example = test->priv;
	struct example *example = mock_get_trgt(mock_example);
	struct mock_expectation *handle;

	handle = EXPECT_CALL(foo(mock_get_ctrl(mock_example), int_eq(test, 5)));
	handle->action = int_return(test, 2);

	KUNIT_EXPECT_EQ(test, 2, example_bar(example, 5));
}

static int example_test_init(struct KUNIT_T *test)
{
	kunit_info(test, "initializing");

	test->priv = CONSTRUCT_MOCK(example, test);
	if (!test->priv)
		return -EINVAL;

	return 0;
}

static struct test_case example_test_cases[] = {
	KUNIT_CASE(example_simple_test),
	KUNIT_CASE(example_mock_test),
	{},
};

static struct test_module example_test_module = {
	.name = "example",
	.init = example_test_init,
	.test_cases = example_test_cases,
};
kunit_test_suites(example_test_module);
