--- /dev/null
+#include <iostream>
+
+#include <tut/tut.hpp>
+
+#include "admin_conf.h"
+
+namespace tut
+{
+ struct priv_data {
+ enum {
+ MIX2 = 0x06C6, // 2103210
+ ONES = 0x1555,
+ MIX3 = 0x1B1B, // 3210321
+ TWOS = 0x2AAA,
+ MIX1 = 0x24E4, // 0123012
+ THREES = 0x3FFF
+ };
+ };
+
+ typedef test_group<priv_data> tg;
+ tg priv_test_group("PRIV tests group");
+
+ typedef tg::object testobject;
+
+ template<>
+ template<>
+ void testobject::test<1>()
+ {
+ set_test_name("Check default constructor");
+
+ PRIV zero;
+
+ ensure("zero.userStat == 0", zero.userStat == 0);
+ ensure("zero.userConf == 0", zero.userConf == 0);
+ ensure("zero.userCash == 0", zero.userCash == 0);
+ ensure("zero.userPasswd == 0", zero.userPasswd == 0);
+ ensure("zero.userAddDel == 0", zero.userAddDel == 0);
+ ensure("zero.adminChg == 0", zero.adminChg == 0);
+ ensure("zero.tariffChg == 0", zero.tariffChg == 0);
+
+ ensure("zero.ToInt() == 0", zero.ToInt() == 0);
+ }
+
+ template<>
+ template<>
+ void testobject::test<2>()
+ {
+ set_test_name("Check uint16_t conversions");
+
+ for (uint16_t i = 0; i < 4; ++i) {
+
+ // 'i' is extra trash in high bits
+
+ PRIV priv1(ONES | (i << 0x0E)); // All 1
+
+ ensure_equals("priv1.userStat == 1", priv1.userStat, 1);
+ ensure_equals("priv1.userConf == 1", priv1.userConf, 1);
+ ensure_equals("priv1.userCash == 1", priv1.userCash, 1);
+ ensure_equals("priv1.userPasswd == 1", priv1.userPasswd, 1);
+ ensure_equals("priv1.userAddDel == 1", priv1.userAddDel, 1);
+ ensure_equals("priv1.adminChg == 1", priv1.adminChg, 1);
+ ensure_equals("priv1.tariffChg == 1", priv1.tariffChg, 1);
+
+ ensure_equals("priv1.ToInt() == 0x1555", priv1.ToInt(), static_cast<uint16_t>(ONES));
+
+ PRIV priv2(TWOS | (i << 0x0E)); // All 2
+
+ ensure_equals("priv2.userStat == 2", priv2.userStat, 2);
+ ensure_equals("priv2.userConf == 2", priv2.userConf, 2);
+ ensure_equals("priv2.userCash == 2", priv2.userCash, 2);
+ ensure_equals("priv2.userPasswd == 2", priv2.userPasswd, 2);
+ ensure_equals("priv2.userAddDel == 2", priv2.userAddDel, 2);
+ ensure_equals("priv2.adminChg == 2", priv2.adminChg, 2);
+ ensure_equals("priv2.tariffChg == 2", priv2.tariffChg, 2);
+
+ ensure_equals("priv2.ToInt() = 0x2AAA", priv2.ToInt(), static_cast<uint16_t>(TWOS));
+
+ PRIV priv3(THREES | (i << 0x0E)); // All 3
+
+ ensure_equals("priv3.userStat == 3", priv3.userStat, 3);
+ ensure_equals("priv3.userConf == 3", priv3.userConf, 3);
+ ensure_equals("priv3.userCash == 3", priv3.userCash, 3);
+ ensure_equals("priv3.userPasswd == 3", priv3.userPasswd, 3);
+ ensure_equals("priv3.userAddDel == 3", priv3.userAddDel, 3);
+ ensure_equals("priv3.adminChg == 3", priv3.adminChg, 3);
+ ensure_equals("priv3.tariffChg == 3", priv3.tariffChg, 3);
+
+ ensure_equals("priv2.ToInt() = 0x3FFF", priv3.ToInt(), static_cast<uint16_t>(THREES));
+
+ PRIV pm1(MIX1 | (i << 0x0E)); // 0123012
+
+ ensure_equals("pm1.userStat == 0", pm1.userStat, 0);
+ ensure_equals("pm1.userConf == 1", pm1.userConf, 1);
+ ensure_equals("pm1.userCash == 2", pm1.userCash, 2);
+ ensure_equals("pm1.userPasswd == 3", pm1.userPasswd, 3);
+ ensure_equals("pm1.userAddDel == 0", pm1.userAddDel, 0);
+ ensure_equals("pm1.adminChg == 1", pm1.adminChg, 1);
+ ensure_equals("pm1.tariffChg == 2", pm1.tariffChg, 2);
+
+ ensure_equals("pm1.ToInt() = 0x24E4", pm1.ToInt(), static_cast<uint16_t>(MIX1));
+
+ PRIV pm2(MIX2 | (i << 0x0E)); // 0123012
+
+ ensure_equals("pm2.userStat == 2", pm2.userStat, 2);
+ ensure_equals("pm2.userConf == 1", pm2.userConf, 1);
+ ensure_equals("pm2.userCash == 0", pm2.userCash, 0);
+ ensure_equals("pm2.userPasswd == 3", pm2.userPasswd, 3);
+ ensure_equals("pm2.userAddDel == 2", pm2.userAddDel, 2);
+ ensure_equals("pm2.adminChg == 1", pm2.adminChg, 1);
+ ensure_equals("pm2.tariffChg == 0", pm2.tariffChg, 0);
+
+ ensure_equals("pm2.ToInt() = 0x06C6", pm2.ToInt(), static_cast<uint16_t>(MIX2));
+
+ PRIV pm3(MIX3 | (i << 0x0E)); // 3210321
+
+ ensure_equals("pm3.userStat == 3", pm3.userStat, 3);
+ ensure_equals("pm3.userConf == 2", pm3.userConf, 2);
+ ensure_equals("pm3.userCash == 1", pm3.userCash, 1);
+ ensure_equals("pm3.userPasswd == 0", pm3.userPasswd, 0);
+ ensure_equals("pm3.userAddDel == 3", pm3.userAddDel, 3);
+ ensure_equals("pm3.adminChg == 2", pm3.adminChg, 2);
+ ensure_equals("pm3.tariffChg == 1", pm3.tariffChg, 1);
+
+ ensure_equals("pm3.ToInt() = 0x1B1B", pm3.ToInt(), static_cast<uint16_t>(MIX3));
+
+ }
+
+ }
+
+ template<>
+ template<>
+ void testobject::test<3>()
+ {
+ set_test_name("Check explicit uint16_t conversions");
+
+ for (uint16_t i = 0; i < 4; ++i) {
+
+ // 'i' is extra trash in high bits
+
+ PRIV priv1;
+ priv1.FromInt(ONES | (i << 0x0E)); // All 1
+
+ ensure_equals("priv1.userStat == 1", priv1.userStat, 1);
+ ensure_equals("priv1.userConf == 1", priv1.userConf, 1);
+ ensure_equals("priv1.userCash == 1", priv1.userCash, 1);
+ ensure_equals("priv1.userPasswd == 1", priv1.userPasswd, 1);
+ ensure_equals("priv1.userAddDel == 1", priv1.userAddDel, 1);
+ ensure_equals("priv1.adminChg == 1", priv1.adminChg, 1);
+ ensure_equals("priv1.tariffChg == 1", priv1.tariffChg, 1);
+
+ ensure_equals("priv1.ToInt() == 0x1555", priv1.ToInt(), static_cast<uint16_t>(ONES));
+
+ PRIV priv2;
+ priv2.FromInt(TWOS | (i << 0x0E)); // All 2
+
+ ensure_equals("priv2.userStat == 2", priv2.userStat, 2);
+ ensure_equals("priv2.userConf == 2", priv2.userConf, 2);
+ ensure_equals("priv2.userCash == 2", priv2.userCash, 2);
+ ensure_equals("priv2.userPasswd == 2", priv2.userPasswd, 2);
+ ensure_equals("priv2.userAddDel == 2", priv2.userAddDel, 2);
+ ensure_equals("priv2.adminChg == 2", priv2.adminChg, 2);
+ ensure_equals("priv2.tariffChg == 2", priv2.tariffChg, 2);
+
+ ensure_equals("priv2.ToInt() = 0x2AAA", priv2.ToInt(), static_cast<uint16_t>(TWOS));
+
+ PRIV priv3;
+ priv3.FromInt(THREES | (i << 0x0E)); // All 3
+
+ ensure_equals("priv3.userStat == 3", priv3.userStat, 3);
+ ensure_equals("priv3.userConf == 3", priv3.userConf, 3);
+ ensure_equals("priv3.userCash == 3", priv3.userCash, 3);
+ ensure_equals("priv3.userPasswd == 3", priv3.userPasswd, 3);
+ ensure_equals("priv3.userAddDel == 3", priv3.userAddDel, 3);
+ ensure_equals("priv3.adminChg == 3", priv3.adminChg, 3);
+ ensure_equals("priv3.tariffChg == 3", priv3.tariffChg, 3);
+
+ ensure_equals("priv2.ToInt() = 0x3FFF", priv3.ToInt(), static_cast<uint16_t>(THREES));
+
+ PRIV pm1;
+ pm1.FromInt(MIX1 | (i << 0x0E)); // 0123012
+
+ ensure_equals("pm1.userStat == 0", pm1.userStat, 0);
+ ensure_equals("pm1.userConf == 1", pm1.userConf, 1);
+ ensure_equals("pm1.userCash == 2", pm1.userCash, 2);
+ ensure_equals("pm1.userPasswd == 3", pm1.userPasswd, 3);
+ ensure_equals("pm1.userAddDel == 0", pm1.userAddDel, 0);
+ ensure_equals("pm1.adminChg == 1", pm1.adminChg, 1);
+ ensure_equals("pm1.tariffChg == 2", pm1.tariffChg, 2);
+
+ ensure_equals("pm1.ToInt() = 0x24E4", pm1.ToInt(), static_cast<uint16_t>(MIX1));
+
+ PRIV pm2;
+ pm2.FromInt(MIX2 | (i << 0x0E)); // 0123012
+
+ ensure_equals("pm2.userStat == 2", pm2.userStat, 2);
+ ensure_equals("pm2.userConf == 1", pm2.userConf, 1);
+ ensure_equals("pm2.userCash == 0", pm2.userCash, 0);
+ ensure_equals("pm2.userPasswd == 3", pm2.userPasswd, 3);
+ ensure_equals("pm2.userAddDel == 2", pm2.userAddDel, 2);
+ ensure_equals("pm2.adminChg == 1", pm2.adminChg, 1);
+ ensure_equals("pm2.tariffChg == 0", pm2.tariffChg, 0);
+
+ ensure_equals("pm2.ToInt() = 0x06C6", pm2.ToInt(), static_cast<uint16_t>(MIX2));
+
+ PRIV pm3;
+ pm3.FromInt(MIX3 | (i << 0x0E)); // 3210321
+
+ ensure_equals("pm3.userStat == 3", pm3.userStat, 3);
+ ensure_equals("pm3.userConf == 2", pm3.userConf, 2);
+ ensure_equals("pm3.userCash == 1", pm3.userCash, 1);
+ ensure_equals("pm3.userPasswd == 0", pm3.userPasswd, 0);
+ ensure_equals("pm3.userAddDel == 3", pm3.userAddDel, 3);
+ ensure_equals("pm3.adminChg == 2", pm3.adminChg, 2);
+ ensure_equals("pm3.tariffChg == 1", pm3.tariffChg, 1);
+
+ ensure_equals("pm3.ToInt() = 0x1B1B", pm3.ToInt(), static_cast<uint16_t>(MIX3));
+
+ }
+
+ }
+
+}
--- /dev/null
+#include <tut/tut.hpp>
+
+#include "tariff_conf.h"
+#include "tariff.h"
+
+namespace tut
+{
+ struct tariff_data {
+ };
+
+ typedef test_group<tariff_data> tg;
+ tg tariff_test_group("TARIFF tests group");
+
+ typedef tg::object testobject;
+
+ template<>
+ template<>
+ void testobject::test<1>()
+ {
+ set_test_name("Check construction");
+
+ TARIFF_DATA td("test");
+ td.tariffConf.fee = 1;
+ td.tariffConf.free = 2;
+ td.tariffConf.traffType = TRAFF_UP_DOWN;
+ td.tariffConf.passiveCost = 4;
+ td.dirPrice[0].mDay = 30;
+ td.dirPrice[0].hDay = 9;
+ td.dirPrice[0].mNight = 30;
+ td.dirPrice[0].hNight = 21;
+ td.dirPrice[0].priceDayA = 0;
+ td.dirPrice[0].priceDayB = 1;
+ td.dirPrice[0].priceNightA = 2;
+ td.dirPrice[0].priceNightB = 3;
+ td.dirPrice[0].threshold = 4;
+ td.dirPrice[0].singlePrice = 0;
+ td.dirPrice[0].noDiscount = 0;
+ TARIFF tariff(td);
+
+ ensure("freeMb = 2", tariff.GetFreeMb() == td.tariffConf.free);
+ ensure("passiveCost = 4", tariff.GetPassiveCost() == td.tariffConf.passiveCost);
+ ensure("fee = 1", tariff.GetFee() == td.tariffConf.fee);
+ ensure("free (alias of freeMb) = 2", tariff.GetFree() == td.tariffConf.free);
+ ensure("name = \"test\"'", tariff.GetName() == td.tariffConf.name);
+ ensure("traffType = TRAFF_UP_DOWN", tariff.GetTraffType() == td.tariffConf.traffType);
+ ensure("threshold[0] = 4", tariff.GetThreshold(0) == td.dirPrice[0].threshold);
+ ensure_equals("traffByType(6, 0) = 6", tariff.GetTraffByType(6, 0), 6);
+ ensure_equals("traffByType(5, 1) = 6", tariff.GetTraffByType(5, 1), 6);
+ ensure_equals("traffByType(4, 2) = 6", tariff.GetTraffByType(4, 2), 6);
+ ensure_equals("traffByType(3, 3) = 6", tariff.GetTraffByType(3, 3), 6);
+ ensure_equals("traffByType(2, 4) = 6", tariff.GetTraffByType(2, 4), 6);
+ ensure_equals("traffByType(1, 5) = 6", tariff.GetTraffByType(1, 5), 6);
+ ensure_equals("traffByType(0, 6) = 6", tariff.GetTraffByType(0, 6), 6);
+ }
+
+ template<>
+ template<>
+ void testobject::test<2>()
+ {
+ set_test_name("Check traff types");
+
+ TARIFF_DATA td("test");
+ td.tariffConf.fee = 1;
+ td.tariffConf.free = 2;
+ td.tariffConf.traffType = TRAFF_UP;
+ td.tariffConf.passiveCost = 4;
+ td.dirPrice[0].mDay = 30;
+ td.dirPrice[0].hDay = 9;
+ td.dirPrice[0].mNight = 30;
+ td.dirPrice[0].hNight = 21;
+ td.dirPrice[0].priceDayA = 0;
+ td.dirPrice[0].priceDayB = 1;
+ td.dirPrice[0].priceNightA = 2;
+ td.dirPrice[0].priceNightB = 3;
+ td.dirPrice[0].threshold = 4;
+ td.dirPrice[0].singlePrice = 0;
+ td.dirPrice[0].noDiscount = 0;
+ TARIFF tariff(td);
+
+ ensure("traffType = TRAFF_UP", tariff.GetTraffType() == TRAFF_UP);
+ ensure_equals("traffByType(6, 0) = 6 for UP", tariff.GetTraffByType(6, 0), 6);
+ ensure_equals("traffByType(5, 1) = 5 for UP", tariff.GetTraffByType(5, 1), 5);
+ ensure_equals("traffByType(4, 2) = 4 for UP", tariff.GetTraffByType(4, 2), 4);
+ ensure_equals("traffByType(3, 3) = 3 for UP", tariff.GetTraffByType(3, 3), 3);
+ ensure_equals("traffByType(2, 4) = 2 for UP", tariff.GetTraffByType(2, 4), 2);
+ ensure_equals("traffByType(1, 5) = 1 for UP", tariff.GetTraffByType(1, 5), 1);
+ ensure_equals("traffByType(0, 6) = 0 for UP", tariff.GetTraffByType(0, 6), 0);
+
+ td.tariffConf.traffType = TRAFF_DOWN;
+ tariff = td;
+
+ ensure("traffType = TRAFF_DOWN", tariff.GetTraffType() == TRAFF_DOWN);
+ ensure_equals("traffByType(6, 0) = 0 for DOWN", tariff.GetTraffByType(6, 0), 0);
+ ensure_equals("traffByType(5, 1) = 1 for DOWN", tariff.GetTraffByType(5, 1), 1);
+ ensure_equals("traffByType(4, 2) = 2 for DOWN", tariff.GetTraffByType(4, 2), 2);
+ ensure_equals("traffByType(3, 3) = 3 for DOWN", tariff.GetTraffByType(3, 3), 3);
+ ensure_equals("traffByType(2, 4) = 4 for DOWN", tariff.GetTraffByType(2, 4), 4);
+ ensure_equals("traffByType(1, 5) = 5 for DOWN", tariff.GetTraffByType(1, 5), 5);
+ ensure_equals("traffByType(0, 6) = 6 for DOWN", tariff.GetTraffByType(0, 6), 6);
+
+ td.tariffConf.traffType = TRAFF_MAX;
+ tariff = td;
+
+ ensure("traffType = TRAFF_MAX", tariff.GetTraffType() == TRAFF_MAX);
+ ensure_equals("traffByType(6, 0) = 6 for MAX", tariff.GetTraffByType(6, 0), 6);
+ ensure_equals("traffByType(5, 1) = 5 for MAX", tariff.GetTraffByType(5, 1), 5);
+ ensure_equals("traffByType(4, 2) = 4 for MAX", tariff.GetTraffByType(4, 2), 4);
+ ensure_equals("traffByType(3, 3) = 3 for MAX", tariff.GetTraffByType(3, 3), 3);
+ ensure_equals("traffByType(2, 4) = 4 for MAX", tariff.GetTraffByType(2, 4), 4);
+ ensure_equals("traffByType(1, 5) = 5 for MAX", tariff.GetTraffByType(1, 5), 5);
+ ensure_equals("traffByType(0, 6) = 6 for MAX", tariff.GetTraffByType(0, 6), 6);
+
+ td.tariffConf.traffType = TRAFF_UP_DOWN;
+ tariff = td;
+
+ ensure("traffType = TRAFF_UP_DOWN", tariff.GetTraffType() == TRAFF_UP_DOWN);
+ ensure_equals("traffByType(6, 0) = 6 for UP_DOWN", tariff.GetTraffByType(6, 0), 6);
+ ensure_equals("traffByType(5, 1) = 6 for UP_DOWN", tariff.GetTraffByType(5, 1), 6);
+ ensure_equals("traffByType(4, 2) = 6 for UP_DOWN", tariff.GetTraffByType(4, 2), 6);
+ ensure_equals("traffByType(3, 3) = 6 for UP_DOWN", tariff.GetTraffByType(3, 3), 6);
+ ensure_equals("traffByType(2, 4) = 6 for UP_DOWN", tariff.GetTraffByType(2, 4), 6);
+ ensure_equals("traffByType(1, 5) = 6 for UP_DOWN", tariff.GetTraffByType(1, 5), 6);
+ ensure_equals("traffByType(0, 6) = 6 for UP_DOWN", tariff.GetTraffByType(0, 6), 6);
+ }
+
+ template<>
+ template<>
+ void testobject::test<3>()
+ {
+ set_test_name("Check normal interval prices");
+
+ TARIFF_DATA td("test");
+ td.tariffConf.fee = 1;
+ td.tariffConf.free = 2;
+ td.tariffConf.traffType = TRAFF_UP_DOWN;
+ td.tariffConf.passiveCost = 4;
+ td.dirPrice[0].mDay = 30;
+ td.dirPrice[0].hDay = 9;
+ td.dirPrice[0].mNight = 30;
+ td.dirPrice[0].hNight = 21;
+ td.dirPrice[0].priceDayA = 0;
+ td.dirPrice[0].priceDayB = 1;
+ td.dirPrice[0].priceNightA = 2;
+ td.dirPrice[0].priceNightB = 3;
+ td.dirPrice[0].threshold = 4;
+ td.dirPrice[0].singlePrice = 0;
+ td.dirPrice[0].noDiscount = 0;
+ TARIFF tariff(td);
+
+ ensure_equals("0000 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 0 < 4 DA
+ ensure_equals("0001 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 1); // Near 17:30, 6 > 4 DB
+ ensure_equals("0010 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 2); // Near 22:30, 0 < 4 NA
+ ensure_equals("0011 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286479245), 3); // Near 22:30, 6 > 4 NB
+
+ td.dirPrice[0].singlePrice = 1;
+ tariff = td;
+
+ ensure_equals("0100 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 0 < 4 DA
+ ensure_equals("0101 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 1); // Near 17:30, 6 > 4 DB
+ ensure_equals("0110 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 0 < 4 DA
+ ensure_equals("0111 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286479245), 1); // Near 22:30, 6 > 4 DB
+
+ td.dirPrice[0].singlePrice = 0;
+ td.dirPrice[0].noDiscount = 1;
+ tariff = td;
+
+ ensure_equals("1000 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 0 < 4 DA
+ ensure_equals("1001 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 6 > 4 DA
+ ensure_equals("1010 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 2); // Near 22:30, 0 < 4 NA
+ ensure_equals("1011 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286479245), 2); // Near 22:30, 6 > 4 NA
+
+ td.dirPrice[0].singlePrice = 1;
+ td.dirPrice[0].noDiscount = 1;
+ tariff = td;
+
+ ensure_equals("1100 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 0 < 4 DA
+ ensure_equals("1101 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 6 > 4 DA
+ ensure_equals("1110 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 0 < 4 DA
+ ensure_equals("1111 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 6 > 4 DA
+ }
+
+ template<>
+ template<>
+ void testobject::test<4>()
+ {
+ set_test_name("Check construction for day-night inversion");
+
+ TARIFF_DATA td("test");
+ td.tariffConf.fee = 1;
+ td.tariffConf.free = 2;
+ td.tariffConf.traffType = TRAFF_UP_DOWN;
+ td.tariffConf.passiveCost = 4;
+ td.dirPrice[0].mDay = 30;
+ td.dirPrice[0].hDay = 21;
+ td.dirPrice[0].mNight = 30;
+ td.dirPrice[0].hNight = 9;
+ td.dirPrice[0].priceDayA = 0;
+ td.dirPrice[0].priceDayB = 1;
+ td.dirPrice[0].priceNightA = 2;
+ td.dirPrice[0].priceNightB = 3;
+ td.dirPrice[0].threshold = 4;
+ td.dirPrice[0].singlePrice = 0;
+ td.dirPrice[0].noDiscount = 0;
+ TARIFF tariff(td);
+
+ ensure("freeMb = 2", tariff.GetFreeMb() == td.tariffConf.free);
+ ensure("passiveCost = 4", tariff.GetPassiveCost() == td.tariffConf.passiveCost);
+ ensure("fee = 1", tariff.GetFee() == td.tariffConf.fee);
+ ensure("free (alias of freeMb) = 2", tariff.GetFree() == td.tariffConf.free);
+ ensure("name = \"test\"'", tariff.GetName() == td.tariffConf.name);
+ ensure("traffType = TRAFF_UP_DOWN", tariff.GetTraffType() == td.tariffConf.traffType);
+ ensure("threshold[0] = 4", tariff.GetThreshold(0) == td.dirPrice[0].threshold);
+ ensure_equals("traffByType(6, 0) = 6", tariff.GetTraffByType(6, 0), 6);
+ ensure_equals("traffByType(5, 1) = 6", tariff.GetTraffByType(5, 1), 6);
+ ensure_equals("traffByType(4, 2) = 6", tariff.GetTraffByType(4, 2), 6);
+ ensure_equals("traffByType(3, 3) = 6", tariff.GetTraffByType(3, 3), 6);
+ ensure_equals("traffByType(2, 4) = 6", tariff.GetTraffByType(2, 4), 6);
+ ensure_equals("traffByType(1, 5) = 6", tariff.GetTraffByType(1, 5), 6);
+ ensure_equals("traffByType(0, 6) = 6", tariff.GetTraffByType(0, 6), 6);
+ }
+
+ template<>
+ template<>
+ void testobject::test<5>()
+ {
+ set_test_name("Check traff types for day-night inversion");
+
+ TARIFF_DATA td("test");
+ td.tariffConf.fee = 1;
+ td.tariffConf.free = 2;
+ td.tariffConf.traffType = TRAFF_UP;
+ td.tariffConf.passiveCost = 4;
+ td.dirPrice[0].mDay = 30;
+ td.dirPrice[0].hDay = 21;
+ td.dirPrice[0].mNight = 30;
+ td.dirPrice[0].hNight = 9;
+ td.dirPrice[0].priceDayA = 0;
+ td.dirPrice[0].priceDayB = 1;
+ td.dirPrice[0].priceNightA = 2;
+ td.dirPrice[0].priceNightB = 3;
+ td.dirPrice[0].threshold = 4;
+ td.dirPrice[0].singlePrice = 0;
+ td.dirPrice[0].noDiscount = 0;
+ TARIFF tariff(td);
+
+ ensure("traffType = TRAFF_UP", tariff.GetTraffType() == TRAFF_UP);
+ ensure_equals("traffByType(6, 0) = 6 for UP", tariff.GetTraffByType(6, 0), 6);
+ ensure_equals("traffByType(5, 1) = 5 for UP", tariff.GetTraffByType(5, 1), 5);
+ ensure_equals("traffByType(4, 2) = 4 for UP", tariff.GetTraffByType(4, 2), 4);
+ ensure_equals("traffByType(3, 3) = 3 for UP", tariff.GetTraffByType(3, 3), 3);
+ ensure_equals("traffByType(2, 4) = 2 for UP", tariff.GetTraffByType(2, 4), 2);
+ ensure_equals("traffByType(1, 5) = 1 for UP", tariff.GetTraffByType(1, 5), 1);
+ ensure_equals("traffByType(0, 6) = 0 for UP", tariff.GetTraffByType(0, 6), 0);
+
+ td.tariffConf.traffType = TRAFF_DOWN;
+ tariff = td;
+
+ ensure("traffType = TRAFF_DOWN", tariff.GetTraffType() == TRAFF_DOWN);
+ ensure_equals("traffByType(6, 0) = 0 for DOWN", tariff.GetTraffByType(6, 0), 0);
+ ensure_equals("traffByType(5, 1) = 1 for DOWN", tariff.GetTraffByType(5, 1), 1);
+ ensure_equals("traffByType(4, 2) = 2 for DOWN", tariff.GetTraffByType(4, 2), 2);
+ ensure_equals("traffByType(3, 3) = 3 for DOWN", tariff.GetTraffByType(3, 3), 3);
+ ensure_equals("traffByType(2, 4) = 4 for DOWN", tariff.GetTraffByType(2, 4), 4);
+ ensure_equals("traffByType(1, 5) = 5 for DOWN", tariff.GetTraffByType(1, 5), 5);
+ ensure_equals("traffByType(0, 6) = 6 for DOWN", tariff.GetTraffByType(0, 6), 6);
+
+ td.tariffConf.traffType = TRAFF_MAX;
+ tariff = td;
+
+ ensure("traffType = TRAFF_MAX", tariff.GetTraffType() == TRAFF_MAX);
+ ensure_equals("traffByType(6, 0) = 6 for MAX", tariff.GetTraffByType(6, 0), 6);
+ ensure_equals("traffByType(5, 1) = 5 for MAX", tariff.GetTraffByType(5, 1), 5);
+ ensure_equals("traffByType(4, 2) = 4 for MAX", tariff.GetTraffByType(4, 2), 4);
+ ensure_equals("traffByType(3, 3) = 3 for MAX", tariff.GetTraffByType(3, 3), 3);
+ ensure_equals("traffByType(2, 4) = 4 for MAX", tariff.GetTraffByType(2, 4), 4);
+ ensure_equals("traffByType(1, 5) = 5 for MAX", tariff.GetTraffByType(1, 5), 5);
+ ensure_equals("traffByType(0, 6) = 6 for MAX", tariff.GetTraffByType(0, 6), 6);
+
+ td.tariffConf.traffType = TRAFF_UP_DOWN;
+ tariff = td;
+
+ ensure("traffType = TRAFF_UP_DOWN", tariff.GetTraffType() == TRAFF_UP_DOWN);
+ ensure_equals("traffByType(6, 0) = 6 for UP_DOWN", tariff.GetTraffByType(6, 0), 6);
+ ensure_equals("traffByType(5, 1) = 6 for UP_DOWN", tariff.GetTraffByType(5, 1), 6);
+ ensure_equals("traffByType(4, 2) = 6 for UP_DOWN", tariff.GetTraffByType(4, 2), 6);
+ ensure_equals("traffByType(3, 3) = 6 for UP_DOWN", tariff.GetTraffByType(3, 3), 6);
+ ensure_equals("traffByType(2, 4) = 6 for UP_DOWN", tariff.GetTraffByType(2, 4), 6);
+ ensure_equals("traffByType(1, 5) = 6 for UP_DOWN", tariff.GetTraffByType(1, 5), 6);
+ ensure_equals("traffByType(0, 6) = 6 for UP_DOWN", tariff.GetTraffByType(0, 6), 6);
+ }
+
+ template<>
+ template<>
+ void testobject::test<6>()
+ {
+ set_test_name("Check normal interval prices for day-night inversion");
+
+ TARIFF_DATA td("test");
+ td.tariffConf.fee = 1;
+ td.tariffConf.free = 2;
+ td.tariffConf.traffType = TRAFF_UP_DOWN;
+ td.tariffConf.passiveCost = 4;
+ td.dirPrice[0].mDay = 30;
+ td.dirPrice[0].hDay = 21;
+ td.dirPrice[0].mNight = 30;
+ td.dirPrice[0].hNight = 9;
+ td.dirPrice[0].priceDayA = 0;
+ td.dirPrice[0].priceDayB = 1;
+ td.dirPrice[0].priceNightA = 2;
+ td.dirPrice[0].priceNightB = 3;
+ td.dirPrice[0].threshold = 4;
+ td.dirPrice[0].singlePrice = 0;
+ td.dirPrice[0].noDiscount = 0;
+ TARIFF tariff(td);
+
+ ensure_equals("0000 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 2); // Near 17:30, 0 < 4 NA
+ ensure_equals("0001 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 3); // Near 17:30, 6 > 4 NB
+ ensure_equals("0010 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 0 < 4 DA
+ ensure_equals("0011 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286479245), 1); // Near 22:30, 6 > 4 DB
+
+ td.dirPrice[0].singlePrice = 1;
+ tariff = td;
+
+ ensure_equals("0100 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 0 < 4 DA (ignore night)
+ ensure_equals("0101 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 1); // Near 17:30, 6 > 4 DB (ignore night)
+ ensure_equals("0110 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 0 < 4 DA (ignore night)
+ ensure_equals("0111 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286479245), 1); // Near 22:30, 6 > 4 DB (ignore night)
+
+ td.dirPrice[0].singlePrice = 0;
+ td.dirPrice[0].noDiscount = 1;
+ tariff = td;
+
+ ensure_equals("1000 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 2); // Near 17:30, 0 < 4 NA
+ ensure_equals("1001 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 2); // Near 17:30, 6 > 4 NA
+ ensure_equals("1010 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 0 < 4 DA
+ ensure_equals("1011 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 6 > 4 DA
+
+ td.dirPrice[0].singlePrice = 1;
+ td.dirPrice[0].noDiscount = 1;
+ tariff = td;
+
+ ensure_equals("1100 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 0 < 4 DA (ignore night)
+ ensure_equals("1101 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 6 > 4 DA (ignore night)
+ ensure_equals("1110 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 0 < 4 DA (ignore night)
+ ensure_equals("1111 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 6 > 4 DA (ignore night)
+ }
+}