diff options
author | innokentii <innokentii@ydb.tech> | 2023-12-06 12:17:20 +0300 |
---|---|---|
committer | innokentii <innokentii@ydb.tech> | 2023-12-06 12:55:01 +0300 |
commit | e7fda6595937cda061fdefb21d18d2b1f92a9841 (patch) | |
tree | 09aaa4155c147eba0a6af1de860d43d5854129ca /library/cpp/yaml | |
parent | e83c481c67c6d22053de832f656e049faeab0f80 (diff) | |
download | ydb-e7fda6595937cda061fdefb21d18d2b1f92a9841.tar.gz |
Fix ut
fix ut
Diffstat (limited to 'library/cpp/yaml')
-rw-r--r-- | library/cpp/yaml/fyamlcpp/fyamlcpp.cpp | 1126 | ||||
-rw-r--r-- | library/cpp/yaml/fyamlcpp/fyamlcpp.h | 939 | ||||
-rw-r--r-- | library/cpp/yaml/fyamlcpp/fyamlcpp_ut.cpp | 543 | ||||
-rw-r--r-- | library/cpp/yaml/fyamlcpp/libfyaml_ut.cpp | 1838 | ||||
-rw-r--r-- | library/cpp/yaml/fyamlcpp/ya.make | 16 |
5 files changed, 0 insertions, 4462 deletions
diff --git a/library/cpp/yaml/fyamlcpp/fyamlcpp.cpp b/library/cpp/yaml/fyamlcpp/fyamlcpp.cpp deleted file mode 100644 index cf5d01ef70..0000000000 --- a/library/cpp/yaml/fyamlcpp/fyamlcpp.cpp +++ /dev/null @@ -1,1126 +0,0 @@ -#include "fyamlcpp.h" - -#include <contrib/libs/libfyaml/include/libfyaml.h> - -#include <util/digest/murmur.h> - -namespace NFyaml { - -const char* zstr = ""; - -enum class EErrorType { - Debug = FYET_DEBUG, - Info = FYET_INFO, - Notice = FYET_NOTICE, - Warning = FYET_WARNING, - Error = FYET_ERROR, - Max = FYET_MAX, -}; - -enum class EErrorModule { - Unknown = FYEM_UNKNOWN, - Atom = FYEM_ATOM, - Scan = FYEM_SCAN, - Parse = FYEM_PARSE, - Doc = FYEM_DOC, - Build = FYEM_BUILD, - Internal = FYEM_INTERNAL, - System = FYEM_SYSTEM, - Max = FYEM_MAX, -}; - -enum class EParseCfgFlags { - Quiet = FYPCF_QUIET, - CollectDiag = FYPCF_COLLECT_DIAG, - ResolveDocument = FYPCF_RESOLVE_DOCUMENT, - DisableMmapOpt = FYPCF_DISABLE_MMAP_OPT, - DisableRecycling = FYPCF_DISABLE_RECYCLING, - ParseComments = FYPCF_PARSE_COMMENTS, - DisableDepth_limit = FYPCF_DISABLE_DEPTH_LIMIT, - DisableAccelerators = FYPCF_DISABLE_ACCELERATORS, - DisableBuffering = FYPCF_DISABLE_BUFFERING, - DefaultVersionAuto = FYPCF_DEFAULT_VERSION_AUTO, - DefaultVersion1_1 = FYPCF_DEFAULT_VERSION_1_1, - DefaultVersion1_2 = FYPCF_DEFAULT_VERSION_1_2, - DefaultVersion1_3 = FYPCF_DEFAULT_VERSION_1_3, - SloppyFlowIndentation = FYPCF_SLOPPY_FLOW_INDENTATION, - PreferRecursive = FYPCF_PREFER_RECURSIVE, - JsonAuto = FYPCF_JSON_AUTO, - JsonNone = FYPCF_JSON_NONE, - JsonForce = FYPCF_JSON_FORCE, - YpathAliases = FYPCF_YPATH_ALIASES, - AllowDuplicateKeys = FYPCF_ALLOW_DUPLICATE_KEYS, -}; - -enum class EEventType { - None = FYET_NONE, - StreamStart = FYET_STREAM_START, - StreamEnd = FYET_STREAM_END, - DocumentStart = FYET_DOCUMENT_START, - DocumentEnd = FYET_DOCUMENT_END, - MappingStart = FYET_MAPPING_START, - MappingEnd = FYET_MAPPING_END, - SequenceStart = FYET_SEQUENCE_START, - SequenceEnd = FYET_SEQUENCE_END, - Scalar = FYET_SCALAR, - Alias = FYET_ALIAS, -}; - -enum class EScalarStyle { - Any = FYSS_ANY, - Plain = FYSS_PLAIN, - SingleQuoted = FYSS_SINGLE_QUOTED, - DoubleQuoted = FYSS_DOUBLE_QUOTED, - Literal = FYSS_LITERAL, - Folded = FYSS_FOLDED, - Max = FYSS_MAX, -}; - -enum class EEmitterWriteType { - DocumentIndicator = fyewt_document_indicator, - TagDirective = fyewt_tag_directive, - VersionDirective = fyewt_version_directive, - Indent = fyewt_indent, - Indicator = fyewt_indicator, - Whitespace = fyewt_whitespace, - PlainScalar = fyewt_plain_scalar, - SingleQuotedScalar = fyewt_single_quoted_scalar, - DoubleQuotedScalar = fyewt_double_quoted_scalar, - LiteralScalar = fyewt_literal_scalar, - FoldedScalar = fyewt_folded_scalar, - Anchor = fyewt_anchor, - Tag = fyewt_tag, - Linebreak = fyewt_linebreak, - Alias = fyewt_alias, - TerminatingZero = fyewt_terminating_zero, - PlainScalarKey = fyewt_plain_scalar_key, - SingleQuotedScalarKey = fyewt_single_quoted_scalar_key, - DoubleQuotedScalarKey = fyewt_double_quoted_scalar_key, - Comment = fyewt_comment, -}; - -enum class ECommentPlacement { - Top = fycp_top, - Right = fycp_right, - Bottom = fycp_bottom, -}; - -enum EEmitterCfgFlags { - SortKeys = FYECF_SORT_KEYS, - OutputComments = FYECF_OUTPUT_COMMENTS, - StripLabels = FYECF_STRIP_LABELS, - StripTags = FYECF_STRIP_TAGS, - StripDoc = FYECF_STRIP_DOC, - NoEndingNewline = FYECF_NO_ENDING_NEWLINE, - StripEmptyKv = FYECF_STRIP_EMPTY_KV, - IndentDefault = FYECF_INDENT_DEFAULT, - Indent1 = FYECF_INDENT_1, - Indent2 = FYECF_INDENT_2, - Indent3 = FYECF_INDENT_3, - Indent4 = FYECF_INDENT_4, - Indent5 = FYECF_INDENT_5, - Indent6 = FYECF_INDENT_6, - Indent7 = FYECF_INDENT_7, - Indent8 = FYECF_INDENT_8, - Indent9 = FYECF_INDENT_9, - WidthDefault = FYECF_WIDTH_DEFAULT, - Width80 = FYECF_WIDTH_80, - Width132 = FYECF_WIDTH_132, - WidthInf = FYECF_WIDTH_INF, - ModeOriginal = FYECF_MODE_ORIGINAL, - ModeBlock = FYECF_MODE_BLOCK, - ModeFlow = FYECF_MODE_FLOW, - ModeFlowOneline = FYECF_MODE_FLOW_ONELINE, - ModeJson = FYECF_MODE_JSON, - ModeJsonTp = FYECF_MODE_JSON_TP, - ModeJsonOneline = FYECF_MODE_JSON_ONELINE, - ModeDejson = FYECF_MODE_DEJSON, - ModePretty = FYECF_MODE_PRETTY, - DocStartMarkAuto = FYECF_DOC_START_MARK_AUTO, - DocStartMarkOff = FYECF_DOC_START_MARK_OFF, - DocStartMarkOn = FYECF_DOC_START_MARK_ON, - DocEndMarkAuto = FYECF_DOC_END_MARK_AUTO, - DocEndMarkOff = FYECF_DOC_END_MARK_OFF, - DocEndMarkOn = FYECF_DOC_END_MARK_ON, - VersionDirAuto = FYECF_VERSION_DIR_AUTO, - VersionDirOff = FYECF_VERSION_DIR_OFF, - VersionDirOn = FYECF_VERSION_DIR_ON, - TagDirAuto = FYECF_TAG_DIR_AUTO, - TagDirOff = FYECF_TAG_DIR_OFF, - TagDirOn = FYECF_TAG_DIR_ON, - - Default = FYECF_DEFAULT, -}; - -enum class ENodeWalkFlags { - DontFollow = FYNWF_DONT_FOLLOW, - Follow = FYNWF_FOLLOW, - PtrYaml = FYNWF_PTR_YAML, - PtrJson = FYNWF_PTR_JSON, - PtrReljson = FYNWF_PTR_RELJSON, - PtrYpath = FYNWF_PTR_YPATH, - UriEncoded = FYNWF_URI_ENCODED, - MaxdepthDefault = FYNWF_MAXDEPTH_DEFAULT, - MarkerDefault = FYNWF_MARKER_DEFAULT, - PtrDefault = FYNWF_PTR_DEFAULT, -}; - -enum class EPathParseCfgFlags { - Quiet = FYPPCF_QUIET, - DisableRecycling = FYPPCF_DISABLE_RECYCLING, - DisableAccelerators = FYPPCF_DISABLE_ACCELERATORS, -}; - -enum class EPathExecCfgFlags { - Quiet = FYPXCF_QUIET, - DisableRecycling = FYPXCF_DISABLE_RECYCLING, - DisableAccelerators = FYPXCF_DISABLE_ACCELERATORS, -}; - -enum class ETokenType { - /* non-content token types */ - None = FYTT_NONE, - StreamStart = FYTT_STREAM_START, - StreamEnd = FYTT_STREAM_END, - VersionDirective = FYTT_VERSION_DIRECTIVE, - TagDirective = FYTT_TAG_DIRECTIVE, - DocumentStart = FYTT_DOCUMENT_START, - DocumentEnd = FYTT_DOCUMENT_END, - /* content token types */ - BlockSequenceStart = FYTT_BLOCK_SEQUENCE_START, - BlockMappingStart = FYTT_BLOCK_MAPPING_START, - BlockEnd = FYTT_BLOCK_END, - FlowSequenceStart = FYTT_FLOW_SEQUENCE_START, - FlowSequenceEnd = FYTT_FLOW_SEQUENCE_END, - FlowMappingStart = FYTT_FLOW_MAPPING_START, - FlowMappingEnd = FYTT_FLOW_MAPPING_END, - BlockEntry = FYTT_BLOCK_ENTRY, - FlowEntry = FYTT_FLOW_ENTRY, - Key = FYTT_KEY, - Value = FYTT_VALUE, - Alias = FYTT_ALIAS, - Anchor = FYTT_ANCHOR, - Tag = FYTT_TAG, - Scalar = FYTT_SCALAR, - - /* special error reporting */ - Input_marker = FYTT_INPUT_MARKER, - - /* path expression tokens */ - PeSlash = FYTT_PE_SLASH, - PeRoot = FYTT_PE_ROOT, - PeThis = FYTT_PE_THIS, - PeParent = FYTT_PE_PARENT, - PeMapKey = FYTT_PE_MAP_KEY, - PeSeqIndex = FYTT_PE_SEQ_INDEX, - PeSeqSlice = FYTT_PE_SEQ_SLICE, - PeScalarFilter = FYTT_PE_SCALAR_FILTER, - PeCollectionFilter = FYTT_PE_COLLECTION_FILTER, - PeSeqFilter = FYTT_PE_SEQ_FILTER, - PeMapFilter = FYTT_PE_MAP_FILTER, - PeUniqueFilter = FYTT_PE_UNIQUE_FILTER, - PeEveryChild = FYTT_PE_EVERY_CHILD, - PeEveryChildR = FYTT_PE_EVERY_CHILD_R, - PeAlias = FYTT_PE_ALIAS, - PeSibling = FYTT_PE_SIBLING, - PeComma = FYTT_PE_COMMA, - PeBarbar = FYTT_PE_BARBAR, - PeAmpamp = FYTT_PE_AMPAMP, - PeLparen = FYTT_PE_LPAREN, - PeRparen = FYTT_PE_RPAREN, - - /* comparison operators */ - PeEqeq = FYTT_PE_EQEQ, - PeNoteq = FYTT_PE_NOTEQ, - PeLt = FYTT_PE_LT, - PeGt = FYTT_PE_GT, - PeLte = FYTT_PE_LTE, - PeGte = FYTT_PE_GTE, - - /* scalar expression tokens */ - SePlus = FYTT_SE_PLUS, - SeMinus = FYTT_SE_MINUS, - SeMult = FYTT_SE_MULT, - SeDiv = FYTT_SE_DIV, - - PeMethod = FYTT_PE_METHOD, - SeMethod = FYTT_SE_METHOD, -}; - -enum class EComposerReturn { - OkContinue = FYCR_OK_CONTINUE, - OkStop = FYCR_OK_STOP, - OkStartSkip = FYCR_OK_START_SKIP, - OkStopSkip = FYCR_OK_STOP_SKIP, - Error = FYCR_ERROR, -}; - -TDocumentIterator::TDocumentIterator(fy_document_iterator* iterator) - : Iterator_(iterator, fy_document_iterator_destroy) -{} - -TNodeRef::TNodeRef(fy_node* node) - : Node_(node) -{} - -fy_node* TNodeRef::NodeRawPointer() const { - return Node_; -} - -TNode& TNode::operator=(fy_node* node) { - Node_.reset(node, fy_node_free); - return *this; -} - -TNode::TNode(fy_node* node) - : Node_(node, fy_node_free) -{} - -TNodeRef TNodePairRef::Key() const { - ENSURE_NODE_NOT_EMPTY(Pair_); - return TNodeRef(fy_node_pair_key(Pair_)); -} - -int TNodePairRef::Index(const TNodeRef& node) const { - ENSURE_NODE_NOT_EMPTY(node); - ENSURE_NODE_NOT_EMPTY(Pair_); - return fy_node_mapping_get_pair_index(node.Node_, Pair_); -} - -void TNodePairRef::SetKey(const TNodeRef& node) { - ENSURE_NODE_NOT_EMPTY(Pair_); - ENSURE_NODE_NOT_EMPTY(node); - NDetail::RethrowOnError(fy_node_pair_set_key(Pair_, node.Node_), Pair_); -} - -TNodeRef TNodePairRef::Value() const { - ENSURE_NODE_NOT_EMPTY(Pair_); - return TNodeRef(fy_node_pair_value(Pair_)); -} - -void TNodePairRef::SetValue(const TNodeRef& node) { - ENSURE_NODE_NOT_EMPTY(Pair_); - ENSURE_NODE_NOT_EMPTY(node); - NDetail::RethrowOnError(fy_node_pair_set_value(Pair_, node.Node_), Pair_); -} - -TMappingIterator::TMappingIterator(const TNodeRef& node, bool end) - : Node_(node) -{ - if (!end) { - NodePair_ = TNodePairRef(fy_node_mapping_iterate(Node_.Node_, reinterpret_cast<void**>(&NodePair_.Pair_))); - } -} - -TMappingIterator& TMappingIterator::operator++() { - NodePair_ = TNodePairRef(fy_node_mapping_iterate(Node_.Node_, reinterpret_cast<void**>(&NodePair_.Pair_))); - return *this; -} - -TReverseMappingIterator::TReverseMappingIterator(const TNodeRef& node, bool end) - : Node_(node) -{ - if (!end) { - NodePair_ = TNodePairRef(fy_node_mapping_reverse_iterate(Node_.Node_, reinterpret_cast<void**>(&NodePair_.Pair_))); - } -} - -TReverseMappingIterator& TReverseMappingIterator::operator++() { - NodePair_ = TNodePairRef(fy_node_mapping_reverse_iterate(Node_.Node_, reinterpret_cast<void**>(&NodePair_.Pair_))); - return *this; -} - -size_t TMapping::size() const { - ENSURE_NODE_NOT_EMPTY(Node_); - return fy_node_mapping_item_count(Node_); -} - -size_t TMapping::empty() const { - ENSURE_NODE_NOT_EMPTY(Node_); - return fy_node_mapping_is_empty(Node_); -} - -TNodePairRef TMapping::at(int index) const { - ENSURE_NODE_NOT_EMPTY(Node_); - auto res = fy_node_mapping_get_by_index(Node_, index); - Y_ENSURE_EX(res, ({ - TStringStream ss; - ss << "No such child: " << Path() << "/" << index; - TFyamlEx(ss.Str()); - })); - return TNodePairRef(res); -} - -TNodePairRef TMapping::operator[](int index) const { - ENSURE_NODE_NOT_EMPTY(Node_); - return TNodePairRef(fy_node_mapping_get_by_index(Node_, index)); -} - -TNodeRef TMapping::at(const TString& index) const { - ENSURE_NODE_NOT_EMPTY(Node_); - auto res = fy_node_mapping_lookup_by_string(Node_, index.data(), index.size()); - Y_ENSURE_EX(res, ({ - TStringStream ss; - ss << "No such child: " << Path() << "/" << index; - TFyamlEx(ss.Str()); - })); - return TNodeRef(res); -} - -TNodePairRef TMapping::pair_at(const TString& index) const { - ENSURE_NODE_NOT_EMPTY(Node_); - auto res = fy_node_mapping_lookup_pair_by_string(Node_, index.data(), index.size()); - Y_ENSURE_EX(res, ({ - TStringStream ss; - ss << "No such child: " << Path() << "/" << index; - TFyamlEx(ss.Str()); - })); - return TNodePairRef(res); -} - -TNodePairRef TMapping::pair_at_opt(const TString& index) const { - ENSURE_NODE_NOT_EMPTY(Node_); - return TNodePairRef(fy_node_mapping_lookup_pair_by_string(Node_, index.data(), index.size())); -} - -TNodeRef TMapping::operator[](const TString& index) const { - ENSURE_NODE_NOT_EMPTY(Node_); - return TNodeRef(fy_node_mapping_lookup_by_string(Node_, index.data(), index.size())); -} - -TNodeRef TMapping::operator[](const char* str) const { - ENSURE_NODE_NOT_EMPTY(Node_); - TString index(str); - return TNodeRef(fy_node_mapping_lookup_by_string(Node_, index.data(), index.size())); -} - -void TMapping::Append(const TNodeRef& key, const TNodeRef& value) { - ENSURE_NODE_NOT_EMPTY(Node_); - ENSURE_NODE_NOT_EMPTY(key); - ENSURE_NODE_NOT_EMPTY(value); - NDetail::RethrowOnError(fy_node_mapping_append(Node_, key.Node_, value.Node_), Node_); -} - -void TMapping::Prepend(const TNodeRef& key, const TNodeRef& value) { - ENSURE_NODE_NOT_EMPTY(Node_); - ENSURE_NODE_NOT_EMPTY(key); - ENSURE_NODE_NOT_EMPTY(value); - NDetail::RethrowOnError(fy_node_mapping_prepend(Node_, key.Node_, value.Node_), Node_); -} - -void TMapping::Remove(const TNodePairRef& toRemove) { - ENSURE_NODE_NOT_EMPTY(Node_); - ENSURE_NODE_NOT_EMPTY(toRemove); - NDetail::RethrowOnError(fy_node_mapping_remove(Node_, toRemove.Pair_), Node_); - fy_node_free(fy_node_pair_key(toRemove.Pair_)); - fy_node_free(fy_node_pair_value(toRemove.Pair_)); - free(toRemove.Pair_); -} - -bool TMapping::Has(TString key) const { - return fy_node_mapping_lookup_by_string(Node_, key.data(), key.size()) != nullptr; -} - -TMappingIterator TMapping::Remove(const TMappingIterator& toRemove) { - ENSURE_NODE_NOT_EMPTY(Node_); - Y_DEBUG_ABORT_UNLESS(Node_ == toRemove.Node_); - TMappingIterator ret = toRemove; - ++ret; - fy_node_mapping_remove(Node_, toRemove.NodePair_.Pair_); - return ret; -} - -void TMapping::Remove(const TNodeRef& key) { - ENSURE_NODE_NOT_EMPTY(Node_); - fy_node_free(fy_node_mapping_remove_by_key(Node_, key.Node_)); -} - -TSequenceIterator::TSequenceIterator(const TNodeRef& node, bool end) - : Node_(node) -{ - if (!end) { - IterNode_ = TNodeRef(fy_node_sequence_iterate(Node_.Node_, &Iter_)); - } -} - -TSequenceIterator& TSequenceIterator::operator++() { - IterNode_ = TNodeRef(fy_node_sequence_iterate(Node_.Node_, &Iter_)); - return *this; -} - -void TSequenceIterator::InsertBefore(const TNodeRef& node) { - ENSURE_NODE_NOT_EMPTY(Node_); - ENSURE_NODE_NOT_EMPTY(IterNode_); - ENSURE_NODE_NOT_EMPTY(node); - NDetail::RethrowOnError(fy_node_sequence_insert_before(Node_.Node_, IterNode_.Node_, node.Node_), Node_.Node_); -} - -void TSequenceIterator::InsertAfter(const TNodeRef& node) { - ENSURE_NODE_NOT_EMPTY(Node_); - ENSURE_NODE_NOT_EMPTY(IterNode_); - ENSURE_NODE_NOT_EMPTY(node); - NDetail::RethrowOnError(fy_node_sequence_insert_after(Node_.Node_, IterNode_.Node_, node.Node_), Node_.Node_); -} - -TReverseSequenceIterator::TReverseSequenceIterator(const TNodeRef& node, bool end) - : Node_(node) -{ - if (!end) { - IterNode_ = TNodeRef(fy_node_sequence_reverse_iterate(Node_.Node_, &Iter_)); - } -} - -TReverseSequenceIterator& TReverseSequenceIterator::operator++() { - IterNode_ = TNodeRef(fy_node_sequence_reverse_iterate(Node_.Node_, &Iter_)); - return *this; -} - -void TReverseSequenceIterator::InsertBefore(const TNodeRef& node) { - ENSURE_NODE_NOT_EMPTY(Node_); - ENSURE_NODE_NOT_EMPTY(IterNode_); - ENSURE_NODE_NOT_EMPTY(node); - NDetail::RethrowOnError(fy_node_sequence_insert_after(Node_.Node_, IterNode_.Node_, node.Node_), Node_.Node_); -} - -void TReverseSequenceIterator::InsertAfter(const TNodeRef& node) { - ENSURE_NODE_NOT_EMPTY(Node_); - ENSURE_NODE_NOT_EMPTY(IterNode_); - ENSURE_NODE_NOT_EMPTY(node); - NDetail::RethrowOnError(fy_node_sequence_insert_before(Node_.Node_, IterNode_.Node_, node.Node_), Node_.Node_); -} - -size_t TSequence::size() const { - ENSURE_NODE_NOT_EMPTY(Node_); - return fy_node_sequence_item_count(Node_); -} - -size_t TSequence::empty() const { - ENSURE_NODE_NOT_EMPTY(Node_); - return fy_node_sequence_is_empty(Node_); -} - -TNodeRef TSequence::at(int index) const { - ENSURE_NODE_NOT_EMPTY(Node_); - auto res = fy_node_sequence_get_by_index(Node_, index); - Y_ENSURE_EX(res, ({ - TStringStream ss; - ss << "No such index: " << Path() << "/" << index; - TFyamlEx(ss.Str()); - })); - return TNodeRef(res); -} - -TNodeRef TSequence::operator[](int index) const { - ENSURE_NODE_NOT_EMPTY(Node_); - return TNodeRef(fy_node_sequence_get_by_index(Node_, index)); -} - -void TSequence::Append(const TNodeRef& node) { - ENSURE_NODE_NOT_EMPTY(Node_); - ENSURE_NODE_NOT_EMPTY(node); - NDetail::RethrowOnError(fy_node_sequence_append(Node_, node.Node_), Node_); -} - -void TSequence::Prepend(const TNodeRef& node) { - ENSURE_NODE_NOT_EMPTY(Node_); - ENSURE_NODE_NOT_EMPTY(node); - NDetail::RethrowOnError(fy_node_sequence_prepend(Node_, node.Node_), Node_); -} - -void TSequence::InsertBefore(const TNodeRef& mark, const TNodeRef& node) { - ENSURE_NODE_NOT_EMPTY(Node_); - ENSURE_NODE_NOT_EMPTY(mark); - ENSURE_NODE_NOT_EMPTY(node); - NDetail::RethrowOnError(fy_node_sequence_insert_before(Node_, mark.Node_, node.Node_), Node_); -} - -void TSequence::InsertAfter(const TNodeRef& mark, const TNodeRef& node) { - ENSURE_NODE_NOT_EMPTY(Node_); - ENSURE_NODE_NOT_EMPTY(mark); - ENSURE_NODE_NOT_EMPTY(node); - NDetail::RethrowOnError(fy_node_sequence_insert_after(Node_, mark.Node_, node.Node_), Node_); -} - -TNode TSequence::Remove(const TNodeRef& toRemove) { - ENSURE_NODE_NOT_EMPTY(Node_); - ENSURE_NODE_NOT_EMPTY(toRemove.Node_); - return TNode(fy_node_sequence_remove(Node_, toRemove.Node_)); -} - -TSequenceIterator TSequence::Remove(const TSequenceIterator& toRemove) { - ENSURE_NODE_NOT_EMPTY(Node_); - Y_DEBUG_ABORT_UNLESS(Node_ == toRemove.Node_); - ENSURE_NODE_NOT_EMPTY(toRemove.IterNode_); - TSequenceIterator ret = toRemove; - ++ret; - fy_node_sequence_remove(Node_, toRemove.IterNode_.Node_); - fy_node_free(toRemove.IterNode_.Node_); // TODO add extract - return ret; -} - -TReverseSequenceIterator TSequence::Remove(const TReverseSequenceIterator& toRemove) { - ENSURE_NODE_NOT_EMPTY(Node_); - Y_DEBUG_ABORT_UNLESS(Node_ == toRemove.Node_); - ENSURE_NODE_NOT_EMPTY(toRemove.IterNode_); - TReverseSequenceIterator ret = toRemove; - ++ret; - fy_node_sequence_remove(Node_, toRemove.IterNode_.Node_); - fy_node_free(toRemove.IterNode_.Node_); // TODO add extract - return ret; -} - -TDocumentNodeIterator::TDocumentNodeIterator(TNodeRef&& node) - : Node_(node) -{ - if (node) { - Iterator_ = {fy_document_iterator_create(), fy_document_iterator_destroy}; - fy_document_iterator_node_start(Iterator_.get(), node.Node_); - } -} - -TDocumentNodeIterator& TDocumentNodeIterator::operator++() { - Node_ = fy_document_iterator_node_next(Iterator_.get()); - return *this; -} - -TDocument::TDocument(TString str, fy_document* doc, fy_diag* diag) - : Document_(doc, fy_document_destroy) - , Diag_(diag, fy_diag_destroy) -{ - auto* userdata = new THashSet<TSimpleSharedPtr<TString>, TStringPtrHashT>({MakeSimpleShared<TString>(std::move(str))}); - fy_document_set_userdata(doc, userdata); - fy_document_register_on_destroy(doc, &DestroyDocumentStrings); - RegisterUserDataCleanup(); -} - -TDocument::TDocument(fy_document* doc, fy_diag* diag) - : Document_(doc, fy_document_destroy) - , Diag_(diag, fy_diag_destroy) -{ - RegisterUserDataCleanup(); -} - -TDocument TDocument::Parse(TString str) { - const char* cstr = str.empty() ? zstr : str.cbegin(); - fy_diag_cfg dcfg; - fy_diag_cfg_default(&dcfg); - std::unique_ptr<fy_diag, void(*)(fy_diag*)> diag(fy_diag_create(&dcfg), fy_diag_destroy); - fy_diag_set_collect_errors(diag.get(), true); - fy_parse_cfg cfg{ - "", - // FYPCF_PARSE_COMMENTS, - FYPCF_QUIET, - nullptr, - diag.get() - }; - fy_document* doc = fy_document_build_from_string(&cfg, cstr, FY_NT); - if (!doc) { - NDetail::ThrowAllExceptionsIfAny(diag.get()); - } - return TDocument(std::move(str), doc, diag.release()); -} - -TDocument TDocument::Clone() const { - ENSURE_DOCUMENT_NOT_EMPTY(Document_); - fy_document* doc = fy_document_clone(Document_.get()); - fy_document_set_userdata( - doc, - new THashSet<TSimpleSharedPtr<TString>, TStringPtrHashT>( - *reinterpret_cast<THashSet<TSimpleSharedPtr<TString>, TStringPtrHashT>*>(fy_document_get_userdata(Document_.get())) - ) - ); - fy_document_register_on_destroy(doc, &DestroyDocumentStrings); - return TDocument(doc, fy_document_get_diag(doc)); -} - -void TDocument::InsertAt(const char* path, const TNodeRef& node) { - ENSURE_DOCUMENT_NOT_EMPTY(Document_); - NDetail::RethrowOnError(fy_document_insert_at(Document_.get(), path, FY_NT, node.Node_), Diag_.get()); -} - -TNodeRef TDocument::Buildf(const char* content) { - ENSURE_DOCUMENT_NOT_EMPTY(Document_); - return TNodeRef(fy_node_build_from_string(Document_.get(), content, strlen(content))); -} - -void TDocument::Resolve() { - ENSURE_DOCUMENT_NOT_EMPTY(Document_); - if (fy_document_resolve(Document_.get()) != 0) { - NDetail::ThrowAllExceptionsIfAny(Diag_.get()); - } -} - -bool TDocument::HasDirectives() { - ENSURE_DOCUMENT_NOT_EMPTY(Document_); - return fy_document_has_directives(Document_.get()); -} - -bool TDocument::HasExplicitDocumentStart() { - ENSURE_DOCUMENT_NOT_EMPTY(Document_); - return fy_document_has_explicit_document_start(Document_.get()); -} - -bool TDocument::HasExplicitDocumentEnd() { - ENSURE_DOCUMENT_NOT_EMPTY(Document_); - return fy_document_has_explicit_document_end(Document_.get()); -} - -void TDocument::SetParent(const TDocument& doc) { - ENSURE_DOCUMENT_NOT_EMPTY(Document_); - ENSURE_DOCUMENT_NOT_EMPTY(doc.Document_); - NDetail::RethrowOnError(fy_document_set_parent(doc.Document_.get(), Document_.release()), Diag_.get()); -} - -TNodeRef TDocument::Root() { - ENSURE_DOCUMENT_NOT_EMPTY(Document_); - return TNodeRef(fy_document_root(Document_.get())); -} - -void TDocument::SetRoot(const TNodeRef& node) { - ENSURE_DOCUMENT_NOT_EMPTY(Document_); - ENSURE_NODE_NOT_EMPTY(node.Node_); - NDetail::RethrowOnError(fy_document_set_root(Document_.get(), node.Node_), Diag_.get()); -} - -TNodeRef TDocument::CreateAlias(const TString& name) { - ENSURE_DOCUMENT_NOT_EMPTY(Document_); - return TNodeRef(fy_node_create_alias_copy(Document_.get(), name.c_str(), name.length())); -} - -std::unique_ptr<char, void(*)(char*)> TDocument::EmitToCharArray() const { - std::unique_ptr<char, void(*)(char*)> res( - fy_emit_document_to_string( - Document_.get(), - (fy_emitter_cfg_flags)(FYECF_DEFAULT | FYECF_MODE_PRETTY | FYECF_OUTPUT_COMMENTS)), &NDetail::FreeChar); - return res; -} - -bool TDocument::RegisterUserDataCleanup() { - ENSURE_DOCUMENT_NOT_EMPTY(Document_); - return fy_document_register_meta(Document_.get(), &DestroyUserData, nullptr) == 0; -} - -void TDocument::UnregisterUserDataCleanup() { - ENSURE_DOCUMENT_NOT_EMPTY(Document_); - fy_document_unregister_meta(Document_.get()); -} - -TMark TDocument::BeginMark() const { - ENSURE_DOCUMENT_NOT_EMPTY(Document_); - auto* fyds = fy_document_get_document_state(Document_.get()); - auto* mark = fy_document_state_start_mark(fyds); - return TMark{ - mark->input_pos, - mark->line, - mark->column, - }; -} - -TMark TDocument::EndMark() const { - ENSURE_DOCUMENT_NOT_EMPTY(Document_); - auto* fyds = fy_document_get_document_state(Document_.get()); - auto* mark = fy_document_state_end_mark(fyds); - return TMark{ - mark->input_pos, - mark->line, - mark->column, - }; -} - -std::unique_ptr<char, void(*)(char*)> TJsonEmitter::EmitToCharArray() const { - std::unique_ptr<char, void(*)(char*)> res( - fy_emit_node_to_string( - Node_.Node_, - (fy_emitter_cfg_flags)(FYECF_DEFAULT | FYECF_SORT_KEYS | FYECF_MODE_JSON_TP)), &NDetail::FreeChar); - return res; -} - -TParser::TParser(TString rawStream, fy_parser* parser, fy_diag* diag) - : RawDocumentStream_(std::move(rawStream)) - , Parser_(parser, fy_parser_destroy) - , Diag_(diag, fy_diag_destroy) -{} - -TParser TParser::Create(TString str) -{ - const char* stream = str.empty() ? zstr : str.cbegin(); - fy_diag_cfg dcfg; - fy_diag_cfg_default(&dcfg); - std::unique_ptr<fy_diag, void(*)(fy_diag*)> diag(fy_diag_create(&dcfg), fy_diag_destroy); - fy_diag_set_collect_errors(diag.get(), true); - fy_parse_cfg cfg{ - "", - // FYPCF_PARSE_COMMENTS, - FYPCF_QUIET, - nullptr, - diag.get() - }; - auto* parser = fy_parser_create(&cfg); - if (!parser) { - NDetail::ThrowAllExceptionsIfAny(diag.get()); - } - - fy_parser_set_string(parser, stream, -1); - - return TParser(std::move(str), parser, diag.release()); -} - -std::optional<TDocument> TParser::NextDocument() { - auto* doc = fy_parse_load_document(Parser_.get()); - if (!doc) { - return std::nullopt; - } - - return TDocument(RawDocumentStream_, doc, fy_document_get_diag(doc)); -} - -namespace NDetail { - -fy_node* TNodeOpsBase::CreateReference(fy_node* node) const { - ENSURE_NODE_NOT_EMPTY(node); - return fy_node_create_reference(node); -} - -fy_node* TNodeOpsBase::Copy(fy_node* node) const { - ENSURE_NODE_NOT_EMPTY(node); - return fy_node_copy(fy_node_document(node), node); -} - -fy_node* TNodeOpsBase::Copy(fy_node* node, fy_document* to) const { - ENSURE_NODE_NOT_EMPTY(node); - auto* fromDoc = fy_node_document(node); - auto& fromUserdata = *reinterpret_cast<THashSet<TSimpleSharedPtr<TString>, TStringPtrHashT>*>(fy_document_get_userdata(fromDoc)); - auto& toUserdata = *reinterpret_cast<THashSet<TSimpleSharedPtr<TString>, TStringPtrHashT>*>(fy_document_get_userdata(to)); - toUserdata.insert(fromUserdata.begin(), fromUserdata.end()); - return fy_node_copy(to, node); -} - -TString TNodeOpsBase::Path(fy_node* node) const { - ENSURE_NODE_NOT_EMPTY(node); - char* path = fy_node_get_path(node); - - if (path) { - TString str(path); - free(path); - return str; - } - - return {}; -} - -ENodeType TNodeOpsBase::Type(fy_node* node) const { - ENSURE_NODE_NOT_EMPTY(node); - return static_cast<ENodeType>(fy_node_get_type(node)); -} - -bool TNodeOpsBase::IsAlias(fy_node* node) const { - ENSURE_NODE_NOT_EMPTY(node); - return fy_node_is_alias(node); -} - -fy_node* TNodeOpsBase::ResolveAlias(fy_node* node) const { - ENSURE_NODE_NOT_EMPTY(node); - Y_DEBUG_ABORT_UNLESS(IsAlias(node)); - return fy_node_resolve_alias(node); -} - -TString TNodeOpsBase::Scalar(fy_node* node) const { - ENSURE_NODE_NOT_EMPTY(node); - Y_ENSURE_EX(fy_node_is_scalar(node), TFyamlEx() << "Node is not Scalar: " << Path(node)); - size_t size; - const char* text = fy_node_get_scalar(node, &size); - return TString(text, size); -} - -TMark TNodeOpsBase::BeginMark(fy_node* node) const { - ENSURE_NODE_NOT_EMPTY(node); - std::unique_ptr<fy_document_iterator, void(*)(fy_document_iterator*)> it( - fy_document_iterator_create(), - &fy_document_iterator_destroy); - fy_document_iterator_node_start(it.get(), node); - auto deleter = [&](fy_event* fye){ fy_document_iterator_event_free(it.get(), fye); }; - std::unique_ptr<fy_event, decltype(deleter)> ev( - fy_document_iterator_body_next(it.get()), - deleter); - auto* mark = fy_event_start_mark(ev.get()); - - if (!mark) { - ythrow yexception() << "can't get begin mark for a node"; - } - - return TMark{ - mark->input_pos, - mark->line, - mark->column, - }; -} - -namespace { - -fy_event_type GetOpenEventType(ENodeType type) { - switch(type) { - case ENodeType::Mapping: - return FYET_MAPPING_START; - case ENodeType::Sequence: - return FYET_SEQUENCE_START; - default: - Y_ABORT("Not a brackets type"); - } -} - -fy_event_type GetCloseEventType(ENodeType type) { - switch(type) { - case ENodeType::Mapping: - return FYET_MAPPING_END; - case ENodeType::Sequence: - return FYET_SEQUENCE_END; - default: - Y_ABORT("Not a brackets type"); - } -} - -} // anonymous namespace - -TMark TNodeOpsBase::EndMark(fy_node* node) const { - ENSURE_NODE_NOT_EMPTY(node); - std::unique_ptr<fy_document_iterator, void(*)(fy_document_iterator*)> it( - fy_document_iterator_create(), - &fy_document_iterator_destroy); - fy_document_iterator_node_start(it.get(), node); - - auto deleter = [&](fy_event* fye){ fy_document_iterator_event_free(it.get(), fye); }; - std::unique_ptr<fy_event, decltype(deleter)> prevEv( - nullptr, - deleter); - std::unique_ptr<fy_event, decltype(deleter)> ev( - fy_document_iterator_body_next(it.get()), - deleter); - - if (IsComplexType(Type(node))) { - int openBrackets = 0; - if (ev->type == GetOpenEventType(Type(node))) { - ++openBrackets; - } - if (ev->type == GetCloseEventType(Type(node))) { - --openBrackets; - } - while (ev->type != GetCloseEventType(Type(node)) || openBrackets != 0) { - std::unique_ptr<fy_event, decltype(deleter)> cur( - fy_document_iterator_body_next(it.get()), - deleter); - if (cur == nullptr) { - break; - } - if (cur->type == GetOpenEventType(Type(node))) { - ++openBrackets; - } - if (cur->type == GetCloseEventType(Type(node))) { - --openBrackets; - } - if (fy_event_get_node_style(cur.get()) != FYNS_BLOCK) { - prevEv.reset(ev.release()); - ev.reset(cur.release()); - } - } - } - - auto* mark = fy_event_end_mark(ev.get()); - - if (!mark && prevEv) { - mark = fy_event_end_mark(prevEv.get()); - } - - if (!mark) { - ythrow yexception() << "can't get end mark for a node"; - } - - return TMark{ - mark->input_pos, - mark->line, - mark->column, - }; -} - -fy_node* TNodeOpsBase::Map(fy_node* node) const { - ENSURE_NODE_NOT_EMPTY(node); - Y_ENSURE_EX(fy_node_is_mapping(node), TFyamlEx() << "Node is not Mapping: " << Path(node)); - return node; -} - -fy_node* TNodeOpsBase::Sequence(fy_node* node) const { - ENSURE_NODE_NOT_EMPTY(node); - Y_ENSURE_EX(fy_node_is_sequence(node), TFyamlEx() << "Node is not Sequence: " << Path(node)); - return node; -} - -void TNodeOpsBase::Insert(fy_node* thisNode, fy_node* node) { - ENSURE_NODE_NOT_EMPTY(node); - RethrowOnError(fy_node_insert(thisNode, node), thisNode); -} - -std::optional<TString> TNodeOpsBase::Tag(fy_node* node) const { - ENSURE_NODE_NOT_EMPTY(node); - size_t len = 0; - const char* tag = fy_node_get_tag(node, &len); - - if (tag) { - return TString(tag, len); - } - - return std::nullopt; -} - -void TNodeOpsBase::SetTag(fy_node* node, const TString& tag) { - ENSURE_NODE_NOT_EMPTY(node); - auto* str = new TString(std::move(tag)); - auto* data = new TUserDataHolder(UserData(node), str); - SetUserData(node, data); - RethrowOnError(fy_node_set_tag(node, str->c_str(), str->length()), node); -} - -bool TNodeOpsBase::RemoveTag(fy_node* node) { - ENSURE_NODE_NOT_EMPTY(node); - bool ret = fy_node_remove_tag(node); - ClearUserData(node); - return ret; -} - -bool TNodeOpsBase::HasAnchor(fy_node* node) const { - ENSURE_NODE_NOT_EMPTY(node); - return fy_node_get_anchor(node) != nullptr; -} - -void TNodeOpsBase::SetAnchor(fy_node* node, const TString& anchor) { - auto* str = new TString(anchor); - auto* data = new TUserDataHolder(UserData(node), str); - SetUserData(node, data); - RethrowOnError(fy_node_set_anchor(node, str->c_str(), str->length()), node); -} - -bool TNodeOpsBase::DeepEqual(fy_node* thisNode, fy_node* other) { - ENSURE_NODE_NOT_EMPTY(thisNode); - ENSURE_NODE_NOT_EMPTY(other); - return fy_node_compare(thisNode, other); -} - -std::unique_ptr<char, void(*)(char*)> TNodeOpsBase::EmitToCharArray(fy_node* node) const { - std::unique_ptr<char, void(*)(char*)> res( - fy_emit_node_to_string( - node, - (fy_emitter_cfg_flags)(FYECF_DEFAULT)), &FreeChar); - return res; -} - -void TNodeOpsBase::SetStyle(fy_node* node, ENodeStyle style) { - ENSURE_NODE_NOT_EMPTY(node); - fy_node_set_style(node, (enum fy_node_style)style); -} - -ENodeStyle TNodeOpsBase::Style(fy_node* node) const { - ENSURE_NODE_NOT_EMPTY(node); - return (ENodeStyle)fy_node_get_style(node); -} - -void TNodeOpsBase::SetUserData(fy_node* node, IBasicUserData* data) { - ENSURE_NODE_NOT_EMPTY(node); - fy_node_set_meta(node, data); -} - -IBasicUserData* TNodeOpsBase::UserData(fy_node* node) const { - ENSURE_NODE_NOT_EMPTY(node); - return reinterpret_cast<IBasicUserData* >(fy_node_get_meta(node)); -} - -void TNodeOpsBase::ClearUserData(fy_node* node) { - ENSURE_NODE_NOT_EMPTY(node); - fy_node_clear_meta(node); -} - -void ThrowAllExceptionsIfAny(fy_diag* diag) { - void* iter = nullptr; - fy_diag_error* err = fy_diag_errors_iterate(diag, &iter); - if (err != nullptr) { - TStringStream ss; - ss << err->line << ":" << err->column << " " << err->msg; - TFyamlEx ex(ss.Str()); - - while ((err = fy_diag_errors_iterate(diag, &iter)) != nullptr) { - TStringStream ss; - ss << err->line << ":" << err->column << " " << err->msg; - ex.AddError(ss.Str()); - } - - ythrow ex; - } -} - -void RethrowError(fy_diag* diag) { - void *iter = nullptr; - fy_diag_error* err; - TStringStream ss; - while ((err = fy_diag_errors_iterate(diag, &iter)) != nullptr) { - ss << err->line << ":" << err->column << " " << err->msg << "\n"; - } - ythrow TFyamlEx(ss.Str()); -} - -void RethrowOnError(bool isError, fy_node* node) { - if (!isError) { - return; - } - - std::unique_ptr<fy_diag, void(*)(fy_diag*)> diag(fy_document_get_diag(fy_node_document(node)), fy_diag_unref); - RethrowError(diag.get()); -} - -void RethrowOnError(bool isError, fy_node_pair* pair) { - if (!isError) { - return; - } - - std::unique_ptr<fy_diag, void(*)(fy_diag*)> diag(fy_document_get_diag(fy_node_document(fy_node_pair_key(pair))), fy_diag_unref); - RethrowError(diag.get()); -} - -void RethrowOnError(bool isError, fy_diag* diag) { - if (!isError) { - return; - } - - RethrowError(diag); -} - -void FreeChar(char* mem) { - free(mem); -} - -bool IsComplexType(ENodeType type) { - return type == ENodeType::Mapping || type == ENodeType::Sequence; -} - -} // namespace NDetail - -} // namespace NFyaml - -template <> -void Out<NFyaml::TDocument>(IOutputStream& out, const NFyaml::TDocument& value) { - out << value.EmitToCharArray().get(); -} - -template <> -void Out<NFyaml::TNodeRef>(IOutputStream& out, const NFyaml::TNodeRef& value) { - out << value.EmitToCharArray().get(); -} - -template <> -void Out<NFyaml::TJsonEmitter>(IOutputStream& out, const NFyaml::TJsonEmitter& value) { - out << value.EmitToCharArray().get(); -} - -bool operator==(const fy_node* node1, const NFyaml::NDetail::TNodeOps<NFyaml::TNodeRef>& node2) { - return node2.Node() == node1; -} - -bool operator==(const fy_node* node1, const NFyaml::NDetail::TNodeOps<NFyaml::TNode>& node2) { - return node2.Node() == node1; -} diff --git a/library/cpp/yaml/fyamlcpp/fyamlcpp.h b/library/cpp/yaml/fyamlcpp/fyamlcpp.h deleted file mode 100644 index e205db7122..0000000000 --- a/library/cpp/yaml/fyamlcpp/fyamlcpp.h +++ /dev/null @@ -1,939 +0,0 @@ -#pragma once - -#include <util/generic/yexception.h> -#include <util/system/compiler.h> -#include <util/system/yassert.h> -#include <util/stream/str.h> -#include <util/generic/hash_set.h> -#include <util/generic/vector.h> - -#include <memory> -#include <optional> - -#define ENSURE_NODE_NOT_EMPTY(NODE) Y_ENSURE_EX(NODE, TFyamlEx() << "Expected non-empty Node") -#define ENSURE_DOCUMENT_NOT_EMPTY(NODE) Y_ENSURE_EX(NODE, TFyamlEx() << "Expected non-empty Document") - -struct fy_parser; -struct fy_node; -struct fy_document; -struct fy_diag; -struct fy_document_iterator; -struct fy_node_pair; -extern "C" struct fy_node *fy_node_buildf(struct fy_document *fyd, const char *fmt, ...); - -namespace NFyaml { - namespace NDetail { - template <class T> - class TNodeOps; - } - class TNodeRef; - class TNode; -} - -bool operator==(const fy_node* node1, const NFyaml::NDetail::TNodeOps<NFyaml::TNodeRef>& node2); -bool operator==(const fy_node* node1, const NFyaml::NDetail::TNodeOps<NFyaml::TNode>& node2); - -namespace NFyaml { - -struct TStringPtrHashT { - size_t operator()(const TSimpleSharedPtr<TString>& str) const { - return (size_t)str.Get(); - } -}; - -// do TFyaml(str) instead of TFyaml() << str; -class TFyamlEx : public yexception { -public: - TFyamlEx() {} - - TFyamlEx(TString error) : Errors_({error}) {} - - TFyamlEx(std::initializer_list<TString> errors) : Errors_(errors) {} - - const TVector<TString>& Errors() { - return Errors_; - } - - const char* what() const noexcept override { - What_ = TString(yexception::what()); - for (auto& err : Errors_) { - What_.push_back('\n'); - What_.append(err); - } - - return What_.c_str(); - } - - TFyamlEx& AddError(TString error) { - Errors_.push_back(error); - return *this; - } - - TStringBuf AsStrBuf() const { - return what(); - } - -private: - TVector<TString> Errors_; - mutable TString What_; -}; - -enum class ENodeType { - Scalar, - Sequence, - Mapping, -}; - -enum class ENodeStyle { - Any = -1, - Flow, - Block, - Plain, - SingleQuoted, - DoubleQuoted, - Literal, - Folded, - Alias, -}; - -class TNodeRef; -class TDocumentIterator; -class TDocument; -class TNode; -class TMappingIterator; -class TReverseMappingIterator; -class TMapping; -class TSequenceIterator; -class TReverseSequenceIterator; -class TSequence; -class TJsonEmitter; -class TParser; -struct TMark; - -namespace NDetail { - -class IBasicUserData { -public: - virtual ~IBasicUserData() = default; -}; - -template <class T> -class TUserDataHolder : public IBasicUserData { -public: - TUserDataHolder(IBasicUserData* next, T* data) - : Next_(next) - , Data_(data) - {} - -private: - std::unique_ptr<IBasicUserData> Next_ = nullptr; - std::unique_ptr<T> Data_ = nullptr; -}; - -void ThrowAllExceptionsIfAny(fy_diag* diag); - -void RethrowError(fy_diag* diag); - -void RethrowOnError(bool isError, fy_node* node); - -void RethrowOnError(bool isError, fy_node_pair* pair); - -void RethrowOnError(bool isError, fy_diag* diag); - -void FreeChar(char* mem); - -bool IsComplexType(ENodeType type); - -class TNodeOpsBase { -protected: - TString Path(fy_node* node) const; - - ENodeType Type(fy_node* node) const; - - fy_node* Copy(fy_node* node) const; - - fy_node* Copy(fy_node* node, fy_document* to) const; - - bool IsAlias(fy_node* node) const; - - fy_node* ResolveAlias(fy_node* node) const; - - fy_node* CreateReference(fy_node* node) const; - - fy_node* Sequence(fy_node* node) const; - - fy_node* Map(fy_node* node) const; - - TString Scalar(fy_node* node) const; - - TMark BeginMark(fy_node* node) const; - - TMark EndMark(fy_node* node) const; - - void Insert(fy_node* thisNode, fy_node* node); - - std::optional<TString> Tag(fy_node* node) const; - - void SetTag(fy_node* node, const TString& tag); - - bool RemoveTag(fy_node* node); - - bool HasAnchor(fy_node* node) const; - - void SetAnchor(fy_node* node, const TString& anchor); - - bool DeepEqual(fy_node* thisNode, fy_node* other); - - std::unique_ptr<char, void(*)(char*)> EmitToCharArray(fy_node* node) const; - - void SetStyle(fy_node* node, ENodeStyle style); - - ENodeStyle Style(fy_node* node) const; - -protected: - void SetUserData(fy_node* node, NDetail::IBasicUserData* data); - - NDetail::IBasicUserData* UserData(fy_node* node) const; - - void ClearUserData(fy_node* node); -}; - -template <class T> -class TNodeOps : public TNodeOpsBase { -friend class ::NFyaml::TNodeRef; - -public: - template <class OtherT> - bool operator==(const TNodeOps<OtherT>& other) const { return Node() == other.Node(); } - - bool operator==(const fy_node* node) const { return Node() == node; } - - friend bool ::operator==(const fy_node* node1, const TNodeOps<NFyaml::TNodeRef>& node2); - friend bool ::operator==(const fy_node* node1, const TNodeOps<NFyaml::TNode>& node2); - - explicit operator bool() const { return Node() != nullptr; } - - TString Path() const; - - ENodeType Type() const; - - TNode Copy() const; - - TNode Copy(TDocument& to) const; - - bool IsAlias() const; - - TNodeRef ResolveAlias() const; - - TNode CreateReference() const; - - TSequence Sequence() const; - - TMapping Map() const; - - TString Scalar() const; - - TMark BeginMark() const; - - TMark EndMark() const; - - void Insert(const TNodeRef& node); - - bool Empty() const { return Node() == nullptr; } - - std::optional<TString> Tag() const; - - void SetTag(const TString& tag); - - bool RemoveTag(); - - bool HasAnchor() const; - - void SetAnchor(const TString& anchor); - - bool DeepEqual(const TNodeRef& other); - - std::unique_ptr<char, void(*)(char*)> EmitToCharArray() const; - - void SetStyle(ENodeStyle style); - - ENodeStyle Style() const; - -protected: - const T& AsDerived() const; - - fy_node* Node() const; - - fy_node* Node(); - - void SetUserData(NDetail::IBasicUserData* data); - - NDetail::IBasicUserData* UserData() const; - - void ClearUserData(); -}; - -} // namespace NDetail - -class TDocumentIterator { - friend class TDocument; -public: - explicit TDocumentIterator(fy_document_iterator* iterator = nullptr); - -protected: - std::unique_ptr<fy_document_iterator, void(*)(fy_document_iterator*)> Iterator_; -}; - -class TNodeRef : public NDetail::TNodeOps<TNodeRef> { - friend class TNodeOps<TNodeRef>; - friend class TNodeOpsBase; - friend class TDocument; - friend class TDocumentNodeIterator; - friend class TMapping; - friend class TMappingIterator; - friend class TReverseMappingIterator; - friend class TNodePairRef; - friend class TSequence; - friend class TSequenceIterator; - friend class TReverseSequenceIterator; - friend class TJsonEmitter; - -public: - TNodeRef() = default; - - template <class T> - TNodeRef(const TNodeOps<T>& other) : Node_(other.Node()) {} - - explicit TNodeRef(const TNodeRef& other) : Node_(other.Node_) {} - - TNodeRef(fy_node* node); - - TNodeRef& operator=(const TNodeRef& other) { Node_ = other.Node_; return *this; } - - TNodeRef& operator=(fy_node* node) { Node_ = node; return *this; } - -protected: - fy_node* Node_ = nullptr; - -private: - fy_node* NodeRawPointer() const; -}; - -class TNode : public NDetail::TNodeOps<TNode> { - friend class TNodeOps<TNode>; - -public: - TNode(fy_node* node = nullptr); - - template <class T> - explicit TNode(const TNodeOps<T>& other) : Node_(other.Node_) {} - - TNodeRef Ref() { return TNodeRef(*this); } - -private: - std::shared_ptr<fy_node> Node_; - - TNode& operator=(fy_node* node); - - fy_node* NodeRawPointer() const { - return Node_.get(); - } -}; - -class TNodePairRef { -friend class TMappingIterator; -friend class TReverseMappingIterator; -friend class TMapping; - -public: - TNodePairRef(fy_node_pair* pair = nullptr) : Pair_(pair) {} - - bool operator==(const TNodePairRef& other) const { return Pair_ == other.Pair_; } - - explicit operator bool() const { return Pair_ != nullptr; } - - TNodeRef Key() const; - - int Index(const TNodeRef& node) const; - - void SetKey(const TNodeRef& node); - - TNodeRef Value() const; - - void SetValue(const TNodeRef& node); - -private: - fy_node_pair* Pair_ = nullptr; -}; - -class TMappingIterator { - friend class TMapping; -public: - explicit TMappingIterator(const TNodeRef& node, bool end = false); - - TMappingIterator(const TMappingIterator& other) { - Node_ = other.Node_; - NodePair_ = other.NodePair_; - } - - TMappingIterator& operator=(const TMappingIterator& other) { - Node_ = other.Node_; - NodePair_ = other.NodePair_; - return *this; - } - - TMappingIterator& operator++(); - - const TNodePairRef* operator->() const { return &NodePair_; } - - TMappingIterator operator++(int) { - TMappingIterator retval = *this; - ++(*this); - return retval; - } - - bool operator==(TMappingIterator other) const { return Node_ == other.Node_ && NodePair_ == other.NodePair_; } - - const TNodePairRef& operator*() const { return NodePair_; } - -private: - TNodeRef Node_; - TNodePairRef NodePair_; -}; - -class TReverseMappingIterator { - friend class TMapping; -public: - explicit TReverseMappingIterator(const TNodeRef& node, bool end = false); - - TReverseMappingIterator(const TReverseMappingIterator& other) { - Node_ = other.Node_; - NodePair_ = other.NodePair_; - } - - TReverseMappingIterator& operator=(const TReverseMappingIterator& other) { - Node_ = other.Node_; - NodePair_ = other.NodePair_; - return *this; - } - - TReverseMappingIterator& operator++(); - - const TNodePairRef* operator->() const { return &NodePair_; } - - TReverseMappingIterator operator++(int) { - TReverseMappingIterator retval = *this; - ++(*this); - return retval; - } - - bool operator==(TReverseMappingIterator other) const { return Node_ == other.Node_ && NodePair_ == other.NodePair_; } - - bool operator!=(TReverseMappingIterator other) const { return !(*this == other); } - - const TNodePairRef& operator*() const { return NodePair_; } - -private: - TNodeRef Node_; - TNodePairRef NodePair_; -}; - -class TMapping : public TNodeRef { -public: - template <class T> - explicit TMapping(const TNodeOps<T>& node) - : TNodeRef(node) - { - Y_DEBUG_ABORT_UNLESS(Type() == ENodeType::Mapping); - } - - TMappingIterator begin() const { - return TMappingIterator(*this); - } - - TMappingIterator end() const { - return TMappingIterator(*this, true); - } - - TReverseMappingIterator rbegin() const { - return TReverseMappingIterator(*this); - } - - TReverseMappingIterator rend() const { - return TReverseMappingIterator(*this, true); - } - - size_t size() const; - - size_t empty() const; - - TNodePairRef at(int index) const; - - TNodePairRef operator[](int index) const; - - TNodeRef at(const TString& index) const; - - TNodePairRef pair_at(const TString& index) const; - - TNodePairRef pair_at_opt(const TString& index) const; - - TNodeRef operator[](const TString& index) const; - - TNodeRef operator[](const char* str) const; - - void Append(const TNodeRef& key, const TNodeRef& value); - - void Prepend(const TNodeRef& key, const TNodeRef& value); - - void Remove(const TNodePairRef& toRemove); - - bool Has(TString key) const; - - TMappingIterator Remove(const TMappingIterator& toRemove); - - void Remove(const TNodeRef& key); -}; - -class TSequenceIterator { - friend class TSequence; -public: - explicit TSequenceIterator(const TNodeRef& node, bool end = false); - - TSequenceIterator(const TSequenceIterator& other) { - Node_ = other.Node_; - IterNode_ = other.IterNode_; - Iter_ = other.Iter_; - } - - TSequenceIterator& operator=(const TSequenceIterator& other) { - Node_ = other.Node_; - IterNode_ = other.IterNode_; - Iter_ = other.Iter_; - return *this; - } - - TSequenceIterator& operator++(); - - const TNodeRef* operator->() const { - return &IterNode_; - } - - TSequenceIterator operator++(int) { - TSequenceIterator retval = *this; - ++(*this); - return retval; - } - - bool operator==(TSequenceIterator other) const { return Node_ == other.Node_ && Iter_ == other.Iter_; } - - bool operator!=(TSequenceIterator other) const { return !(*this == other); } - - const TNodeRef& operator*() const { return IterNode_; } - - void InsertBefore(const TNodeRef& node); - - void InsertAfter(const TNodeRef& node); - -private: - TNodeRef Node_; - TNodeRef IterNode_; - void* Iter_ = nullptr; -}; - -class TReverseSequenceIterator { - friend class TSequence; -public: - explicit TReverseSequenceIterator(const TNodeRef& node, bool end = false); - - TReverseSequenceIterator(const TReverseSequenceIterator& other) { - Node_ = other.Node_; - IterNode_ = other.IterNode_; - Iter_ = other.Iter_; - } - - TReverseSequenceIterator& operator=(const TReverseSequenceIterator& other) { - Node_ = other.Node_; - IterNode_ = other.IterNode_; - Iter_ = other.Iter_; - return *this; - } - - TReverseSequenceIterator& operator++(); - - const TNodeRef* operator->() const { - return &IterNode_; - } - - TReverseSequenceIterator operator++(int) { - TReverseSequenceIterator retval = *this; - ++(*this); - return retval; - } - - bool operator==(TReverseSequenceIterator other) const { return Node_ == other.Node_ && Iter_ == other.Iter_; } - - bool operator!=(TReverseSequenceIterator other) const { return !(*this == other); } - - const TNodeRef& operator*() const { return IterNode_; } - - void InsertBefore(const TNodeRef& node); - - void InsertAfter(const TNodeRef& node); - -private: - TNodeRef Node_; - TNodeRef IterNode_; - void* Iter_ = nullptr; -}; - -class TSequence : public TNodeRef { -public: - explicit TSequence(const TNodeRef& node) - : TNodeRef(node) - { - Y_DEBUG_ABORT_UNLESS(Type() == ENodeType::Sequence); - } - - TSequenceIterator begin() const { - return TSequenceIterator(*this); - } - - TSequenceIterator end() const { - return TSequenceIterator(*this, true); - } - - TReverseSequenceIterator rbegin() const { - return TReverseSequenceIterator(*this); - } - - TReverseSequenceIterator rend() const { - return TReverseSequenceIterator(*this, true); - } - - size_t size() const; - - size_t empty() const; - - TNodeRef at(int index) const; - - TNodeRef operator[](int index) const; - - void Append(const TNodeRef& node); - - void Prepend(const TNodeRef& node); - - void InsertBefore(const TNodeRef& mark, const TNodeRef& node); - - void InsertAfter(const TNodeRef& mark, const TNodeRef& node); - - TNode Remove(const TNodeRef& toRemove); - - TSequenceIterator Remove(const TSequenceIterator& toRemove); - - TReverseSequenceIterator Remove(const TReverseSequenceIterator& toRemove); -}; - -class TDocumentNodeIterator - : public TDocumentIterator -{ -public: - explicit TDocumentNodeIterator(TNodeRef&& node); - - TDocumentNodeIterator(const TDocumentNodeIterator& other) - : TDocumentIterator(other.Iterator_.get()) - , Node_(other.Node_) - {} - - TDocumentNodeIterator& operator=(const TDocumentNodeIterator& other) { - Iterator_.reset(other.Iterator_.get()); - Node_ = other.Node_; - return *this; - } - - TDocumentNodeIterator& operator++(); - - TNodeRef* operator->() { - return &Node_; - } - - TDocumentNodeIterator operator++(int) { - TDocumentNodeIterator retval = *this; - ++(*this); - return retval; - } - - bool operator==(TDocumentNodeIterator other) const { return Node_ == other.Node_; } - - bool operator!=(TDocumentNodeIterator other) const { return !(*this == other); } - - TNodeRef& operator*() { return Node_; } - -private: - TNodeRef Node_; -}; - -class TDocument { - friend class NDetail::TNodeOps<TNodeRef>; - friend class NDetail::TNodeOps<TNode>; - friend class TParser; - - explicit TDocument(TString str, fy_document* doc = nullptr, fy_diag* diag = nullptr); - explicit TDocument(fy_document* doc = nullptr, fy_diag* diag = nullptr); - -public: - TDocument(TDocument&& other) - : Document_(std::move(other.Document_)) - , Diag_(std::move(other.Diag_)) - {} - - static TDocument Parse(TString cstr); - - TDocument Clone() const; - - template <class... Args> - size_t Scanf(const char* fmt, Args&& ...args) { - Y_DEBUG_ABORT_UNLESS(Document_); - return fy_document_scanf(Document_.get(), fmt, std::forward<Args>(args)...); - } - - void InsertAt(const char* path, const TNodeRef& node); - - template <class... Args> - TNodeRef Buildf(const char* fmt, Args&& ...args) { - Y_DEBUG_ABORT_UNLESS(Document_); - return fy_node_buildf(Document_.get(), fmt, std::forward<Args>(args)...); - } - - TNodeRef Buildf(const char* content); - - void Resolve(); - - bool HasDirectives(); - - bool HasExplicitDocumentStart(); - - bool HasExplicitDocumentEnd(); - - void SetParent(const TDocument& doc); - - TNodeRef Root(); - - void SetRoot(const TNodeRef& node); - - TDocumentNodeIterator begin() { - auto it = TDocumentNodeIterator(Root()); - ++it; - return it; - } - - TDocumentNodeIterator end() { - return TDocumentNodeIterator(TNodeRef(nullptr)); - } - - TNodeRef CreateAlias(const TString& name); - - std::unique_ptr<char, void(*)(char*)> EmitToCharArray() const; - - TMark BeginMark() const; - - TMark EndMark() const; - -private: - std::unique_ptr<fy_document, void(*)(fy_document*)> Document_; - std::unique_ptr<fy_diag, void(*)(fy_diag*)> Diag_; - - static void DestroyUserData(fy_node *fyn, void *meta, void *user) { - Y_UNUSED(fyn); - Y_UNUSED(user); - if (meta) { - auto* data = reinterpret_cast<NDetail::IBasicUserData*>(meta); - delete data; - } - } - - static void DestroyDocumentStrings(fy_document *fyd, void *user) { - Y_UNUSED(fyd); - if (user) { - auto* data = reinterpret_cast<THashSet<TSimpleSharedPtr<TString>, TStringPtrHashT>*>(user); - delete data; - } - } - - bool RegisterUserDataCleanup(); - void UnregisterUserDataCleanup(); -}; - -class TJsonEmitter { -public: - explicit TJsonEmitter(TDocument& doc) : Node_(doc.Root()) {} - explicit TJsonEmitter(const TNodeRef& node) : Node_(node) {} - - std::unique_ptr<char, void(*)(char*)> EmitToCharArray() const; - -private: - const TNodeRef Node_; -}; - -class TParser { - TParser(TString rawStream, fy_parser* doc, fy_diag* diag); -public: - static TParser Create(TString str); - - std::optional<TDocument> NextDocument(); -private: - TString RawDocumentStream_; - std::unique_ptr<fy_parser, void(*)(fy_parser*)> Parser_; - std::unique_ptr<fy_diag, void(*)(fy_diag*)> Diag_; -}; - -struct TMark { - size_t InputPos; - int Line; - int Column; -}; - -namespace NDetail { - -template <class T> -TNode TNodeOps<T>::CreateReference() const { - return TNode(TNodeOpsBase::CreateReference(Node())); -} - -template <class T> -TNode TNodeOps<T>::Copy() const { - return TNode(TNodeOpsBase::Copy(Node())); -} - -template <class T> -TNode TNodeOps<T>::Copy(TDocument& to) const { - return TNode(TNodeOpsBase::Copy(Node(), to.Document_.get())); -} - -template <class T> -TString TNodeOps<T>::Path() const { - return TNodeOpsBase::Path(Node()); -} - -template <class T> -ENodeType TNodeOps<T>::Type() const { - return TNodeOpsBase::Type(Node()); -} - -template <class T> -bool TNodeOps<T>::IsAlias() const { - return TNodeOpsBase::IsAlias(Node()); -} - -template <class T> -TNodeRef TNodeOps<T>::ResolveAlias() const { - return TNodeRef(TNodeOpsBase::ResolveAlias(Node())); -} - -template <class T> -TString TNodeOps<T>::Scalar() const { - return TNodeOpsBase::Scalar(Node()); -} - -template <class T> -TMark TNodeOps<T>::BeginMark() const { - return TNodeOpsBase::BeginMark(Node()); -} - -template <class T> -TMark TNodeOps<T>::EndMark() const { - return TNodeOpsBase::EndMark(Node()); -} - -template <class T> -TMapping TNodeOps<T>::Map() const { - return TMapping(TNodeRef(TNodeOpsBase::Map(Node()))); -} - -template <class T> -TSequence TNodeOps<T>::Sequence() const { - return TSequence(TNodeRef(TNodeOpsBase::Sequence(Node()))); -} - -template <class T> -void TNodeOps<T>::Insert(const TNodeRef& node) { - return TNodeOpsBase::Insert(Node(), node.Node_); -} - -template <class T> -std::optional<TString> TNodeOps<T>::Tag() const { - return TNodeOpsBase::Tag(Node()); -} - -template <class T> -void TNodeOps<T>::SetTag(const TString& tag) { - return TNodeOpsBase::SetTag(Node(), tag); -} - -template <class T> -bool TNodeOps<T>::RemoveTag() { - return TNodeOpsBase::RemoveTag(Node()); -} - -template <class T> -bool TNodeOps<T>::HasAnchor() const { - return TNodeOpsBase::HasAnchor(Node()); -} - -template <class T> -void TNodeOps<T>::SetAnchor(const TString& anchor) { - return TNodeOpsBase::SetAnchor(Node(), anchor); -} - -template <class T> -bool TNodeOps<T>::DeepEqual(const TNodeRef& other) { - return TNodeOpsBase::DeepEqual(Node(), other.Node_); -} - -template <class T> -std::unique_ptr<char, void(*)(char*)> TNodeOps<T>::EmitToCharArray() const { - return TNodeOpsBase::EmitToCharArray(Node()); -} - -template <class T> -void TNodeOps<T>::SetStyle(ENodeStyle style) { - return TNodeOpsBase::SetStyle(Node(), style); -} - -template <class T> -ENodeStyle TNodeOps<T>::Style() const { - return TNodeOpsBase::Style(Node()); -} - -template <class T> -const T& TNodeOps<T>::AsDerived() const { - return static_cast<const T&>(*this); -} - -template <class T> -fy_node* TNodeOps<T>::Node() const { - return AsDerived().NodeRawPointer(); -} - -template <class T> -fy_node* TNodeOps<T>::Node() { - return AsDerived().NodeRawPointer(); -} - -template <class T> -void TNodeOps<T>::SetUserData(IBasicUserData* data) { - return TNodeOpsBase::SetUserData(Node(), data); -} - -template <class T> -IBasicUserData* TNodeOps<T>::UserData() const { - return TNodeOpsBase::UserData(Node()); -} - -template <class T> -void TNodeOps<T>::ClearUserData() { - return TNodeOpsBase::ClearUserData(Node()); -} - -} // namespace NDetail - -} // namesapce NFyaml diff --git a/library/cpp/yaml/fyamlcpp/fyamlcpp_ut.cpp b/library/cpp/yaml/fyamlcpp/fyamlcpp_ut.cpp deleted file mode 100644 index 493aaab136..0000000000 --- a/library/cpp/yaml/fyamlcpp/fyamlcpp_ut.cpp +++ /dev/null @@ -1,543 +0,0 @@ -#include "fyamlcpp.h" - -#include <contrib/libs/libfyaml/include/libfyaml.h> - -#include <library/cpp/testing/unittest/registar.h> - -#include <util/stream/str.h> - -Y_UNIT_TEST_SUITE(FYamlCpp) { - Y_UNIT_TEST(EnumEquals) { - UNIT_ASSERT_EQUAL((int)NFyaml::ENodeType::Scalar, FYNT_SCALAR); - UNIT_ASSERT_EQUAL((int)NFyaml::ENodeType::Sequence, FYNT_SEQUENCE); - UNIT_ASSERT_EQUAL((int)NFyaml::ENodeType::Mapping, FYNT_MAPPING); - - UNIT_ASSERT_EQUAL((int)NFyaml::ENodeStyle::Any, FYNS_ANY); - UNIT_ASSERT_EQUAL((int)NFyaml::ENodeStyle::Flow, FYNS_FLOW); - UNIT_ASSERT_EQUAL((int)NFyaml::ENodeStyle::Block, FYNS_BLOCK); - UNIT_ASSERT_EQUAL((int)NFyaml::ENodeStyle::Plain, FYNS_PLAIN); - UNIT_ASSERT_EQUAL((int)NFyaml::ENodeStyle::SingleQuoted, FYNS_SINGLE_QUOTED); - UNIT_ASSERT_EQUAL((int)NFyaml::ENodeStyle::DoubleQuoted, FYNS_DOUBLE_QUOTED); - UNIT_ASSERT_EQUAL((int)NFyaml::ENodeStyle::Literal, FYNS_LITERAL); - UNIT_ASSERT_EQUAL((int)NFyaml::ENodeStyle::Folded, FYNS_FOLDED); - UNIT_ASSERT_EQUAL((int)NFyaml::ENodeStyle::Alias, FYNS_ALIAS); - } - - Y_UNIT_TEST(ErrorHandling) { - { - const char *yaml = R"( -config: a -config: b -)"; - UNIT_ASSERT_EXCEPTION_CONTAINS( - NFyaml::TDocument::Parse(yaml), - NFyaml::TFyamlEx, - "3:1 duplicate key"); - } - - { - const char *yaml = R"( -anchor: *does_not_exists -)"; - auto doc = NFyaml::TDocument::Parse(yaml); - UNIT_ASSERT_EXCEPTION_CONTAINS( - doc.Resolve(), - NFyaml::TFyamlEx, - "2:10 invalid alias"); - } - { - const char *yaml = R"( -a: 1 -a: 2 -a: 3 -)"; - try { - NFyaml::TDocument::Parse(yaml); - UNIT_FAIL("exception must've happend"); - } catch (NFyaml::TFyamlEx e) { - UNIT_ASSERT(TString(e.what()).Contains("3:1 duplicate key")); - UNIT_ASSERT(e.Errors().ysize() == 1); - } - } - } - - Y_UNIT_TEST(Out) { - const char *yaml = R"( -test: output -)"; - - auto doc = NFyaml::TDocument::Parse(yaml); - - TStringStream ss; - - ss << doc; - - UNIT_ASSERT_VALUES_EQUAL(ss.Str(), "test: output\n"); - } - - Y_UNIT_TEST(Parser) { - const char *yaml = R"( -test: a ---- -test: b -)"; - auto parser = NFyaml::TParser::Create(yaml); - - TStringStream ss; - - auto docOpt = parser.NextDocument(); - UNIT_ASSERT(docOpt); - ss << *docOpt; - UNIT_ASSERT_VALUES_EQUAL(ss.Str(), "test: a\n"); - auto beginMark = docOpt->BeginMark(); - UNIT_ASSERT_VALUES_EQUAL(beginMark.InputPos, 1); - auto endMark = docOpt->EndMark(); - UNIT_ASSERT_VALUES_EQUAL(endMark.InputPos, 12); - UNIT_ASSERT_VALUES_EQUAL(TStringBuf(yaml).SubStr(beginMark.InputPos, endMark.InputPos - 4), ss.Str()); - - ss.clear(); - - auto docOpt2 = parser.NextDocument(); - UNIT_ASSERT(docOpt2); - ss << *docOpt2; - UNIT_ASSERT_VALUES_EQUAL(ss.Str(), "---\ntest: b\n"); - beginMark = docOpt2->BeginMark(); - UNIT_ASSERT_VALUES_EQUAL(beginMark.InputPos, 9); - endMark = docOpt2->EndMark(); - UNIT_ASSERT_VALUES_EQUAL(endMark.InputPos, 21); - UNIT_ASSERT_VALUES_EQUAL(TStringBuf(yaml).SubStr(beginMark.InputPos, endMark.InputPos), ss.Str()); - - auto docOpt3 = parser.NextDocument(); - UNIT_ASSERT(!docOpt3); - } - - Y_UNIT_TEST(Leak) { - std::optional<NFyaml::TDocument> doc; - - { - std::optional<NFyaml::TDocument> item1; - std::optional<NFyaml::TDocument> item2; - { - const TString items = R"( -item: - x: 1 - y: 2 ---- -test: - a: noop - b: - - 1 - - 2 - - 3 ---- -x: b -)"; - auto parser = NFyaml::TParser::Create(items); - - item1.emplace(*parser.NextDocument()); - item2.emplace(*parser.NextDocument()); - parser.NextDocument(); - parser.NextDocument(); - } - - { - const TString config = R"( -test: a ---- -test: [] ---- -x: b -)"; - auto parser = NFyaml::TParser::Create(config); - - parser.NextDocument(); - doc.emplace(*parser.NextDocument()); - parser.NextDocument(); - parser.NextDocument(); - } - - { - auto item1NodeRef = item1->Root().Map().at("item"); - auto item2NodeRef = item2->Root().Map().at("test"); - auto docNodeRef = doc->Root().Map().at("test"); - auto node1 = item1NodeRef.Copy(*doc); - auto node2 = item2NodeRef.Copy(*doc); - docNodeRef.Sequence().Append(node1); - docNodeRef.Sequence().Append(node2); - item1.reset(); - item2.reset(); - } - } - - auto seq = doc->Root().Map().at("test").Sequence(); - UNIT_ASSERT(seq[0].Map().Has("x")); - UNIT_ASSERT(!seq[0].Map().Has("xx")); - UNIT_ASSERT_VALUES_EQUAL(seq[0].Map().at("x").Scalar(), "1"); - UNIT_ASSERT_VALUES_EQUAL(seq[0].Map().at("y").Scalar(), "2"); - UNIT_ASSERT_VALUES_EQUAL(seq[1].Map().at("a").Scalar(), "noop"); - UNIT_ASSERT_VALUES_EQUAL(seq[1].Map().at("b").Sequence().at(0).Scalar(), "1"); - UNIT_ASSERT_VALUES_EQUAL(seq[1].Map().at("b").Sequence().at(1).Scalar(), "2"); - UNIT_ASSERT_VALUES_EQUAL(seq[1].Map().at("b").Sequence().at(2).Scalar(), "3"); - } - - Y_UNIT_TEST(SimpleScalarMark) { - auto check = [](const TString& str, const NFyaml::TNodeRef& node) { - auto pos = str.find("123"); - auto endPos = pos + strlen("123"); - auto begin = node.BeginMark().InputPos; - auto end = node.EndMark().InputPos; - UNIT_ASSERT_VALUES_EQUAL(begin, pos); - UNIT_ASSERT_VALUES_EQUAL(end, endPos); - }; - - { - TString str = R"(obj: 123)"; - auto doc = NFyaml::TDocument::Parse(str); - auto node = doc.Root().Map().at("obj"); - check(str, node); - } - - { - TString str = R"(obj: 123 # test)"; - auto doc = NFyaml::TDocument::Parse(str); - auto node = doc.Root().Map().at("obj"); - check(str, node); - } - - { - TString str = R"( -# test -obj: 123 # test -# test -)"; - auto doc = NFyaml::TDocument::Parse(str); - auto node = doc.Root().Map().at("obj"); - check(str, node); - } - - { - TString str = R"( ---- -obj: 123 -... -)"; - auto doc = NFyaml::TDocument::Parse(str); - auto node = doc.Root().Map().at("obj"); - check(str, node); - } - - { - TString str = R"( -a: foo -test: [{obj: 123}] -b: bar - )"; - auto doc = NFyaml::TDocument::Parse(str); - auto node = doc.Root().Map().at("test").Sequence().at(0).Map().at("obj"); - check(str, node); - } - - { - TString str = R"(obj: '123')"; - auto doc = NFyaml::TDocument::Parse(str); - auto node = doc.Root().Map().at("obj"); - check(str, node); - } - - { - TString str = R"(obj: '123' # test)"; - auto doc = NFyaml::TDocument::Parse(str); - auto node = doc.Root().Map().at("obj"); - check(str, node); - } - - { - TString str = R"( -# test -obj: '123' # test -# test -)"; - auto doc = NFyaml::TDocument::Parse(str); - auto node = doc.Root().Map().at("obj"); - check(str, node); - } - - { - TString str = R"( ---- -obj: '123' -... -)"; - auto doc = NFyaml::TDocument::Parse(str); - auto node = doc.Root().Map().at("obj"); - check(str, node); - } - - { - TString str = R"( -a: foo -test: [{obj: "123"}] -b: bar - )"; - auto doc = NFyaml::TDocument::Parse(str); - auto node = doc.Root().Map().at("test").Sequence().at(0).Map().at("obj"); - check(str, node); - } - - { - TString str = R"(obj: "123")"; - auto doc = NFyaml::TDocument::Parse(str); - auto node = doc.Root().Map().at("obj"); - check(str, node); - } - - { - TString str = R"(obj: "123" # test)"; - auto doc = NFyaml::TDocument::Parse(str); - auto node = doc.Root().Map().at("obj"); - check(str, node); - } - - { - TString str = R"( -# test -obj: "123" # test -# test -)"; - auto doc = NFyaml::TDocument::Parse(str); - auto node = doc.Root().Map().at("obj"); - check(str, node); - } - - { - TString str = R"( ---- -obj: "123" -... -)"; - auto doc = NFyaml::TDocument::Parse(str); - auto node = doc.Root().Map().at("obj"); - check(str, node); - } - - { - TString str = R"( -a: foo -test: [{obj: "123"}] -b: bar - )"; - auto doc = NFyaml::TDocument::Parse(str); - auto node = doc.Root().Map().at("test").Sequence().at(0).Map().at("obj"); - check(str, node); - } - - { - TString str = R"( -a: foo -test: [{obj: !!int "123"}] -b: bar - )"; - auto doc = NFyaml::TDocument::Parse(str); - auto node = doc.Root().Map().at("test").Sequence().at(0).Map().at("obj"); - check(str, node); - } - - } - - Y_UNIT_TEST(MultilineScalarMark) { - { - TString str = R"(obj: >+2 - some - multiline - - scalar with couple words)"; - auto doc = NFyaml::TDocument::Parse(str); - auto node = doc.Root().Map().at("obj"); - auto begin = node.BeginMark().InputPos; - auto end = node.EndMark().InputPos; - UNIT_ASSERT_VALUES_EQUAL(begin, 9); - UNIT_ASSERT_VALUES_EQUAL(end, 55); - } - } - - Y_UNIT_TEST(MapMark) { - { - TString str = R"( -a: foo -map: !!map - internal_map1: {} - internal_map2: - internal_map3: - internal_map4: - value: 1 - internal_map5: { - internal_map6: {test1: 1, test2: 2}, - internal_map7: { - value: 1 - } - } -# comment -c: bar - )"; - - auto doc = NFyaml::TDocument::Parse(str); - - auto node = doc.Root().Map().at("map"); - - auto begin = node.BeginMark().InputPos; - auto end = node.EndMark().InputPos; - - UNIT_ASSERT_VALUES_EQUAL(begin, 21); - UNIT_ASSERT_VALUES_EQUAL(end, 246); - } - - { - TString str = R"( -a: foo -map: !!map # comment -# comment -c: bar - )"; - - auto doc = NFyaml::TDocument::Parse(str); - - auto node = doc.Root().Map().at("map"); - - auto begin = node.BeginMark().InputPos; - auto end = node.EndMark().InputPos; - - UNIT_ASSERT_VALUES_EQUAL(begin, 11); - UNIT_ASSERT_VALUES_EQUAL(end, 11); - } - - { - TString str = R"( -a: foo -map: {} # comment -# comment -c: bar - )"; - - auto doc = NFyaml::TDocument::Parse(str); - - auto node = doc.Root().Map().at("map"); - - auto begin = node.BeginMark().InputPos; - auto end = node.EndMark().InputPos; - - UNIT_ASSERT_VALUES_EQUAL(begin, 13); - UNIT_ASSERT_VALUES_EQUAL(end, 15); - } - - { - TString str = R"( -a: foo -map: - value: 1 -# comment -c: bar - )"; - - auto doc = NFyaml::TDocument::Parse(str); - - auto node = doc.Root().Map().at("map"); - - auto begin = node.BeginMark().InputPos; - auto end = node.EndMark().InputPos; - - UNIT_ASSERT_VALUES_EQUAL(begin, 15); - UNIT_ASSERT_VALUES_EQUAL(end, 23); - } - } - - Y_UNIT_TEST(SequenceMark) { - { - TString str = R"( -a: foo -seq: !!seq -- internal_map1: {} -- internal_seq2: - - internal_seq3: - - internal_seq4: - value: 1 - - internal_seq5: [ - internal_seq6: [{test1: 1}, {test2: 2}], - internal_seq7: [ - {value: 1} - ] - ] -# comment -c: bar - )"; - - auto doc = NFyaml::TDocument::Parse(str); - - auto node = doc.Root().Map().at("seq"); - - auto begin = node.BeginMark().InputPos; - auto end = node.EndMark().InputPos; - - UNIT_ASSERT_VALUES_EQUAL(begin, 19); - UNIT_ASSERT_VALUES_EQUAL(end, 252); - } - - { - TString str = R"( -a: foo -seq: !!seq # comment -# comment -c: bar - )"; - - auto doc = NFyaml::TDocument::Parse(str); - - auto node = doc.Root().Map().at("seq"); - - auto begin = node.BeginMark().InputPos; - auto end = node.EndMark().InputPos; - - UNIT_ASSERT_VALUES_EQUAL(begin, 11); - UNIT_ASSERT_VALUES_EQUAL(end, 11); - } - - { - TString str = R"( -a: foo -seq: [] # comment -# comment -c: bar - )"; - - auto doc = NFyaml::TDocument::Parse(str); - - auto node = doc.Root().Map().at("seq"); - - auto begin = node.BeginMark().InputPos; - auto end = node.EndMark().InputPos; - - UNIT_ASSERT_VALUES_EQUAL(begin, 13); - UNIT_ASSERT_VALUES_EQUAL(end, 15); - } - - { - TString str = R"( -a: foo -seq: -- value: 1 -# comment -c: bar - )"; - - auto doc = NFyaml::TDocument::Parse(str); - - auto node = doc.Root().Map().at("seq"); - - auto begin = node.BeginMark().InputPos; - auto end = node.EndMark().InputPos; - - UNIT_ASSERT_VALUES_EQUAL(begin, 13); - UNIT_ASSERT_VALUES_EQUAL(end, 23); - } - } - -} diff --git a/library/cpp/yaml/fyamlcpp/libfyaml_ut.cpp b/library/cpp/yaml/fyamlcpp/libfyaml_ut.cpp deleted file mode 100644 index d5e28cf98e..0000000000 --- a/library/cpp/yaml/fyamlcpp/libfyaml_ut.cpp +++ /dev/null @@ -1,1838 +0,0 @@ -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <assert.h> -#include <limits.h> - -#include <span> - -#include <contrib/libs/libfyaml/include/libfyaml.h> -#include <library/cpp/testing/unittest/registar.h> - -/* -These tests are ported from https://github.com/pantoniou/libfyaml/blob/master/test/libfyaml-test-core.c -To check windows compatibility and avoid possible internal patch issues -*/ - -Y_UNIT_TEST_SUITE(LibFyamlCore) { - -Y_UNIT_TEST(doc_build_simple) { - struct fy_document *fyd; - - /* setup */ - fyd = fy_document_create(NULL); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - /* cleanup */ - fy_document_destroy(fyd); -} - -Y_UNIT_TEST(doc_build_parse_check) { - struct fy_document *fyd; - char *buf; - - /* build document (with comments, newlines etc) */ - fyd = fy_document_build_from_string(NULL, "#comment\n[ 42, \n 12 ] # comment\n", FY_NT); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - /* convert to string */ - buf = fy_emit_document_to_string(fyd, FYECF_MODE_FLOW_ONELINE); - UNIT_ASSERT_UNEQUAL(buf, NULL); - - /* compare with expected result */ - UNIT_ASSERT_VALUES_EQUAL(buf, TString("[42, 12]\n")); - - free(buf); - - fy_document_destroy(fyd); -} - -Y_UNIT_TEST(doc_build_scalar) { - struct fy_document *fyd; - - /* build document */ - fyd = fy_document_build_from_string(NULL, "plain scalar # comment", FY_NT); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - /* compare with expected result */ - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fy_document_root(fyd)), TString("plain scalar")); - - fy_document_destroy(fyd); -} - -Y_UNIT_TEST(doc_build_sequence) { - struct fy_document *fyd; - struct fy_node *fyn; - int count; - void *iter; - - /* build document */ - fyd = fy_document_build_from_string(NULL, "[ 10, 11, foo ] # comment", FY_NT); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - /* check for correct count value */ - count = fy_node_sequence_item_count(fy_document_root(fyd)); - UNIT_ASSERT_EQUAL(count, 3); - - /* try forward iterator first */ - iter = NULL; - - /* 0 */ - fyn = fy_node_sequence_iterate(fy_document_root(fyd), &iter); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fyn), TString("10")); - - /* 1 */ - fyn = fy_node_sequence_iterate(fy_document_root(fyd), &iter); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fyn), TString("11")); - - /* 2 */ - fyn = fy_node_sequence_iterate(fy_document_root(fyd), &iter); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fyn), TString("foo")); - - /* final, iterator must return NULL */ - fyn = fy_node_sequence_iterate(fy_document_root(fyd), &iter); - UNIT_ASSERT_EQUAL(fyn, NULL); - - /* reverse iterator */ - iter = NULL; - - /* 2 */ - fyn = fy_node_sequence_reverse_iterate(fy_document_root(fyd), &iter); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fyn), TString("foo")); - - /* 1 */ - fyn = fy_node_sequence_reverse_iterate(fy_document_root(fyd), &iter); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fyn), TString("11")); - - /* 0 */ - fyn = fy_node_sequence_reverse_iterate(fy_document_root(fyd), &iter); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fyn), TString("10")); - - /* final, iterator must return NULL */ - fyn = fy_node_sequence_reverse_iterate(fy_document_root(fyd), &iter); - UNIT_ASSERT_EQUAL(fyn, NULL); - - /* do forward index based accesses */ - - /* 0 */ - fyn = fy_node_sequence_get_by_index(fy_document_root(fyd), 0); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fyn), TString("10")); - - /* 1 */ - fyn = fy_node_sequence_get_by_index(fy_document_root(fyd), 1); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fyn), TString("11")); - - /* 2 */ - fyn = fy_node_sequence_get_by_index(fy_document_root(fyd), 2); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fyn), TString("foo")); - - /* 3, it must not exist */ - fyn = fy_node_sequence_get_by_index(fy_document_root(fyd), 3); - UNIT_ASSERT_EQUAL(fyn, NULL); - - /* do backward index based accesses */ - - /* 2 */ - fyn = fy_node_sequence_get_by_index(fy_document_root(fyd), -1); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fyn), TString("foo")); - - /* 1 */ - fyn = fy_node_sequence_get_by_index(fy_document_root(fyd), -2); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fyn), TString("11")); - - /* 0 */ - fyn = fy_node_sequence_get_by_index(fy_document_root(fyd), -3); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fyn), TString("10")); - - /* -1, it must not exist */ - fyn = fy_node_sequence_get_by_index(fy_document_root(fyd), -4); - UNIT_ASSERT_EQUAL(fyn, NULL); - - fy_document_destroy(fyd); -} - -Y_UNIT_TEST(doc_build_mapping) { - struct fy_document *fyd; - struct fy_node_pair *fynp; - int count; - void *iter; - - fyd = fy_document_build_from_string(NULL, "{ foo: 10, bar : 20, baz: [100, 101], [frob, 1]: boo }", FY_NT); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - /* check for correct count value */ - count = fy_node_mapping_item_count(fy_document_root(fyd)); - UNIT_ASSERT_EQUAL(count, 4); - - /* forward iterator first */ - iter = NULL; - - /* 0 */ - fynp = fy_node_mapping_iterate(fy_document_root(fyd), &iter); - UNIT_ASSERT_UNEQUAL(fynp, NULL); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fy_node_pair_key(fynp)), TString("foo")); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fy_node_pair_value(fynp)), TString("10")); - - /* 1 */ - fynp = fy_node_mapping_iterate(fy_document_root(fyd), &iter); - UNIT_ASSERT_UNEQUAL(fynp, NULL); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fy_node_pair_key(fynp)), TString("bar")); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fy_node_pair_value(fynp)), TString("20")); - - /* 2 */ - fynp = fy_node_mapping_iterate(fy_document_root(fyd), &iter); - UNIT_ASSERT_UNEQUAL(fynp, NULL); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fy_node_pair_key(fynp)), TString("baz")); - UNIT_ASSERT_EQUAL(fy_node_sequence_item_count(fy_node_pair_value(fynp)), 2); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fy_node_sequence_get_by_index(fy_node_pair_value(fynp), 0)), TString("100")); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fy_node_sequence_get_by_index(fy_node_pair_value(fynp), 1)), TString("101")); - - /* 3 */ - fynp = fy_node_mapping_iterate(fy_document_root(fyd), &iter); - UNIT_ASSERT_UNEQUAL(fynp, NULL); - UNIT_ASSERT_EQUAL(fy_node_sequence_item_count(fy_node_pair_key(fynp)), 2); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fy_node_sequence_get_by_index(fy_node_pair_key(fynp), 0)), TString("frob")); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fy_node_sequence_get_by_index(fy_node_pair_key(fynp), 1)), TString("1")); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fy_node_pair_value(fynp)), TString("boo")); - - /* 4, it must not exist */ - fynp = fy_node_mapping_iterate(fy_document_root(fyd), &iter); - UNIT_ASSERT_EQUAL(fynp, NULL); - - /* reverse iterator */ - iter = NULL; - - /* 3 */ - fynp = fy_node_mapping_reverse_iterate(fy_document_root(fyd), &iter); - UNIT_ASSERT_UNEQUAL(fynp, NULL); - UNIT_ASSERT_EQUAL(fy_node_sequence_item_count(fy_node_pair_key(fynp)), 2); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fy_node_sequence_get_by_index(fy_node_pair_key(fynp), 0)), TString("frob")); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fy_node_sequence_get_by_index(fy_node_pair_key(fynp), 1)), TString("1")); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fy_node_pair_value(fynp)), TString("boo")); - - /* 2 */ - fynp = fy_node_mapping_reverse_iterate(fy_document_root(fyd), &iter); - UNIT_ASSERT_UNEQUAL(fynp, NULL); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fy_node_pair_key(fynp)), TString("baz")); - UNIT_ASSERT_EQUAL(fy_node_sequence_item_count(fy_node_pair_value(fynp)), 2); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fy_node_sequence_get_by_index(fy_node_pair_value(fynp), 0)), TString("100")); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fy_node_sequence_get_by_index(fy_node_pair_value(fynp), 1)), TString("101")); - - /* 1 */ - fynp = fy_node_mapping_reverse_iterate(fy_document_root(fyd), &iter); - UNIT_ASSERT_UNEQUAL(fynp, NULL); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fy_node_pair_key(fynp)), TString("bar")); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fy_node_pair_value(fynp)), TString("20")); - - /* 0 */ - fynp = fy_node_mapping_reverse_iterate(fy_document_root(fyd), &iter); - UNIT_ASSERT_UNEQUAL(fynp, NULL); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fy_node_pair_key(fynp)), TString("foo")); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fy_node_pair_value(fynp)), TString("10")); - - /* -1, it must not exist */ - fynp = fy_node_mapping_reverse_iterate(fy_document_root(fyd), &iter); - UNIT_ASSERT_EQUAL(fynp, NULL); - - /* key lookups (note how only the contents are compared) */ - UNIT_ASSERT(fy_node_compare_string(fy_node_mapping_lookup_by_string(fy_document_root(fyd), "foo", FY_NT), "10", FY_NT) == true); - UNIT_ASSERT(fy_node_compare_string(fy_node_mapping_lookup_by_string(fy_document_root(fyd), "bar", FY_NT), "20", FY_NT) == true); - UNIT_ASSERT(fy_node_compare_string(fy_node_mapping_lookup_by_string(fy_document_root(fyd), "baz", FY_NT), "- 100\n- 101", FY_NT) == true); - UNIT_ASSERT(fy_node_compare_string(fy_node_mapping_lookup_by_string(fy_document_root(fyd), "- 'frob'\n- \"\x31\"", FY_NT), "boo", FY_NT) == true); - - fy_document_destroy(fyd); - fyd = NULL; -} - -Y_UNIT_TEST(doc_path_access) { - struct fy_document *fyd; - struct fy_node *fyn; - - /* build document */ - fyd = fy_document_build_from_string(NULL, "{ " - "foo: 10, bar : 20, baz:{ frob: boo }, " - "frooz: [ seq1, { key: value} ], \"zero\\0zero\" : 0, " - "{ key2: value2 }: { key3: value3 } " - "}", FY_NT); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - /* check that getting root node works */ - fyn = fy_node_by_path(fy_document_root(fyd), "/", FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - UNIT_ASSERT_EQUAL(fyn, fy_document_root(fyd)); - - /* check access to scalars */ - UNIT_ASSERT(fy_node_compare_string(fy_node_by_path(fy_document_root(fyd), "/foo", FY_NT, FYNWF_DONT_FOLLOW), "10", FY_NT) == true); - UNIT_ASSERT(fy_node_compare_string(fy_node_by_path(fy_document_root(fyd), "bar", FY_NT, FYNWF_DONT_FOLLOW), "20", FY_NT) == true); - UNIT_ASSERT(fy_node_compare_string(fy_node_by_path(fy_document_root(fyd), "baz/frob", FY_NT, FYNWF_DONT_FOLLOW), "boo", FY_NT) == true); - UNIT_ASSERT(fy_node_compare_string(fy_node_by_path(fy_document_root(fyd), "/frooz/0", FY_NT, FYNWF_DONT_FOLLOW), "seq1", FY_NT) == true); - UNIT_ASSERT(fy_node_compare_string(fy_node_by_path(fy_document_root(fyd), "/frooz/1/key", FY_NT, FYNWF_DONT_FOLLOW), "value", FY_NT) == true); - UNIT_ASSERT(fy_node_compare_string(fy_node_by_path(fy_document_root(fyd), "\"zero\\0zero\"", FY_NT, FYNWF_DONT_FOLLOW), "0", FY_NT) == true); - UNIT_ASSERT(fy_node_compare_string(fy_node_by_path(fy_document_root(fyd), "/{ key2: value2 }/key3", FY_NT, FYNWF_DONT_FOLLOW), "value3", FY_NT) == true); - - fy_document_destroy(fyd); -} - -Y_UNIT_TEST(doc_path_node) { - struct fy_document *fyd; - char *path; - - /* build document */ - fyd = fy_document_build_from_string(NULL, "{ " - "foo: 10, bar : 20, baz:{ frob: boo }, " - "frooz: [ seq1, { key: value} ], \"zero\\0zero\" : 0, " - "{ key2: value2 }: { key3: value3 } " - "}", FY_NT); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - path = fy_node_get_path(fy_node_by_path(fy_document_root(fyd), "/", FY_NT, FYNWF_DONT_FOLLOW)); - UNIT_ASSERT_VALUES_EQUAL(path, TString("/")); - free(path); - - path = fy_node_get_path(fy_node_by_path(fy_document_root(fyd), "/frooz", FY_NT, FYNWF_DONT_FOLLOW)); - UNIT_ASSERT_VALUES_EQUAL(path, TString("/frooz")); - free(path); - - path = fy_node_get_path(fy_node_by_path(fy_document_root(fyd), "/frooz/0", FY_NT, FYNWF_DONT_FOLLOW)); - UNIT_ASSERT_VALUES_EQUAL(path, TString("/frooz/0")); - free(path); - - path = fy_node_get_path(fy_node_by_path(fy_document_root(fyd), "/{ key2: value2 }/key3", FY_NT, FYNWF_DONT_FOLLOW)); - UNIT_ASSERT_VALUES_EQUAL(path, TString("/{key2: value2}/key3")); - free(path); - - fy_document_destroy(fyd); -} - -Y_UNIT_TEST(doc_path_parent) { - struct fy_document *fyd; - struct fy_node *fyn_root, *fyn_foo, *fyn_bar, *fyn_baz, *fyn_frob, *fyn_ten; - struct fy_node *fyn_deep, *fyn_deeper; - char *path; - - /* build document */ - fyd = fy_document_build_from_string(NULL, "{ " - "foo: 10, bar : [ ten, 20 ], baz:{ frob: boo, deep: { deeper: yet } }, " - "}", FY_NT); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - fyn_root = fy_document_root(fyd); - UNIT_ASSERT_UNEQUAL(fyn_root, NULL); - - fyn_foo = fy_node_by_path(fyn_root, "/foo", FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_UNEQUAL(fyn_foo, NULL); - - fyn_bar = fy_node_by_path(fyn_root, "/bar", FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_UNEQUAL(fyn_bar, NULL); - - fyn_baz = fy_node_by_path(fyn_root, "/baz", FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_UNEQUAL(fyn_baz, NULL); - - fyn_frob = fy_node_by_path(fyn_root, "/baz/frob", FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_UNEQUAL(fyn_frob, NULL); - - fyn_ten = fy_node_by_path(fyn_root, "/bar/0", FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_UNEQUAL(fyn_ten, NULL); - - fyn_deep = fy_node_by_path(fyn_root, "/baz/deep", FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_UNEQUAL(fyn_deep, NULL); - - fyn_deeper = fy_node_by_path(fyn_root, "/baz/deep/deeper", FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_UNEQUAL(fyn_deeper, NULL); - - /* check parent paths of foo, frob, ten */ - path = fy_node_get_parent_address(fyn_foo); - UNIT_ASSERT_UNEQUAL(path, NULL); - UNIT_ASSERT_VALUES_EQUAL(path, TString("foo")); - free(path); - - path = fy_node_get_parent_address(fyn_frob); - UNIT_ASSERT_UNEQUAL(path, NULL); - UNIT_ASSERT_VALUES_EQUAL(path, TString("frob")); - free(path); - - path = fy_node_get_parent_address(fyn_ten); - UNIT_ASSERT_UNEQUAL(path, NULL); - UNIT_ASSERT_VALUES_EQUAL(path, TString("0")); - free(path); - - /* check relative paths to root */ - path = fy_node_get_path_relative_to(NULL, fyn_foo); - UNIT_ASSERT_UNEQUAL(path, NULL); - UNIT_ASSERT_VALUES_EQUAL(path, TString("foo")); - free(path); - - path = fy_node_get_path_relative_to(fyn_root, fyn_foo); - UNIT_ASSERT_UNEQUAL(path, NULL); - UNIT_ASSERT_VALUES_EQUAL(path, TString("foo")); - free(path); - - path = fy_node_get_path_relative_to(fyn_root, fyn_frob); - UNIT_ASSERT_UNEQUAL(path, NULL); - UNIT_ASSERT_VALUES_EQUAL(path, TString("baz/frob")); - free(path); - - path = fy_node_get_path_relative_to(fyn_root, fyn_ten); - UNIT_ASSERT_UNEQUAL(path, NULL); - UNIT_ASSERT_VALUES_EQUAL(path, TString("bar/0")); - free(path); - - /* check relative paths to other parents */ - path = fy_node_get_path_relative_to(fyn_baz, fyn_frob); - UNIT_ASSERT_UNEQUAL(path, NULL); - UNIT_ASSERT_VALUES_EQUAL(path, TString("frob")); - free(path); - - path = fy_node_get_path_relative_to(fyn_bar, fyn_ten); - UNIT_ASSERT_UNEQUAL(path, NULL); - UNIT_ASSERT_VALUES_EQUAL(path, TString("0")); - free(path); - - path = fy_node_get_path_relative_to(fyn_baz, fyn_deeper); - UNIT_ASSERT_UNEQUAL(path, NULL); - UNIT_ASSERT_VALUES_EQUAL(path, TString("deep/deeper")); - free(path); - - fy_document_destroy(fyd); -} - -Y_UNIT_TEST(doc_short_path) { - struct fy_document *fyd; - struct fy_node *fyn_root, *fyn_foo, *fyn_notfoo, *fyn_bar, *fyn_baz; - const char *str; - - /* build document */ - fyd = fy_document_build_from_string(NULL, - "--- &r\n" - " foo: &f\n" - " bar: [ 0, two, baz: what ]\n" - " frob: true\n" - " notfoo: false\n" - , FY_NT); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - fyn_root = fy_document_root(fyd); - UNIT_ASSERT_UNEQUAL(fyn_root, NULL); - - fyn_foo = fy_node_by_path(fyn_root, "/foo", FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_UNEQUAL(fyn_foo, NULL); - - fyn_notfoo = fy_node_by_path(fyn_root, "/notfoo", FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_UNEQUAL(fyn_notfoo, NULL); - - fyn_bar = fy_node_by_path(fyn_root, "/foo/bar", FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_UNEQUAL(fyn_bar, NULL); - - fyn_baz = fy_node_by_path(fyn_root, "/foo/bar/2/baz", FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_UNEQUAL(fyn_baz, NULL); - - str = fy_node_get_short_path(fyn_root); - UNIT_ASSERT_UNEQUAL(str, NULL); - UNIT_ASSERT_VALUES_EQUAL(str, "*r"); - UNIT_ASSERT_EQUAL(fy_node_by_path(fy_document_root(fyd), str, FY_NT, FYNWF_FOLLOW), fyn_root); - free((void*)str); - - str = fy_node_get_short_path(fyn_foo); - UNIT_ASSERT_UNEQUAL(str, NULL); - UNIT_ASSERT_VALUES_EQUAL(str, "*f"); - UNIT_ASSERT_EQUAL(fy_node_by_path(fy_document_root(fyd), str, FY_NT, FYNWF_FOLLOW), fyn_foo); - free((void*)str); - - str = fy_node_get_short_path(fyn_notfoo); - UNIT_ASSERT_UNEQUAL(str, NULL); - UNIT_ASSERT_VALUES_EQUAL(str, "*r/notfoo"); - UNIT_ASSERT_EQUAL(fy_node_by_path(fy_document_root(fyd), str, FY_NT, FYNWF_FOLLOW), fyn_notfoo); - free((void*)str); - - str = fy_node_get_short_path(fyn_bar); - UNIT_ASSERT_UNEQUAL(str, NULL); - UNIT_ASSERT_VALUES_EQUAL(str, "*f/bar"); - UNIT_ASSERT_EQUAL(fy_node_by_path(fy_document_root(fyd), str, FY_NT, FYNWF_FOLLOW), fyn_bar); - free((void*)str); - - str = fy_node_get_short_path(fyn_baz); - UNIT_ASSERT_UNEQUAL(str, NULL); - UNIT_ASSERT_VALUES_EQUAL(str, "*f/bar/2/baz"); - UNIT_ASSERT_EQUAL(fy_node_by_path(fy_document_root(fyd), str, FY_NT, FYNWF_FOLLOW), fyn_baz); - free((void*)str); - - fy_document_destroy(fyd); -} - -Y_UNIT_TEST(doc_scalar_path) { - struct fy_document *fyd; - struct fy_node *fyn_root, *fyn_foo; - - /* build document */ - fyd = fy_document_build_from_string(NULL, "--- foo\n", FY_NT); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - fyn_root = fy_document_root(fyd); - UNIT_ASSERT_UNEQUAL(fyn_root, NULL); - - /* get the scalar root and verify */ - fyn_foo = fy_node_by_path(fyn_root, "/", FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_UNEQUAL(fyn_foo, NULL); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fyn_foo), "foo"); - - fy_document_destroy(fyd); -} - -Y_UNIT_TEST(doc_scalar_path_array) { - struct fy_document *fyd; - struct fy_node *fyn_root, *fynt; - - /* build document */ - fyd = fy_document_build_from_string(NULL, "--- [ foo, bar, baz ]\n", FY_NT); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - fyn_root = fy_document_root(fyd); - UNIT_ASSERT_UNEQUAL(fyn_root, NULL); - - /* get the scalars in the array and verify */ - fynt = fy_node_by_path(fyn_root, "/0", FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_UNEQUAL(fynt, NULL); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fynt), "foo"); - - fynt = fy_node_by_path(fyn_root, "/1", FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_UNEQUAL(fynt, NULL); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fynt), "bar"); - - fynt = fy_node_by_path(fyn_root, "/2", FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_UNEQUAL(fynt, NULL); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fynt), "baz"); - - fy_document_destroy(fyd); -} - -Y_UNIT_TEST(doc_nearest_anchor) { - struct fy_document *fyd; - struct fy_node *fyn, *fyn_root, *fyn_foo, *fyn_notfoo, *fyn_bar, *fyn_baz; - - /* build document */ - fyd = fy_document_build_from_string(NULL, - "--- &r\n" - " foo: &f\n" - " bar: [ 0, two, baz: what ]\n" - " frob: true\n" - " notfoo: false\n" - , FY_NT); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - fyn_root = fy_document_root(fyd); - UNIT_ASSERT_UNEQUAL(fyn_root, NULL); - - fyn_foo = fy_node_by_path(fyn_root, "/foo", FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_UNEQUAL(fyn_foo, NULL); - - fyn_notfoo = fy_node_by_path(fyn_root, "/notfoo", FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_UNEQUAL(fyn_notfoo, NULL); - - fyn_bar = fy_node_by_path(fyn_root, "/foo/bar", FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_UNEQUAL(fyn_bar, NULL); - - fyn_baz = fy_node_by_path(fyn_root, "/foo/bar/2/baz", FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_UNEQUAL(fyn_baz, NULL); - - /* get nearest anchor of root (is root) */ - fyn = fy_anchor_node(fy_node_get_nearest_anchor(fyn_root)); - UNIT_ASSERT_EQUAL(fyn, fyn_root); - - /* get nearest anchor of notfoo (is root) */ - fyn = fy_anchor_node(fy_node_get_nearest_anchor(fyn_notfoo)); - UNIT_ASSERT_EQUAL(fyn, fyn_root); - - /* get nearest anchor of baz (is foo) */ - fyn = fy_anchor_node(fy_node_get_nearest_anchor(fyn_baz)); - UNIT_ASSERT_EQUAL(fyn, fyn_foo); - - fy_document_destroy(fyd); -} - -Y_UNIT_TEST(doc_references) { - struct fy_document *fyd; - struct fy_node *fyn, *fyn_ref, *fyn_root, *fyn_foo, *fyn_notfoo, *fyn_bar, *fyn_baz; - char *path; - - /* build document */ - fyd = fy_document_build_from_string(NULL, - "---\n" - " foo: &f\n" - " bar: [ 0, two, baz: what ]\n" - " frob: true\n" - " notfoo: false\n" - , FY_NT); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - fyn_root = fy_document_root(fyd); - UNIT_ASSERT_UNEQUAL(fyn_root, NULL); - - fyn_foo = fy_node_by_path(fyn_root, "/foo", FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_UNEQUAL(fyn_foo, NULL); - - fyn_notfoo = fy_node_by_path(fyn_root, "/notfoo", FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_UNEQUAL(fyn_notfoo, NULL); - - fyn_bar = fy_node_by_path(fyn_root, "/foo/bar", FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_UNEQUAL(fyn_bar, NULL); - - fyn_baz = fy_node_by_path(fyn_root, "/foo/bar/2/baz", FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_UNEQUAL(fyn_baz, NULL); - - /* get reference to root */ - path = fy_node_get_reference(fyn_root); - UNIT_ASSERT_UNEQUAL(path, NULL); - UNIT_ASSERT_VALUES_EQUAL(path, TString("*/")); - free(path); - - /* get reference to /foo */ - path = fy_node_get_reference(fyn_foo); - UNIT_ASSERT_UNEQUAL(path, NULL); - UNIT_ASSERT_VALUES_EQUAL(path, TString("*f")); - free(path); - - /* get reference to /notfoo */ - path = fy_node_get_reference(fyn_notfoo); - UNIT_ASSERT_UNEQUAL(path, NULL); - UNIT_ASSERT_VALUES_EQUAL(path, TString("*/notfoo")); - free(path); - - /* get reference to /foo/bar/2/baz */ - path = fy_node_get_reference(fyn_baz); - UNIT_ASSERT_UNEQUAL(path, NULL); - UNIT_ASSERT_VALUES_EQUAL(path, TString("*/foo/bar/2/baz")); - free(path); - - /* create reference to root and verify it points there */ - fyn_ref = fy_node_create_reference(fyn_root); - UNIT_ASSERT_UNEQUAL(fyn_ref, NULL); - fyn = fy_node_resolve_alias(fyn_ref); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - UNIT_ASSERT_EQUAL(fyn, fyn_root); - fy_node_free(fyn_ref); - - /* get reference to /foo */ - fyn_ref = fy_node_create_reference(fyn_foo); - UNIT_ASSERT_UNEQUAL(path, NULL); - fyn = fy_node_resolve_alias(fyn_ref); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - UNIT_ASSERT_EQUAL(fyn, fyn_foo); - fy_node_free(fyn_ref); - - /* get reference to /notfoo */ - fyn_ref = fy_node_create_reference(fyn_notfoo); - UNIT_ASSERT_UNEQUAL(path, NULL); - fyn = fy_node_resolve_alias(fyn_ref); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - UNIT_ASSERT_EQUAL(fyn, fyn_notfoo); - fy_node_free(fyn_ref); - - /* get reference to /bar */ - fyn_ref = fy_node_create_reference(fyn_bar); - UNIT_ASSERT_UNEQUAL(path, NULL); - fyn = fy_node_resolve_alias(fyn_ref); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - UNIT_ASSERT_EQUAL(fyn, fyn_bar); - fy_node_free(fyn_ref); - - /* get reference to /baz */ - fyn_ref = fy_node_create_reference(fyn_baz); - UNIT_ASSERT_UNEQUAL(path, NULL); - fyn = fy_node_resolve_alias(fyn_ref); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - UNIT_ASSERT_EQUAL(fyn, fyn_baz); - fy_node_free(fyn_ref); - - /* get relative reference to /foo starting at / */ - path = fy_node_get_relative_reference(fyn_root, fyn_foo); - UNIT_ASSERT_UNEQUAL(path, NULL); - UNIT_ASSERT_VALUES_EQUAL(path, TString("*/foo")); - free(path); - - /* get relative reference to /foo/bar/2/baz starting at / */ - path = fy_node_get_relative_reference(fyn_root, fyn_baz); - UNIT_ASSERT_UNEQUAL(path, NULL); - UNIT_ASSERT_VALUES_EQUAL(path, TString("*/foo/bar/2/baz")); - free(path); - - /* get relative reference to /foo/bar/2/baz starting at /foo */ - path = fy_node_get_relative_reference(fyn_foo, fyn_baz); - UNIT_ASSERT_UNEQUAL(path, NULL); - UNIT_ASSERT_VALUES_EQUAL(path, TString("*f/bar/2/baz")); - free(path); - - /* get relative reference to /notfoo at /foo (will return absolute) */ - path = fy_node_get_relative_reference(fyn_foo, fyn_notfoo); - UNIT_ASSERT_UNEQUAL(path, NULL); - UNIT_ASSERT_VALUES_EQUAL(path, TString("*/notfoo")); - free(path); - - /* create relative reference to /foo starting at / */ - fyn_ref = fy_node_create_relative_reference(fyn_root, fyn_foo); - UNIT_ASSERT_UNEQUAL(fyn_ref, NULL); - fyn = fy_node_resolve_alias(fyn_ref); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - UNIT_ASSERT_EQUAL(fyn, fyn_foo); - fy_node_free(fyn_ref); - - /* create relative reference to /foo/bar/2/baz starting at / */ - fyn_ref = fy_node_create_relative_reference(fyn_root, fyn_baz); - UNIT_ASSERT_UNEQUAL(fyn_ref, NULL); - fyn = fy_node_resolve_alias(fyn_ref); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - UNIT_ASSERT_EQUAL(fyn, fyn_baz); - fy_node_free(fyn_ref); - - /* create relative reference to /foo/bar/2/baz starting at /foo */ - fyn_ref = fy_node_create_relative_reference(fyn_foo, fyn_baz); - UNIT_ASSERT_UNEQUAL(fyn_ref, NULL); - fyn = fy_node_resolve_alias(fyn_ref); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - UNIT_ASSERT_EQUAL(fyn, fyn_baz); - fy_node_free(fyn_ref); - - /* create relative reference to /notfoo starting at /foo (will use absolute) */ - fyn_ref = fy_node_create_relative_reference(fyn_foo, fyn_notfoo); - UNIT_ASSERT_UNEQUAL(fyn_ref, NULL); - fyn = fy_node_resolve_alias(fyn_ref); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - UNIT_ASSERT_EQUAL(fyn, fyn_notfoo); - fy_node_free(fyn_ref); - - fy_document_destroy(fyd); -} - -Y_UNIT_TEST(doc_nearest_child_of) { - struct fy_document *fyd; - struct fy_node *fyn, *fyn_root, *fyn_foo, *fyn_bar, *fyn_baz; - - /* build document */ - fyd = fy_document_build_from_string(NULL, - "foo:\n" - " bar:\n" - " barz: [ zero, baz: true ]\n" - " frooz: notfoo\n" - , FY_NT); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - fyn_root = fy_document_root(fyd); - UNIT_ASSERT_UNEQUAL(fyn_root, NULL); - - fyn_foo = fy_node_by_path(fyn_root, "/foo", FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_UNEQUAL(fyn_foo, NULL); - - fyn_bar = fy_node_by_path(fyn_root, "/foo/bar", FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_UNEQUAL(fyn_bar, NULL); - - fyn_baz = fy_node_by_path(fyn_root, "/foo/bar/barz/1/baz", FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_UNEQUAL(fyn_baz, NULL); - - /* nearest child to the root of /foo is /foo */ - fyn = fy_node_get_nearest_child_of(fyn_root, fyn_foo); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - UNIT_ASSERT_EQUAL(fyn, fyn_foo); - - /* nearest child to the root of /foo/bar/barz/1/baz is /foo */ - fyn = fy_node_get_nearest_child_of(fyn_root, fyn_baz); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - UNIT_ASSERT_EQUAL(fyn, fyn_foo); - - /* nearest child to foo of /foo/bar/barz/1/baz is /foo/bar */ - fyn = fy_node_get_nearest_child_of(fyn_foo, fyn_baz); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - UNIT_ASSERT_EQUAL(fyn, fyn_bar); - - fy_document_destroy(fyd); -} - -Y_UNIT_TEST(doc_create_empty_seq1) { - struct fy_document *fyd; - struct fy_node *fyn; - char *buf; - - fyd = fy_document_create(NULL); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - fyn = fy_node_build_from_string(fyd, "[ ]", FY_NT); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - - fy_document_set_root(fyd, fyn); - - /* convert to string */ - buf = fy_emit_node_to_string(fy_document_root(fyd), FYECF_MODE_FLOW_ONELINE); - UNIT_ASSERT_UNEQUAL(buf, NULL); - - /* compare with expected result */ - UNIT_ASSERT_VALUES_EQUAL(buf, TString("[]")); - - free(buf); - - fy_document_destroy(fyd); -} - -Y_UNIT_TEST(doc_create_empty_seq2) { - struct fy_document *fyd; - struct fy_node *fyn; - char *buf; - - fyd = fy_document_create(NULL); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - fyn = fy_node_create_sequence(fyd); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - - fy_document_set_root(fyd, fyn); - - /* convert to string */ - buf = fy_emit_node_to_string(fy_document_root(fyd), FYECF_MODE_FLOW_ONELINE); - UNIT_ASSERT_UNEQUAL(buf, NULL); - - /* compare with expected result */ - UNIT_ASSERT_VALUES_EQUAL(buf, TString("[]")); - - free(buf); - - fy_document_destroy(fyd); -} - -Y_UNIT_TEST(doc_create_empty_map1) { - struct fy_document *fyd; - struct fy_node *fyn; - char *buf; - - fyd = fy_document_create(NULL); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - fyn = fy_node_build_from_string(fyd, "{ }", FY_NT); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - - fy_document_set_root(fyd, fyn); - - /* convert to string */ - buf = fy_emit_node_to_string(fy_document_root(fyd), FYECF_MODE_FLOW_ONELINE); - UNIT_ASSERT_UNEQUAL(buf, NULL); - - /* compare with expected result */ - UNIT_ASSERT_VALUES_EQUAL(buf, TString("{}")); - - free(buf); - - fy_document_destroy(fyd); -} - -Y_UNIT_TEST(doc_create_empty_map2) { - struct fy_document *fyd; - struct fy_node *fyn; - char *buf; - - fyd = fy_document_create(NULL); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - fyn = fy_node_create_mapping(fyd); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - - fy_document_set_root(fyd, fyn); - - /* convert to string */ - buf = fy_emit_node_to_string(fy_document_root(fyd), FYECF_MODE_FLOW_ONELINE); - UNIT_ASSERT_UNEQUAL(buf, NULL); - - /* compare with expected result */ - UNIT_ASSERT_VALUES_EQUAL(buf, TString("{}")); - - free(buf); - - fy_document_destroy(fyd); -} - -Y_UNIT_TEST(doc_create_test_seq1) { - struct fy_document *fyd; - struct fy_node *fyn; - int ret; - - fyd = fy_document_create(NULL); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - fyn = fy_node_create_sequence(fyd); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - - ret = fy_node_sequence_append(fyn, fy_node_create_scalar(fyd, "foo", FY_NT)); - UNIT_ASSERT_EQUAL(ret, 0); - - ret = fy_node_sequence_append(fyn, fy_node_create_scalar(fyd, "bar", FY_NT)); - UNIT_ASSERT_EQUAL(ret, 0); - - ret = fy_node_sequence_append(fyn, fy_node_build_from_string(fyd, "{ baz: frooz }", FY_NT)); - UNIT_ASSERT_EQUAL(ret, 0); - - fy_document_set_root(fyd, fyn); - - UNIT_ASSERT(fy_node_compare_string(fy_node_by_path(fy_document_root(fyd), "/0", FY_NT, FYNWF_DONT_FOLLOW), "foo", FY_NT) == true); - UNIT_ASSERT(fy_node_compare_string(fy_node_by_path(fy_document_root(fyd), "/1", FY_NT, FYNWF_DONT_FOLLOW), "bar", FY_NT) == true); - UNIT_ASSERT(fy_node_compare_string(fy_node_by_path(fy_document_root(fyd), "/2/baz", FY_NT, FYNWF_DONT_FOLLOW), "frooz", FY_NT) == true); - - fy_document_destroy(fyd); -} - -Y_UNIT_TEST(doc_create_test_map1) { - struct fy_document *fyd; - struct fy_node *fyn, *fyn1, *fyn2, *fyn3; - int ret; - - fyd = fy_document_create(NULL); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - fyn = fy_node_create_mapping(fyd); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - - ret = fy_node_mapping_append(fyn, - fy_node_build_from_string(fyd, "seq", FY_NT), - fy_node_build_from_string(fyd, "[ zero, one ]", FY_NT)); - UNIT_ASSERT_EQUAL(ret, 0); - - ret = fy_node_mapping_append(fyn, NULL, - fy_node_build_from_string(fyd, "value-of-null-key", FY_NT)); - UNIT_ASSERT_EQUAL(ret, 0); - - ret = fy_node_mapping_append(fyn, - fy_node_build_from_string(fyd, "key-of-null-value", FY_NT), NULL); - UNIT_ASSERT_EQUAL(ret, 0); - - fy_document_set_root(fyd, fyn); - - UNIT_ASSERT(fy_node_compare_string(fy_node_by_path(fy_document_root(fyd), "/seq/0", FY_NT, FYNWF_DONT_FOLLOW), "zero", FY_NT) == true); - UNIT_ASSERT(fy_node_compare_string(fy_node_by_path(fy_document_root(fyd), "/seq/1", FY_NT, FYNWF_DONT_FOLLOW), "one", FY_NT) == true); - UNIT_ASSERT(fy_node_compare_string(fy_node_by_path(fy_document_root(fyd), "/''", FY_NT, FYNWF_DONT_FOLLOW), "value-of-null-key", FY_NT) == true); - - fyn1 = fy_node_by_path(fy_document_root(fyd), "/key-of-null-value", FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_EQUAL(fyn1, NULL); - - /* try to append duplicate key (it should fail) */ - fyn2 = fy_node_build_from_string(fyd, "seq", FY_NT); - UNIT_ASSERT_UNEQUAL(fyn2, NULL); - fyn3 = fy_node_create_scalar(fyd, "dupl", FY_NT); - UNIT_ASSERT_UNEQUAL(fyn3, NULL); - ret = fy_node_mapping_append(fyn, fyn2, fyn3); - UNIT_ASSERT_UNEQUAL(ret, 0); - - fy_node_free(fyn3); - fy_node_free(fyn2); - - fy_document_destroy(fyd); -} - -Y_UNIT_TEST(doc_insert_remove_seq) { - struct fy_document *fyd; - struct fy_node *fyn; - int ret; - - fyd = fy_document_create(NULL); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - fy_document_set_root(fyd, fy_node_build_from_string(fyd, "[ one, two, four ]", FY_NT)); - - /* check that the order is correct */ - UNIT_ASSERT(fy_node_compare_string(fy_node_by_path(fy_document_root(fyd), "/0", FY_NT, FYNWF_DONT_FOLLOW), "one", FY_NT) == true); - UNIT_ASSERT(fy_node_compare_string(fy_node_by_path(fy_document_root(fyd), "/1", FY_NT, FYNWF_DONT_FOLLOW), "two", FY_NT) == true); - UNIT_ASSERT(fy_node_compare_string(fy_node_by_path(fy_document_root(fyd), "/2", FY_NT, FYNWF_DONT_FOLLOW), "four", FY_NT) == true); - - ret = fy_node_sequence_append(fy_document_root(fyd), fy_node_build_from_string(fyd, "five", FY_NT)); - UNIT_ASSERT_EQUAL(ret, 0); - - ret = fy_node_sequence_prepend(fy_document_root(fyd), fy_node_build_from_string(fyd, "zero", FY_NT)); - UNIT_ASSERT_EQUAL(ret, 0); - - ret = fy_node_sequence_insert_after(fy_document_root(fyd), - fy_node_by_path(fy_document_root(fyd), "/2", FY_NT, FYNWF_DONT_FOLLOW), - fy_node_build_from_string(fyd, "three", FY_NT)); - UNIT_ASSERT_EQUAL(ret, 0); - - ret = fy_node_sequence_insert_before(fy_document_root(fyd), - fy_node_by_path(fy_document_root(fyd), "/3", FY_NT, FYNWF_DONT_FOLLOW), - fy_node_build_from_string(fyd, "two-and-a-half", FY_NT)); - UNIT_ASSERT_EQUAL(ret, 0); - - fyn = fy_node_sequence_remove(fy_document_root(fyd), - fy_node_by_path(fy_document_root(fyd), "/3", FY_NT, FYNWF_DONT_FOLLOW)); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - - fy_node_free(fyn); - - UNIT_ASSERT(fy_node_compare_string(fy_node_by_path(fy_document_root(fyd), "/0", FY_NT, FYNWF_DONT_FOLLOW), "zero", FY_NT) == true); - UNIT_ASSERT(fy_node_compare_string(fy_node_by_path(fy_document_root(fyd), "/1", FY_NT, FYNWF_DONT_FOLLOW), "one", FY_NT) == true); - UNIT_ASSERT(fy_node_compare_string(fy_node_by_path(fy_document_root(fyd), "/2", FY_NT, FYNWF_DONT_FOLLOW), "two", FY_NT) == true); - UNIT_ASSERT(fy_node_compare_string(fy_node_by_path(fy_document_root(fyd), "/3", FY_NT, FYNWF_DONT_FOLLOW), "three", FY_NT) == true); - UNIT_ASSERT(fy_node_compare_string(fy_node_by_path(fy_document_root(fyd), "/4", FY_NT, FYNWF_DONT_FOLLOW), "four", FY_NT) == true); - - fy_document_destroy(fyd); -} - -Y_UNIT_TEST(doc_insert_remove_map) { - struct fy_document *fyd; - struct fy_node *fyn; - int ret; - - fyd = fy_document_build_from_string(NULL, "{ one: 1, two: 2, four: 4 }", FY_NT); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - /* check that the order is correct */ - UNIT_ASSERT(fy_node_compare_string(fy_node_by_path(fy_document_root(fyd), "/one", FY_NT, FYNWF_DONT_FOLLOW), "1", FY_NT) == true); - UNIT_ASSERT(fy_node_compare_string(fy_node_by_path(fy_document_root(fyd), "/two", FY_NT, FYNWF_DONT_FOLLOW), "2", FY_NT) == true); - UNIT_ASSERT(fy_node_compare_string(fy_node_by_path(fy_document_root(fyd), "/four", FY_NT, FYNWF_DONT_FOLLOW), "4", FY_NT) == true); - - ret = fy_node_mapping_append(fy_document_root(fyd), - fy_node_build_from_string(fyd, "three", FY_NT), - fy_node_build_from_string(fyd, "3", FY_NT)); - UNIT_ASSERT_EQUAL(ret, 0); - - UNIT_ASSERT(fy_node_compare_string(fy_node_by_path(fy_document_root(fyd), "/three", FY_NT, FYNWF_DONT_FOLLOW), "3", FY_NT) == true); - - ret = fy_node_mapping_prepend(fy_document_root(fyd), - fy_node_build_from_string(fyd, "zero", FY_NT), - fy_node_build_from_string(fyd, "0", FY_NT)); - UNIT_ASSERT_EQUAL(ret, 0); - - UNIT_ASSERT(fy_node_compare_string(fy_node_by_path(fy_document_root(fyd), "/zero", FY_NT, FYNWF_DONT_FOLLOW), "0", FY_NT) == true); - - ret = fy_node_mapping_append(fy_document_root(fyd), - fy_node_build_from_string(fyd, "two-and-a-half", FY_NT), - fy_node_build_from_string(fyd, "2.5", FY_NT)); - UNIT_ASSERT_EQUAL(ret, 0); - - UNIT_ASSERT(fy_node_compare_string(fy_node_by_path(fy_document_root(fyd), "/two-and-a-half", FY_NT, FYNWF_DONT_FOLLOW), "2.5", FY_NT) == true); - - fyn = fy_node_mapping_remove_by_key(fy_document_root(fyd), - fy_node_build_from_string(fyd, "two-and-a-half", FY_NT)); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - - fy_node_free(fyn); - - /* it must be removed */ - fyn = fy_node_by_path(fy_document_root(fyd), "/two-and-a-half", FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_EQUAL(fyn, NULL); - - fy_document_destroy(fyd); -} - -Y_UNIT_TEST(doc_sort) { - struct fy_document *fyd; - fy_node_pair *fynp; - void *iter; - int ret, count; - - fyd = fy_document_build_from_string(NULL, "{ a: 5, { z: bar }: 1, z: 7, " - "[ a, b, c] : 3, { a: whee } : 2 , " - "b: 6, [ z ]: 4 }", FY_NT); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - ret = fy_node_sort(fy_document_root(fyd), NULL, NULL); - UNIT_ASSERT_EQUAL(ret, 0); - - /* check for correct count value */ - count = fy_node_mapping_item_count(fy_document_root(fyd)); - UNIT_ASSERT_EQUAL(count, 7); - - /* forward iterator first */ - iter = NULL; - - fynp = fy_node_mapping_iterate(fy_document_root(fyd), &iter); - UNIT_ASSERT_UNEQUAL(fynp, NULL); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fy_node_pair_value(fynp)), "1"); - - fynp = fy_node_mapping_iterate(fy_document_root(fyd), &iter); - UNIT_ASSERT_UNEQUAL(fynp, NULL); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fy_node_pair_value(fynp)), "2"); - - fynp = fy_node_mapping_iterate(fy_document_root(fyd), &iter); - UNIT_ASSERT_UNEQUAL(fynp, NULL); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fy_node_pair_value(fynp)), "3"); - - fynp = fy_node_mapping_iterate(fy_document_root(fyd), &iter); - UNIT_ASSERT_UNEQUAL(fynp, NULL); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fy_node_pair_value(fynp)), "4"); - - fynp = fy_node_mapping_iterate(fy_document_root(fyd), &iter); - UNIT_ASSERT_UNEQUAL(fynp, NULL); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fy_node_pair_value(fynp)), "5"); - - fynp = fy_node_mapping_iterate(fy_document_root(fyd), &iter); - UNIT_ASSERT_UNEQUAL(fynp, NULL); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fy_node_pair_value(fynp)), "6"); - - fynp = fy_node_mapping_iterate(fy_document_root(fyd), &iter); - UNIT_ASSERT_UNEQUAL(fynp, NULL); - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fy_node_pair_value(fynp)), "7"); - - fy_document_destroy(fyd); -} - -static char *join_docs(const char *tgt_text, const char *tgt_path, - const char *src_text, const char *src_path, - const char *emit_path) -{ - struct fy_document *fyd_tgt, *fyd_src; - struct fy_node *fyn_tgt, *fyn_src, *fyn_emit; - char *output; - int ret; - - /* insert which overwrites root ( <map> <- <scalar> ) */ - fyd_tgt = fy_document_build_from_string(NULL, tgt_text, FY_NT); - UNIT_ASSERT_UNEQUAL(fyd_tgt, NULL); - - fyd_src = fy_document_build_from_string(NULL, src_text, FY_NT); - UNIT_ASSERT_UNEQUAL(fyd_src, NULL); - - fyn_tgt = fy_node_by_path(fy_document_root(fyd_tgt), tgt_path, FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_UNEQUAL(fyn_tgt, NULL); - - fyn_src = fy_node_by_path(fy_document_root(fyd_src), src_path, FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_UNEQUAL(fyn_src, NULL); - - ret = fy_node_insert(fyn_tgt, fyn_src); - UNIT_ASSERT_EQUAL(ret, 0); - - ret = fy_document_set_parent(fyd_tgt, fyd_src); - UNIT_ASSERT_EQUAL(ret, 0); - - fyn_emit = fy_node_by_path(fy_document_root(fyd_tgt), emit_path, FY_NT, FYNWF_DONT_FOLLOW); - UNIT_ASSERT_UNEQUAL(fyn_emit, NULL); - - output = fy_emit_node_to_string(fyn_emit, (fy_emitter_cfg_flags) (FYECF_MODE_FLOW_ONELINE | FYECF_WIDTH_INF)); - UNIT_ASSERT_UNEQUAL(output, NULL); - - fy_document_destroy(fyd_tgt); - - return output; -} - -Y_UNIT_TEST(doc_join_scalar_to_scalar) { - char *output; - - output = join_docs( - "foo", "/", /* target */ - "bar", "/", /* source */ - "/"); /* emit path */ - - UNIT_ASSERT_VALUES_EQUAL(output, TString("bar")); - free(output); -} - -Y_UNIT_TEST(doc_join_scalar_to_map) { - char *output; - - output = join_docs( - "{ foo: baz }", "/", /* target */ - "bar", "/", /* source */ - "/"); /* emit path */ - - UNIT_ASSERT_VALUES_EQUAL(output, TString("bar")); - free(output); -} - -Y_UNIT_TEST(doc_join_scalar_to_seq) { - char *output; - - output = join_docs( - "[ foo, baz ]", "/", /* target */ - "bar", "/", /* source */ - "/"); /* emit path */ - - UNIT_ASSERT_VALUES_EQUAL(output, TString("bar")); - free(output); -} - -Y_UNIT_TEST(doc_join_map_to_scalar) { - char *output; - - output = join_docs( - "foo", "/", /* target */ - "{bar: baz}", "/", /* source */ - "/"); /* emit path */ - - UNIT_ASSERT_VALUES_EQUAL(output, TString("{bar: baz}")); - free(output); -} - -Y_UNIT_TEST(doc_join_map_to_seq) { - char *output; - - output = join_docs( - "[foo, frooz]", "/", /* target */ - "{bar: baz}", "/", /* source */ - "/"); /* emit path */ - - UNIT_ASSERT_VALUES_EQUAL(output, TString("{bar: baz}")); - free(output); -} - -Y_UNIT_TEST(doc_join_map_to_map) { - char *output; - - output = join_docs( - "{foo: frooz}", "/", /* target */ - "{bar: baz}", "/", /* source */ - "/"); /* emit path */ - - UNIT_ASSERT_VALUES_EQUAL(output, TString("{foo: frooz, bar: baz}")); - free(output); -} - -Y_UNIT_TEST(doc_join_seq_to_scalar) { - char *output; - - output = join_docs( - "foo", "/", /* target */ - "[bar, baz]", "/", /* source */ - "/"); /* emit path */ - - UNIT_ASSERT_VALUES_EQUAL(output, TString("[bar, baz]")); - free(output); -} - -Y_UNIT_TEST(doc_join_seq_to_seq) { - char *output; - - output = join_docs( - "[foo, frooz]", "/", /* target */ - "[bar, baz]", "/", /* source */ - "/"); /* emit path */ - - UNIT_ASSERT_VALUES_EQUAL(output, TString("[foo, frooz, bar, baz]")); - free(output); -} - -Y_UNIT_TEST(doc_join_seq_to_map) { - char *output; - - output = join_docs( - "{foo: frooz}", "/", /* target */ - "[bar, baz]", "/", /* source */ - "/"); /* emit path */ - - UNIT_ASSERT_VALUES_EQUAL(output, TString("[bar, baz]")); - free(output); -} - -Y_UNIT_TEST(doc_join_tags) { - char *output; - - output = join_docs( - "%TAG !a! tag:a.com,2019:\n" - "---\n" - "- !a!foo\n" - " foo: bar\n", "/", - "%TAG !b! tag:b.com,2019:\n" - "---\n" - "- !b!bar\n" - " something: other\n", "/", - "/"); - - UNIT_ASSERT_VALUES_EQUAL(output, TString("[!a!foo {foo: bar}, !b!bar {something: other}]")); - free(output); -} - -Y_UNIT_TEST(doc_build_with_tags) { - struct fy_document *fyd; - struct fy_node *fyn; - struct fy_token *fyt; - char *buf; - int rc; - - /* build document */ - fyd = fy_document_create(NULL); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - /* create a sequence and set it as root */ - fyn = fy_node_create_sequence(fyd); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - - fy_document_set_root(fyd, fyn); - fyn = NULL; - - /* create a node, containing a new tag */ - fyn = fy_node_build_from_string(fyd, "%TAG !e! tag:example.com,2000:app/\n---\n- foo\n- !e!foo bar\n", FY_NT); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - - /* append it to the root of the document */ - rc = fy_node_sequence_append(fy_document_root(fyd), fyn); - UNIT_ASSERT_EQUAL(rc, 0); - fyn = NULL; - - /* there must be a new tag */ - fyt = fy_document_tag_directive_lookup(fyd, "!e!"); - UNIT_ASSERT_UNEQUAL(fyt, NULL); - - /* try to build another, but with a different !e! prefix, it must fail */ - fyn = fy_node_build_from_string(fyd, "%TAG !e! tag:example.com,2019:app/\n---\n- foo\n- !e!foo bar\n", FY_NT); - UNIT_ASSERT_EQUAL(fyn, NULL); - - /* manually add a tag */ - rc = fy_document_tag_directive_add(fyd, "!f!", "tag:example.com,2019:f/"); - UNIT_ASSERT_EQUAL(rc, 0); - - /* build a node with a tag that's already in the document */ - fyn = fy_node_build_from_string(fyd, "!f!whiz frooz\n", FY_NT); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - - /* append it to the root of the document */ - rc = fy_node_sequence_append(fy_document_root(fyd), fyn); - UNIT_ASSERT_EQUAL(rc, 0); - fyn = NULL; - - /* convert to string */ - buf = fy_emit_document_to_string(fyd, FYECF_MODE_FLOW_ONELINE); - UNIT_ASSERT_UNEQUAL(buf, NULL); - - free(buf); - - fy_document_destroy(fyd); -} - -Y_UNIT_TEST(doc_attach_check) { - struct fy_document *fyd; - struct fy_node *fyn, *fyn_seq, *fyn_map; - struct fy_node *fyn_foo, *fyn_foo2, *fyn_bar, *fyn_baz; - struct fy_node_pair *fynp; - int rc; - - /* build document */ - fyd = fy_document_create(NULL); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - /* create a sequence */ - fyn_seq = fy_node_create_sequence(fyd); - UNIT_ASSERT_UNEQUAL(fyn_seq, NULL); - - /* create a mapping */ - fyn_map = fy_node_create_mapping(fyd); - UNIT_ASSERT_UNEQUAL(fyn_map, NULL); - - /* create a simple scalar node foo */ - fyn_foo = fy_node_build_from_string(fyd, "foo", FY_NT); - UNIT_ASSERT_UNEQUAL(fyn_foo, NULL); - - /* create another simple scalar node bar */ - fyn_bar = fy_node_build_from_string(fyd, "bar", FY_NT); - UNIT_ASSERT_UNEQUAL(fyn_bar, NULL); - - /* create another simple scalar node baz */ - fyn_baz = fy_node_build_from_string(fyd, "baz", FY_NT); - UNIT_ASSERT_UNEQUAL(fyn_baz, NULL); - - /* create a scalar node with the same content as foo */ - fyn_foo2 = fy_node_build_from_string(fyd, "foo", FY_NT); - UNIT_ASSERT_UNEQUAL(fyn_foo2, NULL); - - /* set the root as the sequence */ - rc = fy_document_set_root(fyd, fyn_seq); - UNIT_ASSERT_EQUAL(rc, 0); - - /* should fail since fyn_seq is now attached */ - rc = fy_document_set_root(fyd, fyn_seq); - UNIT_ASSERT_UNEQUAL(rc, 0); - - /* freeing should fail, since it's attached too */ - rc = fy_node_free(fyn_seq); - UNIT_ASSERT_UNEQUAL(rc, 0); - - /* append it to the sequence */ - rc = fy_node_sequence_append(fyn_seq, fyn_foo); - UNIT_ASSERT_EQUAL(rc, 0); - - /* freeing should fail, since it's attached to the seq */ - rc = fy_node_free(fyn_foo); - UNIT_ASSERT_UNEQUAL(rc, 0); - - /* trying to append it to the sequence again should fail */ - rc = fy_node_sequence_append(fyn_seq, fyn_foo); - UNIT_ASSERT_UNEQUAL(rc, 0); - - /* append the mapping to the sequence */ - rc = fy_node_sequence_append(fyn_seq, fyn_map); - UNIT_ASSERT_EQUAL(rc, 0); - - /* this should fail, since foo is attached to the sequence */ - rc = fy_node_mapping_append(fyn_map, fyn_foo, fyn_bar); - UNIT_ASSERT_UNEQUAL(rc, 0); - - /* this should be OK, since foo2 is not attached */ - rc = fy_node_mapping_append(fyn_map, fyn_foo2, fyn_bar); - UNIT_ASSERT_EQUAL(rc, 0); - - /* remove foo from the sequence */ - fyn = fy_node_sequence_remove(fyn_seq, fyn_foo); - UNIT_ASSERT_EQUAL(fyn, fyn_foo); - - /* trying to append the same key should fail */ - rc = fy_node_mapping_append(fyn_map, fyn_foo, NULL); - UNIT_ASSERT_UNEQUAL(rc, 0); - - /* append the baz: NULL mapping */ - rc = fy_node_mapping_append(fyn_map, fyn_baz, NULL); - UNIT_ASSERT_EQUAL(rc, 0); - - /* get the baz: null node pair */ - fynp = fy_node_mapping_lookup_pair(fyn_map, fyn_baz); - UNIT_ASSERT_UNEQUAL(fynp, NULL); - UNIT_ASSERT_EQUAL(fy_node_pair_key(fynp), fyn_baz); - UNIT_ASSERT_EQUAL(fy_node_pair_value(fynp), NULL); - - /* trying to set the same key in the mapping should fail */ - rc = fy_node_pair_set_key(fynp, fyn_foo); - UNIT_ASSERT_UNEQUAL(rc, 0); - - /* get the foo: bar node pair */ - fynp = fy_node_mapping_lookup_pair(fyn_map, fyn_foo); - UNIT_ASSERT_UNEQUAL(fynp, NULL); - UNIT_ASSERT_EQUAL(fy_node_pair_key(fynp), fyn_foo2); - UNIT_ASSERT_EQUAL(fy_node_pair_value(fynp), fyn_bar); - - /* we're setting the same key to the mapping, but that's OK - * since the key is replaced */ - rc = fy_node_pair_set_key(fynp, fyn_foo); - UNIT_ASSERT_EQUAL(rc, 0); - - /* fyn_foo has been freed */ - fyn_foo = NULL; - - /* convert to string */ - rc = fy_emit_document_to_fp(fyd, FYECF_MODE_FLOW_ONELINE, stderr); - UNIT_ASSERT_EQUAL(rc, 0); - - fy_document_destroy(fyd); -} - -Y_UNIT_TEST(manual_scalar_esc) { - // FIXME removed \e because it works incorrectly in MS C - const std::span MANUAL_SCALAR_ESC = "\\\"\0\a\b\t\v\f\r\xc2\x85\xc2\xa0\xe2\x80\xa8\xe2\x80\xa9"; - const TStringBuf MANUAL_SCALAR_ESC_TXT = "\"\\\\\\\"\\0\\a\\b\\t\\v\\f\\r\\N\\_\\L\\P\""; - const char *what = MANUAL_SCALAR_ESC.data(); - size_t what_sz = MANUAL_SCALAR_ESC.size() - 1; - struct fy_document *fyd; - struct fy_node *fyn; - char *buf; - const char *buf2; - size_t sz2; - int rc; - - /* build document */ - fyd = fy_document_create(NULL); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - /* create a manual scalar with all the escapes */ - fyn = fy_node_create_scalar(fyd, what, what_sz); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - - fy_document_set_root(fyd, fyn); - fyn = NULL; - - /* emit to a buffer */ - buf = fy_emit_document_to_string(fyd, FYECF_MODE_FLOW_ONELINE); - UNIT_ASSERT_UNEQUAL(buf, NULL); - - /* destroy the old document */ - fy_document_destroy(fyd); - fyd = NULL; - - /* verify that the resulting document is in the escaped form */ - UNIT_ASSERT_VALUES_EQUAL(buf, TString(MANUAL_SCALAR_ESC_TXT) + "\n"); - - /* now load the result back and verify that it contains exactly the same */ - fyd = fy_document_build_from_string(NULL, buf, FY_NT); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - /* get the scalar content */ - buf2 = fy_node_get_scalar(fy_document_root(fyd), &sz2); - UNIT_ASSERT_UNEQUAL(buf2, NULL); - - /* sizes must match */ - UNIT_ASSERT_EQUAL(what_sz, sz2); - - /* and the strings too */ - rc = memcmp(what, buf2, what_sz); - UNIT_ASSERT_EQUAL(rc, 0); - - /* free the document */ - fy_document_destroy(fyd); - fyd = NULL; - - free(buf); -} - -Y_UNIT_TEST(manual_scalar_quoted) { - const TStringBuf MANUAL_SCALAR_QUOTED = "&foo"; - const TStringBuf MANUAL_SCALAR_QUOTED_TXT = "\"&foo\""; - const char *what = MANUAL_SCALAR_QUOTED.data(); - size_t what_sz = MANUAL_SCALAR_QUOTED.length(); - struct fy_document *fyd; - struct fy_node *fyn; - char *buf; - const char *buf2; - size_t sz2; - int rc; - - /* build document */ - fyd = fy_document_create(NULL); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - /* create a manual scalar with all the escapes */ - fyn = fy_node_create_scalar(fyd, what, what_sz); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - - fy_document_set_root(fyd, fyn); - fyn = NULL; - - /* emit to a buffer */ - buf = fy_emit_document_to_string(fyd, FYECF_MODE_FLOW_ONELINE); - UNIT_ASSERT_UNEQUAL(buf, NULL); - - /* destroy the old document */ - fy_document_destroy(fyd); - fyd = NULL; - - /* verify that the resulting document is in the escaped form */ - UNIT_ASSERT_VALUES_EQUAL(buf, TString(MANUAL_SCALAR_QUOTED_TXT) + "\n"); - - /* now load the result back and verify that it contains exactly the same */ - fyd = fy_document_build_from_string(NULL, buf, FY_NT); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - /* get the scalar content */ - buf2 = fy_node_get_scalar(fy_document_root(fyd), &sz2); - UNIT_ASSERT_UNEQUAL(buf2, NULL); - - /* sizes must match */ - UNIT_ASSERT_EQUAL(what_sz, sz2); - - /* and the strings too */ - rc = memcmp(what, buf2, what_sz); - UNIT_ASSERT_EQUAL(rc, 0); - - /* free the document */ - fy_document_destroy(fyd); - fyd = NULL; - - free(buf); -} - -Y_UNIT_TEST(manual_scalar_copy) { - const TStringBuf MANUAL_SCALAR_COPY = "foo"; - const char *what = MANUAL_SCALAR_COPY.data(); - size_t what_sz = MANUAL_SCALAR_COPY.length(); - char *what_copy; - struct fy_document *fyd; - struct fy_node *fyn; - char *buf; - - /* build document */ - fyd = fy_document_create(NULL); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - what_copy = (char*)malloc(what_sz); - UNIT_ASSERT_UNEQUAL(what_copy, NULL); - memcpy(what_copy, what, what_sz); - - /* create a manual scalar with all the escapes */ - fyn = fy_node_create_scalar_copy(fyd, what_copy, what_sz); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - - /* free the data */ - free(what_copy); - - fy_document_set_root(fyd, fyn); - fyn = NULL; - - /* emit to a buffer */ - buf = fy_emit_document_to_string(fyd, FYECF_MODE_FLOW_ONELINE); - UNIT_ASSERT_UNEQUAL(buf, NULL); - - /* verify that the resulting document is the one we used + '\n' */ - UNIT_ASSERT_VALUES_EQUAL(buf, TString(MANUAL_SCALAR_COPY) + "\n"); - - /* destroy the old document */ - fy_document_destroy(fyd); - fyd = NULL; - - free(buf); - -} - -Y_UNIT_TEST(manual_scalarf) { - struct fy_document *fyd; - struct fy_node *fyn; - char *buf; - - /* build document */ - fyd = fy_document_create(NULL); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - /* create a manual scalar using the printf interface */ - fyn = fy_node_create_scalarf(fyd, "foo%d", 13); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - - fy_document_set_root(fyd, fyn); - fyn = NULL; - - /* emit to a buffer */ - buf = fy_emit_document_to_string(fyd, FYECF_MODE_FLOW_ONELINE); - UNIT_ASSERT_UNEQUAL(buf, NULL); - - /* verify that the resulting document is the one we used + '\n' */ - UNIT_ASSERT_VALUES_EQUAL(buf, TString("foo13\n")); - - /* destroy the old document */ - fy_document_destroy(fyd); - fyd = NULL; - - free(buf); -} - -Y_UNIT_TEST(manual_valid_anchor) { - struct fy_document *fyd; - struct fy_node *fyn; - int ret; - - fyd = fy_document_create(NULL); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - fyn = fy_node_create_sequence(fyd); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - - fy_document_set_root(fyd, fyn); - - fyn = fy_node_create_scalar(fyd, "foo", FY_NT); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - - ret = fy_node_sequence_append(fy_document_root(fyd), fyn); - UNIT_ASSERT_EQUAL(ret, 0); - - /* create a valid anchor */ - ret = fy_node_set_anchor(fyn, "foo", FY_NT); - UNIT_ASSERT_EQUAL(ret, 0); - - fy_document_destroy(fyd); -} - -Y_UNIT_TEST(manual_invalid_anchor) { - struct fy_document *fyd; - struct fy_node *fyn; - int ret; - - fyd = fy_document_create(NULL); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - fyn = fy_node_create_sequence(fyd); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - - fy_document_set_root(fyd, fyn); - - fyn = fy_node_create_scalar(fyd, "foo", FY_NT); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - - ret = fy_node_sequence_append(fy_document_root(fyd), fyn); - UNIT_ASSERT_EQUAL(ret, 0); - - /* create an invalid anchor */ - ret = fy_node_set_anchor(fyn, "*foo", FY_NT); - UNIT_ASSERT_UNEQUAL(ret, 0); - - fy_document_destroy(fyd); -} - -Y_UNIT_TEST(manual_anchor_removal) { - struct fy_document *fyd; - struct fy_node *fyn; - int ret; - - fyd = fy_document_create(NULL); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - fyn = fy_node_create_sequence(fyd); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - - fy_document_set_root(fyd, fyn); - - fyn = fy_node_create_scalar(fyd, "foo", FY_NT); - UNIT_ASSERT_UNEQUAL(fyn, NULL); - - ret = fy_node_sequence_append(fy_document_root(fyd), fyn); - UNIT_ASSERT_EQUAL(ret, 0); - - /* create a valid anchor */ - ret = fy_node_set_anchor(fyn, "foo", FY_NT); - UNIT_ASSERT_EQUAL(ret, 0); - - fprintf(stderr, "---\n# with anchor\n"); - fy_emit_document_to_fp(fyd, FYECF_MODE_FLOW_ONELINE, stderr); - - /* should fail (an anchor already exists) */ - ret = fy_node_set_anchor(fyn, "bar", FY_NT); - UNIT_ASSERT_UNEQUAL(ret, 0); - - /* should succeed */ - ret = fy_node_remove_anchor(fyn); - UNIT_ASSERT_EQUAL(ret, 0); - - fprintf(stderr, "---\n# without anchor\n"); - fy_emit_document_to_fp(fyd, FYECF_MODE_FLOW_ONELINE, stderr); - - fy_document_destroy(fyd); -} - -Y_UNIT_TEST(manual_block_flow_mix) { - struct fy_document *fyd; - struct fy_node *fyn_mapping, *fyn_key, *fyn_value; - char *buf; - int ret; - - fyd = fy_document_build_from_string(NULL, "--- &root\n{\n}\n", FY_NT); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - fyn_mapping = fy_document_root(fyd); - UNIT_ASSERT_UNEQUAL(fyn_mapping, NULL); - - UNIT_ASSERT(fy_node_is_mapping(fyn_mapping) == true); - - fyn_key = fy_node_create_scalar(fyd, "key", FY_NT); - UNIT_ASSERT_UNEQUAL(fyn_key, NULL); - - fyn_value = fy_node_build_from_string(fyd, "|\n literal\n", FY_NT); - UNIT_ASSERT_UNEQUAL(fyn_value, NULL); - - ret = fy_node_mapping_append(fyn_mapping, fyn_key, fyn_value); - UNIT_ASSERT_EQUAL(ret, 0); - - /* emit document to buffer */ - buf = fy_emit_document_to_string(fyd, FYECF_MODE_FLOW_ONELINE); - UNIT_ASSERT_UNEQUAL(buf, NULL); - - /* destroy the first document */ - fy_document_destroy(fyd); - fyd = NULL; - - /* read the emitted document back */ - fyd = fy_document_build_from_string(NULL, buf, FY_NT); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - /* compare with expected result */ - UNIT_ASSERT_VALUES_EQUAL(fy_node_get_scalar0(fy_node_by_path(fy_document_root(fyd), "/key", FY_NT, FYNWF_DONT_FOLLOW)), "literal\n"); - - /* destroy the second document */ - fy_document_destroy(fyd); - fyd = NULL; - - free(buf); - -} - -/* FIXME - * This test is disabled because we can't make compatible - * alloca-based API on windows because original library - * uses gcc inline block extensions it will be uncommented - * when new API will be introduced - */ -#if false -Y_UNIT_TEST(alloca_check) { - struct fy_document *fyd; - char *buf; - const char *abuf; - - /* build document */ - fyd = fy_document_build_from_string(NULL, "{ " - "foo: 10, bar : [ ten, 20 ], baz:{ frob: boo, deep: { deeper: yet } }, " - "}", FY_NT); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - /* fy_emit_document_to_string*() */ - buf = fy_emit_document_to_string(fyd, FYECF_MODE_FLOW_ONELINE); - UNIT_ASSERT_UNEQUAL(buf, NULL); - abuf = fy_emit_document_to_string_alloca(fyd, FYECF_MODE_FLOW_ONELINE); - UNIT_ASSERT_UNEQUAL(abuf, NULL); - UNIT_ASSERT_VALUES_EQUAL(buf, abuf); - free(buf); - - /* fy_emit_node_to_string*() */ - buf = fy_emit_node_to_string(fy_node_by_path(fy_document_root(fyd), "/foo", FY_NT, FYNWF_DONT_FOLLOW), FYECF_MODE_FLOW_ONELINE); - UNIT_ASSERT_UNEQUAL(buf, NULL); - abuf = fy_emit_node_to_string_alloca(fy_node_by_path(fy_document_root(fyd), "/foo", FY_NT, FYNWF_DONT_FOLLOW), FYECF_MODE_FLOW_ONELINE); - UNIT_ASSERT_UNEQUAL(abuf, NULL); - UNIT_ASSERT_VALUES_EQUAL(buf, abuf); - free(buf); - - /* path check eq */ - buf = fy_node_get_path(fy_node_by_path(fy_document_root(fyd), "/foo", FY_NT, FYNWF_DONT_FOLLOW)); - UNIT_ASSERT_UNEQUAL(buf, NULL); - UNIT_ASSERT_VALUES_EQUAL(buf, "/foo"); - abuf = fy_node_get_path_alloca(fy_node_by_path(fy_document_root(fyd), "/foo", FY_NT, FYNWF_DONT_FOLLOW)); - UNIT_ASSERT_UNEQUAL(abuf, NULL); - UNIT_ASSERT_VALUES_EQUAL(abuf, "/foo"); - UNIT_ASSERT_VALUES_EQUAL(buf, abuf); - free(buf); - - /* check that a bad path is "" */ - abuf = fy_node_get_path_alloca(NULL); - UNIT_ASSERT_UNEQUAL(abuf, NULL); - UNIT_ASSERT_VALUES_EQUAL(abuf, ""); - - fy_document_destroy(fyd); - -} -#endif - -Y_UNIT_TEST(scanf_check) { - struct fy_document *fyd; - struct fy_node *fyn_root; - int ret, ival; - char sval[256]; - - /* build document */ - fyd = fy_document_build_from_string(NULL, "{ " - "foo: 10, bar : 20, baz:{ frob: boo }, " - "frooz: [ 1, { key: value }, three ]" - "}", FY_NT); - UNIT_ASSERT_UNEQUAL(fyd, NULL); - - fyn_root = fy_document_root(fyd); - UNIT_ASSERT_UNEQUAL(fyn_root, NULL); - - /* check scanf accesses to scalars */ - ret = fy_node_scanf(fyn_root, "/foo %d", &ival); - UNIT_ASSERT_EQUAL(ret, 1); - UNIT_ASSERT_EQUAL(ival, 10); - - ret = fy_node_scanf(fyn_root, "/bar %d", &ival); - UNIT_ASSERT_EQUAL(ret, 1); - UNIT_ASSERT_EQUAL(ival, 20); - - ret = fy_node_scanf(fyn_root, "/baz/frob %s", sval); - UNIT_ASSERT_EQUAL(ret, 1); - UNIT_ASSERT_VALUES_EQUAL(sval, "boo"); - - ret = fy_node_scanf(fyn_root, "/frooz/0 %d", &ival); - UNIT_ASSERT_EQUAL(ret, 1); - UNIT_ASSERT_EQUAL(ival, 1); - - ret = fy_node_scanf(fyn_root, "/frooz/1/key %s", sval); - UNIT_ASSERT_EQUAL(ret, 1); - UNIT_ASSERT_VALUES_EQUAL(sval, "value"); - - ret = fy_node_scanf(fyn_root, "/frooz/2 %s", sval); - UNIT_ASSERT_EQUAL(ret, 1); - UNIT_ASSERT_VALUES_EQUAL(sval, "three"); - - fy_document_destroy(fyd); -} - -} diff --git a/library/cpp/yaml/fyamlcpp/ya.make b/library/cpp/yaml/fyamlcpp/ya.make deleted file mode 100644 index 06ce8066ee..0000000000 --- a/library/cpp/yaml/fyamlcpp/ya.make +++ /dev/null @@ -1,16 +0,0 @@ -LIBRARY() - -SRCS( - fyamlcpp.cpp - fyamlcpp.h -) - -PEERDIR( - contrib/libs/libfyaml -) - -END() - -RECURSE_FOR_TESTS( - ut -) |