From d523e9fce2b053f186ab3bebbe57a2c499c7c831 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Radovan=20=C4=8Cerven=C3=BD?= <radovan.cerveny@gmail.com>
Date: Thu, 18 Feb 2016 14:10:35 +0100
Subject: [PATCH] MeasurementResults can now be parsed from xml

---
 alib2measure/src/allocator/StealthTypes.cpp   |   4 +
 alib2measure/src/allocator/StealthTypes.hpp   |   3 +-
 .../src/measurements/MeasurementTypes.cpp     |  10 +
 .../src/measurements/MeasurementTypes.hpp     |   1 +
 .../measurements/MeasurementXmlFactory.cpp    | 352 +++++++++++++++---
 .../measurements/MeasurementXmlFactory.hpp    |  19 +-
 .../measurements/frames/MemoryDataFrame.hpp   |  13 +-
 .../src/measurements/frames/TimeDataFrame.hpp |   6 +-
 .../src/measurements/measurements.hpp         |   1 +
 .../measurements/MeasurementsTest.cpp         | 111 +++++-
 .../test-src/measurements/MeasurementsTest.h  |   3 +
 11 files changed, 434 insertions(+), 89 deletions(-)

diff --git a/alib2measure/src/allocator/StealthTypes.cpp b/alib2measure/src/allocator/StealthTypes.cpp
index 07d00967e3..66dfd0ac42 100644
--- a/alib2measure/src/allocator/StealthTypes.cpp
+++ b/alib2measure/src/allocator/StealthTypes.cpp
@@ -13,4 +13,8 @@ std::string to_string ( stealth_string & ss ) {
 	return ss.c_str ( );
 }
 
+stealth_string stealth_string_from_string ( const std::string & str ) {
+	return stealth_string ( str.c_str ( ) );
+}
+
 }
diff --git a/alib2measure/src/allocator/StealthTypes.hpp b/alib2measure/src/allocator/StealthTypes.hpp
index c389401fae..21061661c2 100644
--- a/alib2measure/src/allocator/StealthTypes.hpp
+++ b/alib2measure/src/allocator/StealthTypes.hpp
@@ -17,12 +17,13 @@ using stealth_string = std::basic_string < char, std::char_traits < char >, stea
 std::string to_string ( const stealth_string & );
 std::string to_string ( stealth_string & );
 
+stealth_string stealth_string_from_string ( const std::string & );
+
 template < typename T >
 using stealth_vector = std::vector < T, stealth_allocator < T > >;
 
 template < class Key, class T, class Compare = std::less < Key > >
 using stealth_map = std::map < Key, T, Compare, stealth_allocator < std::pair < const Key, T > > >;
-
 }
 
 #endif /* STEALTH_TYPES_HPP_ */
diff --git a/alib2measure/src/measurements/MeasurementTypes.cpp b/alib2measure/src/measurements/MeasurementTypes.cpp
index 47f29c9038..c352ced01e 100644
--- a/alib2measure/src/measurements/MeasurementTypes.cpp
+++ b/alib2measure/src/measurements/MeasurementTypes.cpp
@@ -29,6 +29,16 @@ std::string to_string ( Type t ) {
 	return "ERR";
 }
 
+Type measurement_type_from_string ( const std::string & ts ) {
+	if ( ts == "ROOT" ) return Type::ROOT;
+	if ( ts == "OVERALL" ) return Type::OVERALL;
+	if ( ts == "INIT" ) return Type::INIT;
+	if ( ts == "FINALIZE" ) return Type::FINALIZE;
+	if ( ts == "MAIN" ) return Type::MAIN;
+	if ( ts == "AUXILIARY" ) return Type::AUXILIARY;
+	return Type::ROOT;
+}
+
 std::ostream & operator <<( std::ostream & os, Type t ) {
 	os << to_string ( t );
 	return os;
diff --git a/alib2measure/src/measurements/MeasurementTypes.hpp b/alib2measure/src/measurements/MeasurementTypes.hpp
index 38e3ed64e2..ba3d870aa7 100644
--- a/alib2measure/src/measurements/MeasurementTypes.hpp
+++ b/alib2measure/src/measurements/MeasurementTypes.hpp
@@ -18,6 +18,7 @@ enum class Type : unsigned {
 };
 
 std::string to_string ( Type );
+Type measurement_type_from_string ( const std::string & );
 std::ostream & operator <<( std::ostream &, Type );
 
 }
diff --git a/alib2measure/src/measurements/MeasurementXmlFactory.cpp b/alib2measure/src/measurements/MeasurementXmlFactory.cpp
index 67ae1a6fe8..118e3bd28c 100644
--- a/alib2measure/src/measurements/MeasurementXmlFactory.cpp
+++ b/alib2measure/src/measurements/MeasurementXmlFactory.cpp
@@ -2,32 +2,37 @@
  * Author: Radovan Cerveny
  */
 
+#include "sax/FromXMLParserHelper.h"
 #include "MeasurementXmlFactory.hpp"
