Commit 2a9b5be2 authored by Pavel Vainerman's avatar Pavel Vainerman

(tests): небольщой рефакторинг тестов, для лучшего понимая "отчётов"

parent 85906e18
#include <catch.hpp> #include <catch.hpp>
// -----------------------------------------------------------------------------
#include "Exceptions.h" #include "Exceptions.h"
#include "Extensions.h" #include "Extensions.h"
#include "DigitalFilter.h" #include "DigitalFilter.h"
// -----------------------------------------------------------------------------
using namespace std; using namespace std;
using namespace UniSetTypes; using namespace UniSetTypes;
using namespace UniSetExtensions; using namespace UniSetExtensions;
// -----------------------------------------------------------------------------
TEST_CASE("DigitalFilter","[DigitalFilter]") TEST_CASE("[DigitalFilter]: default","[DigitalFilter]")
{ {
SECTION("..") SECTION("..")
{ {
...@@ -37,59 +37,59 @@ TEST_CASE("DigitalFilter","[DigitalFilter]") ...@@ -37,59 +37,59 @@ TEST_CASE("DigitalFilter","[DigitalFilter]")
REQUIRE( df10.currentRC() == 50 ); REQUIRE( df10.currentRC() == 50 );
REQUIRE( df10.currentMedian() == 50 ); REQUIRE( df10.currentMedian() == 50 );
} }
}
SECTION("Median filter") // -----------------------------------------------------------------------------
{ TEST_CASE("[DigitalFilter]: median","[DigitalFilter][median]")
DigitalFilter df; {
for( int i=0; i<20; i++ ) DigitalFilter df;
df.median(50); for( int i=0; i<20; i++ )
df.median(50);
REQUIRE( df.currentMedian() == 50 );
REQUIRE( df.currentMedian() == 50 );
DigitalFilter df1;
DigitalFilter df10; DigitalFilter df1;
vector<long> dat={0,234,356,344,234,320,250,250,250,250,250,250,250,251,252,251,252,252,250}; DigitalFilter df10;
for( auto v: dat ) vector<long> dat={0,234,356,344,234,320,250,250,250,250,250,250,250,251,252,251,252,252,250};
{ for( auto v: dat )
df1.median(v); {
df10.median(v); df1.median(v);
} df10.median(v);
}
REQUIRE( df1.currentMedian() == 252 );
REQUIRE( df10.currentMedian() == 252 ); REQUIRE( df1.currentMedian() == 252 );
} REQUIRE( df10.currentMedian() == 252 );
}
SECTION("filter1") // -----------------------------------------------------------------------------
{ TEST_CASE("[DigitalFilter]: filter1","[DigitalFilter][filter1]")
DigitalFilter df1; {
DigitalFilter df10; DigitalFilter df1;
// "выброс" за СКО отсекается.. DigitalFilter df10;
vector<long> dat={10,12,10,-8,10,10,-230,10,10}; // "выброс" за СКО отсекается..
for( auto v: dat ) vector<long> dat={10,12,10,-8,10,10,-230,10,10};
{ for( auto v: dat )
df1.add(v); {
df10.add(v); df1.add(v);
} df10.add(v);
}
REQUIRE( df1.current1() == 10 );
REQUIRE( df10.current1() == 10 ); REQUIRE( df1.current1() == 10 );
} REQUIRE( df10.current1() == 10 );
}
SECTION("filterRC") // -----------------------------------------------------------------------------
{ TEST_CASE("[DigitalFilter]: filterRC","[DigitalFilter][filterRC]")
double Ti = 0.09; // постоянная времени фильтра {
DigitalFilter df1(5,Ti); double Ti = 0.09; // постоянная времени фильтра
DigitalFilter df10(10,Ti); DigitalFilter df1(5,Ti);
vector<long> dat={10,12,10,-8,10,10,-230,10,10,12,12,10,-8,-8,10,11,9,11,11,11,9,12,12,10,10,11,-4560,12,10,10,11,10,10,10,10}; DigitalFilter df10(10,Ti);
vector<long> dat={10,12,10,-8,10,10,-230,10,10,12,12,10,-8,-8,10,11,9,11,11,11,9,12,12,10,10,11,-4560,12,10,10,11,10,10,10,10};
for( auto v: dat )
{ for( auto v: dat )
df1.add(v); {
df10.add(v); df1.add(v);
msleep(30); df10.add(v);
} msleep(30);
}
REQUIRE( df1.currentRC() == 10 );
REQUIRE( df10.currentRC() == 10 ); REQUIRE( df1.currentRC() == 10 );
} REQUIRE( df10.currentRC() == 10 );
} }
#include <catch.hpp> #include <catch.hpp>
// -----------------------------------------------------------------------------
#include "DelayTimer.h" #include "DelayTimer.h"
#include "UniSetTypes.h" #include "UniSetTypes.h"
using namespace std; using namespace std;
// -----------------------------------------------------------------------------
TEST_CASE("DelayTimer", "[DelayTimer]" ) TEST_CASE("[DelayTimer]: default", "[DelayTimer]" )
{ {
SECTION( "Default constructor" ) SECTION( "Default constructor" )
{ {
...@@ -28,81 +28,6 @@ TEST_CASE("DelayTimer", "[DelayTimer]" ) ...@@ -28,81 +28,6 @@ TEST_CASE("DelayTimer", "[DelayTimer]" )
CHECK_FALSE( dt.check(false) ); CHECK_FALSE( dt.check(false) );
CHECK_FALSE( dt.check(true) ); CHECK_FALSE( dt.check(true) );
} }
SECTION( "Working" )
{
DelayTimer dt(100,60);
CHECK_FALSE( dt.get() );
CHECK_FALSE( dt.check(false) );
// проверяем срабатывание..
CHECK_FALSE( dt.check(true) );
msleep(50);
CHECK_FALSE( dt.check(true) );
msleep(60);
CHECK( dt.check(true) );
CHECK( dt.get() );
// проверяем отпускание
// несмотря на вызов check(false).. должно ещё 60 мсек возвращать true
CHECK( dt.check(false) );
CHECK( dt.get() );
msleep(20);
CHECK( dt.check(false) );
CHECK( dt.get() );
msleep(50); // в сумме уже 20+50=70 > 60, значит должно "отпустить"
CHECK_FALSE( dt.check(false) );
CHECK_FALSE( dt.get() );
dt.reset();
CHECK_FALSE( dt.check(true) );
msleep(50);
CHECK_FALSE( dt.check(true) );
dt.reset();
CHECK_FALSE( dt.check(true) );
msleep(60);
CHECK_FALSE( dt.check(true) );
msleep(60);
CHECK( dt.check(true) );
CHECK( dt.get() );
}
SECTION( "Debounce" )
{
DelayTimer dt(150,100);
CHECK_FALSE( dt.get() );
CHECK_FALSE( dt.check(false) );
// проверяем срабатывание.. (при скакании сигнала)
CHECK_FALSE( dt.check(true) );
msleep(50);
CHECK_FALSE( dt.check(false) );
msleep(60);
CHECK_FALSE( dt.check(true) );
CHECK_FALSE( dt.get() );
msleep(100);
CHECK_FALSE( dt.check(true) );
CHECK_FALSE( dt.get() );
msleep(60);
CHECK( dt.check(true) );
CHECK( dt.get() );
// проверяем отпускание при скакании сигнала
CHECK( dt.check(false) );
CHECK( dt.get() );
msleep(60);
CHECK( dt.check(true) );
CHECK( dt.get() );
dt.check(false);
msleep(80);
CHECK( dt.check(false) );
CHECK( dt.get() );
msleep(40);
CHECK_FALSE( dt.check(false) );
CHECK_FALSE( dt.get() );
}
SECTION( "Copy" ) SECTION( "Copy" )
{ {
DelayTimer dt1(100,50); DelayTimer dt1(100,50);
...@@ -130,3 +55,78 @@ TEST_CASE("DelayTimer", "[DelayTimer]" ) ...@@ -130,3 +55,78 @@ TEST_CASE("DelayTimer", "[DelayTimer]" )
REQUIRE( dt.getOffDelay() == 200 ); REQUIRE( dt.getOffDelay() == 200 );
} }
} }
// -----------------------------------------------------------------------------
TEST_CASE("[DelayTimer]: working", "[DelayTimer]" )
{
DelayTimer dt(100,60);
CHECK_FALSE( dt.get() );
CHECK_FALSE( dt.check(false) );
// проверяем срабатывание..
CHECK_FALSE( dt.check(true) );
msleep(50);
CHECK_FALSE( dt.check(true) );
msleep(60);
CHECK( dt.check(true) );
CHECK( dt.get() );
// проверяем отпускание
// несмотря на вызов check(false).. должно ещё 60 мсек возвращать true
CHECK( dt.check(false) );
CHECK( dt.get() );
msleep(20);
CHECK( dt.check(false) );
CHECK( dt.get() );
msleep(50); // в сумме уже 20+50=70 > 60, значит должно "отпустить"
CHECK_FALSE( dt.check(false) );
CHECK_FALSE( dt.get() );
dt.reset();
CHECK_FALSE( dt.check(true) );
msleep(50);
CHECK_FALSE( dt.check(true) );
dt.reset();
CHECK_FALSE( dt.check(true) );
msleep(60);
CHECK_FALSE( dt.check(true) );
msleep(60);
CHECK( dt.check(true) );
CHECK( dt.get() );
}
// -----------------------------------------------------------------------------
TEST_CASE("[DelayTimer]: debounce", "[DelayTimer]" )
{
DelayTimer dt(150,100);
CHECK_FALSE( dt.get() );
CHECK_FALSE( dt.check(false) );
// проверяем срабатывание.. (при скакании сигнала)
CHECK_FALSE( dt.check(true) );
msleep(50);
CHECK_FALSE( dt.check(false) );
msleep(60);
CHECK_FALSE( dt.check(true) );
CHECK_FALSE( dt.get() );
msleep(100);
CHECK_FALSE( dt.check(true) );
CHECK_FALSE( dt.get() );
msleep(60);
CHECK( dt.check(true) );
CHECK( dt.get() );
// проверяем отпускание при скакании сигнала
CHECK( dt.check(false) );
CHECK( dt.get() );
msleep(60);
CHECK( dt.check(true) );
CHECK( dt.get() );
dt.check(false);
msleep(80);
CHECK( dt.check(false) );
CHECK( dt.get() );
msleep(40);
CHECK_FALSE( dt.check(false) );
CHECK_FALSE( dt.get() );
}
// -----------------------------------------------------------------------------
#include <catch.hpp> #include <catch.hpp>
// -----------------------------------------------------------------------------
#include <iostream> #include <iostream>
// -----------------------------------------------------------------------------
using namespace std;
#include "Exceptions.h" #include "Exceptions.h"
#include "UniXML.h" #include "UniXML.h"
#include "UniSetTypes.h" #include "UniSetTypes.h"
// -----------------------------------------------------------------------------
using namespace std;
// -----------------------------------------------------------------------------
TEST_CASE("UniXML", "[unixml][basic]" ) TEST_CASE("UniXML", "[unixml][basic]" )
{ {
SECTION( "Default constructor" ) SECTION( "Default constructor" )
...@@ -44,73 +44,79 @@ TEST_CASE("UniXML", "[unixml][basic]" ) ...@@ -44,73 +44,79 @@ TEST_CASE("UniXML", "[unixml][basic]" )
// remove // remove
// copy // copy
// nextNode // nextNode
}
// -----------------------------------------------------------------------------
TEST_CASE("UniXML::iterator", "[unixml][iterator][basic]" )
{
UniXML uxml("tests_unixml.xml");
CHECK( uxml.isOpen() );
SECTION( "Iterator" ); xmlNode* cnode = uxml.findNode(uxml.getFirstNode(),"UniSet");
{ CHECK( cnode != NULL );
UniXML::iterator it(cnode);
CHECK( it.getCurrent() != 0 ); UniXML::iterator it(cnode);
it = uxml.begin(); CHECK( it.getCurrent() != 0 );
CHECK( it.find("UniSet") != 0 ); it = uxml.begin();
CHECK( it.find("UniSet") != 0 );
// поиск в глубину..
it = uxml.begin(); // поиск в глубину..
CHECK( it.find("TestProc") != 0 ); it = uxml.begin();
CHECK( it.find("TestProc") != 0 );
it = uxml.begin();
CHECK( it.getName() == "UNISETPLC" ); it = uxml.begin();
it.goChildren(); CHECK( it.getName() == "UNISETPLC" );
CHECK( it.getName() == "UserData" ); it.goChildren();
CHECK( it.getName() == "UserData" );
it += 4;
CHECK( it.getName() == "settings" ); it += 4;
CHECK( it.getName() == "settings" );
it -= 4;
CHECK( it.getName() == "UserData" ); it -= 4;
CHECK( it.getName() == "UserData" );
it = it + 4;
CHECK( it.getName() == "settings" ); it = it + 4;
CHECK( it.getName() == "settings" );
it = it - 4;
CHECK( it.getName() == "UserData" ); it = it - 4;
CHECK( it.getName() == "UserData" );
it++;
CHECK( it.getName() == "UniSet" ); it++;
CHECK( it.getName() == "UniSet" );
it--;
CHECK( it.getName() == "UserData" ); it--;
CHECK( it.getName() == "UserData" );
++it;
CHECK( it.getName() == "UniSet" ); ++it;
CHECK( it.getName() == "UniSet" );
--it;
CHECK( it.getName() == "UserData" ); --it;
CHECK( it.getName() == "UserData" );
it = uxml.begin();
CHECK( it.findName("TestNode","TestNode1") != 0 ); it = uxml.begin();
it = uxml.begin(); CHECK( it.findName("TestNode","TestNode1") != 0 );
CHECK( it.findName("TestNode","TestNode2") != 0 ); it = uxml.begin();
CHECK( it.findName("TestNode","TestNode2") != 0 );
it = uxml.begin();
it.goChildren(); it = uxml.begin();
CHECK( it.getName() == "UserData" ); it.goChildren();
it.goParent(); CHECK( it.getName() == "UserData" );
CHECK( it.getName() == "UNISETPLC" ); it.goParent();
CHECK( it.getName() == "UNISETPLC" );
it = uxml.begin();
it.goChildren(); it = uxml.begin();
it.goEnd(); it.goChildren();
CHECK( it.getName() == "EndSection" ); it.goEnd();
it.goBegin(); CHECK( it.getName() == "EndSection" );
CHECK( it.getName() == "UserData" ); it.goBegin();
CHECK( it.getName() == "UserData" );
it = uxml.begin();
CHECK( it.find("TestData") != 0 ); it = uxml.begin();
CHECK( it.find("TestData") != 0 );
CHECK( it.getProp("text") == "text" );
CHECK( it.getIntProp("x") == 10 ); CHECK( it.getProp("text") == "text" );
CHECK( it.getPIntProp("y",-20) == 100 ); CHECK( it.getIntProp("x") == 10 );
CHECK( it.getPIntProp("zero",20) == 0 ); CHECK( it.getPIntProp("y",-20) == 100 );
CHECK( it.getPIntProp("negative",20) == -10 ); CHECK( it.getPIntProp("zero",20) == 0 );
CHECK( it.getPIntProp("unknown",20) == 20 ); CHECK( it.getPIntProp("negative",20) == -10 );
} CHECK( it.getPIntProp("unknown",20) == 20 );
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment