source: trunk/test/trig.cpp @ 927

Last change on this file since 927 was 927, checked in by sam, 8 years ago

lolunit: add a LOLUNIT_SET_CONTEXT / LOLUNIT_UNSET_CONTEXT macro pair.

This is useful when doing several asserts in one loop, for instance: there
isn't always a way to deduce the loop index from the assert failure, so
these macros allow the user to give more context information.

  • Property svn:keywords set to Id
File size: 4.3 KB
Line 
1//
2// Lol Engine
3//
4// Copyright: (c) 2010-2011 Sam Hocevar <sam@hocevar.net>
5//   This program is free software; you can redistribute it and/or
6//   modify it under the terms of the Do What The Fuck You Want To
7//   Public License, Version 2, as published by Sam Hocevar. See
8//   http://sam.zoy.org/projects/COPYING.WTFPL for more details.
9//
10
11#if defined HAVE_CONFIG_H
12#   include "config.h"
13#endif
14
15#include <cmath>
16
17#include "core.h"
18#include "lol/unit.h"
19
20namespace lol
21{
22
23LOLUNIT_FIXTURE(TrigTest)
24{
25public:
26    void setUp() {}
27    void tearDown() {}
28
29    LOLUNIT_TEST(test_sin)
30    {
31        for (int i = -10000; i < 10000; i++)
32        {
33            double f = (double)i * (1.0 / 1000.0);
34#if defined __GNUC__
35            double a = __builtin_sin(f);
36#else
37            double a = sin(f);
38#endif
39            double b = lol_sin(f);
40            LOLUNIT_SET_CONTEXT(f);
41            LOLUNIT_ASSERT_DOUBLES_EQUAL(a, b, fabs(f) * 1e-11);
42        }
43
44        for (int i = -10000; i < 10000; i++)
45        {
46            double f = (double)i * (1.0 / 100000.0);
47#if defined __GNUC__
48            double a = __builtin_sin(f);
49#else
50            double a = sin(f);
51#endif
52            double b = lol_sin(f);
53            LOLUNIT_SET_CONTEXT(f);
54            LOLUNIT_ASSERT_DOUBLES_EQUAL(a, b, fabs(f) * 1e-11);
55        }
56    }
57
58    LOLUNIT_TEST(test_cos)
59    {
60        for (int i = -10000; i < 10000; i++)
61        {
62            double f = (double)i * (1.0 / 1000.0);
63#if defined __GNUC__
64            double a = __builtin_cos(f);
65#else
66            double a = cos(f);
67#endif
68            double b = lol_cos(f);
69            LOLUNIT_SET_CONTEXT(f);
70            LOLUNIT_ASSERT_DOUBLES_EQUAL(a, b, fabs(f) * 1e-11);
71        }
72
73        for (int i = -10000; i < 10000; i++)
74        {
75            double f = (double)i * (1.0 / 100000.0);
76#if defined __GNUC__
77            double a = __builtin_cos(f);
78#else
79            double a = cos(f);
80#endif
81            double b = lol_cos(f);
82            LOLUNIT_SET_CONTEXT(f);
83            LOLUNIT_ASSERT_DOUBLES_EQUAL(a, b, fabs(f) * 1e-11);
84        }
85    }
86
87    LOLUNIT_TEST(test_sincos)
88    {
89        for (int i = -10000; i < 10000; i++)
90        {
91            double f = (double)i * (1.0 / 1000.0);
92#if defined __GNUC__
93            double a1 = __builtin_sin(f);
94            double a2 = __builtin_cos(f);
95#else
96            double a1 = sin(f);
97            double a2 = cos(f);
98#endif
99            double b1, b2;
100            lol_sincos(f, &b1, &b2);
101            LOLUNIT_SET_CONTEXT(f);
102            LOLUNIT_ASSERT_DOUBLES_EQUAL(a1, b1, fabs(f) * 1e-11);
103            LOLUNIT_ASSERT_DOUBLES_EQUAL(a2, b2, fabs(f) * 1e-11);
104        }
105
106        for (int i = -10000; i < 10000; i++)
107        {
108            double f = (double)i * (1.0 / 100000.0);
109#if defined __GNUC__
110            double a1 = __builtin_sin(f);
111            double a2 = __builtin_cos(f);
112#else
113            double a1 = sin(f);
114            double a2 = cos(f);
115#endif
116            double b1, b2;
117            lol_sincos(f, &b1, &b2);
118            LOLUNIT_SET_CONTEXT(f);
119            LOLUNIT_ASSERT_DOUBLES_EQUAL(a1, b1, fabs(f) * 1e-11);
120            LOLUNIT_ASSERT_DOUBLES_EQUAL(a2, b2, fabs(f) * 1e-11);
121        }
122    }
123
124    LOLUNIT_TEST(test_tan)
125    {
126        for (int i = -100000; i < 100000; i++)
127        {
128            double f = (double)i * (1.0 / 10000.0);
129#if defined __GNUC__
130            double a = __builtin_tan(f);
131#else
132            double a = tan(f);
133#endif
134            double b = lol_tan(f);
135            LOLUNIT_SET_CONTEXT(f);
136            if (fabs(a) > 1e4)
137                LOLUNIT_ASSERT_DOUBLES_EQUAL(a, b, fabs(a) * fabs(a) * 1e-11);
138            else if (fabs(a) > 1.0)
139                LOLUNIT_ASSERT_DOUBLES_EQUAL(a, b, fabs(a) * 1e-11);
140            else
141                LOLUNIT_ASSERT_DOUBLES_EQUAL(a, b, fabs(f) * 1e-11);
142        }
143
144        for (int i = -10000; i < 10000; i++)
145        {
146            double f = (double)i * (1.0 / 100000.0);
147#if defined __GNUC__
148            double a = __builtin_tan(f);
149#else
150            double a = tan(f);
151#endif
152            double b = lol_tan(f);
153            LOLUNIT_SET_CONTEXT(f);
154            if (fabs(a) > 1e4)
155                LOLUNIT_ASSERT_DOUBLES_EQUAL(a, b, fabs(a) * fabs(a) * 1e-11);
156            else if (fabs(a) > 1.0)
157                LOLUNIT_ASSERT_DOUBLES_EQUAL(a, b, fabs(a) * 1e-11);
158            else
159                LOLUNIT_ASSERT_DOUBLES_EQUAL(a, b, fabs(f) * 1e-11);
160        }
161    }
162};
163
164} /* namespace lol */
165
Note: See TracBrowser for help on using the repository browser.