2026-07-21 09:42:30 -05:00 | | | //+------------------------------------------------------------------+
|
| | | //| 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
|
| | |
|
2026-07-21 10:38:19 -05:00 | | | //+------------------------------------------------------------------+
|
| | | //| |
|
| | | //+------------------------------------------------------------------+
|
| | | #define TSN_MQLCI_INLINE_TEST
|
2026-10-03 22:25:05 -05:00 | | | #define TEST_SIZE (102)
|
2026-07-21 10:38:19 -05:00 | | |
|
2026-07-21 09:42:30 -05:00 | | | //+------------------------------------------------------------------+
|
| | | //| |
|
| | | //+------------------------------------------------------------------+
|
| | | #include "Inc\\All.mqh"
|
| | |
|
2026-07-21 10:38:19 -05:00 | | | //+------------------------------------------------------------------+
|
| | | //| Inputs |
|
| | | //+------------------------------------------------------------------+
|
| | | input long InpCharId = 0;
|
| | | input string InpTestName = "JsonParserByLeo - Full Suite";
|
| | | TSN::CJsonParser g_node_parser;
|
| | |
|
2026-07-21 09:42:30 -05:00 | | | //+------------------------------------------------------------------+
|
| | | //| Expert initialization function |
|
| | | //+------------------------------------------------------------------+
|
| | | int OnInit()
|
2026-07-21 10:38:19 -05:00 | | | {
|
| | | //--- 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);
|
2026-09-23 15:25:08 -05:00 | | | util.TestSize(TEST_SIZE);
|
2026-07-21 10:38:19 -05:00 | | |
|
2026-07-21 09:42:30 -05:00 | | | //---
|
2026-07-21 10:38:19 -05:00 | | | 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::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_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_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());
|
2026-10-03 22:25:05 -05:00 | | | util.SetTestPtr(i++, new TSN::CTestParser_TrailingCommaRejected());
|
| | | util.SetTestPtr(i++, new TSN::CTestParser_UnescapeUnicodeOnDemand());
|
| | | util.SetTestPtr(i++, new TSN::CTestParser_DuplicateKeysFirstWins());
|
| | | util.SetTestPtr(i++, new TSN::CTestParser_BracketMismatchRejected());
|
| | | util.SetTestPtr(i++, new TSN::CTestParser_LeadingZerosRejected());
|
| | | util.SetTestPtr(i++, new TSN::CTestParser_MalformedDecimalAndExponent());
|
| | | util.SetTestPtr(i++, new TSN::CTestParser_MalformedLiteralsRejected());
|
2026-07-21 10:38:19 -05:00 | | |
|
| | | //=== 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());
|
| | |
|
2026-09-23 15:25:08 -05:00 | | | //--- Sanity check: i debe coincidir exacto con TestSize(TEST_SIZE)
|
| | | if(i != TEST_SIZE)
|
2026-07-21 10:38:19 -05:00 | | | {
|
| | | #ifdef TSN_MQLCI_INLINE_TEST
|
2026-09-23 15:25:08 -05:00 | | | PrintFormat("ERROR: se instanciaron %d tests, esperado TEST_SIZE (revisar Test.mq5)", i);
|
2026-07-21 10:38:19 -05:00 | | | 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
|
| | |
|
2026-07-21 09:42:30 -05:00 | | | //---
|
2026-07-21 10:38:19 -05:00 | | | return CIBYLEO_ONINIT_FINISH;
|
| | | }
|
2026-07-21 09:42:30 -05:00 | | | //+------------------------------------------------------------------+
|
| | | //| Expert deinitialization function |
|
| | | //+------------------------------------------------------------------+
|
| | | void OnDeinit(const int reason)
|
2026-07-21 10:38:19 -05:00 | | | {
|
2026-07-21 09:42:30 -05:00 | | | //---
|
2026-07-21 10:38:19 -05:00 | | | }
|
2026-07-21 09:42:30 -05:00 | | | //+------------------------------------------------------------------+
|
| | | //| Expert tick function |
|
| | | //+------------------------------------------------------------------+
|
| | | void OnTick()
|
2026-07-21 10:38:19 -05:00 | | | {
|
2026-07-21 09:42:30 -05:00 | | | //---
|
2026-07-21 10:38:19 -05:00 | | | }
|
2026-07-21 09:42:30 -05:00 | | | //+------------------------------------------------------------------+
|