Skip to content

Commit

Permalink
add Hexa maps support in Checker (and unit tests)
Browse files Browse the repository at this point in the history
issue #33
  • Loading branch information
Valentin Noel committed Nov 26, 2013
1 parent 80de4f1 commit 3dfe678
Show file tree
Hide file tree
Showing 2 changed files with 154 additions and 2 deletions.
13 changes: 11 additions & 2 deletions libraries/ElementChecker/src/ElementChecker/Checker/Checker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,15 @@ void Checker::check( const ShPtrElement element )
if( value == orig || value == lowCase || value == upCase )
status = eStatusValid;

element->_mapValue = Map< std::string >( element->_map ).getLabel( orig );
if( element->_mapValue.empty() )
element->_mapValue = Map< std::string >( element->_map ).getLabel( lowCase );
if( element->_mapValue.empty() )
element->_mapValue = Map< std::string >( element->_map ).getLabel( upCase );

if( ! element->_mapValue.empty() && status == eStatusInvalid )
status = eStatusPassOver;

if( status == eStatusInvalid )
element->_error += "Invalid value - ";
break;
Expand Down Expand Up @@ -179,13 +188,13 @@ void Checker::check( const ShPtrElement element )

size_t Checker::getSize( const ShPtrElement element )
{
if( element->_type == eTypeHexa )
element->_size = element->_size >> 1;
if( ! element->_countExpr.empty() && element->_size == 0 )
{
element->_size = _exprParser->getExpressionResult< size_t >( element->_countExpr );
//LOG_TRACE( "COUNT: " << element->_id << "'s size: " << element->_size );
}
if( element->_type == eTypeHexa )
return element->_size >> 1;
return element->_size;
}

Expand Down
143 changes: 143 additions & 0 deletions libraries/ElementChecker/test/checkerTestMap.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -144,4 +144,147 @@ BOOST_AUTO_TEST_CASE( element_checker_test_checker_map )
}
}

BOOST_AUTO_TEST_CASE( element_checker_test_checker_map_hexa )
{
std::string jsonString = R"*(
{
"header": [
{ "id": "value1", "label": "Value1", "type": "ascii", "values": "WAVE1" },
{ "id": "value2", "label": "Value2", "type": "hexa", "count": "2", "map": [
{ "0123": "First Label" },
{ "89ab": "Second Label" },
{ "cdef": "Third Label" }
] },
{ "id": "value3", "label": "Value3", "type": "ascii", "values": "WAVE3" }
]
}
)*";

const char buff1[5] { 'W', 'A', 'V', 'E', '1' };
const char buff3[5] { 'W', 'A', 'V', 'E', '3' };

spec_reader::Specification spec;
spec.setFromString( jsonString );
std::shared_ptr< spec_reader::SpecNode > node = spec.getFirstNode();
BOOST_CHECK_EQUAL( node->getId(), "value1" );
BOOST_CHECK_EQUAL( node->next()->getId(), "value2" );
BOOST_CHECK_EQUAL( node->next()->next()->getId(), "value3" );
BOOST_CHECK( node->next()->next()->next() == nullptr );

Checker checker;

