//+------------------------------------------------------------------+ //| UnitTests.mq5 | //| Unit Tests for Package riskgate-ea | //| Organization: douglasrechia | //+------------------------------------------------------------------+ #include "../knitpkg/build/BuildInfo.mqh" #property copyright "Copyright (C) 2026 by " + MANIFEST_AUTHOR #property link "https://knitpkg.dev" #property description "" #property description "Version: " + MANIFEST_VERSION #property description "" #property description "Description: Unit tests for package riskgate" #property description "Organization: douglasrechia" #property description "Author: " + MANIFEST_AUTHOR #property description "License: " + MANIFEST_LICENSE #property description "" #property description "Powered by KnitPkg for MetaTrader" #property description "https://knitpkg.dev" // Include the headers under test #include "../knitpkg/include/douglasrechia/riskgate-ea/RiskGateClient.mqh" #define TEST_MSG_SEPARATOR "\r\n\r\n" //+------------------------------------------------------------------+ //| TestRiskGateClientBasicUsage | //+------------------------------------------------------------------+ bool TestRiskGateClientBasicUsage() { const ushort TEST_PORT = 15555; // Create mock server douglasrechia::ServerSocket* server = new douglasrechia::ServerSocket(TEST_PORT); if(!server.Created()) { Print("Failed to create test server: ", server.GetLastError()); delete server; return false; } // Create client and connect douglasrechia::RiskGateClient client("127.0.0.1", TEST_PORT, 1000); if(!client.Connect()) { Print("Client failed to connect"); delete server; return false; } // Accept connection on server side douglasrechia::ClientSocket* clientConn = NULL; int attempts = 0; while(clientConn == NULL && attempts < 100) { clientConn = server.Accept(); if(clientConn == NULL) Sleep(10); attempts++; } if(clientConn == NULL) { Print("Server failed to accept connection"); client.Disconnect(); delete server; return false; } // Create test signal CJAVal signal, response; signal["symbol"] = "EURUSD"; signal["side"] = "BUY"; signal["stop_loss"] = 1.0850; // Start async request (client sends signal) bool requestStarted = true; // Server receives signal string receivedSignal = ""; attempts = 0; while(receivedSignal == "" && attempts < 100) { receivedSignal = clientConn.Receive(TEST_MSG_SEPARATOR); if(receivedSignal == "") Sleep(10); attempts++; } // Server sends mock response CJAVal mockResponse; mockResponse["approved"] = true; mockResponse["lot"] = 0.05; mockResponse["reason"] = "test_approved"; string responseStr = mockResponse.Serialize() + TEST_MSG_SEPARATOR; clientConn.Send(responseStr); // Client receives response bool online = client.RequestPositionSize(signal, response); // Verify response bool testPassed = online && response["approved"].ToBool() == true && response["lot"].ToDbl() == 0.05 && response["reason"].ToStr() == "test_approved"; // Cleanup client.Disconnect(); delete clientConn; delete server; return testPassed; } //+------------------------------------------------------------------+ //| DoTests | //+------------------------------------------------------------------+ void DoTests(int &testsPerformed,int &testsPassed) { string testName=""; //--- TestRiskGateClientBasicUsage testsPerformed++; testName="TestRiskGateClientBasicUsage"; if(TestRiskGateClientBasicUsage()) { testsPassed++; PrintFormat("%s pass",testName); } else PrintFormat("%s failed",testName); //--- // Add more tests here as needed } //+------------------------------------------------------------------+ //| UnitTests() | //+------------------------------------------------------------------+ void UnitTests(const string packageName) { PrintFormat("Unit tests for Package %s\n",packageName); //--- initial values int testsPerformed=0; int testsPassed=0; //--- test distributions DoTests(testsPerformed,testsPassed); //--- print statistics PrintFormat("\n%d of %d passed",testsPassed,testsPerformed); } //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { UnitTests("riskgate-ea"); } //+------------------------------------------------------------------+