From 3419ac0704e38525d5947203a25eaffd7e7cbb88 Mon Sep 17 00:00:00 2001 From: Mike Phares Date: Wed, 30 Apr 2025 09:54:47 -0700 Subject: [PATCH] process-data-standard-format changes for better unit testing --- .../MoveMatchingFiles/FileRead.cs | 53 +++++++++++-------- .../Shared/ProcessDataStandardFormat.cs | 53 ++++++------------- Adaptation/_Tests/Shared/AdaptationTesting.cs | 2 +- 3 files changed, 50 insertions(+), 58 deletions(-) diff --git a/Adaptation/FileHandlers/MoveMatchingFiles/FileRead.cs b/Adaptation/FileHandlers/MoveMatchingFiles/FileRead.cs index 55ec96e..9ffd8a7 100644 --- a/Adaptation/FileHandlers/MoveMatchingFiles/FileRead.cs +++ b/Adaptation/FileHandlers/MoveMatchingFiles/FileRead.cs @@ -22,19 +22,26 @@ public class FileRead : Shared.FileRead, IFileRead internal class PreWith { - internal string MatchingFile { get; private set; } - internal string CheckFile { get; private set; } internal string ErrFile { get; private set; } + internal string CheckFile { get; private set; } + internal string MatchingFile { get; private set; } internal string CheckDirectory { get; private set; } internal string NoWaitDirectory { get; private set; } + internal bool MesEntityMatchesProcess { get; private set; } - internal PreWith(string matchingFile, string checkFile, string errFile, string checkDirectory, string noWaitDirectory) + internal PreWith(string checkDirectory, + string checkFile, + string errFile, + string matchingFile, + string noWaitDirectory, + bool mesEntityMatchesProcess) { - MatchingFile = matchingFile; - CheckFile = checkFile; ErrFile = errFile; + CheckFile = checkFile; + MatchingFile = matchingFile; CheckDirectory = checkDirectory; NoWaitDirectory = noWaitDirectory; + MesEntityMatchesProcess = mesEntityMatchesProcess; } } @@ -205,7 +212,7 @@ public class FileRead : Shared.FileRead, IFileRead return result; } - private static ReadOnlyCollection GetPreWithCollection(ReadOnlyCollection
 preCollection)
+    private static ReadOnlyCollection GetPreWithCollection(ReadOnlyCollection
 preCollection, bool mesEntityMatchesProcess)
     {
         List results = new();
         string errFile;
@@ -221,7 +228,12 @@ public class FileRead : Shared.FileRead, IFileRead
             if (!Directory.Exists(checkDirectory))
                 _ = Directory.CreateDirectory(checkDirectory);
             noWaitDirectory = Path.Combine(checkDirectory, "NoWaitDirectory");
-            preWith = new(pre.MatchingFile, pre.CheckFile, errFile, checkDirectory, noWaitDirectory);
+            preWith = new(checkDirectory: checkDirectory,
+                          checkFile: pre.CheckFile,
+                          errFile: errFile,
+                          matchingFile: pre.MatchingFile,
+                          noWaitDirectory: noWaitDirectory,
+                          mesEntityMatchesProcess: mesEntityMatchesProcess);
             results.Add(preWith);
         }
         return results.AsReadOnly();
