2009-07-30 04:42:27 +00:00
#include "tests.h"
2010-10-18 07:05:53 +00:00
#include "yaml-cpp/yaml.h"
2011-11-13 16:12:39 -06:00
#include <iostream>
2009-07-30 04:42:27 +00:00
namespace Test
{
namespace Emitter {
////////////////////////////////////////////////////////////////////////////////////////////////////////
// correct emitting
void SimpleScalar ( YAML :: Emitter & out , std :: string & desiredOutput ) {
out << "Hello, World!" ;
2011-03-03 08:57:00 +00:00
desiredOutput = "Hello, World!" ;
2009-07-30 04:42:27 +00:00
}
void SimpleSeq ( YAML :: Emitter & out , std :: string & desiredOutput ) {
out << YAML :: BeginSeq ;
out << "eggs" ;
out << "bread" ;
out << "milk" ;
out << YAML :: EndSeq ;
2011-03-03 08:57:00 +00:00
desiredOutput = "- eggs \n - bread \n - milk" ;
2009-07-30 04:42:27 +00:00
}
void SimpleFlowSeq ( YAML :: Emitter & out , std :: string & desiredOutput ) {
out << YAML :: Flow ;
out << YAML :: BeginSeq ;
out << "Larry" ;
out << "Curly" ;
out << "Moe" ;
out << YAML :: EndSeq ;
2011-03-03 08:57:00 +00:00
desiredOutput = "[Larry, Curly, Moe]" ;
2009-07-30 04:42:27 +00:00
}
void EmptyFlowSeq ( YAML :: Emitter & out , std :: string & desiredOutput ) {
out << YAML :: Flow ;
out << YAML :: BeginSeq ;
out << YAML :: EndSeq ;
2011-03-03 08:57:00 +00:00
desiredOutput = "[]" ;
2009-07-30 04:42:27 +00:00
}
void NestedBlockSeq ( YAML :: Emitter & out , std :: string & desiredOutput ) {
out << YAML :: BeginSeq ;
out << "item 1" ;
out << YAML :: BeginSeq << "subitem 1" << "subitem 2" << YAML :: EndSeq ;
out << YAML :: EndSeq ;
2011-03-03 08:57:00 +00:00
desiredOutput = "- item 1 \n - \n - subitem 1 \n - subitem 2" ;
2009-07-30 04:42:27 +00:00
}
void NestedFlowSeq ( YAML :: Emitter & out , std :: string & desiredOutput ) {
out << YAML :: BeginSeq ;
out << "one" ;
out << YAML :: Flow << YAML :: BeginSeq << "two" << "three" << YAML :: EndSeq ;
out << YAML :: EndSeq ;
2011-03-03 08:57:00 +00:00
desiredOutput = "- one \n - [two, three]" ;
2009-07-30 04:42:27 +00:00
}
void SimpleMap ( YAML :: Emitter & out , std :: string & desiredOutput ) {
out << YAML :: BeginMap ;
out << YAML :: Key << "name" ;
out << YAML :: Value << "Ryan Braun" ;
out << YAML :: Key << "position" ;
out << YAML :: Value << "3B" ;
out << YAML :: EndMap ;
2011-03-03 08:57:00 +00:00
desiredOutput = "name: Ryan Braun \n position: 3B" ;
2009-07-30 04:42:27 +00:00
}
void SimpleFlowMap ( YAML :: Emitter & out , std :: string & desiredOutput ) {
out << YAML :: Flow ;
out << YAML :: BeginMap ;
out << YAML :: Key << "shape" ;
out << YAML :: Value << "square" ;
out << YAML :: Key << "color" ;
out << YAML :: Value << "blue" ;
out << YAML :: EndMap ;
2011-03-03 08:57:00 +00:00
desiredOutput = "{shape: square, color: blue}" ;
2009-07-30 04:42:27 +00:00
}
void MapAndList ( YAML :: Emitter & out , std :: string & desiredOutput ) {
out << YAML :: BeginMap ;
out << YAML :: Key << "name" ;
out << YAML :: Value << "Barack Obama" ;
out << YAML :: Key << "children" ;
out << YAML :: Value << YAML :: BeginSeq << "Sasha" << "Malia" << YAML :: EndSeq ;
out << YAML :: EndMap ;
2011-03-03 08:57:00 +00:00
desiredOutput = "name: Barack Obama \n children: \n - Sasha \n - Malia" ;
2009-07-30 04:42:27 +00:00
}
void ListAndMap ( YAML :: Emitter & out , std :: string & desiredOutput ) {
out << YAML :: BeginSeq ;
out << "item 1" ;
out << YAML :: BeginMap ;
out << YAML :: Key << "pens" << YAML :: Value << 8 ;
out << YAML :: Key << "pencils" << YAML :: Value << 14 ;
out << YAML :: EndMap ;
out << "item 2" ;
out << YAML :: EndSeq ;
2011-03-03 08:57:00 +00:00
desiredOutput = "- item 1 \n - pens: 8 \n pencils: 14 \n - item 2" ;
2009-07-30 04:42:27 +00:00
}
void NestedBlockMap ( YAML :: Emitter & out , std :: string & desiredOutput ) {
out << YAML :: BeginMap ;
out << YAML :: Key << "name" ;
out << YAML :: Value << "Fred" ;
out << YAML :: Key << "grades" ;
out << YAML :: Value ;
out << YAML :: BeginMap ;
out << YAML :: Key << "algebra" << YAML :: Value << "A" ;
out << YAML :: Key << "physics" << YAML :: Value << "C+" ;
out << YAML :: Key << "literature" << YAML :: Value << "B" ;
out << YAML :: EndMap ;
out << YAML :: EndMap ;
2011-03-03 08:57:00 +00:00
desiredOutput = "name: Fred \n grades: \n algebra: A \n physics: C+ \n literature: B" ;
2009-07-30 04:42:27 +00:00
}
void NestedFlowMap ( YAML :: Emitter & out , std :: string & desiredOutput ) {
out << YAML :: Flow ;
out << YAML :: BeginMap ;
out << YAML :: Key << "name" ;
out << YAML :: Value << "Fred" ;
out << YAML :: Key << "grades" ;
out << YAML :: Value ;
out << YAML :: BeginMap ;
out << YAML :: Key << "algebra" << YAML :: Value << "A" ;
out << YAML :: Key << "physics" << YAML :: Value << "C+" ;
out << YAML :: Key << "literature" << YAML :: Value << "B" ;
out << YAML :: EndMap ;
out << YAML :: EndMap ;
2011-03-03 08:57:00 +00:00
desiredOutput = "{name: Fred, grades: {algebra: A, physics: C+, literature: B}}" ;
2009-07-30 04:42:27 +00:00
}
void MapListMix ( YAML :: Emitter & out , std :: string & desiredOutput ) {
out << YAML :: BeginMap ;
out << YAML :: Key << "name" ;
out << YAML :: Value << "Bob" ;
out << YAML :: Key << "position" ;
out << YAML :: Value ;
out << YAML :: Flow << YAML :: BeginSeq << 2 << 4 << YAML :: EndSeq ;
out << YAML :: Key << "invincible" << YAML :: Value << YAML :: OnOffBool << false ;
out << YAML :: EndMap ;
2011-03-03 08:57:00 +00:00
desiredOutput = "name: Bob \n position: [2, 4] \n invincible: off" ;
2009-07-30 04:42:27 +00:00
}
void SimpleLongKey ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: LongKey ;
out << YAML :: BeginMap ;
out << YAML :: Key << "height" ;
out << YAML :: Value << "5'9 \" " ;
out << YAML :: Key << "weight" ;
out << YAML :: Value << 145 ;
out << YAML :: EndMap ;
2011-03-03 08:57:00 +00:00
desiredOutput = "? height \n : 5'9 \"\n ? weight \n : 145" ;
2009-07-30 04:42:27 +00:00
}
void SingleLongKey ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginMap ;
out << YAML :: Key << "age" ;
out << YAML :: Value << "24" ;
out << YAML :: LongKey << YAML :: Key << "height" ;
out << YAML :: Value << "5'9 \" " ;
out << YAML :: Key << "weight" ;
out << YAML :: Value << 145 ;
out << YAML :: EndMap ;
2011-03-03 08:57:00 +00:00
desiredOutput = "age: 24 \n ? height \n : 5'9 \"\n weight: 145" ;
2009-07-30 04:42:27 +00:00
}
void ComplexLongKey ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: LongKey ;
out << YAML :: BeginMap ;
out << YAML :: Key << YAML :: BeginSeq << 1 << 3 << YAML :: EndSeq ;
out << YAML :: Value << "monster" ;
out << YAML :: Key << YAML :: Flow << YAML :: BeginSeq << 2 << 0 << YAML :: EndSeq ;
out << YAML :: Value << "demon" ;
out << YAML :: EndMap ;
2011-03-03 08:57:00 +00:00
desiredOutput = "? \n - 1 \n - 3 \n : monster \n ? [2, 0] \n : demon" ;
2009-07-30 04:42:27 +00:00
}
void AutoLongKey ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginMap ;
out << YAML :: Key << YAML :: BeginSeq << 1 << 3 << YAML :: EndSeq ;
out << YAML :: Value << "monster" ;
out << YAML :: Key << YAML :: Flow << YAML :: BeginSeq << 2 << 0 << YAML :: EndSeq ;
out << YAML :: Value << "demon" ;
out << YAML :: Key << "the origin" ;
out << YAML :: Value << "angel" ;
out << YAML :: EndMap ;
2011-03-03 08:57:00 +00:00
desiredOutput = "? \n - 1 \n - 3 \n : monster \n ? [2, 0] \n : demon \n the origin: angel" ;
2009-07-30 04:42:27 +00:00
}
void ScalarFormat ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginSeq ;
out << "simple scalar" ;
out << YAML :: SingleQuoted << "explicit single-quoted scalar" ;
out << YAML :: DoubleQuoted << "explicit double-quoted scalar" ;
out << "auto-detected \n double-quoted scalar" ;
out << "a non- \" auto-detected \" double-quoted scalar" ;
out << YAML :: Literal << "literal scalar \n that may span \n many, many \n lines and have \" whatever \" crazy \t symbols that we like" ;
out << YAML :: EndSeq ;
2011-03-03 08:57:00 +00:00
desiredOutput = "- simple scalar \n - 'explicit single-quoted scalar' \n - \" explicit double-quoted scalar \"\n - \" auto-detected \\ x0adouble-quoted scalar \"\n - a non- \" auto-detected \" double-quoted scalar \n - | \n literal scalar \n that may span \n many, many \n lines and have \" whatever \" crazy \t symbols that we like" ;
2009-07-30 04:42:27 +00:00
}
void AutoLongKeyScalar ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginMap ;
out << YAML :: Key << YAML :: Literal << "multi-line \n scalar" ;
out << YAML :: Value << "and its value" ;
out << YAML :: EndMap ;
2011-03-03 08:57:00 +00:00
desiredOutput = "? | \n multi-line \n scalar \n : and its value" ;
2009-07-30 04:42:27 +00:00
}
void LongKeyFlowMap ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: Flow ;
out << YAML :: BeginMap ;
out << YAML :: Key << "simple key" ;
out << YAML :: Value << "and value" ;
out << YAML :: LongKey << YAML :: Key << "long key" ;
out << YAML :: Value << "and its value" ;
out << YAML :: EndMap ;
2011-03-03 08:57:00 +00:00
desiredOutput = "{simple key: and value, ? long key: and its value}" ;
2009-07-30 04:42:27 +00:00
}
void BlockMapAsKey ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginMap ;
out << YAML :: Key ;
out << YAML :: BeginMap ;
out << YAML :: Key << "key" << YAML :: Value << "value" ;
out << YAML :: Key << "next key" << YAML :: Value << "next value" ;
out << YAML :: EndMap ;
out << YAML :: Value ;
out << "total value" ;
out << YAML :: EndMap ;
2011-03-03 08:57:00 +00:00
desiredOutput = "? \n key: value \n next key: next value \n : total value" ;
2009-07-30 04:42:27 +00:00
}
void AliasAndAnchor ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginSeq ;
out << YAML :: Anchor ( "fred" );
out << YAML :: BeginMap ;
out << YAML :: Key << "name" << YAML :: Value << "Fred" ;
out << YAML :: Key << "age" << YAML :: Value << 42 ;
out << YAML :: EndMap ;
out << YAML :: Alias ( "fred" );
out << YAML :: EndSeq ;
2011-03-03 08:57:00 +00:00
desiredOutput = "- &fred \n name: Fred \n age: 42 \n - *fred" ;
2009-07-30 04:42:27 +00:00
}
2009-08-24 22:56:54 +00:00
void AliasAndAnchorWithNull ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginSeq ;
out << YAML :: Anchor ( "fred" ) << YAML :: Null ;
out << YAML :: Alias ( "fred" );
out << YAML :: EndSeq ;
2011-03-03 08:57:00 +00:00
desiredOutput = "- &fred ~ \n - *fred" ;
2009-10-29 15:48:06 +00:00
}
2011-08-04 21:50:04 +00:00
void AliasAndAnchorInFlow ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: Flow << YAML :: BeginSeq ;
out << YAML :: Anchor ( "fred" );
out << YAML :: BeginMap ;
out << YAML :: Key << "name" << YAML :: Value << "Fred" ;
out << YAML :: Key << "age" << YAML :: Value << 42 ;
out << YAML :: EndMap ;
out << YAML :: Alias ( "fred" );
out << YAML :: EndSeq ;
desiredOutput = "[&fred {name: Fred, age: 42}, *fred]" ;
}
2009-10-29 15:48:06 +00:00
void SimpleVerbatimTag ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: VerbatimTag ( "!foo" ) << "bar" ;
2011-03-03 08:57:00 +00:00
desiredOutput = "!<!foo> bar" ;
2009-10-29 15:48:06 +00:00
}
void VerbatimTagInBlockSeq ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginSeq ;
out << YAML :: VerbatimTag ( "!foo" ) << "bar" ;
out << "baz" ;
out << YAML :: EndSeq ;
2011-03-03 08:57:00 +00:00
desiredOutput = "- !<!foo> bar \n - baz" ;
2009-10-29 15:48:06 +00:00
}
void VerbatimTagInFlowSeq ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: Flow << YAML :: BeginSeq ;
out << YAML :: VerbatimTag ( "!foo" ) << "bar" ;
out << "baz" ;
out << YAML :: EndSeq ;
2011-03-03 08:57:00 +00:00
desiredOutput = "[!<!foo> bar, baz]" ;
2009-10-29 15:48:06 +00:00
}
void VerbatimTagInFlowSeqWithNull ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: Flow << YAML :: BeginSeq ;
out << YAML :: VerbatimTag ( "!foo" ) << YAML :: Null ;
out << "baz" ;
out << YAML :: EndSeq ;
2011-03-03 08:57:00 +00:00
desiredOutput = "[!<!foo> ~, baz]" ;
2009-10-29 15:48:06 +00:00
}
void VerbatimTagInBlockMap ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginMap ;
out << YAML :: Key << YAML :: VerbatimTag ( "!foo" ) << "bar" ;
out << YAML :: Value << YAML :: VerbatimTag ( "!waz" ) << "baz" ;
out << YAML :: EndMap ;
2011-03-03 08:57:00 +00:00
desiredOutput = "!<!foo> bar: !<!waz> baz" ;
2009-10-29 15:48:06 +00:00
}
void VerbatimTagInFlowMap ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: Flow << YAML :: BeginMap ;
out << YAML :: Key << YAML :: VerbatimTag ( "!foo" ) << "bar" ;
out << YAML :: Value << "baz" ;
out << YAML :: EndMap ;
2011-03-03 08:57:00 +00:00
desiredOutput = "{!<!foo> bar: baz}" ;
2009-10-29 15:48:06 +00:00
}
void VerbatimTagInFlowMapWithNull ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: Flow << YAML :: BeginMap ;
out << YAML :: Key << YAML :: VerbatimTag ( "!foo" ) << YAML :: Null ;
out << YAML :: Value << "baz" ;
out << YAML :: EndMap ;
2011-03-03 08:57:00 +00:00
desiredOutput = "{!<!foo> ~: baz}" ;
2009-10-29 15:48:06 +00:00
}
void VerbatimTagWithEmptySeq ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: VerbatimTag ( "!foo" ) << YAML :: BeginSeq << YAML :: EndSeq ;
2011-03-03 08:57:00 +00:00
desiredOutput = "!<!foo> \n []" ;
2009-10-29 15:48:06 +00:00
}
void VerbatimTagWithEmptyMap ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: VerbatimTag ( "!bar" ) << YAML :: BeginMap << YAML :: EndMap ;
2011-03-03 08:57:00 +00:00
desiredOutput = "!<!bar> \n {}" ;
2009-10-29 15:48:06 +00:00
}
void VerbatimTagWithEmptySeqAndMap ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginSeq ;
out << YAML :: VerbatimTag ( "!foo" ) << YAML :: BeginSeq << YAML :: EndSeq ;
out << YAML :: VerbatimTag ( "!bar" ) << YAML :: BeginMap << YAML :: EndMap ;
out << YAML :: EndSeq ;
2011-03-03 08:57:00 +00:00
desiredOutput = "- !<!foo> \n [] \n - !<!bar> \n {}" ;
2009-08-24 22:56:54 +00:00
}
2010-10-19 06:51:54 +00:00
void ByKindTagWithScalar ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginSeq ;
out << YAML :: DoubleQuoted << "12" ;
out << "12" ;
out << YAML :: TagByKind << "12" ;
out << YAML :: EndSeq ;
2011-03-03 08:57:00 +00:00
desiredOutput = "- \" 12 \"\n - 12 \n - ! 12" ;
2010-10-19 06:51:54 +00:00
}
void LocalTagWithScalar ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: LocalTag ( "foo" ) << "bar" ;
2011-03-03 08:57:00 +00:00
desiredOutput = "!foo bar" ;
2010-10-19 06:51:54 +00:00
}
void BadLocalTag ( YAML :: Emitter & out , std :: string & desiredError )
{
out << YAML :: LocalTag ( "e!far" ) << "bar" ;
desiredError = "invalid tag" ;
}
2009-07-30 04:42:27 +00:00
void ComplexDoc ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginMap ;
out << YAML :: Key << "receipt" ;
out << YAML :: Value << "Oz-Ware Purchase Invoice" ;
out << YAML :: Key << "date" ;
out << YAML :: Value << "2007-08-06" ;
out << YAML :: Key << "customer" ;
out << YAML :: Value ;
out << YAML :: BeginMap ;
out << YAML :: Key << "given" ;
out << YAML :: Value << "Dorothy" ;
out << YAML :: Key << "family" ;
out << YAML :: Value << "Gale" ;
out << YAML :: EndMap ;
out << YAML :: Key << "items" ;
out << YAML :: Value ;
out << YAML :: BeginSeq ;
out << YAML :: BeginMap ;
out << YAML :: Key << "part_no" ;
out << YAML :: Value << "A4786" ;
out << YAML :: Key << "descrip" ;
out << YAML :: Value << "Water Bucket (Filled)" ;
out << YAML :: Key << "price" ;
out << YAML :: Value << 1.47 ;
out << YAML :: Key << "quantity" ;
out << YAML :: Value << 4 ;
out << YAML :: EndMap ;
out << YAML :: BeginMap ;
out << YAML :: Key << "part_no" ;
out << YAML :: Value << "E1628" ;
out << YAML :: Key << "descrip" ;
out << YAML :: Value << "High Heeled \" Ruby \" Slippers" ;
out << YAML :: Key << "price" ;
out << YAML :: Value << 100.27 ;
out << YAML :: Key << "quantity" ;
out << YAML :: Value << 1 ;
out << YAML :: EndMap ;
out << YAML :: EndSeq ;
out << YAML :: Key << "bill-to" ;
out << YAML :: Value << YAML :: Anchor ( "id001" );
out << YAML :: BeginMap ;
out << YAML :: Key << "street" ;
out << YAML :: Value << YAML :: Literal << "123 Tornado Alley \n Suite 16" ;
out << YAML :: Key << "city" ;
out << YAML :: Value << "East Westville" ;
out << YAML :: Key << "state" ;
out << YAML :: Value << "KS" ;
out << YAML :: EndMap ;
out << YAML :: Key << "ship-to" ;
out << YAML :: Value << YAML :: Alias ( "id001" );
out << YAML :: EndMap ;
2011-03-03 08:57:00 +00:00
desiredOutput = "receipt: Oz-Ware Purchase Invoice \n date: 2007-08-06 \n customer: \n given: Dorothy \n family: Gale \n items: \n - part_no: A4786 \n descrip: Water Bucket (Filled) \n price: 1.47 \n quantity: 4 \n - part_no: E1628 \n descrip: High Heeled \" Ruby \" Slippers \n price: 100.27 \n quantity: 1 \n bill-to: &id001 \n street: | \n 123 Tornado Alley \n Suite 16 \n city: East Westville \n state: KS \n ship-to: *id001" ;
2009-07-30 04:42:27 +00:00
}
void STLContainers ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginSeq ;
std :: vector < int > primes ;
primes . push_back ( 2 );
primes . push_back ( 3 );
primes . push_back ( 5 );
primes . push_back ( 7 );
primes . push_back ( 11 );
primes . push_back ( 13 );
out << YAML :: Flow << primes ;
std :: map < std :: string , int > ages ;
ages [ "Daniel" ] = 26 ;
ages [ "Jesse" ] = 24 ;
out << ages ;
out << YAML :: EndSeq ;
2011-03-03 08:57:00 +00:00
desiredOutput = "- [2, 3, 5, 7, 11, 13] \n - Daniel: 26 \n Jesse: 24" ;
2009-07-30 04:42:27 +00:00
}
void SimpleComment ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginMap ;
out << YAML :: Key << "method" ;
out << YAML :: Value << "least squares" << YAML :: Comment ( "should we change this method?" );
out << YAML :: EndMap ;
2011-03-03 08:57:00 +00:00
desiredOutput = "method: least squares # should we change this method?" ;
2009-07-30 04:42:27 +00:00
}
void MultiLineComment ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginSeq ;
out << "item 1" << YAML :: Comment ( "really really long \n comment that couldn't possibly \n fit on one line" );
out << "item 2" ;
out << YAML :: EndSeq ;
2011-03-03 08:57:00 +00:00
desiredOutput = "- item 1 # really really long \n # comment that couldn't possibly \n # fit on one line \n - item 2" ;
2009-07-30 04:42:27 +00:00
}
void ComplexComments ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginMap ;
out << YAML :: LongKey << YAML :: Key << "long key" << YAML :: Comment ( "long key" );
out << YAML :: Value << "value" ;
out << YAML :: EndMap ;
2011-03-03 08:57:00 +00:00
desiredOutput = "? long key # long key \n : value" ;
2009-07-30 04:42:27 +00:00
}
2011-08-04 21:47:57 +00:00
void InitialComment ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: Comment ( "A comment describing the purpose of the file." );
out << YAML :: BeginMap << YAML :: Key << "key" << YAML :: Value << "value" << YAML :: EndMap ;
desiredOutput = "# A comment describing the purpose of the file. \n key: value" ;
}
void InitialCommentWithDocIndicator ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginDoc << YAML :: Comment ( "A comment describing the purpose of the file." );
out << YAML :: BeginMap << YAML :: Key << "key" << YAML :: Value << "value" << YAML :: EndMap ;
desiredOutput = "--- \n # A comment describing the purpose of the file. \n key: value" ;
}
void CommentInFlowSeq ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: Flow << YAML :: BeginSeq << "foo" << YAML :: Comment ( "foo!" ) << "bar" << YAML :: EndSeq ;
desiredOutput = "[foo # foo! \n , bar]" ;
}
void CommentInFlowMap ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: Flow << YAML :: BeginMap ;
2012-01-11 17:06:27 -06:00
out << YAML :: Key << "foo" << YAML :: Value << "foo value" ;
2011-08-04 21:47:57 +00:00
out << YAML :: Key << "bar" << YAML :: Value << "bar value" << YAML :: Comment ( "bar!" );
2012-01-11 17:06:27 -06:00
out << YAML :: Key << "baz" << YAML :: Value << "baz value" << YAML :: Comment ( "baz!" );
2011-08-04 21:47:57 +00:00
out << YAML :: EndMap ;
2012-01-11 17:06:27 -06:00
desiredOutput = "{foo: foo value, bar: bar value # bar! \n , baz: baz value # baz! \n }" ;
2011-08-04 21:47:57 +00:00
}
2009-07-30 04:42:27 +00:00
void Indentation ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: Indent ( 4 );
out << YAML :: BeginSeq ;
out << YAML :: BeginMap ;
out << YAML :: Key << "key 1" << YAML :: Value << "value 1" ;
out << YAML :: Key << "key 2" << YAML :: Value << YAML :: BeginSeq << "a" << "b" << "c" << YAML :: EndSeq ;
out << YAML :: EndMap ;
out << YAML :: EndSeq ;
2011-03-03 08:57:00 +00:00
desiredOutput = "- key 1: value 1 \n key 2: \n - a \n - b \n - c" ;
2009-07-30 04:42:27 +00:00
}
void SimpleGlobalSettings ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out . SetIndent ( 4 );
out . SetMapFormat ( YAML :: LongKey );
out << YAML :: BeginSeq ;
out << YAML :: BeginMap ;
out << YAML :: Key << "key 1" << YAML :: Value << "value 1" ;
out << YAML :: Key << "key 2" << YAML :: Value << YAML :: Flow << YAML :: BeginSeq << "a" << "b" << "c" << YAML :: EndSeq ;
out << YAML :: EndMap ;
out << YAML :: EndSeq ;
2011-03-03 08:57:00 +00:00
desiredOutput = "- ? key 1 \n : value 1 \n ? key 2 \n : [a, b, c]" ;
2009-07-30 04:42:27 +00:00
}
void ComplexGlobalSettings ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginSeq ;
out << YAML :: Block ;
out << YAML :: BeginMap ;
out << YAML :: Key << "key 1" << YAML :: Value << "value 1" ;
out << YAML :: Key << "key 2" << YAML :: Value ;
out . SetSeqFormat ( YAML :: Flow );
out << YAML :: BeginSeq << "a" << "b" << "c" << YAML :: EndSeq ;
out << YAML :: EndMap ;
out << YAML :: BeginMap ;
out << YAML :: Key << YAML :: BeginSeq << 1 << 2 << YAML :: EndSeq ;
out << YAML :: Value << YAML :: BeginMap << YAML :: Key << "a" << YAML :: Value << "b" << YAML :: EndMap ;
out << YAML :: EndMap ;
out << YAML :: EndSeq ;
2011-03-03 08:57:00 +00:00
desiredOutput = "- key 1: value 1 \n key 2: [a, b, c] \n - ? [1, 2] \n : \n a: b" ;
2009-07-30 04:42:27 +00:00
}
void Null ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginSeq ;
out << YAML :: Null ;
out << YAML :: BeginMap ;
out << YAML :: Key << "null value" << YAML :: Value << YAML :: Null ;
out << YAML :: Key << YAML :: Null << YAML :: Value << "null key" ;
out << YAML :: EndMap ;
out << YAML :: EndSeq ;
2011-03-03 08:57:00 +00:00
desiredOutput = "- ~ \n - null value: ~ \n ~: null key" ;
2009-07-30 04:42:27 +00:00
}
2009-10-07 06:46:05 +00:00
2009-10-19 23:31:11 +00:00
void EscapedUnicode ( YAML :: Emitter & out , std :: string & desiredOutput )
2009-10-07 06:46:05 +00:00
{
2009-10-19 23:31:11 +00:00
out << YAML :: EscapeNonAscii << " \x24 \xC2\xA2 \xE2\x82\xAC \xF0\xA4\xAD\xA2 " ;
2009-10-07 06:46:05 +00:00
2011-03-03 08:57:00 +00:00
desiredOutput = " \" $ \\ xa2 \\ u20ac \\ U00024b62 \" " ;
2009-10-07 06:46:05 +00:00
}
2009-10-19 23:31:11 +00:00
void Unicode ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << " \x24 \xC2\xA2 \xE2\x82\xAC \xF0\xA4\xAD\xA2 " ;
2011-03-03 08:57:00 +00:00
desiredOutput = " \x24 \xC2\xA2 \xE2\x82\xAC \xF0\xA4\xAD\xA2 " ;
2009-10-19 23:31:11 +00:00
}
void DoubleQuotedUnicode ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: DoubleQuoted << " \x24 \xC2\xA2 \xE2\x82\xAC \xF0\xA4\xAD\xA2 " ;
2011-03-03 08:57:00 +00:00
desiredOutput = " \"\x24 \xC2\xA2 \xE2\x82\xAC \xF0\xA4\xAD\xA2\" " ;
2009-10-19 23:31:11 +00:00
}
2009-11-17 20:21:22 +00:00
struct Foo {
Foo () : x ( 0 ) {}
Foo ( int x_ , const std :: string & bar_ ) : x ( x_ ), bar ( bar_ ) {}
int x ;
std :: string bar ;
};
YAML :: Emitter & operator << ( YAML :: Emitter & out , const Foo & foo ) {
out << YAML :: BeginMap ;
out << YAML :: Key << "x" << YAML :: Value << foo . x ;
out << YAML :: Key << "bar" << YAML :: Value << foo . bar ;
out << YAML :: EndMap ;
return out ;
}
void UserType ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginSeq ;
out << Foo ( 5 , "hello" );
out << Foo ( 3 , "goodbye" );
out << YAML :: EndSeq ;
2011-03-03 08:57:00 +00:00
desiredOutput = "- x: 5 \n bar: hello \n - x: 3 \n bar: goodbye" ;
2009-11-17 20:21:22 +00:00
}
void UserTypeInContainer ( YAML :: Emitter & out , std :: string & desiredOutput )
{
std :: vector < Foo > fv ;
fv . push_back ( Foo ( 5 , "hello" ));
fv . push_back ( Foo ( 3 , "goodbye" ));
out << fv ;
2011-03-03 08:57:00 +00:00
desiredOutput = "- x: 5 \n bar: hello \n - x: 3 \n bar: goodbye" ;
2009-11-17 20:21:22 +00:00
}
template < typename T >
YAML :: Emitter & operator << ( YAML :: Emitter & out , const T * v ) {
if ( v )
out << * v ;
else
out << YAML :: Null ;
return out ;
}
void PointerToInt ( YAML :: Emitter & out , std :: string & desiredOutput )
{
int foo = 5 ;
int * bar = & foo ;
int * baz = 0 ;
out << YAML :: BeginSeq ;
out << bar << baz ;
out << YAML :: EndSeq ;
2011-03-03 08:57:00 +00:00
desiredOutput = "- 5 \n - ~" ;
2009-11-17 20:21:22 +00:00
}
void PointerToUserType ( YAML :: Emitter & out , std :: string & desiredOutput )
{
Foo foo ( 5 , "hello" );
Foo * bar = & foo ;
Foo * baz = 0 ;
out << YAML :: BeginSeq ;
out << bar << baz ;
out << YAML :: EndSeq ;
2011-03-03 08:57:00 +00:00
desiredOutput = "- x: 5 \n bar: hello \n - ~" ;
2009-11-17 20:21:22 +00:00
}
2010-10-21 22:02:29 +00:00
void NewlineAtEnd ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << "Hello" << YAML :: Newline << YAML :: Newline ;
2011-03-03 08:57:00 +00:00
desiredOutput = "Hello \n\n " ;
2010-10-21 22:02:29 +00:00
}
void NewlineInBlockSequence ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginSeq ;
out << "a" << YAML :: Newline << "b" << "c" << YAML :: Newline << "d" ;
out << YAML :: EndSeq ;
2011-03-03 08:57:00 +00:00
desiredOutput = "- a \n\n - b \n - c \n\n - d" ;
2010-10-21 22:02:29 +00:00
}
void NewlineInFlowSequence ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: Flow << YAML :: BeginSeq ;
out << "a" << YAML :: Newline << "b" << "c" << YAML :: Newline << "d" ;
out << YAML :: EndSeq ;
2011-03-03 08:57:00 +00:00
desiredOutput = "[a \n , b, c \n , d]" ;
2010-10-21 22:02:29 +00:00
}
2010-10-22 03:53:33 +00:00
void NewlineInBlockMap ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginMap ;
out << YAML :: Key << "a" << YAML :: Value << "foo" << YAML :: Newline ;
out << YAML :: Key << "b" << YAML :: Newline << YAML :: Value << "bar" ;
out << YAML :: LongKey << YAML :: Key << "c" << YAML :: Newline << YAML :: Value << "car" ;
out << YAML :: EndMap ;
2011-03-03 08:57:00 +00:00
desiredOutput = "a: foo \n\n b: bar \n ? c \n\n : car" ;
2010-10-22 03:53:33 +00:00
}
2010-10-21 22:02:29 +00:00
2010-10-22 03:53:33 +00:00
void NewlineInFlowMap ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: Flow << YAML :: BeginMap ;
out << YAML :: Key << "a" << YAML :: Value << "foo" << YAML :: Newline ;
2012-01-11 17:06:27 -06:00
out << YAML :: Key << "b" << YAML :: Value << "bar" ;
2010-10-22 03:53:33 +00:00
out << YAML :: EndMap ;
2012-01-11 17:06:27 -06:00
desiredOutput = "{a: foo \n , b: bar}" ;
2010-10-22 03:53:33 +00:00
}
void LotsOfNewlines ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginSeq ;
out << "a" << YAML :: Newline ;
out << YAML :: BeginSeq ;
out << "b" << "c" << YAML :: Newline ;
out << YAML :: EndSeq ;
out << YAML :: Newline ;
out << YAML :: BeginMap ;
out << YAML :: Newline << YAML :: Key << "d" << YAML :: Value << YAML :: Newline << "e" ;
out << YAML :: LongKey << YAML :: Key << "f" << YAML :: Newline << YAML :: Value << "foo" ;
out << YAML :: EndMap ;
out << YAML :: EndSeq ;
2011-03-03 08:57:00 +00:00
desiredOutput = "- a \n\n - \n - b \n - c \n\n\n - \n d: e \n ? f \n\n : foo" ;
2010-10-22 03:53:33 +00:00
}
2010-10-28 21:53:54 +00:00
void Binary ( YAML :: Emitter & out , std :: string & desiredOutput )
{
2011-09-06 00:39:31 -05:00
out << YAML :: Binary ( reinterpret_cast < const unsigned char *> ( "Hello, World!" ), 13 );
2011-03-03 08:57:00 +00:00
desiredOutput = "!!binary \" SGVsbG8sIFdvcmxkIQ== \" " ;
2010-10-28 21:53:54 +00:00
}
void LongBinary ( YAML :: Emitter & out , std :: string & desiredOutput )
{
2011-09-06 00:39:31 -05:00
out << YAML :: Binary ( reinterpret_cast < const unsigned char *> ( "Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure. \n " ), 270 );
2011-03-03 08:57:00 +00:00
desiredOutput = "!!binary \" TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4K \" " ;
2010-10-28 21:53:54 +00:00
}
void EmptyBinary ( YAML :: Emitter & out , std :: string & desiredOutput )
{
2011-09-06 00:39:31 -05:00
out << YAML :: Binary ( reinterpret_cast < const unsigned char *> ( "" ), 0 );
2011-03-03 08:57:00 +00:00
desiredOutput = "!!binary \"\" " ;
2010-10-28 21:53:54 +00:00
}
2010-12-03 21:52:04 +00:00
void ColonAtEndOfScalar ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << "a:" ;
2011-03-03 08:57:00 +00:00
desiredOutput = " \" a: \" " ;
2010-12-03 21:52:04 +00:00
}
void ColonAsScalar ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginMap ;
out << YAML :: Key << "apple" << YAML :: Value << ":" ;
out << YAML :: Key << "banana" << YAML :: Value << ":" ;
out << YAML :: EndMap ;
2011-03-03 08:57:00 +00:00
desiredOutput = "apple: \" : \"\n banana: \" : \" " ;
2010-12-03 21:52:04 +00:00
}
2011-03-02 20:55:05 +00:00
2011-10-31 19:16:17 -05:00
void ColonAtEndOfScalarInFlow ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: Flow << YAML :: BeginMap << YAML :: Key << "C:" << YAML :: Value << "C:" << YAML :: EndMap ;
desiredOutput = "{ \" C: \" : \" C: \" }" ;
}
2011-03-02 20:55:05 +00:00
void BoolFormatting ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginSeq ;
out << YAML :: TrueFalseBool << YAML :: UpperCase << true ;
out << YAML :: TrueFalseBool << YAML :: CamelCase << true ;
out << YAML :: TrueFalseBool << YAML :: LowerCase << true ;
out << YAML :: TrueFalseBool << YAML :: UpperCase << false ;
out << YAML :: TrueFalseBool << YAML :: CamelCase << false ;
out << YAML :: TrueFalseBool << YAML :: LowerCase << false ;
out << YAML :: YesNoBool << YAML :: UpperCase << true ;
out << YAML :: YesNoBool << YAML :: CamelCase << true ;
out << YAML :: YesNoBool << YAML :: LowerCase << true ;
out << YAML :: YesNoBool << YAML :: UpperCase << false ;
out << YAML :: YesNoBool << YAML :: CamelCase << false ;
out << YAML :: YesNoBool << YAML :: LowerCase << false ;
out << YAML :: OnOffBool << YAML :: UpperCase << true ;
out << YAML :: OnOffBool << YAML :: CamelCase << true ;
out << YAML :: OnOffBool << YAML :: LowerCase << true ;
out << YAML :: OnOffBool << YAML :: UpperCase << false ;
out << YAML :: OnOffBool << YAML :: CamelCase << false ;
out << YAML :: OnOffBool << YAML :: LowerCase << false ;
out << YAML :: ShortBool << YAML :: UpperCase << true ;
out << YAML :: ShortBool << YAML :: CamelCase << true ;
out << YAML :: ShortBool << YAML :: LowerCase << true ;
out << YAML :: ShortBool << YAML :: UpperCase << false ;
out << YAML :: ShortBool << YAML :: CamelCase << false ;
out << YAML :: ShortBool << YAML :: LowerCase << false ;
out << YAML :: EndSeq ;
desiredOutput =
2011-03-03 08:57:00 +00:00
"- TRUE \n - True \n - true \n - FALSE \n - False \n - false \n "
2011-03-02 20:55:05 +00:00
"- YES \n - Yes \n - yes \n - NO \n - No \n - no \n "
"- ON \n - On \n - on \n - OFF \n - Off \n - off \n "
"- Y \n - Y \n - y \n - N \n - N \n - n" ;
}
2011-03-03 09:26:12 +00:00
void DocStartAndEnd ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginDoc ;
out << YAML :: BeginSeq << 1 << 2 << 3 << YAML :: EndSeq ;
out << YAML :: BeginDoc ;
out << "Hi there!" ;
out << YAML :: EndDoc ;
out << YAML :: EndDoc ;
out << YAML :: EndDoc ;
out << YAML :: BeginDoc ;
out << YAML :: VerbatimTag ( "foo" ) << "bar" ;
desiredOutput = "--- \n - 1 \n - 2 \n - 3 \n --- \n Hi there! \n ... \n ... \n ... \n --- \n !<foo> bar" ;
}
void ImplicitDocStart ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << "Hi" ;
out << "Bye" ;
out << "Oops" ;
desiredOutput = "Hi \n --- \n Bye \n --- \n Oops" ;
}
2011-09-06 00:24:10 -05:00
void EmptyString ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginMap ;
out << YAML :: Key << "key" << YAML :: Value << "" ;
out << YAML :: EndMap ;
desiredOutput = "key: \"\" " ;
}
2011-11-14 16:23:14 -06:00
void SingleChar ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginSeq ;
out << 'a' ;
out << ':' ;
out << ( char ) 0x10 ;
out << '\n' ;
out << ' ' ;
out << '\t' ;
out << YAML :: EndSeq ;
desiredOutput = "- a \n - \" : \"\n - \"\\ x10 \"\n - \"\\ n \"\n - \" \"\n - \"\\ t \" " ;
}
2012-01-11 14:34:04 -06:00
void DefaultPrecision ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginSeq ;
out << 1.234f ;
out << 3.14159265358979 ;
out << YAML :: EndSeq ;
desiredOutput = "- 1.234 \n - 3.14159265358979" ;
}
2010-10-22 03:53:33 +00:00
2012-01-11 14:34:04 -06:00
void SetPrecision ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginSeq ;
out << YAML :: FloatPrecision ( 3 ) << 1.234f ;
out << YAML :: DoublePrecision ( 6 ) << 3.14159265358979 ;
out << YAML :: EndSeq ;
desiredOutput = "- 1.23 \n - 3.14159" ;
}
2012-01-11 16:39:24 -06:00
void DashInBlockContext ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: BeginMap ;
out << YAML :: Key << "key" << YAML :: Value << "-" ;
out << YAML :: EndMap ;
desiredOutput = "key: \" - \" " ;
}
2012-01-13 00:00:11 -06:00
void HexAndOct ( YAML :: Emitter & out , std :: string & desiredOutput )
{
out << YAML :: Flow << YAML :: BeginSeq ;
out << 31 ;
out << YAML :: Hex << 31 ;
out << YAML :: Oct << 31 ;
out << YAML :: EndSeq ;
desiredOutput = "[31, 0x1f, 037]" ;
}
2012-01-11 16:39:24 -06:00
////////////////////////////////////////////////////////////////////////////////////////////////////////
2009-07-30 04:42:27 +00:00
// incorrect emitting
void ExtraEndSeq ( YAML :: Emitter & out , std :: string & desiredError )
{
desiredError = YAML :: ErrorMsg :: UNEXPECTED_END_SEQ ;
out << YAML :: BeginSeq ;
out << "Hello" ;
out << "World" ;
out << YAML :: EndSeq ;
out << YAML :: EndSeq ;
}
void ExtraEndMap ( YAML :: Emitter & out , std :: string & desiredError )
{
desiredError = YAML :: ErrorMsg :: UNEXPECTED_END_MAP ;
out << YAML :: BeginMap ;
out << YAML :: Key << "Hello" << YAML :: Value << "World" ;
out << YAML :: EndMap ;
out << YAML :: EndMap ;
}
void BadSingleQuoted ( YAML :: Emitter & out , std :: string & desiredError )
{
desiredError = YAML :: ErrorMsg :: SINGLE_QUOTED_CHAR ;
out << YAML :: SingleQuoted << "Hello \n World" ;
}
void InvalidAnchor ( YAML :: Emitter & out , std :: string & desiredError )
{
desiredError = YAML :: ErrorMsg :: INVALID_ANCHOR ;
out << YAML :: BeginSeq ;
out << YAML :: Anchor ( "new \n line" ) << "Test" ;
out << YAML :: EndSeq ;
}
void InvalidAlias ( YAML :: Emitter & out , std :: string & desiredError )
{
desiredError = YAML :: ErrorMsg :: INVALID_ALIAS ;
out << YAML :: BeginSeq ;
out << YAML :: Alias ( "new \n line" );
out << YAML :: EndSeq ;
}
void MissingKey ( YAML :: Emitter & out , std :: string & desiredError )
{
desiredError = YAML :: ErrorMsg :: EXPECTED_KEY_TOKEN ;
out << YAML :: BeginMap ;
out << YAML :: Key << "key" << YAML :: Value << "value" ;
out << "missing key" << YAML :: Value << "value" ;
out << YAML :: EndMap ;
}
void MissingValue ( YAML :: Emitter & out , std :: string & desiredError )
{
desiredError = YAML :: ErrorMsg :: EXPECTED_VALUE_TOKEN ;
out << YAML :: BeginMap ;
out << YAML :: Key << "key" << "value" ;
out << YAML :: EndMap ;
}
void UnexpectedKey ( YAML :: Emitter & out , std :: string & desiredError )
{
desiredError = YAML :: ErrorMsg :: UNEXPECTED_KEY_TOKEN ;
out << YAML :: BeginSeq ;
out << YAML :: Key << "hi" ;
out << YAML :: EndSeq ;
}
void UnexpectedValue ( YAML :: Emitter & out , std :: string & desiredError )
{
desiredError = YAML :: ErrorMsg :: UNEXPECTED_VALUE_TOKEN ;
out << YAML :: BeginSeq ;
out << YAML :: Value << "hi" ;
out << YAML :: EndSeq ;
}
}
2009-09-07 22:17:02 +00:00
namespace {
void RunEmitterTest ( void ( * test )( YAML :: Emitter & , std :: string & ), const std :: string & name , int & passed , int & total ) {
YAML :: Emitter out ;
std :: string desiredOutput ;
test ( out , desiredOutput );
std :: string output = out . c_str ();
2011-03-03 09:26:12 +00:00
std :: string lastError = out . GetLastError ();
2009-09-07 22:17:02 +00:00
if ( output == desiredOutput ) {
2011-03-03 08:04:30 +00:00
try {
2011-09-10 18:02:07 -05:00
#ifdef YAML_CPP_OLD_API
2011-03-03 08:04:30 +00:00
std :: stringstream stream ( output );
YAML :: Parser parser ;
YAML :: Node node ;
parser . GetNextDocument ( node );
2011-09-10 18:02:07 -05:00
#else
2012-01-11 16:41:13 -06:00
YAML :: Node node = YAML :: Load ( output );
2011-09-10 18:02:07 -05:00
#endif
2011-03-03 08:04:30 +00:00
passed ++ ;
} catch ( const YAML :: Exception & e ) {
std :: cout << "Emitter test failed: " << name << " \n " ;
std :: cout << "Parsing output error: " << e . what () << " \n " ;
}
2009-09-07 22:17:02 +00:00
} else {
std :: cout << "Emitter test failed: " << name << " \n " ;
std :: cout << "Output: \n " ;
std :: cout << output << "<<< \n " ;
std :: cout << "Desired output: \n " ;
std :: cout << desiredOutput << "<<< \n " ;
2011-03-03 09:26:12 +00:00
if ( ! out . good ())
std :: cout << "Emitter error: " << lastError << " \n " ;
2009-09-07 22:17:02 +00:00
}
total ++ ;
}
void RunEmitterErrorTest ( void ( * test )( YAML :: Emitter & , std :: string & ), const std :: string & name , int & passed , int & total ) {
YAML :: Emitter out ;
std :: string desiredError ;
test ( out , desiredError );
std :: string lastError = out . GetLastError ();
if ( ! out . good () && lastError == desiredError ) {
passed ++ ;
} else {
std :: cout << "Emitter test failed: " << name << " \n " ;
if ( out . good ())
std :: cout << "No error detected \n " ;
else
std :: cout << "Detected error: " << lastError << " \n " ;
std :: cout << "Expected error: " << desiredError << " \n " ;
}
total ++ ;
}
}
bool RunEmitterTests ()
{
int passed = 0 ;
int total = 0 ;
RunEmitterTest ( & Emitter :: SimpleScalar , "simple scalar" , passed , total );
RunEmitterTest ( & Emitter :: SimpleSeq , "simple seq" , passed , total );
RunEmitterTest ( & Emitter :: SimpleFlowSeq , "simple flow seq" , passed , total );
RunEmitterTest ( & Emitter :: EmptyFlowSeq , "empty flow seq" , passed , total );
RunEmitterTest ( & Emitter :: NestedBlockSeq , "nested block seq" , passed , total );
RunEmitterTest ( & Emitter :: NestedFlowSeq , "nested flow seq" , passed , total );
RunEmitterTest ( & Emitter :: SimpleMap , "simple map" , passed , total );
RunEmitterTest ( & Emitter :: SimpleFlowMap , "simple flow map" , passed , total );
RunEmitterTest ( & Emitter :: MapAndList , "map and list" , passed , total );
RunEmitterTest ( & Emitter :: ListAndMap , "list and map" , passed , total );
RunEmitterTest ( & Emitter :: NestedBlockMap , "nested block map" , passed , total );
RunEmitterTest ( & Emitter :: NestedFlowMap , "nested flow map" , passed , total );
RunEmitterTest ( & Emitter :: MapListMix , "map list mix" , passed , total );
RunEmitterTest ( & Emitter :: SimpleLongKey , "simple long key" , passed , total );
RunEmitterTest ( & Emitter :: SingleLongKey , "single long key" , passed , total );
RunEmitterTest ( & Emitter :: ComplexLongKey , "complex long key" , passed , total );
RunEmitterTest ( & Emitter :: AutoLongKey , "auto long key" , passed , total );
RunEmitterTest ( & Emitter :: ScalarFormat , "scalar format" , passed , total );
RunEmitterTest ( & Emitter :: AutoLongKeyScalar , "auto long key scalar" , passed , total );
RunEmitterTest ( & Emitter :: LongKeyFlowMap , "long key flow map" , passed , total );
RunEmitterTest ( & Emitter :: BlockMapAsKey , "block map as key" , passed , total );
RunEmitterTest ( & Emitter :: AliasAndAnchor , "alias and anchor" , passed , total );
RunEmitterTest ( & Emitter :: AliasAndAnchorWithNull , "alias and anchor with null" , passed , total );
2011-08-04 21:50:04 +00:00
RunEmitterTest ( & Emitter :: AliasAndAnchorInFlow , "alias and anchor in flow" , passed , total );
2009-10-29 15:48:06 +00:00
RunEmitterTest ( & Emitter :: SimpleVerbatimTag , "simple verbatim tag" , passed , total );
RunEmitterTest ( & Emitter :: VerbatimTagInBlockSeq , "verbatim tag in block seq" , passed , total );
RunEmitterTest ( & Emitter :: VerbatimTagInFlowSeq , "verbatim tag in flow seq" , passed , total );
RunEmitterTest ( & Emitter :: VerbatimTagInFlowSeqWithNull , "verbatim tag in flow seq with null" , passed , total );
RunEmitterTest ( & Emitter :: VerbatimTagInBlockMap , "verbatim tag in block map" , passed , total );
RunEmitterTest ( & Emitter :: VerbatimTagInFlowMap , "verbatim tag in flow map" , passed , total );
RunEmitterTest ( & Emitter :: VerbatimTagInFlowMapWithNull , "verbatim tag in flow map with null" , passed , total );
RunEmitterTest ( & Emitter :: VerbatimTagWithEmptySeq , "verbatim tag with empty seq" , passed , total );
RunEmitterTest ( & Emitter :: VerbatimTagWithEmptyMap , "verbatim tag with empty map" , passed , total );
RunEmitterTest ( & Emitter :: VerbatimTagWithEmptySeqAndMap , "verbatim tag with empty seq and map" , passed , total );
2010-10-19 06:51:54 +00:00
RunEmitterTest ( & Emitter :: ByKindTagWithScalar , "by-kind tag with scalar" , passed , total );
RunEmitterTest ( & Emitter :: LocalTagWithScalar , "local tag with scalar" , passed , total );
2009-09-07 22:17:02 +00:00
RunEmitterTest ( & Emitter :: ComplexDoc , "complex doc" , passed , total );
RunEmitterTest ( & Emitter :: STLContainers , "STL containers" , passed , total );
RunEmitterTest ( & Emitter :: SimpleComment , "simple comment" , passed , total );
RunEmitterTest ( & Emitter :: MultiLineComment , "multi-line comment" , passed , total );
RunEmitterTest ( & Emitter :: ComplexComments , "complex comments" , passed , total );
2011-08-04 21:47:57 +00:00
RunEmitterTest ( & Emitter :: InitialComment , "initial comment" , passed , total );
RunEmitterTest ( & Emitter :: InitialCommentWithDocIndicator , "initial comment with doc indicator" , passed , total );
RunEmitterTest ( & Emitter :: CommentInFlowSeq , "comment in flow seq" , passed , total );
RunEmitterTest ( & Emitter :: CommentInFlowMap , "comment in flow map" , passed , total );
2009-09-07 22:17:02 +00:00
RunEmitterTest ( & Emitter :: Indentation , "indentation" , passed , total );
RunEmitterTest ( & Emitter :: SimpleGlobalSettings , "simple global settings" , passed , total );
RunEmitterTest ( & Emitter :: ComplexGlobalSettings , "complex global settings" , passed , total );
RunEmitterTest ( & Emitter :: Null , "null" , passed , total );
2009-10-19 23:31:11 +00:00
RunEmitterTest ( & Emitter :: EscapedUnicode , "escaped unicode" , passed , total );
2009-10-07 06:46:05 +00:00
RunEmitterTest ( & Emitter :: Unicode , "unicode" , passed , total );
2009-10-19 23:31:11 +00:00
RunEmitterTest ( & Emitter :: DoubleQuotedUnicode , "double quoted unicode" , passed , total );
2009-11-17 20:21:22 +00:00
RunEmitterTest ( & Emitter :: UserType , "user type" , passed , total );
RunEmitterTest ( & Emitter :: UserTypeInContainer , "user type in container" , passed , total );
RunEmitterTest ( & Emitter :: PointerToInt , "pointer to int" , passed , total );
RunEmitterTest ( & Emitter :: PointerToUserType , "pointer to user type" , passed , total );
2010-10-21 22:02:29 +00:00
RunEmitterTest ( & Emitter :: NewlineAtEnd , "newline at end" , passed , total );
RunEmitterTest ( & Emitter :: NewlineInBlockSequence , "newline in block sequence" , passed , total );
RunEmitterTest ( & Emitter :: NewlineInFlowSequence , "newline in flow sequence" , passed , total );
2010-10-22 03:53:33 +00:00
RunEmitterTest ( & Emitter :: NewlineInBlockMap , "newline in block map" , passed , total );
RunEmitterTest ( & Emitter :: NewlineInFlowMap , "newline in flow map" , passed , total );
RunEmitterTest ( & Emitter :: LotsOfNewlines , "lots of newlines" , passed , total );
2010-10-28 21:53:54 +00:00
RunEmitterTest ( & Emitter :: Binary , "binary" , passed , total );
RunEmitterTest ( & Emitter :: LongBinary , "long binary" , passed , total );
RunEmitterTest ( & Emitter :: EmptyBinary , "empty binary" , passed , total );
2010-12-03 21:52:04 +00:00
RunEmitterTest ( & Emitter :: ColonAtEndOfScalar , "colon at end of scalar" , passed , total );
RunEmitterTest ( & Emitter :: ColonAsScalar , "colon as scalar" , passed , total );
2011-10-31 19:16:17 -05:00
RunEmitterTest ( & Emitter :: ColonAtEndOfScalarInFlow , "colon at end of scalar in flow" , passed , total );
2011-03-02 20:55:05 +00:00
RunEmitterTest ( & Emitter :: BoolFormatting , "bool formatting" , passed , total );
2011-03-03 09:26:12 +00:00
RunEmitterTest ( & Emitter :: DocStartAndEnd , "doc start and end" , passed , total );
RunEmitterTest ( & Emitter :: ImplicitDocStart , "implicit doc start" , passed , total );
2011-09-06 00:24:10 -05:00
RunEmitterTest ( & Emitter :: EmptyString , "empty string" , passed , total );
2011-11-14 16:23:14 -06:00
RunEmitterTest ( & Emitter :: SingleChar , "single char" , passed , total );
2012-01-11 14:34:04 -06:00
RunEmitterTest ( & Emitter :: DefaultPrecision , "default precision" , passed , total );
RunEmitterTest ( & Emitter :: SetPrecision , "set precision" , passed , total );
2012-01-11 16:39:24 -06:00
RunEmitterTest ( & Emitter :: DashInBlockContext , "dash in block context" , passed , total );
2012-01-13 00:00:11 -06:00
RunEmitterTest ( & Emitter :: HexAndOct , "hex and oct" , passed , total );
2009-09-07 22:17:02 +00:00
RunEmitterErrorTest ( & Emitter :: ExtraEndSeq , "extra EndSeq" , passed , total );
RunEmitterErrorTest ( & Emitter :: ExtraEndMap , "extra EndMap" , passed , total );
RunEmitterErrorTest ( & Emitter :: BadSingleQuoted , "bad single quoted string" , passed , total );
RunEmitterErrorTest ( & Emitter :: InvalidAnchor , "invalid anchor" , passed , total );
RunEmitterErrorTest ( & Emitter :: InvalidAlias , "invalid alias" , passed , total );
RunEmitterErrorTest ( & Emitter :: MissingKey , "missing key" , passed , total );
RunEmitterErrorTest ( & Emitter :: MissingValue , "missing value" , passed , total );
RunEmitterErrorTest ( & Emitter :: UnexpectedKey , "unexpected key" , passed , total );
RunEmitterErrorTest ( & Emitter :: UnexpectedValue , "unexpected value" , passed , total );
2010-10-19 06:51:54 +00:00
RunEmitterErrorTest ( & Emitter :: BadLocalTag , "bad local tag" , passed , total );
2009-09-07 22:17:02 +00:00
std :: cout << "Emitter tests: " << passed << "/" << total << " passed \n " ;
return passed == total ;
}
2009-07-30 04:42:27 +00:00
}
2009-09-07 22:17:02 +00:00