+#include "exception/AlibException.h"
+
+using namespace std;
+using namespace sax;
 
 namespace measurements {
 
-std::deque < sax::Token > MeasurementXmlFactory::composeMeasurementResults ( const MeasurementResults & mr ) {
-	std::deque < sax::Token > tokens;
+deque < Token > MeasurementXmlFactory::composeMeasurementResults ( const MeasurementResults & mr ) {
+	deque < Token > tokens;
 
-	tokens.emplace_back ( MEASUREMENT_RESULTS_TAG, sax::Token::TokenType::START_ELEMENT );
+	tokens.emplace_back ( MEASUREMENT_RESULTS_TAG, Token::TokenType::START_ELEMENT );
 
 	MeasurementXmlFactory::composeMeasurementFrames ( tokens, 0, mr.frames );
 
-	tokens.emplace_back ( MEASUREMENT_RESULTS_TAG, sax::Token::TokenType::END_ELEMENT );
+	tokens.emplace_back ( MEASUREMENT_RESULTS_TAG, Token::TokenType::END_ELEMENT );
 	return tokens;
 }
 
-void MeasurementXmlFactory::composeMeasurementFrames ( std::deque < sax::Token > & tokens, unsigned idx, const measurements::stealth_vector < MeasurementFrame > & frames ) {
+void MeasurementXmlFactory::composeMeasurementFrames ( deque < Token > & tokens, unsigned idx, const stealth_vector < MeasurementFrame > & frames ) {
 
 	const MeasurementFrame & frame = frames[idx];
 
-	tokens.emplace_back ( MEASUREMENT_FRAME_TAG, sax::Token::TokenType::START_ELEMENT );
-	tokens.emplace_back ( MEASUREMENT_FRAME_NAME_TAG, sax::Token::TokenType::START_ELEMENT );
-	tokens.emplace_back ( measurements::to_string ( frame.name ), sax::Token::TokenType::CHARACTER );
-	tokens.emplace_back ( MEASUREMENT_FRAME_NAME_TAG, sax::Token::TokenType::END_ELEMENT );
-	tokens.emplace_back ( MEASUREMENT_FRAME_TYPE_TAG, sax::Token::TokenType::START_ELEMENT );
-	tokens.emplace_back ( measurements::to_string ( frame.type ), sax::Token::TokenType::CHARACTER );
-	tokens.emplace_back ( MEASUREMENT_FRAME_TYPE_TAG, sax::Token::TokenType::END_ELEMENT );
+	tokens.emplace_back ( MEASUREMENT_FRAME_TAG, Token::TokenType::START_ELEMENT );
+	tokens.emplace_back ( MEASUREMENT_FRAME_NAME_TAG, Token::TokenType::START_ELEMENT );
+	tokens.emplace_back ( measurements::to_string ( frame.name ), Token::TokenType::CHARACTER );
+	tokens.emplace_back ( MEASUREMENT_FRAME_NAME_TAG, Token::TokenType::END_ELEMENT );
+	tokens.emplace_back ( MEASUREMENT_FRAME_TYPE_TAG, Token::TokenType::START_ELEMENT );
+	tokens.emplace_back ( measurements::to_string ( frame.type ), Token::TokenType::CHARACTER );
+	tokens.emplace_back ( MEASUREMENT_FRAME_TYPE_TAG, Token::TokenType::END_ELEMENT );
 
 	if ( frame.type != measurements::Type::ROOT ) {
 		composeTimeDataFrame ( tokens, idx, frames );
@@ -35,85 +40,308 @@ void MeasurementXmlFactory::composeMeasurementFrames ( std::deque < sax::Token >
 		composeCounterDataFrame ( tokens, idx, frames );
 	}
 
-	tokens.emplace_back ( MEASUREMENT_SUBFRAMES_TAG, sax::Token::TokenType::START_ELEMENT );
+	tokens.emplace_back ( MEASUREMENT_SUBFRAMES_TAG, Token::TokenType::START_ELEMENT );
 
 	for ( unsigned sub_idx : frame.sub_idxs )
 		composeMeasurementFrames ( tokens, sub_idx, frames );
 
-	tokens.emplace_back ( MEASUREMENT_SUBFRAMES_TAG, sax::Token::TokenType::END_ELEMENT );
+	tokens.emplace_back ( MEASUREMENT_SUBFRAMES_TAG, Token::TokenType::END_ELEMENT );
 
-	tokens.emplace_back ( MEASUREMENT_FRAME_TAG, sax::Token::TokenType::END_ELEMENT );
+	tokens.emplace_back ( MEASUREMENT_FRAME_TAG, Token::TokenType::END_ELEMENT );
 }
 
-void MeasurementXmlFactory::composeTimeDataFrame ( std::deque < sax::Token > & tokens, unsigned idx, const measurements::stealth_vector < MeasurementFrame > & frames ) {
+void MeasurementXmlFactory::composeTimeDataFrame ( deque < Token > & tokens, unsigned idx, const stealth_vector < MeasurementFrame > & frames ) {
 	const TimeDataFrame & frame = frames[idx].time;
 
-	tokens.emplace_back ( TIME_DATA_FRAME_TAG, sax::Token::TokenType::START_ELEMENT );
-	tokens.emplace_back ( TIME_DATA_FRAME_DURATION_TAG, sax::Token::TokenType::START_ELEMENT );
-	tokens.emplace_back ( std::to_string ( frame.duration.count ( ) ), sax::Token::TokenType::CHARACTER );
-	tokens.emplace_back ( TIME_DATA_FRAME_DURATION_TAG, sax::Token::TokenType::END_ELEMENT );
-	tokens.emplace_back ( TIME_DATA_FRAME_REAL_DURATION_TAG, sax::Token::TokenType::START_ELEMENT );
-	tokens.emplace_back ( std::to_string ( frame.real_duration.count ( ) ), sax::Token::TokenType::CHARACTER );
-	tokens.emplace_back ( TIME_DATA_FRAME_REAL_DURATION_TAG, sax::Token::TokenType::END_ELEMENT );
-	tokens.emplace_back ( TIME_DATA_FRAME_TAG, sax::Token::TokenType::END_ELEMENT );
+	tokens.emplace_back ( TIME_DATA_FRAME_TAG, Token::TokenType::START_ELEMENT );
+	tokens.emplace_back ( TIME_DATA_FRAME_DURATION_TAG, Token::TokenType::START_ELEMENT );
+	tokens.emplace_back ( std::to_string ( frame.duration.count ( ) ), Token::TokenType::CHARACTER );
+	tokens.emplace_back ( TIME_DATA_FRAME_DURATION_TAG, Token::TokenType::END_ELEMENT );
+	tokens.emplace_back ( TIME_DATA_FRAME_REAL_DURATION_TAG, Token::TokenType::START_ELEMENT );
+	tokens.emplace_back ( std::to_string ( frame.real_duration.count ( ) ), Token::TokenType::CHARACTER );
+	tokens.emplace_back ( TIME_DATA_FRAME_REAL_DURATION_TAG, Token::TokenType::END_ELEMENT );
+	tokens.emplace_back ( TIME_DATA_FRAME_TAG, Token::TokenType::END_ELEMENT );
 }
 
-void MeasurementXmlFactory::composeMemoryDataFrame ( std::deque < sax::Token > & tokens, unsigned idx, const measurements::stealth_vector < MeasurementFrame > & frames ) {
+void MeasurementXmlFactory::composeMemoryDataFrame ( deque < Token > & tokens, unsigned idx, const stealth_vector < MeasurementFrame > & frames ) {
 	const MemoryDataFrame & frame = frames[idx].memory;
 
-	tokens.emplace_back ( MEMORY_DATA_FRAME_TAG, sax::Token::TokenType::START_ELEMENT );
-	tokens.emplace_back ( MEMORY_DATA_FRAME_START_HEAP_USAGE_TAG, sax::Token::TokenType::START_ELEMENT );
-	tokens.emplace_back ( std::to_string ( frame.start_heap_usage ), sax::Token::TokenType::CHARACTER );
-	tokens.emplace_back ( MEMORY_DATA_FRAME_START_HEAP_USAGE_TAG, sax::Token::TokenType::END_ELEMENT );
-	tokens.emplace_back ( MEMORY_DATA_FRAME_END_HEAP_USAGE_TAG, sax::Token::TokenType::START_ELEMENT );
-	tokens.emplace_back ( std::to_string ( frame.end_heap_usage ), sax::Token::TokenType::CHARACTER );
-	tokens.emplace_back ( MEMORY_DATA_FRAME_END_HEAP_USAGE_TAG, sax::Token::TokenType::END_ELEMENT );
-	tokens.emplace_back ( MEMORY_DATA_FRAME_HIGH_WATERMARK_TAG, sax::Token::TokenType::START_ELEMENT );
-	tokens.emplace_back ( std::to_string ( frame.high_watermark ), sax::Token::TokenType::CHARACTER );
-	tokens.emplace_back ( MEMORY_DATA_FRAME_HIGH_WATERMARK_TAG, sax::Token::TokenType::END_ELEMENT );
-	tokens.emplace_back ( MEMORY_DATA_FRAME_TAG, sax::Token::TokenType::END_ELEMENT );
+	tokens.emplace_back ( MEMORY_DATA_FRAME_TAG, Token::TokenType::START_ELEMENT );
+	tokens.emplace_back ( MEMORY_DATA_FRAME_START_HEAP_USAGE_TAG, Token::TokenType::START_ELEMENT );
+	tokens.emplace_back ( std::to_string ( frame.start_heap_usage ), Token::TokenType::CHARACTER );
+	tokens.emplace_back ( MEMORY_DATA_FRAME_START_HEAP_USAGE_TAG, Token::TokenType::END_ELEMENT );
+	tokens.emplace_back ( MEMORY_DATA_FRAME_END_HEAP_USAGE_TAG, Token::TokenType::START_ELEMENT );
+	tokens.emplace_back ( std::to_string ( frame.end_heap_usage ), Token::TokenType::CHARACTER );
+	tokens.emplace_back ( MEMORY_DATA_FRAME_END_HEAP_USAGE_TAG, Token::TokenType::END_ELEMENT );
+	tokens.emplace_back ( MEMORY_DATA_FRAME_HIGH_WATERMARK_TAG, Token::TokenType::START_ELEMENT );
+	tokens.emplace_back ( std::to_string ( frame.high_watermark ), Token::TokenType::CHARACTER );
+	tokens.emplace_back ( MEMORY_DATA_FRAME_HIGH_WATERMARK_TAG, Token::TokenType::END_ELEMENT );
+	tokens.emplace_back ( MEMORY_DATA_FRAME_TAG, Token::TokenType::END_ELEMENT );
 }
 
-void MeasurementXmlFactory::composeCounterDataFrame ( std::deque < sax::Token > & tokens, unsigned idx, const measurements::stealth_vector < MeasurementFrame > & frames ) {
+void MeasurementXmlFactory::composeCounterDataFrame ( deque < Token > & tokens, unsigned idx, const stealth_vector < MeasurementFrame > & frames ) {
 	const CounterDataFrame & cdf = frames[idx].counter;
 
-	tokens.emplace_back ( COUNTER_DATA_FRAME_TAG, sax::Token::TokenType::START_ELEMENT );
+	tokens.emplace_back ( COUNTER_DATA_FRAME_TAG, Token::TokenType::START_ELEMENT );
 
-	tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTERS_TAG, sax::Token::TokenType::START_ELEMENT );
+	tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTERS_TAG, Token::TokenType::START_ELEMENT );
 
 	for ( const auto & elem : cdf.counters ) {
-		tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_TAG, sax::Token::TokenType::START_ELEMENT );
-		tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_NAME_TAG, sax::Token::TokenType::START_ELEMENT );
-		tokens.emplace_back ( measurements::to_string ( elem.first ), sax::Token::TokenType::CHARACTER );
-		tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_NAME_TAG, sax::Token::TokenType::END_ELEMENT );
-		tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_VALUE_TAG, sax::Token::TokenType::START_ELEMENT );
-		tokens.emplace_back ( std::to_string ( elem.second ), sax::Token::TokenType::CHARACTER );
-		tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_VALUE_TAG, sax::Token::TokenType::END_ELEMENT );
-		tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_TAG, sax::Token::TokenType::END_ELEMENT );
+		tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_TAG, Token::TokenType::START_ELEMENT );
+		tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_NAME_TAG, Token::TokenType::START_ELEMENT );
+		tokens.emplace_back ( measurements::to_string ( elem.first ), Token::TokenType::CHARACTER );
+		tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_NAME_TAG, Token::TokenType::END_ELEMENT );
+		tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_VALUE_TAG, Token::TokenType::START_ELEMENT );
+		tokens.emplace_back ( std::to_string ( elem.second ), Token::TokenType::CHARACTER );
+		tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_VALUE_TAG, Token::TokenType::END_ELEMENT );
+		tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_TAG, Token::TokenType::END_ELEMENT );
 	}
 
