Atrinik Server  4.0
math.c
1 /*************************************************************************
2  * Atrinik, a Multiplayer Online Role Playing Game *
3  * *
4  * Copyright (C) 2009-2014 Alex Tokar and Atrinik Development Team *
5  * *
6  * Fork from Crossfire (Multiplayer game for X-windows). *
7  * *
8  * This program is free software; you can redistribute it and/or modify *
9  * it under the terms of the GNU General Public License as published by *
10  * the Free Software Foundation; either version 2 of the License, or *
11  * (at your option) any later version. *
12  * *
13  * This program is distributed in the hope that it will be useful, *
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
16  * GNU General Public License for more details. *
17  * *
18  * You should have received a copy of the GNU General Public License *
19  * along with this program; if not, write to the Free Software *
20  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *
21  * *
22  * The author can be reached at admin@atrinik.org *
23  ************************************************************************/
24 
25 #include <global.h>
26 #include <check.h>
27 #include <checkstd.h>
28 #include <check_proto.h>
29 #include <malloc.h>
30 
31 START_TEST(test_isqrt)
32 {
33  ck_assert_uint_eq(isqrt(0), 0);
34  ck_assert_uint_eq(isqrt(1), 1);
35  ck_assert_uint_eq(isqrt(2), 1);
36  ck_assert_uint_eq(isqrt(50), 7);
37  ck_assert_uint_eq(isqrt(100), 10);
38  ck_assert_uint_eq(isqrt(500), 22);
39 }
40 END_TEST
41 
42 START_TEST(test_nearest_pow_two_exp)
43 {
44  ck_assert_uint_eq(nearest_pow_two_exp(0), 0);
45  ck_assert_uint_eq(nearest_pow_two_exp(1), 0);
46  ck_assert_uint_eq(nearest_pow_two_exp(2), 1);
47  ck_assert_uint_eq(nearest_pow_two_exp(3), 2);
48  ck_assert_uint_eq(nearest_pow_two_exp(4), 2);
49  ck_assert_uint_eq(nearest_pow_two_exp(128), 7);
50 }
51 END_TEST
52 
53 START_TEST(test_math_point_in_ellipse)
54 {
55  ck_assert(!math_point_in_ellipse(0, 0, 5, 5, 10, 10, 0));
56  ck_assert(!math_point_in_ellipse(500, 0, 5, 5, 10, 10, 0));
57  ck_assert(!math_point_in_ellipse(0, 500, 5, 5, 10, 10, 0));
58  ck_assert(!math_point_in_ellipse(500, 500, 5, 5, 10, 10, 0));
59  ck_assert(!math_point_in_ellipse(10, 10, 5, 5, 10, 10, 0));
60  ck_assert(math_point_in_ellipse(5, 5, 5, 5, 10, 10, 0));
61  ck_assert(math_point_in_ellipse(5, 5, 5, 5, 5, 10, 0));
62  ck_assert(math_point_in_ellipse(5, 5, 5, 5, 10, 5, 0));
63  ck_assert(math_point_in_ellipse(5, 5, 5, 5, 10, 10, 45));
64 }
65 END_TEST
66 
67 START_TEST(test_math_point_edge_ellipse)
68 {
69  ck_assert(!math_point_edge_ellipse(0, 0, 5, 5, 10, 10, 0, NULL));
70  int deg;
71  ck_assert(math_point_edge_ellipse(50, 2, 50, 50, 100, 100, 0, &deg));
72  ck_assert_int_eq(deg, 0);
73  ck_assert(math_point_edge_ellipse(99, 50, 50, 50, 100, 100, 0, &deg));
74  ck_assert_int_eq(deg, 90);
75  ck_assert(math_point_edge_ellipse(50, 99, 50, 50, 100, 100, 0, &deg));
76  ck_assert_int_eq(deg, 180);
77  ck_assert(math_point_edge_ellipse(2, 50, 50, 50, 100, 100, 0, &deg));
78  ck_assert_int_eq(deg, 270);
79  ck_assert(math_point_edge_ellipse(2, 49, 50, 50, 100, 100, 0, &deg));
80  ck_assert_int_eq(deg, 272);
81 }
82 END_TEST
83 
84 static Suite *suite(void)
85 {
86  Suite *s = suite_create("math");
87  TCase *tc_core = tcase_create("Core");
88 
89  tcase_add_unchecked_fixture(tc_core, check_setup, check_teardown);
90  tcase_add_checked_fixture(tc_core, check_test_setup, check_test_teardown);
91 
92  suite_add_tcase(s, tc_core);
93  tcase_add_test(tc_core, test_isqrt);
94  tcase_add_test(tc_core, test_nearest_pow_two_exp);
95  tcase_add_test(tc_core, test_math_point_in_ellipse);
96  tcase_add_test(tc_core, test_math_point_edge_ellipse);
97 
98  return s;
99 }
100 
101 void check_server_math(void)
102 {
103  check_run_suite(suite(), __FILE__);
104 }