@@ -345,16 +357,9 @@ public class FileRead : Shared.FileRead, IFileRead
     private Tuple> GetExtractResult(string reportFullPath, DateTime dateTime)
     {
         Tuple> results = new(string.Empty, Array.Empty(), Array.Empty(), new List());
-        ProcessDataStandardFormat? processDataStandardFormat = ProcessDataStandardFormat.GetProcessDataStandardFormat(reportFullPath, _ProcessDataStandardFormatMapping);
-        if (processDataStandardFormat is not null)
-            _Logistics = new Logistics(reportFullPath, processDataStandardFormat);
-        else
-        {
-            processDataStandardFormat = ProcessDataStandardFormat.GetProcessDataStandardFormat(reportFullPath);
-            _Logistics = new Logistics(reportFullPath, processDataStandardFormat);
-            processDataStandardFormat = null;
-        }
-        if (!_IsEAFHosted && processDataStandardFormat is not null)
+        ProcessDataStandardFormat processDataStandardFormat = ProcessDataStandardFormat.GetProcessDataStandardFormat(reportFullPath, _ProcessDataStandardFormatMapping);
+        _Logistics = new Logistics(reportFullPath, processDataStandardFormat);
+        if (!_IsEAFHosted)
             ProcessDataStandardFormat.Write(".pdsf", processDataStandardFormat, wsResults: null);
         SetFileParameterLotIDToLogisticsMID();
         int numberLength = 2;
@@ -364,11 +369,17 @@ public class FileRead : Shared.FileRead, IFileRead
         ReadOnlyCollection matchingFiles = GetMatchingFiles(ticks, reportFullPath, searchDirectories);
         if (matchingFiles.Count != searchDirectories.Count)
             throw new Exception($"Didn't find all files after {_BreakAfterSeconds} second(s)!");
-        try
-        { CreatePointerFile(numberLength, parentParentDirectory, matchingFiles); }
-        catch (Exception) { }
+        if (_IsEAFHosted)
+        {
+            try
+            { CreatePointerFile(numberLength, parentParentDirectory, matchingFiles); }
+            catch (Exception) { }
+        }
+        JsonElement[] jsonElements = ProcessDataStandardFormat.GetArray(processDataStandardFormat);
+        List descriptions = pcl.ProcessData.GetDescriptions(jsonElements);
+        bool mesEntityMatchesProcess = descriptions.Count > 0 && descriptions[0].MesEntity == descriptions[0].Reactor;
         ReadOnlyCollection
 preCollection = GetPreCollection(numberLength, parentParentDirectory, matchingFiles);
-        ReadOnlyCollection preWithCollection = GetPreWithCollection(preCollection);
+        ReadOnlyCollection preWithCollection = GetPreWithCollection(preCollection, mesEntityMatchesProcess);
         MoveCollection(dateTime, processDataStandardFormat, preWithCollection);
         return results;
     }
diff --git a/Adaptation/Shared/ProcessDataStandardFormat.cs b/Adaptation/Shared/ProcessDataStandardFormat.cs
index 60407cd..e39d4e8 100644
--- a/Adaptation/Shared/ProcessDataStandardFormat.cs
+++ b/Adaptation/Shared/ProcessDataStandardFormat.cs
@@ -61,8 +61,8 @@ internal class ProcessDataStandardFormat
     internal static string Archive(bool addSpaces = true, char separator = ' ') =>
         GetString(SearchFor.Archive, addSpaces, separator);
 
-    internal static ProcessDataStandardFormat GetEmpty() =>
-        new(new(Array.Empty()), new(Array.Empty()), new(Array.Empty()), new(Array.Empty()), null, new(new string[] { "LOGISTICS_1" }), null);
+    internal static ProcessDataStandardFormat GetEmpty(Logistics logistics) =>
+        new(new(Array.Empty()), new(Array.Empty()), new(Array.Empty()), new(Array.Empty()), null, new(logistics.Logistics1), null);
 
     internal static List PDSFToFixedWidth(string reportFullPath)
     {
@@ -214,25 +214,26 @@ internal class ProcessDataStandardFormat
         return results.AsReadOnly();
     }
 
-    internal static ProcessDataStandardFormat? GetProcessDataStandardFormat(string reportFullPath, ProcessDataStandardFormatMapping pdsfMapping)
+    internal static ProcessDataStandardFormat GetProcessDataStandardFormat(string reportFullPath, ProcessDataStandardFormatMapping pdsfMapping)
     {
-        ProcessDataStandardFormat? result;
+        ProcessDataStandardFormat result;
         const int columnsLine = 6;
         FileInfo fileInfo = new(reportFullPath);
-        ProcessDataStandardFormat processDataStandardFormat = GetProcessDataStandardFormat(fileInfo.LastWriteTime, pdsfMapping.NewColumnNames.Count, columnsLine, fileInfo.FullName, lines: null);
-        JsonElement[]? jsonElements = GetArray(pdsfMapping.NewColumnNames.Count, processDataStandardFormat, lookForNumbers: false);
-        if (jsonElements is null || jsonElements.Length == 0 || pdsfMapping.OldColumnNames.Count != pdsfMapping.ColumnIndices.Count)
-            result = null;
+        ProcessDataStandardFormat processDataStandardFormat = GetProcessDataStandardFormat(fileInfo.LastWriteTime, columnsLine, fileInfo.FullName, lines: null);
+        JsonElement[]? jsonElements = pdsfMapping.OldColumnNames.Count != pdsfMapping.ColumnIndices.Count ? null : GetFullArray(processDataStandardFormat);
+        JsonProperty[]? jsonProperties = jsonElements is null || jsonElements.Length == 0 ? null : jsonElements[0].EnumerateObject().ToArray();
+        if (jsonElements is null || jsonProperties is null || jsonProperties.Length != pdsfMapping.NewColumnNames.Count)
+            result = processDataStandardFormat;
         else
         {
             result = GetProcessDataStandardFormat(pdsfMapping, jsonElements, processDataStandardFormat);
             if (result.Sequence is null || result.Columns.Count == 0 || result.Body.Count == 0 || result.Logistics.Count == 0)
-                result = null;
+                result = processDataStandardFormat;
         }
         return result;
     }
 