-	tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTERS_TAG, sax::Token::TokenType::END_ELEMENT );
+	tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTERS_TAG, Token::TokenType::END_ELEMENT );
 
-	tokens.emplace_back ( COUNTER_DATA_FRAME_REAL_COUNTERS_TAG, sax::Token::TokenType::START_ELEMENT );
+	tokens.emplace_back ( COUNTER_DATA_FRAME_REAL_COUNTERS_TAG, Token::TokenType::START_ELEMENT );
 
 	for ( const auto & elem : cdf.real_counters ) {
-		tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_TAG, sax::Token::TokenType::START_ELEMENT );
-		tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_NAME_TAG, sax::Token::TokenType::START_ELEMENT );
-		tokens.emplace_back ( measurements::to_string ( elem.first ), sax::Token::TokenType::CHARACTER );
-		tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_NAME_TAG, sax::Token::TokenType::END_ELEMENT );
-		tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_VALUE_TAG, sax::Token::TokenType::START_ELEMENT );
-		tokens.emplace_back ( std::to_string ( elem.second ), sax::Token::TokenType::CHARACTER );
-		tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_VALUE_TAG, sax::Token::TokenType::END_ELEMENT );
-		tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_TAG, sax::Token::TokenType::END_ELEMENT );
+		tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_TAG, Token::TokenType::START_ELEMENT );
+		tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_NAME_TAG, Token::TokenType::START_ELEMENT );
+		tokens.emplace_back ( measurements::to_string ( elem.first ), Token::TokenType::CHARACTER );
+		tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_NAME_TAG, Token::TokenType::END_ELEMENT );
+		tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_VALUE_TAG, Token::TokenType::START_ELEMENT );
+		tokens.emplace_back ( std::to_string ( elem.second ), Token::TokenType::CHARACTER );
+		tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_VALUE_TAG, Token::TokenType::END_ELEMENT );
+		tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_TAG, Token::TokenType::END_ELEMENT );
+	}
+
+	tokens.emplace_back ( COUNTER_DATA_FRAME_REAL_COUNTERS_TAG, Token::TokenType::END_ELEMENT );
+
+	tokens.emplace_back ( COUNTER_DATA_FRAME_TAG, Token::TokenType::END_ELEMENT );
+}
+
+MeasurementResults MeasurementXmlFactory::parseMeasurementResults ( deque < Token > & tokens ) {
+	MeasurementResults mr;
+
+	deque < Token >::iterator iter = tokens.begin ( );
+
+	if ( iter == tokens.end ( ) ) throw::exception::AlibException ( "Empty tokens list" );
+
+	FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEASUREMENT_RESULTS_TAG );
+
+	parseRootMeasurementFrame ( mr, iter );
+
+	FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEASUREMENT_RESULTS_TAG );
+
+	if ( iter != tokens.end ( ) ) throw::exception::AlibException ( "Unexpeted tokens at the end of the xml" );
+
+	return mr;
+}
+
+void MeasurementXmlFactory::parseRootMeasurementFrame ( MeasurementResults & mr, deque < Token >::iterator & iter ) {
+	FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEASUREMENT_FRAME_TAG );
+
+	mr.frames.emplace_back ( "Root", measurements::Type::ROOT, 0 );
+
+	for ( ; ; ) {
+		if ( !FromXMLParserHelper::isTokenType ( iter, Token::TokenType::START_ELEMENT ) ) break;
+
+		string data = FromXMLParserHelper::getTokenData ( iter, Token::TokenType::START_ELEMENT );
+
+		if ( data == MEASUREMENT_FRAME_NAME_TAG ) {
+			FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEASUREMENT_FRAME_NAME_TAG );
+			FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER );
+			FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEASUREMENT_FRAME_NAME_TAG );
+		} else if ( data == MEASUREMENT_FRAME_TYPE_TAG ) {
+			FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEASUREMENT_FRAME_TYPE_TAG );
+			FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER );
+			FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEASUREMENT_FRAME_TYPE_TAG );
+		} else if ( data == MEASUREMENT_SUBFRAMES_TAG ) {
+
+			parseSubframes ( 0, mr, iter );
+		} else {
+			break;
+		}
+	}
+
+	FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEASUREMENT_FRAME_TAG );
+}
+
+void MeasurementXmlFactory::parseSubframes ( unsigned parentIdx, MeasurementResults & mr, deque < Token >::iterator & iter ) {
+	FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEASUREMENT_SUBFRAMES_TAG );
+
+	for ( ; ; ) {
+		if ( !FromXMLParserHelper::isTokenType ( iter, Token::TokenType::START_ELEMENT ) ) break;
+
+		string data = FromXMLParserHelper::getTokenData ( iter, Token::TokenType::START_ELEMENT );
+
+		if ( data == MEASUREMENT_FRAME_TAG )
+			parseMeasurementFrame ( parentIdx, mr, iter );
+		else
+			break;
+	}
+
+	FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEASUREMENT_SUBFRAMES_TAG );
+}
+
+void MeasurementXmlFactory::parseMeasurementFrame ( unsigned parentIdx, MeasurementResults & mr, deque < Token >::iterator & iter ) {
+	FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEASUREMENT_FRAME_TAG );
+
+	unsigned mfIdx = mr.frames.size ( );
+
+	mr.frames.emplace_back ( "Root", measurements::Type::ROOT, parentIdx );
+	MeasurementFrame & mf = mr.frames.back ( );
+
+	mr.frames[parentIdx].sub_idxs.push_back ( mfIdx );
+
+	for ( ; ; ) {
+		if ( !FromXMLParserHelper::isTokenType ( iter, Token::TokenType::START_ELEMENT ) ) break;
+
+		string data = FromXMLParserHelper::getTokenData ( iter, Token::TokenType::START_ELEMENT );
+
+		if ( data == MEASUREMENT_FRAME_NAME_TAG ) {
+			FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEASUREMENT_FRAME_NAME_TAG );
+			mf.name = measurements::stealth_string_from_string ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) );
+			FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEASUREMENT_FRAME_NAME_TAG );
+		} else if ( data == MEASUREMENT_FRAME_TYPE_TAG ) {
+			FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEASUREMENT_FRAME_TYPE_TAG );
+			mf.type = measurements::measurement_type_from_string ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) );
+			FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEASUREMENT_FRAME_TYPE_TAG );
+		} else if ( data == TIME_DATA_FRAME_TAG ) {
+			parseTimeDataFrame ( mf, iter );
+		} else if ( data == MEMORY_DATA_FRAME_TAG ) {
+			parseMemoryDataFrame ( mf, iter );
+		} else if ( data == COUNTER_DATA_FRAME_TAG ) {
+			parseCounterDataFrame ( mf, iter );
+		} else if ( data == MEASUREMENT_SUBFRAMES_TAG ) {
+			parseSubframes ( mfIdx, mr, iter );
+		} else {
+			break;
+		}
+	}
+
+	FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEASUREMENT_FRAME_TAG );
+}
+
+void MeasurementXmlFactory::parseTimeDataFrame ( MeasurementFrame & mf, deque < Token >::iterator & iter ) {
+	FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, TIME_DATA_FRAME_TAG );
+
+	for ( ; ; ) {
+		if ( !FromXMLParserHelper::isTokenType ( iter, Token::TokenType::START_ELEMENT ) ) break;
+
+		string data = FromXMLParserHelper::getTokenData ( iter, Token::TokenType::START_ELEMENT );
+
+		if ( data == TIME_DATA_FRAME_DURATION_TAG ) {
+			FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, TIME_DATA_FRAME_DURATION_TAG );
+			mf.time.duration = TimeDataFrame::value_type ( valueTypeFromString < TimeDataFrame::value_type::rep > ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) ) );
+			FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, TIME_DATA_FRAME_DURATION_TAG );
+		} else if ( data == TIME_DATA_FRAME_REAL_DURATION_TAG ) {
+			FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, TIME_DATA_FRAME_REAL_DURATION_TAG );
+			mf.time.real_duration = TimeDataFrame::value_type ( valueTypeFromString < TimeDataFrame::value_type::rep > ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) ) );
+			FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, TIME_DATA_FRAME_REAL_DURATION_TAG );
+		} else {
+			break;
+		}
+	}
+
+	FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, TIME_DATA_FRAME_TAG );
+}
+
+void MeasurementXmlFactory::parseMemoryDataFrame ( MeasurementFrame & mf, deque < Token >::iterator & iter ) {
+	FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEMORY_DATA_FRAME_TAG );
+
+	for ( ; ; ) {
+		if ( !FromXMLParserHelper::isTokenType ( iter, Token::TokenType::START_ELEMENT ) ) break;
+
+		string data = FromXMLParserHelper::getTokenData ( iter, Token::TokenType::START_ELEMENT );
+
+		if ( data == MEMORY_DATA_FRAME_START_HEAP_USAGE_TAG ) {
+			FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEMORY_DATA_FRAME_START_HEAP_USAGE_TAG );
+			mf.memory.start_heap_usage = valueTypeFromString < MemoryDataFrame::value_type > ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) );
+			FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEMORY_DATA_FRAME_START_HEAP_USAGE_TAG );
+		} else if ( data == MEMORY_DATA_FRAME_END_HEAP_USAGE_TAG ) {
+			FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEMORY_DATA_FRAME_END_HEAP_USAGE_TAG );
+			mf.memory.end_heap_usage = valueTypeFromString < MemoryDataFrame::value_type > ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) );
+			FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEMORY_DATA_FRAME_END_HEAP_USAGE_TAG );
+		} else if ( data == MEMORY_DATA_FRAME_HIGH_WATERMARK_TAG ) {
+			FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEMORY_DATA_FRAME_HIGH_WATERMARK_TAG );
+			mf.memory.high_watermark = valueTypeFromString < MemoryDataFrame::value_type > ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) );
+			FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEMORY_DATA_FRAME_HIGH_WATERMARK_TAG );
+		} else {
+			break;
+		}
+	}
+
+	FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEMORY_DATA_FRAME_TAG );
+}
+
+void MeasurementXmlFactory::parseCounterDataFrame ( MeasurementFrame & mf, deque < Token >::iterator & iter ) {
+	FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, COUNTER_DATA_FRAME_TAG );
+
+	for ( ; ; ) {
+		if ( !FromXMLParserHelper::isTokenType ( iter, Token::TokenType::START_ELEMENT ) ) break;
+
+		string data = FromXMLParserHelper::getTokenData ( iter, Token::TokenType::START_ELEMENT );
+
+		if ( data == COUNTER_DATA_FRAME_COUNTERS_TAG )
+			parseCounterDataFrameCounters ( COUNTER_DATA_FRAME_COUNTERS_TAG, mf.counter.counters, iter );
+		else if ( data == COUNTER_DATA_FRAME_REAL_COUNTERS_TAG )
+			parseCounterDataFrameCounters ( COUNTER_DATA_FRAME_REAL_COUNTERS_TAG, mf.counter.real_counters, iter );
+		else
+			break;
 	}
 
