view src/Tests/deco_volume_test.cpp @ 287:f342853afcd9

FIX gas_volumes: shall take stops in forward order.
author jdg@air
date Fri, 29 May 2015 02:24:03 +0200
parents 729b01914098
children 08986d479b94
line wrap: on
line source

//////////////////////////////////////////////////////////////////////////////
/// deco_volume_test.cpp
/// Unit test for gas consumption c code.
/// Copyright (c) 2015, JD Gascuel, HeinrichsWeikamp, all right reserved.
//////////////////////////////////////////////////////////////////////////////
//  HISTORY
// 2015-05-27 jDG: Creation for gas volum re-introduction in hwOS 1.80

extern "C" {
#   include "p2_deco.c"
}

#include <gtest/gtest.h>

//////////////////////////////////////////////////////////////////////////////
/// \brief Defines a default OC gas list
static void setup_gas()
{
    char_I_first_gas = 1;
    char_I_const_ppO2 = 0;  // Default to OC mode

#define DEFINE_GAS(gas, o2, he, depth, role)    \
    char_I_deco_N2_ratio  [gas-1] = 100 - o2 - he;  \
    char_I_deco_He_ratio  [gas-1] = he;             \
    char_I_deco_gas_change[gas-1] = depth;

    DEFINE_GAS(1, 21,  0, 0, 1);    // Gas#1 : Air       FIRST
    DEFINE_GAS(2, 18, 30, 0, 2);    // Gas#2 : Tx18/30   TRAVEL
    DEFINE_GAS(3, 80,  0, 9, 3);    // Gas#3 : Nx80 @ 9m DECO
    DEFINE_GAS(4, 21, 0,  0, 0);    // Gas#2 : air @ 10m DISABLED
    DEFINE_GAS(5, 21, 0,  0, 0);    // Gas#2 : air @ 40m DISABLED
}

//////////////////////////////////////////////////////////////////////////////
/// \brief Define a default deco plan.
static void setup_plan()
{
    // 1 min at 12m
    char_O_deco_time [0] = 1;
    char_O_deco_depth[0] =12;
    char_O_deco_gas  [0] = 1; // Gas#1
    // 1 min at 9m
    char_O_deco_time [1] = 1;
    char_O_deco_depth[1] = 9;
    char_O_deco_gas  [1] = 3; // Gas#3
    // 3min at 6m
    char_O_deco_time [2] = 3;
    char_O_deco_depth[2] = 6;
    char_O_deco_gas  [2] = 3; // Gas#3
    // 12 min at 3m
    char_O_deco_time [3] =12;
    char_O_deco_depth[3] = 3;
    char_O_deco_gas  [3] = 3; // Gas#3
    // Done
    for(int s=4; s<NUM_STOPS; ++s) {
        char_O_deco_time [s] = 0;
        char_O_deco_depth[s] = 0;
        char_O_deco_gas  [s] = 0;
    }
}

static void setup_dive(int bottom, int depth)
{
    setup_gas();
    setup_plan();

    char_I_bottom_depth = depth;
    char_I_bottom_time  = bottom;
}

//////////////////////////////////////////////////////////////////////////////
/// \brief Gas consumption at a fixed depth
static float fixed(int rmv, int time, int depth) {
    return rmv * time * (1 + 0.1f*depth);
}

TEST(gas_volume, fixed)
{
    EXPECT_EQ(20*30*1, fixed(20,30, 0));    // 30' @  0m
    EXPECT_EQ(20*30*5, fixed(20,30,40));    // 30' @ 40m
}

//////////////////////////////////////////////////////////////////////////////
/// \brief Gas consumption during an ascent at 10m/min.
static float ascent(int rmv, int oldDepth, int newDepth)
{
    return rmv
         * abs(oldDepth-newDepth)*0.1f          // Ascent time
         * (1 + 0.05f*(oldDepth + newDepth));   // Avg pressure.
}

TEST(gas_volume, ascent)
{
    EXPECT_EQ(0,          ascent(20, 30, 30));  // 30m -> 30m : no time, no conso
    EXPECT_EQ(20*4*(1+2), ascent(20, 40,  0));  // 40m ->  0m : 4min, avg 20m
    EXPECT_EQ(20*4*(1+2), ascent(20,  0, 40));  // 0m  -> 40m : 4min, avg 20m
}

//////////////////////////////////////////////////////////////////////////////

TEST(gas_volume, 30min40m_no_stops)
{
    setup_dive(30, 40);     // 30' @ 40m
    for(int s=0; s<32; ++s)
        char_O_deco_time[s] = 0;

    ASSERT_NO_THROW( deco_gas_volumes() );
    EXPECT_EQ(fixed(20,30,40) + ascent(20,40,0),
              int_O_gas_volumes[0]);
    EXPECT_EQ(0,  int_O_gas_volumes[1]);
    EXPECT_EQ(0,  int_O_gas_volumes[2]);
    EXPECT_EQ(0,  int_O_gas_volumes[3]);
    EXPECT_EQ(0,  int_O_gas_volumes[4]);
}

//////////////////////////////////////////////////////////////////////////////

TEST(gas_volume, 30min40m_1min_1min_3min_12min)
{
    setup_dive(30, 40);     // 30' @ 40m

    ASSERT_NO_THROW( deco_gas_volumes() );
    EXPECT_NEAR(fixed(20,30,40) + ascent(20,40,12)
              + fixed(20, 1,12) + ascent(20,12,9),
              int_O_gas_volumes[0], 1);
    EXPECT_EQ(0, int_O_gas_volumes[1]);
    EXPECT_NEAR(fixed(20, 1,9) + ascent(20,9,6)
              + fixed(20, 3,6) + ascent(20,6,3)
              + fixed(20,12,3) + ascent(20,3,0),
              int_O_gas_volumes[2], 1);
    EXPECT_EQ(0, int_O_gas_volumes[3]);
    EXPECT_EQ(0, int_O_gas_volumes[4]);
}