-    private static ProcessDataStandardFormat GetProcessDataStandardFormat(DateTime lastWriteTime, int expectedColumns, int columnsLine, string path, string[]? lines)
+    private static ProcessDataStandardFormat GetProcessDataStandardFormat(DateTime lastWriteTime, int columnsLine, string path, string[]? lines)
     {
         ProcessDataStandardFormat result;
         long sequence;
@@ -248,8 +249,6 @@ internal class ProcessDataStandardFormat
         else
         {
             segments = lines[columnsLine].Split('\t');
-            if (segments.Length != expectedColumns)
-                segments = Array.Empty();
             for (int i = 0; i < columnsLine; i++)
                 header.Add(lines[i]);
         }
@@ -285,7 +284,7 @@ internal class ProcessDataStandardFormat
         return result;
     }
 
-    private static JsonElement[]? GetArray(int expectedColumns, ProcessDataStandardFormat processDataStandardFormat, bool lookForNumbers)
+    private static JsonElement[]? GetFullArray(ProcessDataStandardFormat processDataStandardFormat)
     {
         JsonElement[]? results;
         if (processDataStandardFormat.Body.Count == 0 || !processDataStandardFormat.Body[0].Contains('\t'))
@@ -293,36 +292,18 @@ internal class ProcessDataStandardFormat
         else
         {
             string value;
-            string[] segments;
+            List segments;
             List lines = new();
             StringBuilder stringBuilder = new();
             foreach (string bodyLine in processDataStandardFormat.Body)
             {
                 _ = stringBuilder.Clear();
                 _ = stringBuilder.Append('{');
-                segments = bodyLine.Split('\t');
-                if (segments.Length != expectedColumns)
-                    continue;
-                if (!lookForNumbers)
+                segments = bodyLine.Split('\t').ToList();
+                for (int c = 0; c < segments.Count; c++)
                 {
-                    for (int c = 0; c < segments.Length; c++)
-                    {
-                        value = segments[c].Replace("\"", "\\\"").Replace("\\", "\\\\");
-                        _ = stringBuilder.Append('"').Append(processDataStandardFormat.Columns[c]).Append("\":\"").Append(value).Append("\",");
-                    }
-                }
-                else
-                {
-                    for (int c = 0; c < segments.Length; c++)
-                    {
-                        value = segments[c].Replace("\"", "\\\"").Replace("\\", "\\\\");
-                        if (string.IsNullOrEmpty(value))
-                            _ = stringBuilder.Append('"').Append(processDataStandardFormat.Columns[c]).Append("\":").Append(value).Append("null,");
-                        else if (value.All(char.IsDigit))
-                            _ = stringBuilder.Append('"').Append(processDataStandardFormat.Columns[c]).Append("\":").Append(value).Append(',');
-                        else
-                            _ = stringBuilder.Append('"').Append(processDataStandardFormat.Columns[c]).Append("\":\"").Append(value).Append("\",");
-                    }
+                    value = segments[c].Replace("\"", "\\\"").Replace("\\", "\\\\");
+                    _ = stringBuilder.Append('"').Append(processDataStandardFormat.Columns[c]).Append("\":\"").Append(value).Append("\",");
                 }
                 _ = stringBuilder.Remove(stringBuilder.Length - 1, 1);
                 _ = stringBuilder.AppendLine("}");
diff --git a/Adaptation/_Tests/Shared/AdaptationTesting.cs b/Adaptation/_Tests/Shared/AdaptationTesting.cs
index e461be5..8c0bc93 100644
--- a/Adaptation/_Tests/Shared/AdaptationTesting.cs
+++ b/Adaptation/_Tests/Shared/AdaptationTesting.cs
@@ -1182,7 +1182,7 @@ public class AdaptationTesting : ISMTP
             Assert.IsNotNull(extractResult.Item3);
             Assert.IsNotNull(extractResult.Item4);
             if (!validatePDSF)
-                _ = GetProcessDataStandardFormat(fileRead, logistics, extractResult, ProcessDataStandardFormat.GetEmpty());
+                _ = GetProcessDataStandardFormat(fileRead, logistics, extractResult, ProcessDataStandardFormat.GetEmpty(logistics));
             else
             {
                 Assert.IsTrue(extractResult.Item3.Length > 0, "extractResult Array Length check!");