-	tokens.emplace_back ( COUNTER_DATA_FRAME_REAL_COUNTERS_TAG, sax::Token::TokenType::END_ELEMENT );
+	FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, COUNTER_DATA_FRAME_TAG );
+}
+
+void MeasurementXmlFactory::parseCounterDataFrameCounters ( const std::string & tag, stealth_map < stealth_string, CounterHint::value_type > & counters, std::deque < sax::Token >::iterator & iter ) {
+	FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, tag );
+
+	for ( ; ; ) {
+		if ( !FromXMLParserHelper::isTokenType ( iter, Token::TokenType::START_ELEMENT ) ) break;
+
+		string data = FromXMLParserHelper::getTokenData ( iter, Token::TokenType::START_ELEMENT );
+
+		if ( data == COUNTER_DATA_FRAME_COUNTER_TAG ) {
+			FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, COUNTER_DATA_FRAME_COUNTER_TAG );
+
+			stealth_string counterName;
+			CounterHint::value_type counterValue;
+
+			for ( ; ; ) {
+				if ( !FromXMLParserHelper::isTokenType ( iter, Token::TokenType::START_ELEMENT ) ) break;
 
-	tokens.emplace_back ( COUNTER_DATA_FRAME_TAG, sax::Token::TokenType::END_ELEMENT );
+				string counterData = FromXMLParserHelper::getTokenData ( iter, Token::TokenType::START_ELEMENT );
+
+				if ( counterData == COUNTER_DATA_FRAME_COUNTER_NAME_TAG ) {
+					FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, COUNTER_DATA_FRAME_COUNTER_NAME_TAG );
+					counterName = stealth_string_from_string ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) );
+					FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, COUNTER_DATA_FRAME_COUNTER_NAME_TAG );
+				} else if ( counterData == COUNTER_DATA_FRAME_COUNTER_VALUE_TAG ) {
+					FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, COUNTER_DATA_FRAME_COUNTER_VALUE_TAG );
+					counterValue = valueTypeFromString < CounterHint::value_type > ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) );
+					FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, COUNTER_DATA_FRAME_COUNTER_VALUE_TAG );
+				} else {
+					break;
+				}
+			}
+
+			FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, COUNTER_DATA_FRAME_COUNTER_TAG );
+
+			counters[counterName] = counterValue;
+
+		} else {
+			break;
+		}
+	}
+
+	FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, tag );
 }
 