LOG_INFO( "\n>>> element_checker_test_checker_map_hexa 1 <<<" );
{
const char buff2[2] { 0x01, 0x23 };

std::shared_ptr< basic_element::Element > elem1( new basic_element::Element( node ) );
BOOST_CHECK_EQUAL( elem1->_id, node->getId() );
BOOST_CHECK( elem1->_map.empty() );
elem1->set( (const char*)&buff1, checker.getSize( elem1 ) );
checker.check( elem1 );
BOOST_CHECK_EQUAL( elem1->_status, eStatusValid );

std::shared_ptr< basic_element::Element > elem2( new basic_element::Element( elem1->next(), elem1 ) );
BOOST_CHECK_EQUAL( elem2->_id, node->next()->getId() );
BOOST_CHECK( ! elem2->_map.empty() );
elem2->set( (const char*)&buff2, checker.getSize( elem2 ) );
checker.check( elem2 );
BOOST_CHECK_EQUAL( elem2->_status, eStatusPassOver );
BOOST_CHECK_EQUAL( elem2->_mapValue, "First Label" );

std::shared_ptr< basic_element::Element > elem3( new basic_element::Element( elem2->next(), elem2 ) );
BOOST_CHECK_EQUAL( elem3->_id, node->next()->next()->getId() );
BOOST_CHECK( elem3->_map.empty() );
elem3->set( (const char*)&buff3, checker.getSize( elem3 ) );
checker.check( elem3 );
BOOST_CHECK_EQUAL( elem3->_status, eStatusValid );

BOOST_CHECK( elem3->next() == nullptr );
}
LOG_INFO( "\n>>> element_checker_test_checker_map_hexa 2 <<<" );
{
const char buff2[2] { 0x89, 0xAB };

std::shared_ptr< basic_element::Element > elem1( new basic_element::Element( node ) );
BOOST_CHECK_EQUAL( elem1->_id, node->getId() );
BOOST_CHECK( elem1->_map.empty() );
elem1->set( (const char*)&buff1, checker.getSize( elem1 ) );
checker.check( elem1 );
BOOST_CHECK_EQUAL( elem1->_status, eStatusValid );

std::shared_ptr< basic_element::Element > elem2( new basic_element::Element( elem1->next(), elem1 ) );
BOOST_CHECK_EQUAL( elem2->_id, node->next()->getId() );
BOOST_CHECK( ! elem2->_map.empty() );
elem2->set( (const char*)&buff2, checker.getSize( elem2 ) );
checker.check( elem2 );
BOOST_CHECK_EQUAL( elem2->_status, eStatusPassOver );
BOOST_CHECK_EQUAL( elem2->_mapValue, "Second Label" );

std::shared_ptr< basic_element::Element > elem3( new basic_element::Element( elem2->next(), elem2 ) );
BOOST_CHECK_EQUAL( elem3->_id, node->next()->next()->getId() );
BOOST_CHECK( elem3->_map.empty() );
elem3->set( (const char*)&buff3, checker.getSize( elem3 ) );
checker.check( elem3 );
BOOST_CHECK_EQUAL( elem3->_status, eStatusValid );

BOOST_CHECK( elem3->next() == nullptr );
}
LOG_INFO( "\n>>> element_checker_test_checker_map_hexa 3 <<<" );
{
const char buff2[2] { 0xcd, 0xEF };

std::shared_ptr< basic_element::Element > elem1( new basic_element::Element( node ) );
BOOST_CHECK_EQUAL( elem1->_id, node->getId() );
BOOST_CHECK( elem1->_map.empty() );
elem1->set( (const char*)&buff1, checker.getSize( elem1 ) );
checker.check( elem1 );
BOOST_CHECK_EQUAL( elem1->_status, eStatusValid );

std::shared_ptr< basic_element::Element > elem2( new basic_element::Element( elem1->next(), elem1 ) );
BOOST_CHECK_EQUAL( elem2->_id, node->next()->getId() );
BOOST_CHECK( ! elem2->_map.empty() );
elem2->set( (const char*)&buff2, checker.getSize( elem2 ) );
checker.check( elem2 );
BOOST_CHECK_EQUAL( elem2->_status, eStatusPassOver );
BOOST_CHECK_EQUAL( elem2->_mapValue, "Third Label" );

std::shared_ptr< basic_element::Element > elem3( new basic_element::Element( elem2->next(), elem2 ) );
BOOST_CHECK_EQUAL( elem3->_id, node->next()->next()->getId() );
BOOST_CHECK( elem3->_map.empty() );
elem3->set( (const char*)&buff3, checker.getSize( elem3 ) );
checker.check( elem3 );
BOOST_CHECK_EQUAL( elem3->_status, eStatusValid );

BOOST_CHECK( elem3->next() == nullptr );
}
LOG_INFO( "\n>>> element_checker_test_checker_map_hexa invalid <<<" );
{
const char buff2[2] { 0x00, 0x00 };

std::shared_ptr< basic_element::Element > elem1( new basic_element::Element( node ) );
BOOST_CHECK_EQUAL( elem1->_id, node->getId() );
BOOST_CHECK( elem1->_map.empty() );
elem1->set( (const char*)&buff1, checker.getSize( elem1 ) );
checker.check( elem1 );
BOOST_CHECK_EQUAL( elem1->_status, eStatusValid );

std::shared_ptr< basic_element::Element > elem2( new basic_element::Element( elem1->next(), elem1 ) );
BOOST_CHECK_EQUAL( elem2->_id, node->next()->getId() );
BOOST_CHECK( ! elem2->_map.empty() );
elem2->set( (const char*)&buff2, checker.getSize( elem2 ) );
checker.check( elem2 );
BOOST_CHECK_EQUAL( elem2->_status, eStatusInvalid );
BOOST_CHECK( elem2->_mapValue.empty() );

std::shared_ptr< basic_element::Element > elem3( new basic_element::Element( elem2->next(), elem2 ) );
BOOST_CHECK_EQUAL( elem3->_id, node->next()->next()->getId() );
BOOST_CHECK( elem3->_map.empty() );
elem3->set( (const char*)&buff3, checker.getSize( elem3 ) );
checker.check( elem3 );
BOOST_CHECK_EQUAL( elem3->_status, eStatusValid );

BOOST_CHECK( elem3->next() == nullptr );
}
}

BOOST_AUTO_TEST_SUITE_END()

0 comments on commit 3dfe678

Please sign in to comment.