LCOV - code coverage report
Current view: top level - src/unittest - test_collision.cpp (source / functions) Hit Total Coverage
Test: report Lines: 4 90 4.4 %
Date: 2015-07-11 18:23:49 Functions: 4 7 57.1 %

          Line data    Source code
       1             : /*
       2             : Minetest
       3             : Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
       4             : 
       5             : This program is free software; you can redistribute it and/or modify
       6             : it under the terms of the GNU Lesser General Public License as published by
       7             : the Free Software Foundation; either version 2.1 of the License, or
       8             : (at your option) any later version.
       9             : 
      10             : This program is distributed in the hope that it will be useful,
      11             : but WITHOUT ANY WARRANTY; without even the implied warranty of
      12             : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      13             : GNU Lesser General Public License for more details.
      14             : 
      15             : You should have received a copy of the GNU Lesser General Public License along
      16             : with this program; if not, write to the Free Software Foundation, Inc.,
      17             : 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
      18             : */
      19             : 
      20             : #include "test.h"
      21             : 
      22             : #include "collision.h"
      23             : 
      24           1 : class TestCollision : public TestBase {
      25             : public:
      26           1 :         TestCollision() { TestManager::registerTestModule(this); }
      27           0 :         const char *getName() { return "TestCollision"; }
      28             : 
      29             :         void runTests(IGameDef *gamedef);
      30             : 
      31             :         void testAxisAlignedCollision();
      32             : };
      33             : 
      34           1 : static TestCollision g_test_instance;
      35             : 
      36           0 : void TestCollision::runTests(IGameDef *gamedef)
      37             : {
      38           0 :         TEST(testAxisAlignedCollision);
      39           0 : }
      40             : 
      41             : ////////////////////////////////////////////////////////////////////////////////
      42             : 
      43           0 : void TestCollision::testAxisAlignedCollision()
      44             : {
      45           0 :         for (s16 bx = -3; bx <= 3; bx++)
      46           0 :         for (s16 by = -3; by <= 3; by++)
      47           0 :         for (s16 bz = -3; bz <= 3; bz++) {
      48             :                 // X-
      49             :                 {
      50           0 :                         aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
      51           0 :                         aabb3f m(bx-2, by, bz, bx-1, by+1, bz+1);
      52           0 :                         v3f v(1, 0, 0);
      53           0 :                         f32 dtime = 0;
      54           0 :                         UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 0);
      55           0 :                         UASSERT(fabs(dtime - 1.000) < 0.001);
      56             :                 }
      57             :                 {
      58           0 :                         aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
      59           0 :                         aabb3f m(bx-2, by, bz, bx-1, by+1, bz+1);
      60           0 :                         v3f v(-1, 0, 0);
      61           0 :                         f32 dtime = 0;
      62           0 :                         UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == -1);
      63             :                 }
      64             :                 {
      65           0 :                         aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
      66           0 :                         aabb3f m(bx-2, by+1.5, bz, bx-1, by+2.5, bz-1);
      67           0 :                         v3f v(1, 0, 0);
      68             :                         f32 dtime;
      69           0 :                         UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == -1);
      70             :                 }
      71             :                 {
      72           0 :                         aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
      73           0 :                         aabb3f m(bx-2, by-1.5, bz, bx-1.5, by+0.5, bz+1);
      74           0 :                         v3f v(0.5, 0.1, 0);
      75             :                         f32 dtime;
      76           0 :                         UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 0);
      77           0 :                         UASSERT(fabs(dtime - 3.000) < 0.001);
      78             :                 }
      79             :                 {
      80           0 :                         aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
      81           0 :                         aabb3f m(bx-2, by-1.5, bz, bx-1.5, by+0.5, bz+1);
      82           0 :                         v3f v(0.5, 0.1, 0);
      83             :                         f32 dtime;
      84           0 :                         UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 0);
      85           0 :                         UASSERT(fabs(dtime - 3.000) < 0.001);
      86             :                 }
      87             : 
      88             :                 // X+
      89             :                 {
      90           0 :                         aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
      91           0 :                         aabb3f m(bx+2, by, bz, bx+3, by+1, bz+1);
      92           0 :                         v3f v(-1, 0, 0);
      93             :                         f32 dtime;
      94           0 :                         UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 0);
      95           0 :                         UASSERT(fabs(dtime - 1.000) < 0.001);
      96             :                 }
      97             :                 {
      98           0 :                         aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
      99           0 :                         aabb3f m(bx+2, by, bz, bx+3, by+1, bz+1);
     100           0 :                         v3f v(1, 0, 0);
     101             :                         f32 dtime;
     102           0 :                         UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == -1);
     103             :                 }
     104             :                 {
     105           0 :                         aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
     106           0 :                         aabb3f m(bx+2, by, bz+1.5, bx+3, by+1, bz+3.5);
     107           0 :                         v3f v(-1, 0, 0);
     108             :                         f32 dtime;
     109           0 :                         UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == -1);
     110             :                 }
     111             :                 {
     112           0 :                         aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
     113           0 :                         aabb3f m(bx+2, by-1.5, bz, bx+2.5, by-0.5, bz+1);
     114           0 :                         v3f v(-0.5, 0.2, 0);
     115             :                         f32 dtime;
     116           0 :                         UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 1);  // Y, not X!
     117           0 :                         UASSERT(fabs(dtime - 2.500) < 0.001);
     118             :                 }
     119             :                 {
     120           0 :                         aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
     121           0 :                         aabb3f m(bx+2, by-1.5, bz, bx+2.5, by-0.5, bz+1);
     122           0 :                         v3f v(-0.5, 0.3, 0);
     123             :                         f32 dtime;
     124           0 :                         UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 0);
     125           0 :                         UASSERT(fabs(dtime - 2.000) < 0.001);
     126             :                 }
     127             : 
     128             :                 // TODO: Y-, Y+, Z-, Z+
     129             : 
     130             :                 // misc
     131             :                 {
     132           0 :                         aabb3f s(bx, by, bz, bx+2, by+2, bz+2);
     133           0 :                         aabb3f m(bx+2.3, by+2.29, bz+2.29, bx+4.2, by+4.2, bz+4.2);
     134           0 :                         v3f v(-1./3, -1./3, -1./3);
     135             :                         f32 dtime;
     136           0 :                         UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 0);
     137           0 :                         UASSERT(fabs(dtime - 0.9) < 0.001);
     138             :                 }
     139             :                 {
     140           0 :                         aabb3f s(bx, by, bz, bx+2, by+2, bz+2);
     141           0 :                         aabb3f m(bx+2.29, by+2.3, bz+2.29, bx+4.2, by+4.2, bz+4.2);
     142           0 :                         v3f v(-1./3, -1./3, -1./3);
     143             :                         f32 dtime;
     144           0 :                         UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 1);
     145           0 :                         UASSERT(fabs(dtime - 0.9) < 0.001);
     146             :                 }
     147             :                 {
     148           0 :                         aabb3f s(bx, by, bz, bx+2, by+2, bz+2);
     149           0 :                         aabb3f m(bx+2.29, by+2.29, bz+2.3, bx+4.2, by+4.2, bz+4.2);
     150           0 :                         v3f v(-1./3, -1./3, -1./3);
     151             :                         f32 dtime;
     152           0 :                         UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 2);
     153           0 :                         UASSERT(fabs(dtime - 0.9) < 0.001);
     154             :                 }
     155             :                 {
     156           0 :                         aabb3f s(bx, by, bz, bx+2, by+2, bz+2);
     157           0 :                         aabb3f m(bx-4.2, by-4.2, bz-4.2, bx-2.3, by-2.29, bz-2.29);
     158           0 :                         v3f v(1./7, 1./7, 1./7);
     159             :                         f32 dtime;
     160           0 :                         UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 0);
     161           0 :                         UASSERT(fabs(dtime - 16.1) < 0.001);
     162             :                 }
     163             :                 {
     164           0 :                         aabb3f s(bx, by, bz, bx+2, by+2, bz+2);
     165           0 :                         aabb3f m(bx-4.2, by-4.2, bz-4.2, bx-2.29, by-2.3, bz-2.29);
     166           0 :                         v3f v(1./7, 1./7, 1./7);
     167             :                         f32 dtime;
     168           0 :                         UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 1);
     169           0 :                         UASSERT(fabs(dtime - 16.1) < 0.001);
     170             :                 }
     171             :                 {
     172           0 :                         aabb3f s(bx, by, bz, bx+2, by+2, bz+2);
     173           0 :                         aabb3f m(bx-4.2, by-4.2, bz-4.2, bx-2.29, by-2.29, bz-2.3);
     174           0 :                         v3f v(1./7, 1./7, 1./7);
     175             :                         f32 dtime;
     176           0 :                         UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 2);
     177           0 :                         UASSERT(fabs(dtime - 16.1) < 0.001);
     178             :                 }
     179             :         }
     180           3 : }

Generated by: LCOV version 1.11