-MeasurementResults MeasurementXmlFactory::parseMeasurementResults ( std::deque < sax::Token > & ) {
-	return MeasurementResults ( );
+template < typename T >
+T MeasurementXmlFactory::valueTypeFromString ( const std::string & str ) {
+	istringstream iss ( str );
+	T val;
+
+	iss >> val;
+	return val;
 }
 
 std::string MeasurementXmlFactory::MEASUREMENT_RESULTS_TAG = "MeasurementResults";
@@ -137,6 +365,6 @@ std::string MeasurementXmlFactory::COUNTER_DATA_FRAME_TAG = "CounterData";
 std::string MeasurementXmlFactory::COUNTER_DATA_FRAME_COUNTERS_TAG = "Counters";
 std::string MeasurementXmlFactory::COUNTER_DATA_FRAME_REAL_COUNTERS_TAG = "RealCounters";
 std::string MeasurementXmlFactory::COUNTER_DATA_FRAME_COUNTER_TAG = "Counter";
-std::string MeasurementXmlFactory::COUNTER_DATA_FRAME_COUNTER_NAME_TAG	 = "Name";
+std::string MeasurementXmlFactory::COUNTER_DATA_FRAME_COUNTER_NAME_TAG	= "Name";
 std::string MeasurementXmlFactory::COUNTER_DATA_FRAME_COUNTER_VALUE_TAG = "Value";
 }
