//+------------------------------------------------------------------+ //| Test.mq5 | //| Copyright 2026, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2026, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property strict //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ #define TSN_MQLCI_INLINE_TEST //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ #include "Inc\\All.mqh" //+------------------------------------------------------------------+ //| Inputs | //+------------------------------------------------------------------+ input long InpCharId = 0; input string InpTestName = "JsonParserByLeo - Full Suite"; TSN::CJsonParser g_node_parser; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- Parseamos una sola vez el fixture de NodeTest.mqh y lo compartimos g_node_parser.Assing(g_test_json); g_node_parser.CorrectPadding(); if(!g_node_parser.Parse()) { Print("Fallo el Parse() del fixture_test.json -> abortando suite de tests"); return INIT_FAILED; } //--- TSN::CiTestUtil util; util.AddLogFlags(LOG_ALL); util.TestSize(104); //--- int i = 0; //--- util.SetTestPtr(i++, new TSN::CTestNode_BracketExistingKey(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_BracketMissingKey(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_BracketChainedDeep(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_AtValidIndex(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_AtOutOfRange(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_AtOnEmptyArray(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_HasKeyTrue(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_HasKeyFalse(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_HasKeyEmptyObj(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_HasKeyForcesHashing(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_BracketAfterHashing(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_GetKeysTopLevel(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_GetKeysEmptyObj(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_GetKeysSingleKeyObj(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_KeyToPositionValid(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_KeyToPositionInvalid(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_ToIntNegative(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_ToIntSafeFromString(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_ToDoubleSmallFloat(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_ToDoubleSafeOnMissing(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_ToBoolDirect(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_IsNull(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_IsValidIsInvalid(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_ToArrayFloats(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_ToArrayBools(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_ExistInArrayStr(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_ExistInArrayHomogeneoInt(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_IteratorArray(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_IteratorObject(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_ArrayOfObjects(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_NestedArrayAccess(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_EscapedString(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_EmptyString(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_StrLenRaw(&g_node_parser)); util.SetTestPtr(i++, new TSN::CTestNode_CompareStrWith(&g_node_parser)); //--- util.SetTestPtr(i++, new TSN::CTestBuilder_SimpleObjString()); util.SetTestPtr(i++, new TSN::CTestBuilder_MultiTypeObj()); util.SetTestPtr(i++, new TSN::CTestBuilder_ArrayInts()); util.SetTestPtr(i++, new TSN::CTestBuilder_EmptyArray()); util.SetTestPtr(i++, new TSN::CTestBuilder_EmptyObj()); util.SetTestPtr(i++, new TSN::CTestBuilder_NestedObjInObj()); util.SetTestPtr(i++, new TSN::CTestBuilder_ArrayOfObjects()); util.SetTestPtr(i++, new TSN::CTestBuilder_NestedArrays()); util.SetTestPtr(i++, new TSN::CTestBuilder_EscapeQuotesBackslash()); util.SetTestPtr(i++, new TSN::CTestBuilder_EscapeNewlineTab()); util.SetTestPtr(i++, new TSN::CTestBuilder_EscapeUnicode()); util.SetTestPtr(i++, new TSN::CTestBuilder_DoublePadding()); util.SetTestPtr(i++, new TSN::CTestBuilder_DoubleNegative()); util.SetTestPtr(i++, new TSN::CTestBuilder_LongBigValue()); util.SetTestPtr(i++, new TSN::CTestBuilder_IntZeroAndNegative()); util.SetTestPtr(i++, new TSN::CTestBuilder_RawNoValidation()); util.SetTestPtr(i++, new TSN::CTestBuilder_ValidJsonFragment()); util.SetTestPtr(i++, new TSN::CTestBuilder_ClearResets()); util.SetTestPtr(i++, new TSN::CTestBuilderStr_SimpleObjDoubleEscaped()); util.SetTestPtr(i++, new TSN::CTestBuilderStr_EscapeQuoteTriple()); util.SetTestPtr(i++, new TSN::CTestBuilderStr_EscapeNewlineDouble()); util.SetTestPtr(i++, new TSN::CTestBuilderStr_EscapeUnicodeDouble()); util.SetTestPtr(i++, new TSN::CTestBuilderStr_NestedObj()); util.SetTestPtr(i++, new TSN::CTestBuilderStr_ArrayMixedValues()); util.SetTestPtr(i++, new TSN::CTestBuilderStr_ValSWVRaw()); util.SetTestPtr(i++, new TSN::CTestBuilder_CrossCompareEscapeLevels()); //--- util.SetTestPtr(i++, new TSN::CTestParser_ToJsonAsmNotEmpty()); util.SetTestPtr(i++, new TSN::CTestParser_JsonAsmRoundTripSameCinta()); util.SetTestPtr(i++, new TSN::CTestParser_JsonAsmRoundTripPreservesValues()); util.SetTestPtr(i++, new TSN::CTestParser_JsonAsmRoundTripEmptyContainers()); util.SetTestPtr(i++, new TSN::CTestParser_JsonAsmRoundTripArray()); util.SetTestPtr(i++, new TSN::CTestParser_JsonAsmDoubleRoundTripStable()); util.SetTestPtr(i++, new TSN::CTestParser_JsonAsmRoundTripNull()); util.SetTestPtr(i++, new TSN::CTestParser_JsonTcRoundTripSameCinta()); util.SetTestPtr(i++, new TSN::CTestParser_JsonTcRoundTripPreservesValues()); util.SetTestPtr(i++, new TSN::CTestParser_JsonTcPreservesHashTables()); util.SetTestPtr(i++, new TSN::CTestParser_JsonTcExternalRefRoundTrip()); util.SetTestPtr(i++, new TSN::CTestParser_JsonTcRoundTripNestedArray()); util.SetTestPtr(i++, new TSN::CTestParser_CrossFormatConsistency()); util.SetTestPtr(i++, new TSN::CTestParser_GetStepInteger()); util.SetTestPtr(i++, new TSN::CTestParser_UnescapeBasic()); util.SetTestPtr(i++, new TSN::CTestParser_MalformedKeyNotClosed()); util.SetTestPtr(i++, new TSN::CTestParser_MalformedUnfinishedJson()); util.SetTestPtr(i++, new TSN::CTestParser_ValidSimpleParseOk()); //=== DomTest.mqh (25) ================================================ util.SetTestPtr(i++, new TSN::CTestDom_ToDomBasicSucceeds()); util.SetTestPtr(i++, new TSN::CTestDom_ToDomPreservesScalars()); util.SetTestPtr(i++, new TSN::CTestDom_ToDomPreservesNesting()); util.SetTestPtr(i++, new TSN::CTestDom_ToDomPreservesNestedArray()); util.SetTestPtr(i++, new TSN::CTestDom_ToDomOnScalarFails()); util.SetTestPtr(i++, new TSN::CTestDom_ToDomKeysAndSizeMatch()); util.SetTestPtr(i++, new TSN::CTestDom_MutateAddNewKey()); util.SetTestPtr(i++, new TSN::CTestDom_MutateChangeTypeDoubleToBool()); util.SetTestPtr(i++, new TSN::CTestDom_MutateObjectToScalarFreesContainer()); util.SetTestPtr(i++, new TSN::CTestDom_RemoveKeyReducesSize()); util.SetTestPtr(i++, new TSN::CTestDom_RemoveMissingKeyReturnsFalse()); util.SetTestPtr(i++, new TSN::CTestDom_RemoveIndexReducesArraySize()); util.SetTestPtr(i++, new TSN::CTestDom_AddItemIncreasesSize()); util.SetTestPtr(i++, new TSN::CTestDom_InRangeValidatesIndices()); util.SetTestPtr(i++, new TSN::CTestDom_AtSafeOutOfRangeReturnsNull()); util.SetTestPtr(i++, new TSN::CTestDom_ClearObjectEmptiesIt()); util.SetTestPtr(i++, new TSN::CTestDom_StandaloneNewObjSetGet()); util.SetTestPtr(i++, new TSN::CTestDom_StandaloneNewArrAddItem()); util.SetTestPtr(i++, new TSN::CTestDom_StandaloneToArray()); util.SetTestPtr(i++, new TSN::CTestDom_MultiManagerSetSharesPointer()); util.SetTestPtr(i++, new TSN::CTestDomSerializer_SimpleObject()); util.SetTestPtr(i++, new TSN::CTestDomSerializer_EscapesStrings()); util.SetTestPtr(i++, new TSN::CTestDomSerializer_NestedArray()); util.SetTestPtr(i++, new TSN::CTestDomSerializer_NullValue()); util.SetTestPtr(i++, new TSN::CTestDomSerializer_FullRoundTripWithMutation()); //--- Sanity check: i debe coincidir exacto con TestSize(104) if(i != 104) { #ifdef TSN_MQLCI_INLINE_TEST PrintFormat("ERROR: se instanciaron %d tests, esperado 104 (revisar Test.mq5)", i); return INIT_FAILED; #else TSN_MQLCI_INLINE_TEST ::EventChartCustom(m_chart_id, CIBYLEO_ONEVENT_RES, CYBYLEO_CODE_ERROR, 0.00, m_test_name); return CIBYLEO_ONINIT_FINISH; #endif // TSN_MQLCI_INLINE_TEST } //--- (chart_id, min_importance_for_early_exit, label, min_percentage_to_pass) util.Init(InpCharId, 70, InpTestName, 90.0); #ifdef TSN_MQLCI_INLINE_TEST if(!util.RunAllTestAndSend()) { FastLog(FUNCION_ACTUAL, FATAL_ERROR_TEXT, InpTestName); return CIBYLEO_ONINIT_FINISH; } #else util.RunAllTestAndSend(); #endif //TSN_MQLCI_INLINE_TEST //--- return CIBYLEO_ONINIT_FINISH; } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- } //+------------------------------------------------------------------+