diff --git a/alib2measure/src/measurements/MeasurementXmlFactory.hpp b/alib2measure/src/measurements/MeasurementXmlFactory.hpp
index 04ad1ebc49..11bfa88586 100644
--- a/alib2measure/src/measurements/MeasurementXmlFactory.hpp
+++ b/alib2measure/src/measurements/MeasurementXmlFactory.hpp
@@ -40,10 +40,21 @@ class MeasurementXmlFactory {
 	static std::string COUNTER_DATA_FRAME_COUNTER_NAME_TAG;
 	static std::string COUNTER_DATA_FRAME_COUNTER_VALUE_TAG;
 
-	static void composeMeasurementFrames ( std::deque < sax::Token > &, unsigned, const measurements::stealth_vector < MeasurementFrame > & );
-	static void composeTimeDataFrame ( std::deque < sax::Token > &, unsigned, const measurements::stealth_vector < MeasurementFrame > & );
-	static void composeMemoryDataFrame ( std::deque < sax::Token > &, unsigned, const measurements::stealth_vector < MeasurementFrame > & );
-	static void composeCounterDataFrame ( std::deque < sax::Token > &, unsigned, const measurements::stealth_vector < MeasurementFrame > & );
+	static void composeMeasurementFrames ( std::deque < sax::Token > &, unsigned, const stealth_vector < MeasurementFrame > & );
+	static void composeTimeDataFrame ( std::deque < sax::Token > &, unsigned, const stealth_vector < MeasurementFrame > & );
+	static void composeMemoryDataFrame ( std::deque < sax::Token > &, unsigned, const stealth_vector < MeasurementFrame > & );
+	static void composeCounterDataFrame ( std::deque < sax::Token > &, unsigned, const stealth_vector < MeasurementFrame > & );
+
+	static void parseRootMeasurementFrame ( MeasurementResults &, std::deque < sax::Token >::iterator & );
+	static void parseSubframes ( unsigned, MeasurementResults &, std::deque < sax::Token >::iterator & );
+	static void parseMeasurementFrame ( unsigned, MeasurementResults &, std::deque < sax::Token >::iterator & );
+	static void parseTimeDataFrame ( MeasurementFrame &, std::deque < sax::Token >::iterator & );
+	static void parseMemoryDataFrame ( MeasurementFrame &, std::deque < sax::Token >::iterator & );
+	static void parseCounterDataFrame ( MeasurementFrame &, std::deque < sax::Token >::iterator & );
+	static void parseCounterDataFrameCounters ( const std::string &, stealth_map < stealth_string, CounterHint::value_type > &, std::deque < sax::Token >::iterator & );
+
+	template < typename T >
+	static T valueTypeFromString ( const std::string & );
 
 public:
 	static std::deque < sax::Token > composeMeasurementResults ( const MeasurementResults & );
diff --git a/alib2measure/src/measurements/frames/MemoryDataFrame.hpp b/alib2measure/src/measurements/frames/MemoryDataFrame.hpp
index 989d35784c..f5fc335966 100644
--- a/alib2measure/src/measurements/frames/MemoryDataFrame.hpp
+++ b/alib2measure/src/measurements/frames/MemoryDataFrame.hpp
@@ -16,20 +16,23 @@ struct MemoryDataFrame;
 
 struct MemoryHint {
 	using frame_type = MemoryDataFrame;
+	using value_type = size_t;
 	enum class Type {
 		NEW, DELETE
 	};
 
 	Type   type;
-	size_t size;
+	value_type size;
 };
 
 struct MemoryDataFrame {
-	size_t start_heap_usage;
-	size_t end_heap_usage;
-	size_t high_watermark;
+	using value_type = size_t;
 
-	size_t current_heap_usage;
+	value_type start_heap_usage;
+	value_type end_heap_usage;
+	value_type high_watermark;
+
+	value_type current_heap_usage;
 
 	static void init ( unsigned, measurements::stealth_vector < MeasurementFrame > & );
 	static void update ( unsigned, measurements::stealth_vector < MeasurementFrame > & );
diff --git a/alib2measure/src/measurements/frames/TimeDataFrame.hpp b/alib2measure/src/measurements/frames/TimeDataFrame.hpp
index f5ebcec7f3..a4c717a7fc 100644
--- a/alib2measure/src/measurements/frames/TimeDataFrame.hpp
+++ b/alib2measure/src/measurements/frames/TimeDataFrame.hpp
@@ -15,10 +15,12 @@ namespace measurements {
 struct MeasurementFrame;
 
 struct TimeDataFrame {
+	using value_type = std::chrono::microseconds;
+
 	std::chrono::time_point < std::chrono::high_resolution_clock > start;
 
-	std::chrono::microseconds duration;
-	std::chrono::microseconds real_duration;
+	value_type duration;
+	value_type real_duration;
 
 	static void init ( unsigned, measurements::stealth_vector < MeasurementFrame > & );
 	static void update ( unsigned, measurements::stealth_vector < MeasurementFrame > & );
diff --git a/alib2measure/src/measurements/measurements.hpp b/alib2measure/src/measurements/measurements.hpp
index e2de451428..0cd6c04c37 100644
--- a/alib2measure/src/measurements/measurements.hpp
+++ b/alib2measure/src/measurements/measurements.hpp
@@ -6,6 +6,7 @@
 #define MEASUREMENTS_HPP_
 
 #include "MeasurementEngine.hpp"
+#include "MeasurementXmlFactory.hpp"
 
 namespace measurements {
 
diff --git a/alib2measure/test-src/measurements/MeasurementsTest.cpp b/alib2measure/test-src/measurements/MeasurementsTest.cpp
index c043485c55..d714157573 100644
--- a/alib2measure/test-src/measurements/MeasurementsTest.cpp
+++ b/alib2measure/test-src/measurements/MeasurementsTest.cpp
@@ -1,5 +1,6 @@
 #include "MeasurementsTest.h"
 #include "sax/SaxComposeInterface.h"
+#include <sstream>
 #include <thread>
 #include <cmath>
 #include <measure>
@@ -15,7 +16,6 @@ void MeasurementsTest::tearDown ( ) {
 }
 
 void MeasurementsTest::testConstructMeasurements ( ) {
-
 }
 
 void MeasurementsTest::testTimeMeasurements ( ) {
@@ -72,11 +72,12 @@ void MeasurementsTest::testMemoryMeasurements ( ) {
 	measurements::start ( "chunk1", measurements::Type::MAIN );
 	int * baz = new int[500];
 
-	delete[] baz;
 	measurements::end ( );
 
-	measurements::start ( "chunk2", measurements::Type::MAIN );
+	delete[] baz;
+
 	int * foo = new int[1000];
+	measurements::start ( "chunk2", measurements::Type::MAIN );
 	measurements::start ( "chunk21", measurements::Type::MAIN );
 	int * bar = new int[2000];
 	measurements::end ( );
@@ -92,21 +93,21 @@ void MeasurementsTest::testMemoryMeasurements ( ) {
 void MeasurementsTest::testCounterMeasurements ( ) {
 
 	measurements::start ( "chunk1", measurements::Type::MAIN );
-	measurements::hint( measurements::CounterHint { "test1", measurements::CounterHint::Type::ADD, 5 } );
-	measurements::hint( measurements::CounterHint { "test2", measurements::CounterHint::Type::INC, 0 } );
+	measurements::hint ( measurements::CounterHint { "test1", measurements::CounterHint::Type::ADD, 5 } );
+	measurements::hint ( measurements::CounterHint { "test2", measurements::CounterHint::Type::INC, 0 } );
 	measurements::start ( "chunk11", measurements::Type::MAIN );
-	measurements::hint( measurements::CounterHint { "test3", measurements::CounterHint::Type::DEC, 0} );
+	measurements::hint ( measurements::CounterHint { "test3", measurements::CounterHint::Type::DEC, 0 } );
 	measurements::start ( "chunk111", measurements::Type::MAIN );
-	measurements::hint( measurements::CounterHint { "test1", measurements::CounterHint::Type::DEC, 0 } );
-	measurements::hint( measurements::CounterHint { "test2", measurements::CounterHint::Type::SUB, 10 } );
-	measurements::hint( measurements::CounterHint { "test3", measurements::CounterHint::Type::DEC, 0} );
-	measurements::hint( measurements::CounterHint { "test4", measurements::CounterHint::Type::DEC, 0} );
+	measurements::hint ( measurements::CounterHint { "test1", measurements::CounterHint::Type::DEC, 0 } );
+	measurements::hint ( measurements::CounterHint { "test2", measurements::CounterHint::Type::SUB, 10 } );
+	measurements::hint ( measurements::CounterHint { "test3", measurements::CounterHint::Type::DEC, 0 } );
+	measurements::hint ( measurements::CounterHint { "test4", measurements::CounterHint::Type::DEC, 0 } );
 	measurements::end ( );
 	measurements::start ( "chunk112", measurements::Type::MAIN );
-	measurements::hint( measurements::CounterHint { "test1", measurements::CounterHint::Type::DEC, 0 } );
-	measurements::hint( measurements::CounterHint { "test2", measurements::CounterHint::Type::SUB, 10 } );
-	measurements::hint( measurements::CounterHint { "test3", measurements::CounterHint::Type::DEC, 0} );
-	measurements::hint( measurements::CounterHint { "test4", measurements::CounterHint::Type::DEC, 0} );
+	measurements::hint ( measurements::CounterHint { "test1", measurements::CounterHint::Type::DEC, 0 } );
+	measurements::hint ( measurements::CounterHint { "test2", measurements::CounterHint::Type::SUB, 10 } );
+	measurements::hint ( measurements::CounterHint { "test3", measurements::CounterHint::Type::DEC, 0 } );
+	measurements::hint ( measurements::CounterHint { "test4", measurements::CounterHint::Type::DEC, 0 } );
 	measurements::end ( );
 	measurements::end ( );
 	measurements::end ( );
@@ -114,4 +115,84 @@ void MeasurementsTest::testCounterMeasurements ( ) {
 	std::cout << measurements::MeasurementFormat::LIST << measurements::results ( ) << std::endl;
 	std::cout << measurements::MeasurementFormat::TREE << measurements::results ( ) << std::endl;
 	std::cout << measurements::MeasurementFormat::XML << measurements::results ( ) << std::endl;
-}
\ No newline at end of file
+}
+
+void MeasurementsTest::testMeasurementXmlFactory ( ) {
+	measurements::start ( "global", measurements::Type::OVERALL );
+	measurements::start ( "init", measurements::Type::INIT );
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 100 ) );
+	measurements::end ( );
+	measurements::hint ( measurements::CounterHint { "counter2", measurements::CounterHint::Type::SUB, 5 } );
+
+	measurements::start ( "main", measurements::Type::MAIN );
+	int * foo = new int[1000];
+
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 20 ) );
+	measurements::start ( "aux", measurements::Type::AUXILIARY );
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) );
+	measurements::hint ( measurements::CounterHint { "counter2", measurements::CounterHint::Type::SUB, 5 } );
+
+	measurements::end ( );
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) );
+	measurements::start ( "aux", measurements::Type::AUXILIARY );
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) );
+	measurements::end ( );
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) );
+	measurements::end ( );
+	measurements::hint ( measurements::CounterHint { "counter2", measurements::CounterHint::Type::SUB, 5 } );
+
+	measurements::start ( "fin", measurements::Type::FINALIZE );
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 30 ) );
+	measurements::start ( "aux", measurements::Type::AUXILIARY );
+	int * bar = new int[2000];
+
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) );
+	measurements::end ( );
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) );
+	measurements::end ( );
+	measurements::hint ( measurements::CounterHint { "counter1", measurements::CounterHint::Type::ADD, 1 } );
+
+	measurements::end ( );
+	measurements::start ( "global2", measurements::Type::OVERALL );
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 100 ) );
+	measurements::end ( );
+
+	delete[] foo;
+	measurements::start ( "global3", measurements::Type::OVERALL );
+	measurements::start ( "init", measurements::Type::INIT );
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 100 ) );
+	measurements::end ( );
+	measurements::start ( "main", measurements::Type::MAIN );
+	delete[] bar;
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 20 ) );
+	measurements::start ( "aux", measurements::Type::AUXILIARY );
+	measurements::hint ( measurements::CounterHint { "counter1", measurements::CounterHint::Type::ADD, 1 } );
+
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) );
+	measurements::end ( );
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) );
+	measurements::start ( "aux", measurements::Type::AUXILIARY );
+	measurements::hint ( measurements::CounterHint { "counter1", measurements::CounterHint::Type::ADD, 1 } );
+
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) );
+	measurements::end ( );
+	std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) );
+	measurements::end ( );
+	measurements::end ( );
+
+	std::deque < sax::Token > tokens = measurements::MeasurementXmlFactory::composeMeasurementResults ( measurements::results ( ) );
+
+	measurements::MeasurementResults convertedResults = measurements::MeasurementXmlFactory::parseMeasurementResults ( tokens );
+
+	std::ostringstream ossoriginal;
+
+	ossoriginal << measurements::MeasurementFormat::LIST << measurements::results ( ) << std::endl;
+
+	std::ostringstream ossconverted;
+
+	ossconverted << measurements::MeasurementFormat::LIST << convertedResults << std::endl;
+
+	std::cout << ossoriginal.str ( ) << std::endl << ossconverted.str ( ) << std::endl;
+
+	CPPUNIT_ASSERT ( ossoriginal.str ( ) == ossconverted.str ( ) );
+}
diff --git a/alib2measure/test-src/measurements/MeasurementsTest.h b/alib2measure/test-src/measurements/MeasurementsTest.h
index 4afc116c16..25a10d4897 100644
--- a/alib2measure/test-src/measurements/MeasurementsTest.h
+++ b/alib2measure/test-src/measurements/MeasurementsTest.h
@@ -9,6 +9,7 @@ class MeasurementsTest : public CppUnit::TestFixture {
   CPPUNIT_TEST ( testTimeMeasurements );
   CPPUNIT_TEST ( testMemoryMeasurements );
   CPPUNIT_TEST ( testCounterMeasurements );
+  CPPUNIT_TEST ( testMeasurementXmlFactory );
   CPPUNIT_TEST_SUITE_END ( );
 
 public:
@@ -19,6 +20,8 @@ public:
   void testTimeMeasurements ( );
   void testMemoryMeasurements ( );
   void testCounterMeasurements ( );
+
+  void testMeasurementXmlFactory ( );
 };
 
 #endif // MEASUREMENTS_TEST_H_
-- 
GitLab